X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openstack%2Fnet-virt%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Fopenstack%2Fnetvirt%2FLBaaSPoolMemberHandler.java;h=d8834f5db7bd32437a4eb59070983ee38b80344c;hb=3a51de5f8d57e2c66be32ecc19565c767fd50a03;hp=9b575b76aa75ef06709ad1f6c46730d18417f7f1;hpb=3a25b787c3e4a6552de0465f3adda6d61b6dcc70;p=netvirt.git diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSPoolMemberHandler.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSPoolMemberHandler.java index 9b575b76aa..d8834f5db7 100755 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSPoolMemberHandler.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSPoolMemberHandler.java @@ -1,15 +1,17 @@ /* - * Copyright (C) 2014 SDN Hub, LLC. + * Copyright (c) 2014, 2015 SDN Hub, LLC. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html - * - * Authors : Srini Seetharaman */ package org.opendaylight.ovsdb.openstack.netvirt; +import java.net.HttpURLConnection; +import java.util.List; +import java.util.Map; + import org.opendaylight.neutron.spi.INeutronLoadBalancerCRUD; import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD; import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolMemberAware; @@ -19,52 +21,53 @@ import org.opendaylight.neutron.spi.INeutronSubnetCRUD; import org.opendaylight.neutron.spi.NeutronLoadBalancer; import org.opendaylight.neutron.spi.NeutronLoadBalancerPool; import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember; -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.EventDispatcher; import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration; import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider; +import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager; +import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; + +import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; -import java.net.HttpURLConnection; -import java.util.Map; - /** * Handle requests for OpenStack Neutron v2.0 LBaaS API calls for * /v2.0/pools/{pool_id}/members */ public class LBaaSPoolMemberHandler extends AbstractHandler - implements INeutronLoadBalancerPoolMemberAware { - - private static final Logger logger = LoggerFactory.getLogger(LBaaSPoolMemberHandler.class); + implements INeutronLoadBalancerPoolMemberAware, ConfigInterface { + private static final Logger LOG = LoggerFactory.getLogger(LBaaSPoolMemberHandler.class); // The implementation for each of these services is resolved by the OSGi Service Manager private volatile INeutronLoadBalancerPoolCRUD neutronLBPoolCache; private volatile INeutronLoadBalancerCRUD neutronLBCache; - private volatile INeutronPortCRUD neutronPortsCache; + private volatile INeutronPortCRUD neutronPortCache; private volatile INeutronNetworkCRUD neutronNetworkCache; private volatile INeutronSubnetCRUD neutronSubnetCache; private volatile LoadBalancerProvider loadBalancerProvider; - private volatile ISwitchManager switchManager; + private volatile NodeCacheManager nodeCacheManager; @Override public int canCreateNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember neutronLBPoolMember) { LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLBPoolMember); - if (lbConfig == null) + if (lbConfig == null) { return HttpURLConnection.HTTP_BAD_REQUEST; - else if (!lbConfig.isValid()) + } else if (!lbConfig.isValid()) { return HttpURLConnection.HTTP_NOT_ACCEPTABLE; - else + } else { return HttpURLConnection.HTTP_OK; + } } @Override public void neutronLoadBalancerPoolMemberCreated(NeutronLoadBalancerPoolMember neutronLBPoolMember) { - logger.debug("Neutron LB Pool Member Creation : {}", neutronLBPoolMember.toString()); + LOG.debug("Neutron LB Pool Member Creation : {}", neutronLBPoolMember.toString()); enqueueEvent(new NorthboundEvent(neutronLBPoolMember, Action.ADD)); } @@ -76,19 +79,22 @@ public class LBaaSPoolMemberHandler extends AbstractHandler private void doNeutronLoadBalancerPoolMemberCreate(NeutronLoadBalancerPoolMember neutronLBPoolMember) { Preconditions.checkNotNull(loadBalancerProvider); LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLBPoolMember); + final List nodes = + nodeCacheManager.getBridgeNodes(); if (lbConfig == null) { - logger.debug("Neutron LB configuration invalid for member {} ", neutronLBPoolMember.getPoolMemberAddress()); + LOG.debug("Neutron LB configuration invalid for member {} ", neutronLBPoolMember.getPoolMemberAddress()); } else if (lbConfig.getVip() == null) { - logger.debug("Neutron LB VIP not created yet for member {} ", neutronLBPoolMember.getPoolMemberID()); + LOG.debug("Neutron LB VIP not created yet for member {} ", neutronLBPoolMember.getID()); } else if (!lbConfig.isValid()) { - logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName()); - } else if (this.switchManager.getNodes().size() == 0) { - logger.debug("Noop with LB pool member {} creation because no nodes available.", neutronLBPoolMember.getPoolMemberID()); + LOG.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName()); + } else if (nodes.isEmpty()) { + LOG.debug("Noop with LB pool member {} creation because no nodes available.", neutronLBPoolMember.getID()); } else { - for (Node node: this.switchManager.getNodes()) + for (Node node : nodes) { loadBalancerProvider.programLoadBalancerPoolMemberRules(node, lbConfig, - lbConfig.getMembers().get(neutronLBPoolMember.getPoolMemberID()), Action.ADD); + lbConfig.getMembers().get(neutronLBPoolMember.getID()), Action.ADD); + } } } @@ -99,24 +105,25 @@ public class LBaaSPoolMemberHandler extends AbstractHandler @Override public void neutronLoadBalancerPoolMemberUpdated(NeutronLoadBalancerPoolMember neutronLBPoolMember) { - logger.debug("Neutron LB Pool Member Update : {}", neutronLBPoolMember.toString()); + LOG.debug("Neutron LB Pool Member Update : {}", neutronLBPoolMember.toString()); enqueueEvent(new NorthboundEvent(neutronLBPoolMember, Action.UPDATE)); } @Override public int canDeleteNeutronLoadBalancerPoolMember(NeutronLoadBalancerPoolMember neutronLBPoolMember) { LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLBPoolMember); - if (lbConfig == null) + if (lbConfig == null) { return HttpURLConnection.HTTP_BAD_REQUEST; - else if (!lbConfig.isValid()) + } else if (!lbConfig.isValid()) { return HttpURLConnection.HTTP_NOT_ACCEPTABLE; - else + } else { return HttpURLConnection.HTTP_OK; + } } @Override public void neutronLoadBalancerPoolMemberDeleted(NeutronLoadBalancerPoolMember neutronLBPoolMember) { - logger.debug("Neutron LB Pool Member Deletion : {}", neutronLBPoolMember.toString()); + LOG.debug("Neutron LB Pool Member Deletion : {}", neutronLBPoolMember.toString()); enqueueEvent(new NorthboundEvent(neutronLBPoolMember, Action.DELETE)); } @@ -124,22 +131,23 @@ public class LBaaSPoolMemberHandler extends AbstractHandler Preconditions.checkNotNull(loadBalancerProvider); LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLBPoolMember); + final List nodes = nodeCacheManager.getBridgeNodes(); if (lbConfig == null) { - logger.debug("Neutron LB configuration invalid for member {} ", neutronLBPoolMember.getPoolMemberAddress()); + LOG.debug("Neutron LB configuration invalid for member {} ", neutronLBPoolMember.getPoolMemberAddress()); } else if (lbConfig.getVip() == null) { - logger.debug("Neutron LB VIP not created yet for member {} ", neutronLBPoolMember.getPoolMemberID()); + LOG.debug("Neutron LB VIP not created yet for member {} ", neutronLBPoolMember.getID()); } else if (!lbConfig.isValid()) { - logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName()); - } else if (this.switchManager.getNodes().size() == 0) { - logger.debug("Noop with LB pool member {} deletion because no nodes available.", neutronLBPoolMember.getPoolMemberID()); + LOG.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName()); + } else if (nodes.isEmpty()) { + LOG.debug("Noop with LB pool member {} deletion because no nodes available.", neutronLBPoolMember.getID()); } else { /* As of now, deleting a member involves recomputing member indices. * This is best done through a complete update of the load balancer instance. */ LoadBalancerConfiguration newLBConfig = new LoadBalancerConfiguration(lbConfig); - newLBConfig.removeMember(neutronLBPoolMember.getPoolMemberID()); + newLBConfig.removeMember(neutronLBPoolMember.getID()); - for (Node node: this.switchManager.getNodes()) { + for (Node node : nodes) { loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE); loadBalancerProvider.programLoadBalancerRules(node, newLBConfig, Action.ADD); } @@ -154,9 +162,9 @@ public class LBaaSPoolMemberHandler extends AbstractHandler */ @Override public void processEvent(AbstractEvent abstractEvent) { - logger.debug("Processing Loadbalancer member event " + abstractEvent); + LOG.debug("Processing Loadbalancer member event {}", abstractEvent); if (!(abstractEvent instanceof NorthboundEvent)) { - logger.error("Unable to process abstract event " + abstractEvent); + LOG.error("Unable to process abstract event {}", abstractEvent); return; } NorthboundEvent ev = (NorthboundEvent) abstractEvent; @@ -172,10 +180,10 @@ public class LBaaSPoolMemberHandler extends AbstractHandler * Typical upgrade involves changing weights. Since weights are not * supported yet, updates are not supported either. TODO */ - logger.warn("Load balancer pool member update is not supported"); + LOG.warn("Load balancer pool member update is not supported"); break; default: - logger.warn("Unable to process event action " + ev.getAction()); + LOG.warn("Unable to process event action {}", ev.getAction()); break; } } @@ -185,29 +193,29 @@ public class LBaaSPoolMemberHandler extends AbstractHandler * configuration from the neutron LB cache based on member info */ public LoadBalancerConfiguration extractLBConfiguration(NeutronLoadBalancerPoolMember neutronLBPoolMember) { - String memberID = neutronLBPoolMember.getPoolMemberID(); + String memberID = neutronLBPoolMember.getID(); String memberIP = neutronLBPoolMember.getPoolMemberAddress(); String memberSubnetID = neutronLBPoolMember.getPoolMemberSubnetID(); Integer memberPort = neutronLBPoolMember.getPoolMemberProtoPort(); String memberPoolID = neutronLBPoolMember.getPoolID(); - String memberProtocol = null; if (memberSubnetID == null || memberID == null || memberPoolID == null) { - logger.debug("Neutron LB pool member details incomplete [id={}, pool_id={},subnet_id={}", + LOG.debug("Neutron LB pool member details incomplete [id={}, pool_id={},subnet_id={}", memberID, memberPoolID, memberSubnetID); return null; } - String memberMAC = NeutronCacheUtils.getMacAddress(neutronPortsCache, memberSubnetID, memberIP); + String memberMAC = NeutronCacheUtils.getMacAddress(neutronPortCache, memberSubnetID, memberIP); if (memberMAC == null) { - logger.debug("Neutron LB pool member {} MAC address unavailable", memberID); + LOG.debug("Neutron LB pool member {} MAC address unavailable", memberID); return null; } NeutronLoadBalancerPool neutronLBPool = neutronLBPoolCache.getNeutronLoadBalancerPool(memberPoolID); - memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol(); + String memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol(); if (!(memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_TCP) || memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTP) || - memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTPS))) + memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTPS))) { return null; + } String loadBalancerSubnetID=null, loadBalancerVip=null, loadBalancerName=null; for (NeutronLoadBalancer neutronLB: neutronLBCache.getAllNeutronLoadBalancers()) { @@ -229,7 +237,7 @@ public class LBaaSPoolMemberHandler extends AbstractHandler lbConfig.setProviderNetworkType(providerInfo.getKey()); lbConfig.setProviderSegmentationId(providerInfo.getValue()); } - lbConfig.setVmac(NeutronCacheUtils.getMacAddress(neutronPortsCache, loadBalancerSubnetID, loadBalancerVip)); + lbConfig.setVmac(NeutronCacheUtils.getMacAddress(neutronPortCache, loadBalancerSubnetID, loadBalancerVip)); /* Extract all other active members and include in LB config */ @@ -238,9 +246,10 @@ public class LBaaSPoolMemberHandler extends AbstractHandler Integer otherMemberPort; for (NeutronLoadBalancerPoolMember otherMember: neutronLBPool.getLoadBalancerPoolMembers()) { - otherMemberID = otherMember.getPoolMemberID(); - if (otherMemberID.equals(memberID)) + otherMemberID = otherMember.getID(); + if (otherMemberID.equals(memberID)) { continue; //skip + } otherMemberIP = otherMember.getPoolMemberAddress(); otherMemberAdminStateIsUp = otherMember.getPoolMemberAdminStateIsUp(); @@ -248,12 +257,12 @@ public class LBaaSPoolMemberHandler extends AbstractHandler otherMemberPort = otherMember.getPoolMemberProtoPort(); otherMemberProtocol = memberProtocol; - if (otherMemberIP == null || otherMemberSubnetID == null || otherMemberAdminStateIsUp == null) - continue; - else if (otherMemberAdminStateIsUp.booleanValue()) { - otherMemberMAC = NeutronCacheUtils.getMacAddress(neutronPortsCache, otherMemberSubnetID, otherMemberIP); - if (otherMemberMAC == null) + if (otherMemberIP != null && otherMemberSubnetID != null && otherMemberAdminStateIsUp != null && + otherMemberAdminStateIsUp) { + otherMemberMAC = NeutronCacheUtils.getMacAddress(neutronPortCache, otherMemberSubnetID, otherMemberIP); + if (otherMemberMAC == null) { continue; + } lbConfig.addMember(otherMemberID, otherMemberIP, otherMemberMAC, otherMemberProtocol, otherMemberPort); } } @@ -261,4 +270,32 @@ public class LBaaSPoolMemberHandler extends AbstractHandler lbConfig.addMember(memberID, memberIP, memberMAC, memberProtocol, memberPort); return lbConfig; } + + @Override + public void setDependencies(ServiceReference serviceReference) { + loadBalancerProvider = + (LoadBalancerProvider) ServiceHelper.getGlobalInstance(LoadBalancerProvider.class, this); + nodeCacheManager = + (NodeCacheManager) ServiceHelper.getGlobalInstance(NodeCacheManager.class, this); + eventDispatcher = + (EventDispatcher) ServiceHelper.getGlobalInstance(EventDispatcher.class, this); + eventDispatcher.eventHandlerAdded(serviceReference, this); + } + + @Override + public void setDependencies(Object impl) { + if (impl instanceof INeutronNetworkCRUD) { + neutronNetworkCache = (INeutronNetworkCRUD)impl; + } else if (impl instanceof INeutronPortCRUD) { + neutronPortCache = (INeutronPortCRUD)impl; + } else if (impl instanceof INeutronSubnetCRUD) { + neutronSubnetCache = (INeutronSubnetCRUD)impl; + } else if (impl instanceof INeutronLoadBalancerCRUD) { + neutronLBCache = (INeutronLoadBalancerCRUD)impl; + } else if (impl instanceof INeutronLoadBalancerPoolCRUD) { + neutronLBPoolCache = (INeutronLoadBalancerPoolCRUD)impl; + } else if (impl instanceof LoadBalancerProvider) { + loadBalancerProvider = (LoadBalancerProvider)impl; + } + } }