protocol.go (69 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package cloudstack import ( "k8s.io/api/core/v1" ) // LoadBalancerProtocol represents a specific network protocol supported by the CloudStack load balancer. // // It also allows easy mapping to standard protocol names. type LoadBalancerProtocol int const ( LoadBalancerProtocolTCP LoadBalancerProtocol = iota LoadBalancerProtocolUDP LoadBalancerProtocolTCPProxy LoadBalancerProtocolInvalid ) // ServiceAnnotationLoadBalancerProxyProtocol is the annotation used on the // service to enable the proxy protocol on a CloudStack load balancer. // The value of this annotation is ignored, even if it is seemingly boolean. // Simple presence of the annotation will enable it. // Note that this protocol only applies to TCP service ports and // CloudStack 4.6 is required for it to work. const ServiceAnnotationLoadBalancerProxyProtocol = "service.beta.kubernetes.io/cloudstack-load-balancer-proxy-protocol" // String returns the same value as CSProtocol. func (p LoadBalancerProtocol) String() string { return p.CSProtocol() } // CSProtocol returns the full CloudStack protocol name. // Returns "" if the value is unknown. func (p LoadBalancerProtocol) CSProtocol() string { switch p { case LoadBalancerProtocolTCP: return "tcp" case LoadBalancerProtocolUDP: return "udp" case LoadBalancerProtocolTCPProxy: return "tcp-proxy" default: return "" } } // IPProtocol returns the standard IP protocol name. // Returns "" if the value is unknown. func (p LoadBalancerProtocol) IPProtocol() string { switch p { case LoadBalancerProtocolTCP: fallthrough case LoadBalancerProtocolTCPProxy: return "tcp" case LoadBalancerProtocolUDP: return "udp" default: return "" } } // ProtocolFromServicePort selects a suitable CloudStack protocol type // based on a ServicePort object and annotations from a LoadBalancer definition. // // Supported combinations include: // // v1.ProtocolTCP="tcp" -> "tcp" // v1.ProtocolTCP="udp" -> "udp" (CloudStack 4.6 and later) // v1.ProtocolTCP="tcp" + annotation "service.beta.kubernetes.io/cloudstack-load-balancer-proxy-protocol" // -> "tcp-proxy" (CloudStack 4.6 and later) // // Other values return LoadBalancerProtocolInvalid. func ProtocolFromServicePort(port v1.ServicePort, annotations map[string]string) LoadBalancerProtocol { proxy := false // FIXME this accepts any value as true, even "false", 0 or other falsey stuff if _, ok := annotations[ServiceAnnotationLoadBalancerProxyProtocol]; ok { proxy = true } switch port.Protocol { case v1.ProtocolTCP: if proxy { return LoadBalancerProtocolTCPProxy } else { return LoadBalancerProtocolTCP } case v1.ProtocolUDP: return LoadBalancerProtocolUDP default: return LoadBalancerProtocolInvalid } } // ProtocolFromLoadBalancer returns the protocol corresponding to the // CloudStack load balancer protocol name. func ProtocolFromLoadBalancer(protocol string) LoadBalancerProtocol { switch protocol { case "tcp": return LoadBalancerProtocolTCP case "udp": return LoadBalancerProtocolUDP case "tcp-proxy": return LoadBalancerProtocolTCPProxy default: return LoadBalancerProtocolInvalid } }