import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember;
import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
import org.opendaylight.controller.networkconfig.neutron.Neutron_IPs;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.switchmanager.ISwitchManager;
import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration;
+import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.collect.Maps;
+import com.google.common.base.Preconditions;
import java.net.HttpURLConnection;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
/**
* Handle requests for OpenStack Neutron v2.0 LBaaS API calls for /v2.0/loadbalancers.
private volatile INeutronLoadBalancerPoolCRUD neutronLBPoolCache;
private volatile INeutronLoadBalancerPoolMemberCRUD neutronLBPoolMemberCache;
private volatile INeutronPortCRUD neutronPortsCache;
- private Map<String, LoadBalancerConfiguration> loadbalancersCache = Maps.newHashMap();
+ private volatile LoadBalancerProvider loadBalancerProvider;
+ private volatile ISwitchManager switchManager;
@Override
public int canCreateNeutronLoadBalancer(NeutronLoadBalancer neutronLoadBalancer) {
- if (loadbalancersCache.containsKey(neutronLoadBalancer.getLoadBalancerID()))
- return HttpURLConnection.HTTP_CONFLICT;
- return HttpURLConnection.HTTP_OK;
+ LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
+ if (!lbConfig.isValid())
+ return HttpURLConnection.HTTP_NOT_ACCEPTABLE;
+ else
+ return HttpURLConnection.HTTP_OK;
}
/**
logger.debug("Neutron Load Balancer creation failed {} ", result);
return;
}
+ Preconditions.checkNotNull(loadBalancerProvider);
+ LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
- String loadBalancerID = neutronLoadBalancer.getLoadBalancerID();
- String loadBalancerName = neutronLoadBalancer.getLoadBalancerName();
- String loadBalancerVip = neutronLoadBalancer.getLoadBalancerVipAddress();
- String loadBalancerSubnetID = neutronLoadBalancer.getLoadBalancerVipSubnetID();
- LoadBalancerConfiguration newLB = new LoadBalancerConfiguration(loadBalancerName, loadBalancerVip);
-
- String memberID, memberIP, memberMAC, memberProtocol;
- Integer memberPort;
-
- for (NeutronLoadBalancerPool neutronLBPool: neutronLBPoolCache.getAllNeutronLoadBalancerPools()) {
- List<? extends NeutronLoadBalancerPoolMember> members =
- (List<? extends NeutronLoadBalancerPoolMember>)neutronLBPool.getLoadBalancerPoolMembers();
- memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol();
- /*
- * Only HTTP and HTTPS are supported as of this version
- * TODO: Support all TCP load-balancers
- */
- if (!(memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTP) ||
- memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTPS)))
- continue;
- for (NeutronLoadBalancerPoolMember neutronLBPoolMember: members) {
- if (neutronLBPoolMember.getPoolMemberSubnetID().equals(loadBalancerSubnetID)) {
- memberID = neutronLBPoolMember.getPoolMemberID();
- memberIP = neutronLBPoolMember.getPoolMemberAddress();
- memberPort = neutronLBPoolMember.getPoolMemberProtoPort();
- memberMAC = this.getMacAddress(memberIP);
- if (memberMAC == null)
- continue;
- newLB.addMember(memberID, memberIP, memberMAC, memberProtocol, memberPort);
- }
- }
- }
- if (newLB.isValid()) {
- logger.trace("Neutron LB pool configuration invalid for {} ", loadBalancerName);
+ if (!lbConfig.isValid()) {
+ logger.trace("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
return;
} else {
- loadbalancersCache.put(loadBalancerID, newLB);
- //TODO: Trigger flowmod addition
+ for (Node node: this.switchManager.getNodes())
+ loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD);
}
}
@Override
public int canDeleteNeutronLoadBalancer(NeutronLoadBalancer neutronLoadBalancer) {
- if (!loadbalancersCache.containsKey(neutronLoadBalancer.getLoadBalancerID()))
+ LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
+ if (!lbConfig.isValid())
return HttpURLConnection.HTTP_NOT_ACCEPTABLE;
- return HttpURLConnection.HTTP_OK;
+ else
+ return HttpURLConnection.HTTP_OK;
}
@Override
logger.error(" delete Neutron NeutronLoadBalancer Pool validation failed for result - {} ", result);
return;
}
- loadbalancersCache.remove(neutronLoadBalancer.getLoadBalancerID());
- //TODO: Trigger flowmod removals
+ Preconditions.checkNotNull(loadBalancerProvider);
+ LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLoadBalancer);
+
+ if (!lbConfig.isValid()) {
+ logger.trace("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
+ return;
+ } else {
+ for (Node node: this.switchManager.getNodes())
+ loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE);
+ }
}
/**
doNeutronLoadBalancerCreate(ev.getLoadBalancer());
case DELETE:
doNeutronLoadBalancerDelete(ev.getLoadBalancer());
- // fall through
case UPDATE:
+ /**
+ * Currently member update requires delete and re-adding
+ * Also, weights and weight updates are not supported
+ */
doNeutronLoadBalancerDelete(ev.getLoadBalancer());
doNeutronLoadBalancerCreate(ev.getLoadBalancer());
break;
}
}
+ /**
+ * Useful utility for extracting the loadbalancer instance
+ * configuration from the neutron LB cache
+ */
+ public LoadBalancerConfiguration extractLBConfiguration(NeutronLoadBalancer neutronLoadBalancer) {
+ String loadBalancerName = neutronLoadBalancer.getLoadBalancerName();
+ String loadBalancerVip = neutronLoadBalancer.getLoadBalancerVipAddress();
+ String loadBalancerSubnetID = neutronLoadBalancer.getLoadBalancerVipSubnetID();
+ LoadBalancerConfiguration lbConfig = new LoadBalancerConfiguration(loadBalancerName, loadBalancerVip);
+
+ String memberID, memberIP, memberMAC, memberProtocol;
+ Integer memberPort;
+
+ for (NeutronLoadBalancerPool neutronLBPool: neutronLBPoolCache.getAllNeutronLoadBalancerPools()) {
+ List<? extends NeutronLoadBalancerPoolMember> members =
+ (List<? extends NeutronLoadBalancerPoolMember>)neutronLBPool.getLoadBalancerPoolMembers();
+ memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol();
+ /*
+ * Only HTTP and HTTPS are supported as of this version
+ * TODO: Support all TCP load-balancers
+ */
+ if (!(memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTP) ||
+ memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTPS)))
+ continue;
+ for (NeutronLoadBalancerPoolMember neutronLBPoolMember: members) {
+ if (neutronLBPoolMember.getPoolMemberSubnetID().equals(loadBalancerSubnetID)) {
+ memberID = neutronLBPoolMember.getPoolMemberID();
+ memberIP = neutronLBPoolMember.getPoolMemberAddress();
+ memberPort = neutronLBPoolMember.getPoolMemberProtoPort();
+ memberMAC = this.getMacAddress(memberIP);
+ if (memberMAC == null)
+ continue;
+ lbConfig.addMember(memberID, memberIP, memberMAC, memberProtocol, memberPort);
+ }
+ }
+ }
+ return lbConfig;
+ }
+
/**
* Look up in the NeutronPortsCRUD cache and return the MAC address for a corresponding IP address
* @param ipAddr IP address of a member or VM
* @return MAC address registered with that IP address
*/
- private String getMacAddress(String ipAddr) {
+ public String getMacAddress(String ipAddr) {
List<Neutron_IPs> fixedIPs;
Iterator<Neutron_IPs> fixedIPIterator;
Neutron_IPs ip;