<forwarding-manager-settings>
<stale-marking-enabled>false</stale-marking-enabled>
</forwarding-manager-settings>
+ <entity-ownership-service>
+ <type xmlns:entity-ownership="urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service">entity-ownership:entity-ownership-service</type>
+ <name>entity-ownership-service</name>
+ </entity-ownership-service>
</module>
</modules>
</data>
<capability>
urn:opendaylight:table:service?module=sal-table&revision=2013-10-26
</capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:config:distributed-entity-ownership-service?module=distributed-entity-ownership-service&revision=2015-08-10
+ </capability>
</required-capabilities>
</snapshot>
LOG.info("FRM module initialization.");
final ForwardingRulesManagerConfig config = readConfig();
final ForwardingRulesManagerImpl forwardingrulessManagerProvider =
- new ForwardingRulesManagerImpl(getDataBrokerDependency(), getRpcRegistryDependency(), config);
+ new ForwardingRulesManagerImpl(getDataBrokerDependency(), getRpcRegistryDependency(), config, getEntityOwnershipServiceDependency());
forwardingrulessManagerProvider.start();
LOG.info("FRM module started successfully.");
return new AutoCloseable() {
package org.opendaylight.openflowplugin.applications.frm;
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
*
* Created: Aug 26, 2014
*/
-public interface FlowNodeReconciliation extends DataChangeListener, AutoCloseable {
+public interface FlowNodeReconciliation extends ClusteredDataChangeListener, AutoCloseable {
/**
* Method contains Node registration to {@link ForwardingRulesManager} functionality
package org.opendaylight.openflowplugin.applications.frm;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
*
* Created: Aug 25, 2014
*/
-public interface ForwardingRulesCommiter <D extends DataObject> extends AutoCloseable, DataTreeChangeListener<D> {
+public interface ForwardingRulesCommiter <D extends DataObject> extends AutoCloseable, ClusteredDataTreeChangeListener<D> {
/**
* Method removes DataObject which is identified by InstanceIdentifier
*/
public ForwardingRulesManagerConfig getConfiguration();
+ /**
+ * Method checks if *this* instance of openflowplugin is owner of
+ * the given openflow node.
+ * @return True if owner, else false
+ */
+ public boolean isNodeOwner(InstanceIdentifier<FlowCapableNode> ident);
+
}
// node from operational data store and if it's present it calls flowNodeConnected to explictly
// trigger the event of new node connected.
+ if(!provider.isNodeOwner(nodeIdent)) { return false; }
+
if (!provider.isNodeActive(nodeIdent)) {
if (provider.checkNodeInOperationalDataStore(nodeIdent)) {
provider.getFlowNodeReconciliation().flowNodeConnected(nodeIdent);
public void flowNodeConnected(InstanceIdentifier<FlowCapableNode> connectedNode) {
if ( ! provider.isNodeActive(connectedNode)) {
provider.registrateNewNode(connectedNode);
+
+ if(!provider.isNodeOwner(connectedNode)) { return; }
+
if (provider.getConfiguration().isStaleMarkingEnabled()) {
LOG.info("Stale-Marking is ENABLED and proceeding with deletion of stale-marked entities on switch {}",
connectedNode.toString());
import com.google.common.util.concurrent.CheckedFuture;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
private FlowNodeReconciliation nodeListener;
private final ForwardingRulesManagerConfig forwardingRulesManagerConfig;
+ private final EntityOwnershipService entityOwnershipService;
public ForwardingRulesManagerImpl(final DataBroker dataBroker,
final RpcConsumerRegistry rpcRegistry,
- final ForwardingRulesManagerConfig config) {
+ final ForwardingRulesManagerConfig config,
+ final EntityOwnershipService eos) {
this.dataService = Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!");
this.forwardingRulesManagerConfig = Preconditions.checkNotNull(config, "Configuration for FRM cannot be null");
+ this.entityOwnershipService = Preconditions.checkNotNull(eos, "EntityOwnership service can not be null");
Preconditions.checkArgument(rpcRegistry != null, "RpcConsumerRegistry can not be null !");
public ForwardingRulesManagerConfig getConfiguration() {
return forwardingRulesManagerConfig;
}
+
+ @Override
+ public boolean isNodeOwner(InstanceIdentifier<FlowCapableNode> ident) {
+ NodeId nodeId = ident.firstKeyOf(Node.class).getId();
+ Entity entity = new Entity("openflow", nodeId.getValue());
+ Optional<EntityOwnershipState> eState = this.entityOwnershipService.getOwnershipState(entity);
+ if(eState.isPresent()) {
+ return eState.get().isOwner();
+ }
+ return false;
+ }
}
import config { prefix config; revision-date 2013-04-05; }
import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
+ import opendaylight-entity-ownership-service { prefix eos; }
description
"This module contains the base YANG definitions for
}
+ container entity-ownership-service {
+ uses config:service-ref {
+ refine type {
+ mandatory true;
+ config:required-identity eos:entity-ownership-service;
+ }
+ }
+ }
+
}
}
import org.junit.Test;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import test.mock.util.EntityOwnershipServiceMock;
import test.mock.util.FRMTest;
import test.mock.util.RpcProviderRegistryMock;
import test.mock.util.SalFlowServiceMock;
public class FlowListenerTest extends FRMTest {
RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+ EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
NodeKey s1Key = new NodeKey(new NodeId("S1"));
TableKey tableKey = new TableKey((short) 2);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(),
+ eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(),
+ eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(),
+ eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(),
+ eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
import org.junit.Test;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import test.mock.util.EntityOwnershipServiceMock;
import test.mock.util.FRMTest;
import test.mock.util.RpcProviderRegistryMock;
import test.mock.util.SalGroupServiceMock;
public class GroupListenerTest extends FRMTest {
RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+ EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
NodeKey s1Key = new NodeKey(new NodeId("S1"));
@Test
public void addTwoGroupsTest() throws Exception {
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(getDataBroker(), rpcProviderRegistryMock,
- getConfig());
+ getConfig(), eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(), eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(), eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
import org.junit.Test;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import test.mock.util.EntityOwnershipServiceMock;
import test.mock.util.FRMTest;
import test.mock.util.RpcProviderRegistryMock;
import test.mock.util.SalMeterServiceMock;
public class MeterListenerTest extends FRMTest {
RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+ EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
NodeKey s1Key = new NodeKey(new NodeId("S1"));
@Test
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(), eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(), eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(), eos);
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.openflowplugin.applications.frm.impl.ForwardingRulesManagerImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import test.mock.util.EntityOwnershipServiceMock;
import test.mock.util.FRMTest;
import test.mock.util.RpcProviderRegistryMock;
public class NodeListenerTest extends FRMTest {
RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+ EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
NodeKey s1Key = new NodeKey(new NodeId("S1"));
@Test
try (ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig())) {
+ getConfig(),
+ eos)) {
forwardingRulesManager.start();
addFlowCapableNode(s1Key);
*/
package test.mock;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInput;
+import test.mock.util.EntityOwnershipServiceMock;
import test.mock.util.SalTableServiceMock;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
public class TableFeaturesListenerTest extends FRMTest {
RpcProviderRegistry rpcProviderRegistryMock = new RpcProviderRegistryMock();
+ EntityOwnershipService eos = new EntityOwnershipServiceMock();
+
@Test
public void updateFlowTest() throws Exception {
ForwardingRulesManagerImpl forwardingRulesManager = new ForwardingRulesManagerImpl(
getDataBroker(),
rpcProviderRegistryMock,
- getConfig());
+ getConfig(),
+ eos);
forwardingRulesManager.start();
addTable(tableKey, s1Key);
--- /dev/null
+/*
+ * Copyright (c) 2016 Brocade Communications Systems, Inc. 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
+ */
+
+package test.mock.util;
+
+import com.google.common.base.Optional;
+import org.opendaylight.controller.md.sal.common.api.clustering.*;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Created by vishnoianil on 2/4/16.
+ */
+public class EntityOwnershipServiceMock implements EntityOwnershipService {
+ @Override
+ public EntityOwnershipCandidateRegistration registerCandidate(@Nonnull Entity entity) throws CandidateAlreadyRegisteredException {
+ return null;
+ }
+
+ @Override
+ public EntityOwnershipListenerRegistration registerListener(@Nonnull String entityType, @Nonnull EntityOwnershipListener listener) {
+ return null;
+ }
+
+ @Override
+ public Optional<EntityOwnershipState> getOwnershipState(@Nonnull Entity forEntity) {
+ return Optional.of(new EntityOwnershipState(true, true));
+ }
+
+ @Override
+ public boolean isCandidateRegistered(@Nonnull Entity entity) {
+ return false;
+ }
+}