Merge 'topic/master/net-virt-networking' to 'master' 01/32301/1
authorAnil Vishnoi <vishnoianil@gmail.com>
Sat, 9 Jan 2016 00:15:19 +0000 (16:15 -0800)
committerAnil Vishnoi <vishnoianil@gmail.com>
Sat, 9 Jan 2016 00:16:22 +0000 (16:16 -0800)
Squashed commit of the following:

commit 11abd792240e8df1a51a012ba1b92dd7c920c38b
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Fri Jan 8 16:11:50 2016 -0800

    Revert to old openflowplugin

    Change-Id: Icaa1fa04fcc319b128e6f1ee0d58b940385812f3
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 83e3dab5337d20168280ba6018ed0b811c713314
Merge: 6801901 9484b0d
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Mon Jan 4 17:14:55 2016 -0800

    Merge branch 'master' into topic/master/net-virt-clustering

    Change-Id: I4aa7a2d4d10df28f15edcedf5e7a74f16a439ab5
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 68019016506b78adef37f7c7764c0622f5bfb61e
Merge: 23295db 9b3005b
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Sat Jan 2 13:19:59 2016 -0800

    Merge branch 'master' into topic/master/net-virt-clustering

    Change-Id: I29e864f4c09862dc8e41110a77479e6ee6d0632a
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 23295dbb6f26fc0b24521949a14743ddad6d45fb
Merge: a1c8e2b eced0bd
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Tue Dec 29 15:52:23 2015 -0800

    Merge branch 'master' into topic/master/net-virt-clustering

    Change-Id: Ib465c8f20f200d407caaa9440bbf635d72776fe1
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit a1c8e2b2a9738ae946731fb4d111f152057d3b71
Author: Flavio Fernandes <ffernand@redhat.com>
Date:   Tue Dec 22 15:39:00 2015 -0500

    Remove extra return statement.

    When Flow id caches that were no longer needed
    were removed from code, a lonely return statement
    in the router interface remove code path was
    left behind.

    Gerrit: https://git.opendaylight.org/gerrit/#/c/29204/

    Change-Id: Ic978953ab65da91baf543e21ea86333b4a9ee5ca
    Reference: Ic2acced7a9a006e6e04afba6fea22aaf0620f134
Signed-off-by: Flavio Fernandes <ffernand@redhat.com>
commit 00de61c7b19937c5b48c1af4d50ae73cdb92b809
Author: Isaku Yamahata <isaku.yamahata@intel.com>
Date:   Tue Dec 15 21:23:49 2015 -0800

    Bug 4789 - allowed address pair doesn't have port id

    So getPortId, setPortId methods aren't defined.
    This is the ovsdb part of Bug 4789.

    Change-Id: Id9ad4762b5ed92c5b84e6fab1d7c5135782ca528
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    (cherry picked from commit 2065f152079fb96f494518efc2b46f4c77db181d)

commit 08ba6afc0ae524716656e5e926bf34675a2e0960
Merge: 4b909d1 9bbb7db
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Mon Dec 14 13:53:12 2015 -0800

    Merge branch 'master' into topic/master/net-virt-clustering

    Conflicts:
     features/ovsdb/pom.xml
     features/src/main/features/features.xml
     openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/AbstractServiceInstance.java
     openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtils.java
     openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtilsTest.java

    Change-Id: I68702767c0fcae8cb9721805e524d3ecb7889ed4
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 4b909d144f06d4924792c42f918e1f0ce1a86137
Merge: ddbb2eb 5483b28
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Fri Nov 20 00:34:30 2015 +0530

    Merge branch 'master' into topic/master/net-virt-clustering

    Conflicts:
     features/ovsdb/src/main/features/features.xml

    Change-Id: Ib614363bab8752913d430a86b420ab104010243c
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit ddbb2eb2a22f271bf57e7470ef1420bd2301193d
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Thu Nov 19 04:50:03 2015 +0530

    Switch to Alternate design of openflowplugin,
    because alternate design supports clustering

    Change-Id: Ia4e14bef316b2576298f013032232dc1e5d64984
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 13264eda1627d01fc6090008e326bcb91bb5e8a8
Merge: 99b5553 c66b0ff
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Tue Nov 17 01:05:38 2015 +0530

    Merge branch 'master' into topic/master/net-virt-clustering

    Conflicts:
     openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclServiceTest.java
     openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtils.java
     openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/MdsalUtilsTest.java

    Change-Id: I587fc39e1af228c8cff968ab2e5004285ae5bae2
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 99b5553d84f642d80890546643543a65a262645a
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Wed Oct 28 01:52:33 2015 +0530

    Net-Virt Clustering : Enabled remote notifications
    and modify the data store write methods to write only if
    the instance is master instance

    Change-Id: Icee31e0ea829f40bd64a072d840d03f8749c803f
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 1e4144b81f47fad768141e7504ce7c2fb1e5f13f
Merge: 218e79b dc9f403
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Tue Oct 27 03:56:39 2015 +0530

    Merge branch 'master' into topic/master/net-virt-clustering

    Change-Id: I1cb9813a044d16dcfa152f6322271bcafe6bfd5c
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit 218e79b7bcf213ce64d2b55ff19e208015798aaf
Merge: f91f1a3 6577da8
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Mon Oct 26 22:02:45 2015 +0530

    Merge branch 'master' into topic/master/net-virt-clustering

    Conflicts:
     openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/NetvirtProvidersProvider.java

    Change-Id: Ibc577f41a59c24ddc2b4cdb94b4a393f961e0950
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit f91f1a3883bf5a0d8a004e8d5141d2bdffd4aaa3
Merge: fa8fe2a 342c8be
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Sat Oct 17 02:18:56 2015 +0530

    Merge branch 'master' into topic/master/net-virt-clustering

    Conflicts:
     openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclServiceTest.java
     openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/IngressAclServiceTest.java
     openstack/net-virt-sfc/features/pom.xml
     openstack/net-virt-sfc/features/production/src/main/features/features.xml
     openstack/net-virt-sfc/impl/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/sfc/NetvirtSfcProvider.java
     southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/AbstractTransactionCommandTest.java
     southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/OpenVSwitchUpdateCommandTest.java
     southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbBridgeRemovedCommandTest.java
     southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbBridgeUpdateCommandTest.java
     southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbControllerRemovedCommandTest.java

    Change-Id: I3cbe7ef4b0064bf07a489f2561630c4f669695fe
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
commit fa8fe2a789c741b2026e2946f08bf1e489db4794
Author: Flavio Fernandes <ffernand@redhat.com>
Date:   Thu Oct 8 16:17:01 2015 -0400

    Wire EntityOwnership service into OVSDB NetVirt (part 2)

    Change-Id: I222177c38ab8efeccd63924842d166633e88f606
