X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openstack%2Fnet-virt%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Fopenstack%2Fnetvirt%2FLBaaSHandler.java;h=e305fd340cea7ec7c2f12d89cd12cc793d82e2d1;hb=72fe035fa1234f1f5a068979e5d71ea94e901e2b;hp=3b6a3397f8b9b5745f3cdc326b719b063f9e6ddc;hpb=ecbee5a75ac881e62f144f064f0fc5cdd90377f8;p=netvirt.git diff --git a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSHandler.java b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSHandler.java index 3b6a3397f8..e305fd340c 100644 --- a/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSHandler.java +++ b/openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSHandler.java @@ -1,42 +1,41 @@ /* - * 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 org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerAware; -import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerCRUD; -import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD; -import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD; -import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD; -import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD; -import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancer; -import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool; -import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember; -import org.opendaylight.controller.sal.core.Node; -import org.opendaylight.controller.sal.core.NodeConnector; -import org.opendaylight.controller.sal.core.Property; -import org.opendaylight.controller.sal.core.UpdateType; -import org.opendaylight.controller.switchmanager.IInventoryListener; -import org.opendaylight.controller.switchmanager.ISwitchManager; +import java.net.HttpURLConnection; +import java.util.List; +import java.util.Map; + +import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancer; +import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancerPool; +import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronLoadBalancerPoolMember; +import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronLoadBalancerCRUD; +import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronLoadBalancerPoolCRUD; +import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronNetworkCRUD; +import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronPortCRUD; +import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronSubnetCRUD; +import org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.INeutronLoadBalancerAware; 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.NodeCacheListener; +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.List; -import java.util.Map; - /** * Handle requests for OpenStack Neutron v2.0 LBaaS API calls for /v2.0/loadbalancers. */ @@ -44,18 +43,17 @@ import java.util.Map; //TODO: Implement INeutronLoadBalancerHealthMonitorAware, INeutronLoadBalancerListenerAware, INeutronLoadBalancerPoolMemberAware, public class LBaaSHandler extends AbstractHandler - implements INeutronLoadBalancerAware, IInventoryListener { - - private static final Logger logger = LoggerFactory.getLogger(LBaaSHandler.class); + implements INeutronLoadBalancerAware, ConfigInterface, NodeCacheListener { + private static final Logger LOG = LoggerFactory.getLogger(LBaaSHandler.class); // The implementation for each of these services is resolved by the OSGi Service Manager private volatile INeutronLoadBalancerCRUD neutronLBCache; private volatile INeutronLoadBalancerPoolCRUD neutronLBPoolCache; - 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 canCreateNeutronLoadBalancer(NeutronLoadBalancer neutronLB) { @@ -65,7 +63,7 @@ public class LBaaSHandler extends AbstractHandler @Override public void neutronLoadBalancerCreated(NeutronLoadBalancer neutronLB) { - logger.debug("Neutron LB Creation : {}", neutronLB.toString()); + LOG.debug("Neutron LB Creation : {}", neutronLB.toString()); enqueueEvent(new NorthboundEvent(neutronLB, Action.ADD)); } @@ -77,13 +75,14 @@ public class LBaaSHandler extends AbstractHandler private void doNeutronLoadBalancerCreate(NeutronLoadBalancer neutronLB) { Preconditions.checkNotNull(loadBalancerProvider); LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLB); + final List nodes = nodeCacheManager.getBridgeNodes(); 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 {} creation because no nodes available.", lbConfig.getName()); + LOG.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName()); + } else if (nodes.isEmpty()) { + LOG.debug("Noop with LB {} creation because no nodes available.", lbConfig.getName()); } else { - for (Node node: this.switchManager.getNodes()) { + for (Node node : nodes) { loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD); } } @@ -97,7 +96,7 @@ public class LBaaSHandler extends AbstractHandler @Override public void neutronLoadBalancerUpdated(NeutronLoadBalancer neutronLB) { - logger.debug("Neutron LB Update : {}", neutronLB.toString()); + LOG.debug("Neutron LB Update : {}", neutronLB.toString()); enqueueEvent(new NorthboundEvent(neutronLB, Action.UPDATE)); } @@ -109,20 +108,21 @@ public class LBaaSHandler extends AbstractHandler @Override public void neutronLoadBalancerDeleted(NeutronLoadBalancer neutronLB) { - logger.debug("Neutron LB Deletion : {}", neutronLB.toString()); + LOG.debug("Neutron LB Deletion : {}", neutronLB.toString()); enqueueEvent(new NorthboundEvent(neutronLB, Action.DELETE)); } private void doNeutronLoadBalancerDelete(NeutronLoadBalancer neutronLB) { Preconditions.checkNotNull(loadBalancerProvider); LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLB); + final List nodes = nodeCacheManager.getBridgeNodes(); 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 {} deletion because no nodes available.", lbConfig.getName()); + LOG.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName()); + } else if (nodes.isEmpty()) { + LOG.debug("Noop with LB {} deletion because no nodes available.", lbConfig.getName()); } else { - for (Node node: this.switchManager.getNodes()) { + for (Node node : nodes) { loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE); } } @@ -136,9 +136,9 @@ public class LBaaSHandler extends AbstractHandler */ @Override public void processEvent(AbstractEvent abstractEvent) { - logger.debug("Processing Loadbalancer event " + abstractEvent); + LOG.debug("Processing Loadbalancer 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; @@ -158,7 +158,7 @@ public class LBaaSHandler extends AbstractHandler doNeutronLoadBalancerCreate(ev.getLoadBalancer()); break; default: - logger.warn("Unable to process event action " + ev.getAction()); + LOG.warn("Unable to process event action {}", ev.getAction()); break; } } @@ -166,6 +166,8 @@ public class LBaaSHandler extends AbstractHandler /** * Useful utility for extracting the loadbalancer instance * configuration from the neutron LB cache + * @param neutronLB neutron load balancer object + * @return returns load balancer configuration */ public LoadBalancerConfiguration extractLBConfiguration(NeutronLoadBalancer neutronLB) { String loadBalancerName = neutronLB.getLoadBalancerName(); @@ -173,20 +175,17 @@ public class LBaaSHandler extends AbstractHandler String loadBalancerSubnetID = neutronLB.getLoadBalancerVipSubnetID(); LoadBalancerConfiguration lbConfig = new LoadBalancerConfiguration(loadBalancerName, loadBalancerVip); - Map.Entry providerInfo = NeutronCacheUtils.getProviderInformation(neutronNetworkCache, neutronSubnetCache, loadBalancerSubnetID); + Map.Entry providerInfo = + NeutronCacheUtils.getProviderInformation(neutronNetworkCache, neutronSubnetCache, loadBalancerSubnetID); if (providerInfo != null) { lbConfig.setProviderNetworkType(providerInfo.getKey()); lbConfig.setProviderSegmentationId(providerInfo.getValue()); } - lbConfig.setVmac(NeutronCacheUtils.getMacAddress(neutronPortsCache, loadBalancerSubnetID, loadBalancerVip)); - - String memberID, memberIP, memberMAC, memberProtocol, memberSubnetID; - Integer memberPort; - Boolean memberAdminStateIsUp; + lbConfig.setVmac(NeutronCacheUtils.getMacAddress(neutronPortCache, loadBalancerSubnetID, loadBalancerVip)); for (NeutronLoadBalancerPool neutronLBPool: neutronLBPoolCache.getAllNeutronLoadBalancerPools()) { List members = neutronLBPool.getLoadBalancerPoolMembers(); - memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol(); + String memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol(); if (memberProtocol == null) { continue; } @@ -197,20 +196,18 @@ public class LBaaSHandler extends AbstractHandler continue; } for (NeutronLoadBalancerPoolMember neutronLBPoolMember: members) { - memberAdminStateIsUp = neutronLBPoolMember.getPoolMemberAdminStateIsUp(); - memberSubnetID = neutronLBPoolMember.getPoolMemberSubnetID(); - if (memberSubnetID == null || memberAdminStateIsUp == null) { - continue; - } - else if (memberSubnetID.equals(loadBalancerSubnetID) && memberAdminStateIsUp.booleanValue()) { - memberID = neutronLBPoolMember.getPoolMemberID(); - memberIP = neutronLBPoolMember.getPoolMemberAddress(); - memberPort = neutronLBPoolMember.getPoolMemberProtoPort(); - if (memberSubnetID == null || memberID == null || memberIP == null || memberPort == null) { - logger.debug("Neutron LB pool member details incomplete: {}", neutronLBPoolMember); + Boolean memberAdminStateIsUp = neutronLBPoolMember.getPoolMemberAdminStateIsUp(); + String memberSubnetID = neutronLBPoolMember.getPoolMemberSubnetID(); + if (memberSubnetID != null && memberAdminStateIsUp != null && + memberSubnetID.equals(loadBalancerSubnetID) && memberAdminStateIsUp) { + String memberID = neutronLBPoolMember.getID(); + String memberIP = neutronLBPoolMember.getPoolMemberAddress(); + Integer memberPort = neutronLBPoolMember.getPoolMemberProtoPort(); + if (memberID == null || memberIP == null || memberPort == null) { + LOG.debug("Neutron LB pool member details incomplete: {}", neutronLBPoolMember); continue; } - memberMAC = NeutronCacheUtils.getMacAddress(neutronPortsCache, memberSubnetID, memberIP); + String memberMAC = NeutronCacheUtils.getMacAddress(neutronPortCache, memberSubnetID, memberIP); if (memberMAC == null) { continue; } @@ -227,16 +224,16 @@ public class LBaaSHandler extends AbstractHandler * when a node is added, and only for the LB instances (and not individual members). */ @Override - public void notifyNode(Node node, UpdateType type, Map propMap) { - logger.debug("notifyNode: Node {} update {} from Controller's inventory Service", node, type); + public void notifyNode(Node node, Action type) { + LOG.debug("notifyNode: Node {} update {} from Controller's inventory Service", node, type); Preconditions.checkNotNull(loadBalancerProvider); for (NeutronLoadBalancer neutronLB: neutronLBCache.getAllNeutronLoadBalancers()) { LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLB); if (!lbConfig.isValid()) { - logger.debug("Neutron LB configuration invalid for {} ", lbConfig.getName()); + LOG.debug("Neutron LB configuration invalid for {} ", lbConfig.getName()); } else { - if (type.equals(UpdateType.ADDED)) { + if (type.equals(Action.ADD)) { loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD); /* When node disappears, we do nothing for now. Making a call to @@ -246,16 +243,37 @@ public class LBaaSHandler extends AbstractHandler */ //(type.equals(UpdateType.REMOVED) || type.equals(UpdateType.CHANGED)) - } else { - continue; } } } } @Override - public void notifyNodeConnector(NodeConnector arg0, UpdateType arg1, - Map arg2) { - //NOOP + public void setDependencies(ServiceReference serviceReference) { + loadBalancerProvider = + (LoadBalancerProvider) ServiceHelper.getGlobalInstance(LoadBalancerProvider.class, this); + nodeCacheManager = + (NodeCacheManager) ServiceHelper.getGlobalInstance(NodeCacheManager.class, this); + nodeCacheManager.cacheListenerAdded(serviceReference, 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; + } } }