Removing ad-sal inventory listener and switchmanager from lbaas.
With this change, lbaas handler will not be getting notifyNode() callbacks.
That will be addressed on part 2.
Change-Id: I56d37877577320030cb871691e244a725f142152
Signed-off-by: Flavio Fernandes <ffernand@redhat.com>
<groupId>org.opendaylight.neutron</groupId>
<artifactId>neutron-spi</artifactId>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal</artifactId>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-common-api</artifactId>
import java.util.List;
import java.util.Map;
-import org.opendaylight.controller.sal.core.Node;
-import org.opendaylight.controller.sal.core.Node.NodeIDType;
import org.opendaylight.ovsdb.openstack.netvirt.NetworkHandler;
import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration;
import org.opendaylight.ovsdb.plugin.api.StatusCode;
import org.opendaylight.ovsdb.utils.mdsal.openflow.ActionUtils;
import org.opendaylight.ovsdb.utils.mdsal.openflow.MatchUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
logger.error("LB config is invalid: {}", lbConfig);
return new Status(StatusCode.BADREQUEST);
}
- if (!node.getType().equals(NodeIDType.OPENFLOW)) {
- logger.trace("Ignoring non-OpenFlow node {} from flow programming", node);
- return new Status(StatusCode.BADREQUEST);
- }
logger.debug("Performing {} rules for member {} with index {} on LB with VIP {} and total members {}",
action, member.getIP(), member.getIndex(), lbConfig.getVip(), lbConfig.getMembers().size());
NodeBuilder nodeBuilder = new NodeBuilder();
- nodeBuilder.setId(new NodeId(Constants.OPENFLOW_NODE_PREFIX
- + String.valueOf(node.getID())));
+ nodeBuilder.setId(new NodeId(Constants.OPENFLOW_NODE_PREFIX + node.getId().getValue()));
nodeBuilder.setKey(new NodeKey(nodeBuilder.getId()));
//Update the multipath rule
logger.error("LB config is invalid: {}", lbConfig);
return new Status(StatusCode.BADREQUEST);
}
- if (!node.getType().equals(NodeIDType.OPENFLOW)) {
- logger.trace("Ignoring non-OpenFlow node {} from flow programming", node);
- return new Status(StatusCode.BADREQUEST);
- }
logger.debug("Performing {} rules for VIP {} and {} members", action, lbConfig.getVip(), lbConfig.getMembers().size());
NodeBuilder nodeBuilder = new NodeBuilder();
- nodeBuilder.setId(new NodeId(Constants.OPENFLOW_NODE_PREFIX + String.valueOf(node.getID())));
+ nodeBuilder.setId(new NodeId(Constants.OPENFLOW_NODE_PREFIX + node.getId().getValue()));
nodeBuilder.setKey(new NodeKey(nodeBuilder.getId()));
if (action.equals(org.opendaylight.ovsdb.openstack.netvirt.api.Action.ADD)) {
<groupId>org.opendaylight.neutron</groupId>
<artifactId>neutron-spi</artifactId>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>switchmanager</artifactId>
- </dependency>
<dependency>
<groupId>org.opendaylight.ovsdb</groupId>
<artifactId>library</artifactId>
import org.opendaylight.neutron.spi.INeutronSecurityRuleAware;
import org.opendaylight.neutron.spi.INeutronSubnetAware;
import org.opendaylight.neutron.spi.INeutronSubnetCRUD;
-import org.opendaylight.controller.switchmanager.IInventoryListener;
-import org.opendaylight.controller.switchmanager.ISwitchManager;
import org.opendaylight.ovsdb.openstack.netvirt.api.ArpProvider;
import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
manager.add(createComponent()
.setInterface(new String[]{INeutronLoadBalancerAware.class.getName(),
- IInventoryListener.class.getName(), AbstractHandler.class.getName()},
+ AbstractHandler.class.getName()},
lbaasHandlerProperties)
.setImplementation(LBaaSHandler.class)
.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true))
.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
- .add(createServiceDependency().setService(ISwitchManager.class).setRequired(true))
.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
- .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true)));
+ .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
+ .add(createServiceDependency().setService(NodeCacheManager.class).setRequired(true)));
Dictionary<String, Object> lbaasPoolHandlerProperties = new Hashtable<>();
lbaasPoolHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
.add(createServiceDependency().setService(INeutronPortCRUD.class).setRequired(true))
.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
- .add(createServiceDependency().setService(ISwitchManager.class).setRequired(true))
.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
- .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true)));
+ .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
+ .add(createServiceDependency().setService(NodeCacheManager.class).setRequired(true)));
Dictionary<String, Object> lbaasPoolMemberHandlerProperties = new Hashtable<>();
lbaasPoolMemberHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
AbstractEvent.HandlerType.NEUTRON_LOAD_BALANCER_POOL_MEMBER);
manager.add(createComponent()
- .setInterface(new String[] {INeutronLoadBalancerPoolMemberAware.class.getName(),
+ .setInterface(new String[]{INeutronLoadBalancerPoolMemberAware.class.getName(),
AbstractHandler.class.getName()}, lbaasPoolMemberHandlerProperties)
.setImplementation(LBaaSPoolMemberHandler.class)
.add(createServiceDependency().setService(EventDispatcher.class).setRequired(true))
.add(createServiceDependency().setService(INeutronLoadBalancerCRUD.class).setRequired(true))
.add(createServiceDependency().setService(INeutronLoadBalancerPoolCRUD.class).setRequired(true))
.add(createServiceDependency().setService(LoadBalancerProvider.class).setRequired(true))
- .add(createServiceDependency().setService(ISwitchManager.class).setRequired(true))
.add(createServiceDependency().setService(INeutronNetworkCRUD.class).setRequired(true))
- .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true)));
+ .add(createServiceDependency().setService(INeutronSubnetCRUD.class).setRequired(true))
+ .add(createServiceDependency().setService(NodeCacheManager.class).setRequired(true)));
Dictionary<String, Object> portSecurityHandlerProperties = new Hashtable<>();
portSecurityHandlerProperties.put(Constants.EVENT_HANDLER_TYPE_PROPERTY,
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.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 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.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//TODO: Implement INeutronLoadBalancerHealthMonitorAware, INeutronLoadBalancerListenerAware, INeutronLoadBalancerPoolMemberAware,
public class LBaaSHandler extends AbstractHandler
- implements INeutronLoadBalancerAware, IInventoryListener {
+ implements INeutronLoadBalancerAware {
private static final Logger logger = LoggerFactory.getLogger(LBaaSHandler.class);
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) {
private void doNeutronLoadBalancerCreate(NeutronLoadBalancer neutronLB) {
Preconditions.checkNotNull(loadBalancerProvider);
LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLB);
+ final List<Node> nodes = nodeCacheManager.getNodes();
if (!lbConfig.isValid()) {
logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
- } else if (this.switchManager.getNodes().size() == 0) {
+ } else if (nodes.isEmpty()) {
logger.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);
}
}
private void doNeutronLoadBalancerDelete(NeutronLoadBalancer neutronLB) {
Preconditions.checkNotNull(loadBalancerProvider);
LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLB);
+ final List<Node> nodes = nodeCacheManager.getNodes();
if (!lbConfig.isValid()) {
logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
- } else if (this.switchManager.getNodes().size() == 0) {
+ } else if (nodes.isEmpty()) {
logger.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);
}
}
}
/**
+ FIXME!
+
* On the addition of a new node, we iterate through all existing loadbalancer
* instances and program the node for all of them. It is sufficient to do that only
* when a node is added, and only for the LB instances (and not individual members).
- */
+ *
@Override
public void notifyNode(Node node, UpdateType type, Map<String, Property> propMap) {
logger.debug("notifyNode: Node {} update {} from Controller's inventory Service", node, type);
if (type.equals(UpdateType.ADDED)) {
loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD);
- /* When node disappears, we do nothing for now. Making a call to
+ * When node disappears, we do nothing for now. Making a call to
* loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE)
* can lead to TransactionCommitFailedException. Similarly when node is changed,
* because of remove followed by add, we do nothing.
- */
+ *
//(type.equals(UpdateType.REMOVED) || type.equals(UpdateType.CHANGED))
} else {
}
}
}
+ */
- @Override
- public void notifyNodeConnector(NodeConnector arg0, UpdateType arg1,
- Map<String, Property> arg2) {
- //NOOP
- }
}
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.LoadBalancerConfiguration;
import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private volatile INeutronNetworkCRUD neutronNetworkCache;
private volatile INeutronSubnetCRUD neutronSubnetCache;
private volatile LoadBalancerProvider loadBalancerProvider;
- private volatile ISwitchManager switchManager;
+ private volatile NodeCacheManager nodeCacheManager;
@Override
public int canCreateNeutronLoadBalancerPool(NeutronLoadBalancerPool neutronLBPool) {
private void doNeutronLoadBalancerPoolCreate(NeutronLoadBalancerPool neutronLBPool) {
Preconditions.checkNotNull(loadBalancerProvider);
List<LoadBalancerConfiguration> lbConfigList = extractLBConfiguration(neutronLBPool);
+ final List<Node> nodes = nodeCacheManager.getNodes();
if (lbConfigList == null) {
logger.debug("Neutron LB configuration invalid for pool {} ", neutronLBPool.getLoadBalancerPoolID());
} else if (lbConfigList.size() == 0) {
logger.debug("No Neutron LB VIP not created yet for pool {} ", neutronLBPool.getLoadBalancerPoolID());
- } else if (this.switchManager.getNodes().size() == 0) {
+ } else if (nodes.isEmpty()) {
logger.debug("Noop with LB pool {} creation because no nodes available.", neutronLBPool.getLoadBalancerPoolID());
} else {
for (LoadBalancerConfiguration lbConfig: lbConfigList) {
logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
continue;
} else {
- for (Node node: this.switchManager.getNodes()) {
+ for (Node node : nodes) {
loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.ADD);
}
}
Preconditions.checkNotNull(loadBalancerProvider);
List<LoadBalancerConfiguration> lbConfigList = extractLBConfiguration(neutronLBPool);
+ final List<Node> nodes = nodeCacheManager.getNodes();
if (lbConfigList == null) {
logger.debug("Neutron LB configuration invalid for pool {} ", neutronLBPool.getLoadBalancerPoolID());
} else if (lbConfigList.size() == 0) {
logger.debug("No Neutron LB VIP not created yet for pool {} ", neutronLBPool.getLoadBalancerPoolID());
- } else if (this.switchManager.getNodes().size() == 0) {
+ } else if (nodes.isEmpty()) {
logger.debug("Noop with LB pool {} deletion because no nodes available.", neutronLBPool.getLoadBalancerPoolID());
} else {
for (LoadBalancerConfiguration lbConfig: lbConfigList) {
logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
continue;
} else {
- for (Node node: this.switchManager.getNodes()) {
+ for (Node node : nodes) {
loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE);
}
}
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.LoadBalancerConfiguration;
import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerProvider;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
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;
/**
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) {
private void doNeutronLoadBalancerPoolMemberCreate(NeutronLoadBalancerPoolMember neutronLBPoolMember) {
Preconditions.checkNotNull(loadBalancerProvider);
LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLBPoolMember);
+ final List<Node> nodes = nodeCacheManager.getNodes();
if (lbConfig == null) {
logger.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());
} else if (!lbConfig.isValid()) {
logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
- } else if (this.switchManager.getNodes().size() == 0) {
+ } else if (nodes.isEmpty()) {
logger.debug("Noop with LB pool member {} creation because no nodes available.", neutronLBPoolMember.getPoolMemberID());
} else {
- for (Node node: this.switchManager.getNodes())
+ for (Node node : nodes)
loadBalancerProvider.programLoadBalancerPoolMemberRules(node,
lbConfig,
lbConfig.getMembers().get(neutronLBPoolMember.getPoolMemberID()), Action.ADD);
Preconditions.checkNotNull(loadBalancerProvider);
LoadBalancerConfiguration lbConfig = extractLBConfiguration(neutronLBPoolMember);
+ final List<Node> nodes = nodeCacheManager.getNodes();
if (lbConfig == null) {
logger.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());
} else if (!lbConfig.isValid()) {
logger.debug("Neutron LB pool configuration invalid for {} ", lbConfig.getName());
- } else if (this.switchManager.getNodes().size() == 0) {
+ } else if (nodes.isEmpty()) {
logger.debug("Noop with LB pool member {} deletion because no nodes available.", neutronLBPoolMember.getPoolMemberID());
} else {
/* As of now, deleting a member involves recomputing member indices.
LoadBalancerConfiguration newLBConfig = new LoadBalancerConfiguration(lbConfig);
newLBConfig.removeMember(neutronLBPoolMember.getPoolMemberID());
- for (Node node: this.switchManager.getNodes()) {
+ for (Node node : nodes) {
loadBalancerProvider.programLoadBalancerRules(node, lbConfig, Action.DELETE);
loadBalancerProvider.programLoadBalancerRules(node, newLBConfig, Action.ADD);
}
package org.opendaylight.ovsdb.openstack.netvirt.api;
-import org.opendaylight.controller.sal.core.Node;
import org.opendaylight.ovsdb.plugin.api.Status;
import org.opendaylight.ovsdb.openstack.netvirt.api.LoadBalancerConfiguration.LoadBalancerPoolMember;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
/**
* This interface allows load-balancer flows to be written to nodes
private void _processNodeAdded(Node node) {
nodeCache.add(node);
- logger.info("XXXX added node {}. cache is now {}", node, nodeCache); // TODO: debug, remove
}
private void _processNodeRemoved(Node node) {
nodeCache.remove(node);
- logger.info("XXXX removed node {}. cache is now {}", node, nodeCache); // TODO: debug, remove
}
/**