Signed-off-by: Flavio Fernandes <ffernand@redhat.com>
    (cherry picked from commit 5239ecfcf1279e72d6d2446d4c88522461b28b1a)

commit a93e284c51d476a1b3b8d4dd9ec532e0caa1c36f
Author: Flavio Fernandes <ffernand@redhat.com>
Date:   Thu Oct 8 13:35:40 2015 -0400

    Wire EntityOwnership service into OVSDB NetVirt

    Implemented logic for netvirt provider to participate in entityOwnership
    service.

    Change-Id: I8f014591099a952d49584eede07624f37492c27d
Signed-off-by: Flavio Fernandes <ffernand@redhat.com>
    (cherry picked from commit e43de9f997323cfe804857a0f68a01d95641fbc5)

commit e74ec764cc75b295dc3e5babd36f44bb5d930b04
Author: Anil Vishnoi <vishnoianil@gmail.com>
Date:   Thu Oct 8 20:03:36 2015 +0530

    Merge 'master' branch to 'topic/master/net-virt-clustering'
    Squashed commit of the following:

    commit 0cbdadc0af848566e34e66ae7a7ac952fd935561
    Merge: b02c878 cfcc6d4
    Author: Sam Hague <shague@redhat.com>
    Date:   Wed Oct 7 22:42:02 2015 +0000

        Merge "UT for southbound/transactions/md - set 2"

    commit b02c8783853d9308eb704ed7b2ca26d4d6d96933
    Merge: b063584 bf288f9
    Author: Flavio Fernandes <ffernand@redhat.com>
    Date:   Wed Oct 7 21:23:35 2015 +0000

        Merge "If controller joins the cluster late, and the owner of the device is already decided, EntityOwnershipService won't notify new candidate that register for ownership. Adding a proactive check on the ownership state of the device, so if it's already owned, adding the connection instances in the connection cache."

    commit cfcc6d4b4288e44bdbcb9de4cf5ac0de97f741f6
    Author: rpujar <rpujar@inocybe.com>
    Date:   Wed Oct 7 16:29:28 2015 -0400

        UT for southbound/transactions/md - set 2

        4. OvsdbBridgeUpdateCommand.java
        5. OvsdbControllerRemovedCommand.java

        Change-Id: Idc469c08351b1e98129dd9e798c07a660d782709
Signed-off-by: rpujar <rpujar@inocybe.com>
    commit b063584cc53ebf9c072bcb3171ef6d68bb727a8e
    Author: Sam Hague <shague@redhat.com>
    Date:   Wed Oct 7 13:22:54 2015 -0400

        Cleanup netvirtsfc poms

        Change-Id: I6c1a3aa44c75f98d226dcf23dd514a31f5df5d2a
Signed-off-by: Sam Hague <shague@redhat.com>
    commit f5382918beb8096bfb68acf73084a3083c2e51d7
    Author: Sam Hague <shague@redhat.com>
    Date:   Wed Oct 7 13:22:13 2015 -0400

        Bump mdsal-utils version to match other bundles

        Change-Id: I6c5166ae27fd2f055217be95630cbc482261bb61
Signed-off-by: Sam Hague <shague@redhat.com>
    commit 7db67352c22b8275e81c0e919aa661eaa0caa1a3
    Merge: f183e98 ba1ac04
    Author: Sam Hague <shague@redhat.com>
    Date:   Wed Oct 7 13:38:27 2015 +0000

        Merge "UT for southbound/transactions/md"

    commit f183e9857b3a53645b2c463204a4f6945bb10cdb
    Merge: 3a2524e fc26e9e
    Author: Sam Hague <shague@redhat.com>
    Date:   Wed Oct 7 00:36:02 2015 +0000

        Merge "Fix checkstyle issues in netvirtsfc"

    commit bf288f954947f35aca6425f7d180b4732dee6818
    Author: Anil Vishnoi <vishnoianil@gmail.com>
    Date:   Wed Oct 7 02:11:25 2015 +0530

        If controller joins the cluster late, and the owner of the device
        is already decided, EntityOwnershipService won't notify new candidate that register
        for ownership. Adding a proactive check on the ownership state of the device,
        so if it's already owned, adding the connection instances in the connection cache.

        Change-Id: I7e87b55599f0ebd408814d72789c86f231b7907c
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
    commit ba1ac0433a93468260f0e00e693ba1a928c14e14
    Author: rpujar <rpujar@inocybe.com>
    Date:   Tue Oct 6 15:56:23 2015 -0400

        UT for southbound/transactions/md

        1. AbstractTransactionCommand.java
        2. OpenVSwitchUpdateCommand.java
        3. OvsdbBridgeRemovedCommand.java

        Change-Id: I7655dec526bc06b770c533dd082eb403bc89a2c7
