@@ -66,6 +66,8 @@ const (
6666
6767 activeStatus = "ACTIVE"
6868 errorStatus = "ERROR"
69+
70+ ServiceAnnotationLoadBalancerFloatingNetworkId = "loadbalancer.openstack.org/floating-network-id"
6971)
7072
7173// LoadBalancer implementation for LBaaS v1
@@ -581,6 +583,21 @@ func nodeAddressForLB(node *v1.Node) (string, error) {
581583 return addrs [0 ].Address , nil
582584}
583585
586+ //getStringFromServiceAnnotation searches a given v1.Service for a specific annotationKey and either returns the annotation's value or a specified defaultSetting
587+ func getStringFromServiceAnnotation (service * v1.Service , annotationKey string , defaultSetting string ) string {
588+ glog .V (4 ).Infof ("getStringFromServiceAnnotation(%v, %v, %v)" , service , annotationKey , defaultSetting )
589+ if annotationValue , ok := service .Annotations [annotationKey ]; ok {
590+ //if there is an annotation for this setting, set the "setting" var to it
591+ // annotationValue can be empty, it is working as designed
592+ // it makes possible for instance provisioning loadbalancer without floatingip
593+ glog .V (4 ).Infof ("Found a Service Annotation: %v = %v" , annotationKey , annotationValue )
594+ return annotationValue
595+ }
596+ //if there is no annotation, set "settings" var to the value from cloud config
597+ glog .V (4 ).Infof ("Could not find a Service Annotation; falling back on cloud-config setting: %v = %v" , annotationKey , defaultSetting )
598+ return defaultSetting
599+ }
600+
584601// TODO: This code currently ignores 'region' and always creates a
585602// loadbalancer in only the current OpenStack region. We should take
586603// a list of regions (from config) and query/create loadbalancers in
@@ -598,6 +615,9 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
598615 return nil , fmt .Errorf ("no ports provided to openstack load balancer" )
599616 }
600617
618+ floatingPool := getStringFromServiceAnnotation (apiService , ServiceAnnotationLoadBalancerFloatingNetworkId , lbaas .opts .FloatingNetworkId )
619+ glog .V (4 ).Infof ("EnsureLoadBalancer using floatingPool: %v" , floatingPool )
620+
601621 // Check for TCP protocol on each port
602622 // TODO: Convert all error messages to use an event recorder
603623 for _ , port := range ports {
@@ -827,10 +847,10 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
827847 if err != nil && err != ErrNotFound {
828848 return nil , fmt .Errorf ("Error getting floating ip for port %s: %v" , portID , err )
829849 }
830- if floatIP == nil && lbaas . opts . FloatingNetworkId != "" {
850+ if floatIP == nil && floatingPool != "" {
831851 glog .V (4 ).Infof ("Creating floating ip for loadbalancer %s port %s" , loadbalancer .ID , portID )
832852 floatIPOpts := floatingips.CreateOpts {
833- FloatingNetworkID : lbaas . opts . FloatingNetworkId ,
853+ FloatingNetworkID : floatingPool ,
834854 PortID : portID ,
835855 }
836856 floatIP , err = floatingips .Create (lbaas .network , floatIPOpts ).Extract ()
0 commit comments