Signed-off-by: rpujar <rpujar@inocybe.com>
    commit 3a2524e329b4955b96aa59eb8dbb8965d06f08a5
    Merge: 99f9a37 e4783a5
    Author: Sam Hague <shague@redhat.com>
    Date:   Tue Oct 6 19:48:18 2015 +0000

        Merge "Send a canonical IPv4 prefix in table 60 routing rules"

    commit fc26e9e4667e470658ebcc9040f1274903075dcd
    Author: Sam Hague <shague@redhat.com>
    Date:   Tue Oct 6 15:45:13 2015 -0400

        Fix checkstyle issues in netvirtsfc

        Change-Id: I7db518959449958849a74c49a83bde1135ee325f
Signed-off-by: Sam Hague <shague@redhat.com>
    commit e4783a5d2eca5670253b8251d62258edb01eb477
    Author: Eric Multanen <eric.w.multanen@intel.com>
    Date:   Fri Oct 2 06:43:04 2015 -0700

        Send a canonical IPv4 prefix in table 60 routing rules

        Testing with userspace OVS with DPDK uncovered that the routing
        rules that go into table 60 were getting rejected.

        Messages from ovs-vswitchd.log:

        ... |nx_match|WARN|Rejecting NXM/OXM entry
            0:32768:12:1:8 with 1-bits in value for bits wildcarded by the mask.

        ... |connmgr|INFO|br-int<->tcp:10.11.21.7:6653:
            sending OFPBMC_BAD_WILDCARDS error reply to OFPT_FLOW_MOD message

        Clearing the non-prefix bits resolved the problem and the flows were
        successfully added.

        v2 - split up long line into two more readable lines

        Change-Id: I42a0c63e6e837197d29bb8333f12e822a5f15d91
Signed-off-by: Eric Multanen <eric.w.multanen@intel.com>
    commit 99f9a373e9bc410933421692148b87f177ab4879
    Author: sangeeta.maurya <sangeeta.maurya@hp.com>
    Date:   Tue Oct 6 22:56:55 2015 +0545

        Custom ICMP SG Rule:
        1)Modification in ICMP matcher
        2)Unit Test Improvement (Check added to validate if some values are set
        properly).

        Change-Id: I31fad80f6dd278372abe2b1a6aac95935aef5f17
Signed-off-by: sangeeta.maurya <sangeeta.maurya@hp.com>
    Change-Id: I1b720089469f928ead3a317172901c6ce09ce1ef
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
Change-Id: I2b79a3309cf29cf497edb3b8a4b5b5bcdaec9e18
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
28 files changed:
openstack/net-virt-providers/src/main/config/default-config.xml
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/NetvirtProvidersProvider.java
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/AbstractServiceInstance.java
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java
openstack/net-virt-providers/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/netvirt/providers/impl/rev150513/NetvirtProvidersImplModule.java
openstack/net-virt-providers/src/main/yang/netvirt-providers-impl.yang
openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/AbstractServiceInstanceTest.java
openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/ArpResponderServiceTest.java
openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/EgressAclServiceTest.java
openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/InboundNatServiceTest.java
openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/L2FowardingServiceTest.java
openstack/net-virt-providers/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/L3FowardingServiceTest.java
openstack/net-virt/src/main/config/default-config.xml
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/NetvirtProvider.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/Constants.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbDataChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronFloatingIPChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronLoadBalancerPoolChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronLoadBalancerPoolMemberChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronNetworkChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronPortChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronRouterChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronSecurityGroupDataChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronSecurityRuleDataChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/translator/iaware/impl/NeutronSubnetChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/netvirt/impl/rev150513/NetvirtImplModule.java
openstack/net-virt/src/main/yang/netvirt-impl.yang
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/SouthboundProvider.java

index f748ee76a4100bd81f991b71324cc638f59650b6..cdbbec28ac687f3d52eb39724e73005604262ecc 100644 (file)
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
             <name>binding-osgi-broker</name>
           </broker>
+          <clustering-entity-ownership-service>
+            <type xmlns:ns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service">ns:entity-ownership-service</type>
+            <name>entity-ownership-service</name>
+          </clustering-entity-ownership-service>
         </module>
       </modules>
     </data>
index e6037c09aa8e06e8667d9a0f803518488b0c0a5e..86556f6d4873efda77b757f1cfe0630b5796cb9a 100644 (file)
@@ -8,26 +8,42 @@
 
 package org.opendaylight.ovsdb.openstack.netvirt.providers;
 
+import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
+
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
+import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidateRegistration;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipChange;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListenerRegistration;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 /**
  * @author Sam Hague (shague@redhat.com)
  */
 public class NetvirtProvidersProvider implements BindingAwareProvider, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(NetvirtProvidersProvider.class);
+
     private BundleContext bundleContext = null;
     private static DataBroker dataBroker = null;
     private ConfigActivator activator;
     private static ProviderContext providerContext = null;
+    private static EntityOwnershipService entityOwnershipService;
+    private ProviderEntityListener providerEntityListener = null;
+    private static AtomicBoolean hasProviderEntityOwnership = new AtomicBoolean(false);
 
-    public NetvirtProvidersProvider(BundleContext bundleContext) {
+    public NetvirtProvidersProvider(BundleContext bundleContext, EntityOwnershipService eos) {
         LOG.info("NetvirtProvidersProvider: bundleContext: {}", bundleContext);
         this.bundleContext = bundleContext;
+        entityOwnershipService = eos;
     }
 
     public static DataBroker getDataBroker() {
@@ -38,10 +54,15 @@ public class NetvirtProvidersProvider implements BindingAwareProvider, AutoClose
         return providerContext;
     }
 
+    public static boolean isMasterProviderInstance() {
+        return hasProviderEntityOwnership.get();
+    }
+
     @Override
     public void close() throws Exception {
         LOG.info("NetvirtProvidersProvider closed");
         activator.stop(bundleContext);
+        providerEntityListener.close();
     }
 
     @Override
@@ -55,5 +76,49 @@ public class NetvirtProvidersProvider implements BindingAwareProvider, AutoClose
         } catch (Exception e) {
             LOG.warn("Failed to start Netvirt: ", e);
         }
+        providerEntityListener = new ProviderEntityListener(this, entityOwnershipService);
+    }
+
+    private void handleOwnershipChange(EntityOwnershipChange ownershipChange) {
+        if (ownershipChange.isOwner()) {
+            LOG.info("*This* instance of OVSDB netvirt provider is a MASTER instance");
+            hasProviderEntityOwnership.set(true);
+        } else {
+            LOG.info("*This* instance of OVSDB netvirt provider is a SLAVE instance");
+            hasProviderEntityOwnership.set(false);
+        }
+    }
+
+    private class ProviderEntityListener implements EntityOwnershipListener {
+        private NetvirtProvidersProvider provider;
+        private EntityOwnershipListenerRegistration listenerRegistration;
+        private EntityOwnershipCandidateRegistration candidateRegistration;
+
+        ProviderEntityListener(NetvirtProvidersProvider provider,
+                               EntityOwnershipService entityOwnershipService) {
+            this.provider = provider;
+            this.listenerRegistration =
+                    entityOwnershipService.registerListener(Constants.NETVIRT_OWNER_ENTITY_TYPE, this);
+
+            //register instance entity to get the ownership of the netvirt provider
+            Entity instanceEntity = new Entity(
+                    Constants.NETVIRT_OWNER_ENTITY_TYPE, Constants.NETVIRT_OWNER_ENTITY_TYPE);
+            try {
+                this.candidateRegistration = entityOwnershipService.registerCandidate(instanceEntity);
+            } catch (CandidateAlreadyRegisteredException e) {
+                LOG.warn("OVSDB Netvirt Provider instance entity {} was already "
+                        + "registered for ownership", instanceEntity, e);
+            }
+        }
+
+        public void close() {
+            this.listenerRegistration.close();
+            this.candidateRegistration.close();
+        }
+
+        @Override
+        public void ownershipChanged(EntityOwnershipChange ownershipChange) {
+            provider.handleOwnershipChange(ownershipChange);
+        }
     }
 }
index 5a94eb972b8fa639938278590861e02f9a92700a..0727f3e0bfc74ed57068e068d69ebac270a8164c 100644 (file)
@@ -139,39 +139,43 @@ public abstract class AbstractServiceInstance {
     }
 
     protected void writeFlow(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) {
-        LOG.debug("writeFlow 3: flowBuilder: {}, nodeBuilder: {}",
-                flowBuilder.build(), nodeBuilder.build());
-        WriteTransaction modification = dataBroker.newWriteOnlyTransaction();
-        LOG.debug("writeFlow: about to put nodePath for Flow {}, nodePath: {}",
-                flowBuilder.getFlowName(), createNodePath(nodeBuilder));
-        modification.put(LogicalDatastoreType.CONFIGURATION, createNodePath(nodeBuilder),
-                nodeBuilder.build(), true /*createMissingParents*/);
-        LOG.debug("writeFlow: about to put Flow {}", flowBuilder.getFlowName());
-        modification.put(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder),
-                flowBuilder.build(), true /*createMissingParents*/);
-        LOG.debug("writeFlow: about to submit Flow {}", flowBuilder.getFlowName());
-        CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
-        LOG.debug("writeFlow: checking status of Flow {}", flowBuilder.getFlowName());
-        try {
-            commitFuture.checkedGet();  // TODO: Make it async (See bug 1362)
-            LOG.debug("Transaction success for write of Flow {}", flowBuilder.getFlowName());
-        } catch (Exception e) {
-            LOG.error(e.getMessage(), e);
-            modification.cancel();
+        if (NetvirtProvidersProvider.isMasterProviderInstance()) {
+            LOG.debug("writeFlow 3: flowBuilder: {}, nodeBuilder: {}",
+                    flowBuilder.build(), nodeBuilder.build());
+            WriteTransaction modification = dataBroker.newWriteOnlyTransaction();
+            LOG.debug("writeFlow: about to put nodePath for Flow {}, nodePath: {}",
+                    flowBuilder.getFlowName(), createNodePath(nodeBuilder));
+            modification.put(LogicalDatastoreType.CONFIGURATION, createNodePath(nodeBuilder),
+                    nodeBuilder.build(), true /*createMissingParents*/);
+            LOG.debug("writeFlow: about to put Flow {}", flowBuilder.getFlowName());
+            modification.put(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder),
+                    flowBuilder.build(), true /*createMissingParents*/);
+            LOG.debug("writeFlow: about to submit Flow {}", flowBuilder.getFlowName());
+            CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
+            LOG.debug("writeFlow: checking status of Flow {}", flowBuilder.getFlowName());
+            try {
+                commitFuture.checkedGet();  // TODO: Make it async (See bug 1362)
+                LOG.debug("Transaction success for write of Flow {}", flowBuilder.getFlowName());
+            } catch (Exception e) {
+                LOG.error(e.getMessage(), e);
+                modification.cancel();
+            }
         }
     }
 
     protected void removeFlow(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) {
-        WriteTransaction modification = dataBroker.newWriteOnlyTransaction();
-        modification.delete(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder));
-
-        CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
-        try {
-            commitFuture.get();  // TODO: Make it async (See bug 1362)
-            LOG.debug("Transaction success for deletion of Flow {}", flowBuilder.getFlowName());
-        } catch (Exception e) {
-            LOG.error(e.getMessage(), e);
-            modification.cancel();
+        if (NetvirtProvidersProvider.isMasterProviderInstance()) {
+            WriteTransaction modification = dataBroker.newWriteOnlyTransaction();
+            modification.delete(LogicalDatastoreType.CONFIGURATION, createFlowPath(flowBuilder, nodeBuilder));
+
+            CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
+            try {
+                commitFuture.get();  // TODO: Make it async (See bug 1362)
+                LOG.debug("Transaction success for deletion of Flow {}", flowBuilder.getFlowName());
+            } catch (Exception e) {
+                LOG.error(e.getMessage(), e);
+                modification.cancel();
+            }
         }
     }
 
index 596ad714d1c750aa13d1b115834c490192d9f945..c46211f46ccac21fa96edbdb725cd3d8c4c6fd31 100644 (file)
@@ -1559,56 +1559,62 @@ public class OF13Provider implements ConfigInterface, NetworkingProvider {
     }
 
     private void writeGroup(GroupBuilder groupBuilder, NodeBuilder nodeBuilder) {
-        ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
-        InstanceIdentifier<Group> path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory
-                .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Group.class,
-                        new GroupKey(groupBuilder.getGroupId())).build();
-        modification.put(LogicalDatastoreType.CONFIGURATION, path1, groupBuilder.build(), true /*createMissingParents*/);
-
-        CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
-        try {
-            commitFuture.get();  // TODO: Make it async (See bug 1362)
-            LOG.debug("Transaction success for write of Group " + groupBuilder.getGroupName());
-        } catch (InterruptedException|ExecutionException e) {
-            LOG.error(e.getMessage(), e);
+        if (NetvirtProvidersProvider.isMasterProviderInstance()) {
+            ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
+            InstanceIdentifier<Group> path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory
+                    .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Group.class,
+                            new GroupKey(groupBuilder.getGroupId())).build();
+            modification.put(LogicalDatastoreType.CONFIGURATION, path1, groupBuilder.build(), true /*createMissingParents*/);
+
+            CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
+            try {
+                commitFuture.get();  // TODO: Make it async (See bug 1362)
+                LOG.debug("Transaction success for write of Group " + groupBuilder.getGroupName());
+            } catch (InterruptedException|ExecutionException e) {
+                LOG.error(e.getMessage(), e);
+            }
         }
     }
 
     private void removeGroup(GroupBuilder groupBuilder, NodeBuilder nodeBuilder) {
-        WriteTransaction modification = dataBroker.newWriteOnlyTransaction();
-        InstanceIdentifier<Group> path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory
-                .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Group.class,
-                        new GroupKey(groupBuilder.getGroupId())).build();
-        modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
-        CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
+        if (NetvirtProvidersProvider.isMasterProviderInstance()) {
+            WriteTransaction modification = dataBroker.newWriteOnlyTransaction();
+            InstanceIdentifier<Group> path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory
+                    .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Group.class,
+                            new GroupKey(groupBuilder.getGroupId())).build();
+            modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
+            CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
 
-        try {
-            commitFuture.get();  // TODO: Make it async (See bug 1362)
-            LOG.debug("Transaction success for deletion of Group " + groupBuilder.getGroupName());
-        } catch (InterruptedException|ExecutionException e) {
-            LOG.error(e.getMessage(), e);
+            try {
+                commitFuture.get();  // TODO: Make it async (See bug 1362)
+                LOG.debug("Transaction success for deletion of Group " + groupBuilder.getGroupName());
+            } catch (InterruptedException|ExecutionException e) {
+                LOG.error(e.getMessage(), e);
+            }
         }
     }
 
     private void writeFlow(FlowBuilder flowBuilder, NodeBuilder nodeBuilder) {
-        ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
-        InstanceIdentifier<Flow> path1 =
-                InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory
-                                .rev130819.nodes.Node.class,
-                        nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Table.class,
-                        new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build();
+        if (NetvirtProvidersProvider.isMasterProviderInstance()){
+            ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
+            InstanceIdentifier<Flow> path1 =
+                    InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory
+                                    .rev130819.nodes.Node.class,
+                            nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Table.class,
+                            new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build();
 
-        //modification.put(LogicalDatastoreType.OPERATIONAL, path1, flowBuilder.build());
-        modification.put(LogicalDatastoreType.CONFIGURATION, path1, flowBuilder.build(),
-                true);//createMissingParents
+            //modification.put(LogicalDatastoreType.OPERATIONAL, path1, flowBuilder.build());
+            modification.put(LogicalDatastoreType.CONFIGURATION, path1, flowBuilder.build(),
+                    true);//createMissingParents
 
 
-        CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
-        try {
-            commitFuture.get();  // TODO: Make it async (See bug 1362)
-            LOG.debug("Transaction success for write of Flow " + flowBuilder.getFlowName());
-        } catch (InterruptedException|ExecutionException e) {
-            LOG.error(e.getMessage(), e);
+            CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
+            try {
+                commitFuture.get();  // TODO: Make it async (See bug 1362)
+                LOG.debug("Transaction success for write of Flow " + flowBuilder.getFlowName());
+            } catch (InterruptedException|ExecutionException e) {
+                LOG.error(e.getMessage(), e);
+            }
         }
     }
 
index 51dfd624fa2133995b0a6ac35ad002a1cec55995..eaed95c249fc32ccf425bca6f0a632c00f43cb2c 100644 (file)
@@ -22,7 +22,7 @@ public class NetvirtProvidersImplModule extends org.opendaylight.yang.gen.v1.urn
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        NetvirtProvidersProvider provider = new NetvirtProvidersProvider(bundleContext);
+        NetvirtProvidersProvider provider = new NetvirtProvidersProvider(bundleContext, getClusteringEntityOwnershipServiceDependency());
         BindingAwareBroker localBroker = getBrokerDependency();
         localBroker.registerProvider(provider);
         return provider;
index 7ae4b17cef5823d29934a1521ac98baa00ad9e8b..a784a4b6f1ab06140087ddf84af1579ff2302846 100644 (file)
@@ -5,6 +5,7 @@ module netvirt-providers-impl {
 
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
+    import opendaylight-entity-ownership-service {prefix eos; revision-date 2015-08-10;}
 
     description
         "Service definition for netvirt providers project";
@@ -30,6 +31,14 @@ module netvirt-providers-impl {
                     }
                 }
             }
+            container clustering-entity-ownership-service {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity eos:entity-ownership-service;
+                    }
+                }
+            }
         }
     }
 }
index 9d9c97f6044f64f578753c29e134e2f32b565c70..50727a188ef68bb345204058a87a84ad8e1d3205 100644 (file)
@@ -20,6 +20,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.lang.reflect.Field;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,8 +32,10 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.ovsdb.openstack.netvirt.NetvirtProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.NetvirtProvidersProvider;
 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
@@ -46,6 +49,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.osgi.framework.ServiceReference;
 import org.powermock.api.mockito.PowerMockito;
+import org.powermock.api.support.membermodification.MemberModifier;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 import com.google.common.base.Optional;
@@ -140,6 +144,9 @@ public class AbstractServiceInstanceTest {
         FlowBuilder flowBuilder = mock(FlowBuilder.class);
         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
 
+        NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
+        MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
+
         abstractServiceInstance.writeFlow(flowBuilder, nodeBuilder);
 
         //verify(transaction, times(1)).put(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class), any(DataObject.class), eq(true));
@@ -163,6 +170,9 @@ public class AbstractServiceInstanceTest {
         FlowBuilder flowBuilder = mock(FlowBuilder.class);
         when(flowBuilder.getKey()).thenReturn(mock(FlowKey.class));
 
+        NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
+        MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
+
         abstractServiceInstance.removeFlow(flowBuilder, nodeBuilder);
         verify(transaction, times(1)).delete(eq(LogicalDatastoreType.CONFIGURATION), any(InstanceIdentifier.class));
         verify(commitFuture, times(1)).get();
index 4206a017514a964b9b6c8a2aed337355cc699e1a..fbbd6e63d68b3da432b8dbd9763b4596835fed76 100644 (file)
@@ -17,6 +17,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.net.InetAddress;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -30,6 +31,7 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile
 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Status;
 import org.opendaylight.ovsdb.openstack.netvirt.api.StatusCode;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.NetvirtProvidersProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
@@ -37,6 +39,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.powermock.api.support.membermodification.MemberModifier;
 
 import com.google.common.util.concurrent.CheckedFuture;
 
index c21b60fa0bbde363e34bdfde92fe71e68db7dfed..3f8bdb188fe67af98d1dafd4b980ac57f17159fe 100644 (file)
@@ -18,6 +18,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -36,6 +37,7 @@ import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronSecurityRule;
 import org.opendaylight.ovsdb.openstack.netvirt.translator.Neutron_IPs;
 import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityGroupCacheManger;
 import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityServicesManager;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.NetvirtProvidersProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestrator;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
@@ -48,6 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.powermock.api.mockito.PowerMockito;
+import org.powermock.api.support.membermodification.MemberModifier;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 import com.google.common.util.concurrent.CheckedFuture;
@@ -108,7 +111,7 @@ public class EgressAclServiceTest {
     }
 
     @Before
-    public void setUp() {
+    public void setUp() throws IllegalArgumentException, IllegalAccessException {
         egressAclServiceSpy = PowerMockito.spy(egressAclService);
 
         when(writeTransaction.submit()).thenReturn(commitFuture);
@@ -139,6 +142,10 @@ public class EgressAclServiceTest {
 
         when(securityGroup.getSecurityRules()).thenReturn(portSecurityList);
         when(securityServices.getVmListForSecurityGroup(PORT_UUID, SECURITY_GROUP_UUID)).thenReturn(neutronDestIpList);
+
+        NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
+        MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
+
     }
 
     /**
index bcd5bb69c1f6dac4e0d0bc811280a3a11fbe2161..891394ff185b438602a3338d8aa40c732e58cd56 100644 (file)
@@ -17,6 +17,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.net.InetAddress;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -31,10 +32,12 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile
 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Status;
 import org.opendaylight.ovsdb.openstack.netvirt.api.StatusCode;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.NetvirtProvidersProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestrator;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.powermock.api.support.membermodification.MemberModifier;
 
 import com.google.common.util.concurrent.CheckedFuture;
 
@@ -57,12 +60,16 @@ public class InboundNatServiceTest {
     private static final String HOST_ADDRESS_PREFIX = "127.0.0.1/32";
 
     @Before
-    public void setUp() {
+    public void setUp() throws IllegalArgumentException, IllegalAccessException {
         when(writeTransaction.submit()).thenReturn(commitFuture);
 
         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);
 
         when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
+
+        NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
+        MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
+
     }
 
     /**
index 34e5658eaef399d46ebc47aded2f660eb6b36eaf..f928918060c2bf95acf81e1c260ad612d52956f4 100644 (file)
@@ -15,6 +15,8 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -26,11 +28,13 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.NetvirtProvidersProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestrator;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.powermock.api.support.membermodification.MemberModifier;
 
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
@@ -74,6 +78,10 @@ public class L2FowardingServiceTest {
         //when(mdsalConsumer.getDataBroker()).thenReturn(dataBroker);
 
         when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
+
+        NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
+        MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
+
     }
 
     /**
index 66a0681936f6e9f9a3705b39a2eab67a607840f2..bd5453e55f0fe6b39816f94b279c6f23cfbb5058 100644 (file)
@@ -17,6 +17,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.net.InetAddress;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -31,10 +32,12 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile
 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Status;
 import org.opendaylight.ovsdb.openstack.netvirt.api.StatusCode;
+import org.opendaylight.ovsdb.openstack.netvirt.providers.NetvirtProvidersProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestrator;
 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.powermock.api.support.membermodification.MemberModifier;
 
 import com.google.common.util.concurrent.CheckedFuture;
 
@@ -64,6 +67,10 @@ public class L3FowardingServiceTest {
         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);
 
         when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
+
+        NetvirtProvidersProvider netvirtProvider = mock(NetvirtProvidersProvider.class);
+        MemberModifier.field(NetvirtProvidersProvider.class, "hasProviderEntityOwnership").set(netvirtProvider, new AtomicBoolean(true));
+
     }
 
     /**
index 7b3ffd38bfe8df2569ad0a191eb60dc99e831eff..e99fbca132a7f3d64aafebfba0a5702ecb40437f 100644 (file)
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
             <name>binding-osgi-broker</name>
           </broker>
+          <clustering-entity-ownership-service>
+            <type xmlns:ns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service">ns:entity-ownership-service</type>
+            <name>entity-ownership-service</name>
+          </clustering-entity-ownership-service>
         </module>
       </modules>
     </data>
index 43c637c88087cf5e17d06249f009b006b182ecd7..a6367872f8c41d0dcfbd6025d521032e2ba8f03d 100644 (file)
@@ -8,7 +8,12 @@
 
 package org.opendaylight.ovsdb.openstack.netvirt;
 
+import com.google.common.base.Optional;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState;
+import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.osgi.framework.BundleContext;
@@ -23,10 +28,22 @@ public class NetvirtProvider implements BindingAwareProvider, AutoCloseable {
     private BundleContext bundleContext = null;
     private static DataBroker dataBroker = null;
     private ConfigActivator activator;
+    private static EntityOwnershipService entityOwnershipService;
+    private static final Entity ownerInstanceEntity = new Entity(
+            Constants.NETVIRT_OWNER_ENTITY_TYPE, Constants.NETVIRT_OWNER_ENTITY_TYPE);
 
-    public NetvirtProvider(BundleContext bundleContext) {
+    public NetvirtProvider(BundleContext bundleContext, EntityOwnershipService eos) {
         LOG.info("NetvirtProvider: bundleContext: {}", bundleContext);
         this.bundleContext = bundleContext;
+        entityOwnershipService = eos;
+    }
+
+    public static boolean isMasterProviderInstance() {
+        if (entityOwnershipService != null) {
+            Optional<EntityOwnershipState> state = entityOwnershipService.getOwnershipState(ownerInstanceEntity);
+            return state.isPresent() && state.get().isOwner();
+        }
+        return false;
     }
 
     @Override
index e43145565bc2ca5bbb9b9cb5ea646177a5890819..2c9858f2ca3ba440448220bf8c9c6fb9f430cd16 100644 (file)
@@ -102,4 +102,9 @@ public final class Constants {
     //6653 is official openflow port.
     public static short OPENFLOW_PORT = 6653;
     public static String OPENFLOW_CONNECTION_PROTOCOL = "tcp";
+
+    /*
+     * Clustering
+     */
+    public static final String NETVIRT_OWNER_ENTITY_TYPE = "ovsdb-netvirt-provider";
 }
index 1daad3154ec60bf7bf395be4391fe5d14e075e58..825eabc35bf83f54ba09b6ff37641ed4f5a7f3d1 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -38,7 +39,7 @@ import org.slf4j.LoggerFactory;
  *
  * @author Sam Hague (shague@redhat.com)
  */
-public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseable {
+public class OvsdbDataChangeListener implements ClusteredDataChangeListener, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(OvsdbDataChangeListener.class);
     private DataBroker dataBroker = null;
     private ListenerRegistration<DataChangeListener> registration;
index 44adae86acabcb3bd428c1620ff4e1c45891c013..6156e64f06908f31758ffc31c5db4ab88099e360 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl;
 
 import java.util.Map.Entry;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -25,7 +26,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NeutronFloatingIPChangeListener implements DataChangeListener, AutoCloseable{
+public class NeutronFloatingIPChangeListener implements ClusteredDataChangeListener, AutoCloseable{
     private static final Logger LOG = LoggerFactory.getLogger(NeutronFloatingIPChangeListener.class);
 
     private ListenerRegistration<DataChangeListener> registration;
index faaaa835231928a8f4db884d17e2eeb908874b51..c173bd7ce975c1259128dd0c8b1d80d53409c21d 100644 (file)
@@ -12,6 +12,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
@@ -40,7 +41,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ImmutableBiMap;
 
-public class NeutronLoadBalancerPoolChangeListener implements DataChangeListener, AutoCloseable {
+public class NeutronLoadBalancerPoolChangeListener implements ClusteredDataChangeListener, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronLoadBalancerPoolChangeListener.class);
 
     private static final ImmutableBiMap<Class<? extends ProtocolBase>,String> PROTOCOL_MAP
index 357e263eee0efa6ab360646f0f789f6c7f91cf74..03313aaf9f065763038f194168ee5f1d42c0c85d 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl;
 
 import java.util.Map.Entry;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
@@ -30,7 +31,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NeutronLoadBalancerPoolMemberChangeListener implements DataChangeListener, AutoCloseable {
+public class NeutronLoadBalancerPoolMemberChangeListener implements ClusteredDataChangeListener, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronLoadBalancerPoolMemberChangeListener.class);
 
     private ListenerRegistration<DataChangeListener> registration;
index a9227a2bb2b6b74e4c9cf0889d2430ad8fed4097..161ba5d198eb7102a55002fe65407e36cd47624e 100644 (file)
@@ -11,6 +11,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
@@ -39,7 +40,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ImmutableBiMap;
 
-public class NeutronNetworkChangeListener implements DataChangeListener, AutoCloseable {
+public class NeutronNetworkChangeListener implements ClusteredDataChangeListener, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkChangeListener.class);
 
     private static final ImmutableBiMap<Class<? extends NetworkTypeBase>,String> NETWORK_MAP
index d998c86f1bd6586eab423e1c5f4bb0daa59890b9..d404196d1c9f9bc1460250d14b845467e04e7e38 100644 (file)
@@ -15,6 +15,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -44,7 +45,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NeutronPortChangeListener implements DataChangeListener, AutoCloseable{
+public class NeutronPortChangeListener implements ClusteredDataChangeListener, AutoCloseable{
     private static final Logger LOG = LoggerFactory.getLogger(NeutronPortChangeListener.class);
 
     private ListenerRegistration<DataChangeListener> registration;
index 256b438e1b98979af3b643f4b4348fd35b83845b..b28576ca34a3b8608322dc702f81810913974674 100644 (file)
@@ -13,6 +13,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -34,7 +35,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NeutronRouterChangeListener implements DataChangeListener, AutoCloseable{
+public class NeutronRouterChangeListener implements ClusteredDataChangeListener, AutoCloseable{
     private static final Logger LOG = LoggerFactory.getLogger(NeutronRouterChangeListener.class);
 
     private ListenerRegistration<DataChangeListener> registration;
index 335de4f04f8836349236aa2b38852c39cb8d9db2..6c1f099869bb7410a652d9585afacee90d28e9a5 100644 (file)
@@ -11,6 +11,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -31,8 +32,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NeutronSecurityGroupDataChangeListener implements
-        DataChangeListener, AutoCloseable {
+public class NeutronSecurityGroupDataChangeListener implements ClusteredDataChangeListener, AutoCloseable {
     private static final Logger LOG = LoggerFactory
             .getLogger(NeutronSecurityGroupDataChangeListener.class);
 
index 6f09a7fa5ca840755923dbbb51e7581d0500b27d..cd474608c19b5cd9e2c243efaf6094006cea583c 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.ovsdb.openstack.netvirt.translator.iaware.impl;
 
 import java.util.Map.Entry;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -38,7 +39,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ImmutableBiMap;
 
-public class NeutronSecurityRuleDataChangeListener implements DataChangeListener, AutoCloseable {
+public class NeutronSecurityRuleDataChangeListener implements ClusteredDataChangeListener, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(NeutronSecurityRuleDataChangeListener.class);
 
index 50b1336d1510fa2226044250a9e8ebe516423a23..1b8d10e72d533842e985b8f3394bda60f15befa9 100644 (file)
@@ -13,6 +13,7 @@ import java.util.List;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -46,7 +47,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ImmutableBiMap;
 
-public class NeutronSubnetChangeListener implements DataChangeListener, AutoCloseable{
+public class NeutronSubnetChangeListener implements ClusteredDataChangeListener, AutoCloseable{
     private static final Logger LOG = LoggerFactory.getLogger(NeutronSubnetChangeListener.class);
 
     private static final ImmutableBiMap<Class<? extends IpVersionBase>,Integer> IPV_MAP
index 2b3f8cc52700526f6c5202b1bad8d0492a37bf94..8a43c9c8596b19c2450a9a9012abab4470842dd8 100644 (file)
@@ -22,7 +22,7 @@ public class NetvirtImplModule extends org.opendaylight.yang.gen.v1.urn.opendayl
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        NetvirtProvider provider = new NetvirtProvider(bundleContext);
+        NetvirtProvider provider = new NetvirtProvider(bundleContext, getClusteringEntityOwnershipServiceDependency());
         BindingAwareBroker localBroker = getBrokerDependency();
         localBroker.registerProvider(provider);
         return provider;
index 0c0e783e429d865975b9198256e099d56dc0144b..73042641c2297da4000b751f3daaffacf5a8d404 100644 (file)
@@ -5,6 +5,7 @@ module netvirt-impl {
 
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
+    import opendaylight-entity-ownership-service {prefix eos; revision-date 2015-08-10;}
 
     description
         "Service definition for netvirt project";
@@ -30,6 +31,14 @@ module netvirt-impl {
                     }
                 }
             }
+            container clustering-entity-ownership-service {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity eos:entity-ownership-service;
+                    }
+                }
+            }
         }
     }
 }
index d88074b9b3f0ee3228de54d6e49d2a6747a512eb..3a8bb7280ab3450028d6595e520f917872836956 100644 (file)
@@ -92,7 +92,7 @@ public class SouthboundProvider implements BindingAwareProvider, AutoCloseable {
             }
         } catch (CandidateAlreadyRegisteredException e) {
             LOG.warn("OVSDB Southbound Provider instance entity {} was already "
-                    + "registered for {} ownership", instanceEntity, e);
+                    + "registered for ownership", instanceEntity, e);
         }
     }