Merge "Fix UT: call method under test and verify"
[ovsdb.git] / openstack / net-virt-providers / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / providers / NetvirtProvidersProvider.java
1 /*
2  * Copyright (c) 2014, 2015 Red Hat, Inc. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.ovsdb.openstack.netvirt.providers;
10
11 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
15 import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException;
16 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidateRegistration;
17 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipChange;
18 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener;
19 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListenerRegistration;
20 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
21 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
22 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
23 import org.osgi.framework.BundleContext;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import java.util.concurrent.atomic.AtomicBoolean;
28
29 /**
30  * @author Sam Hague (shague@redhat.com)
31  */
32 public class NetvirtProvidersProvider implements BindingAwareProvider, AutoCloseable {
33     private static final Logger LOG = LoggerFactory.getLogger(NetvirtProvidersProvider.class);
34
35     private BundleContext bundleContext = null;
36     private static DataBroker dataBroker = null;
37     private ConfigActivator activator;
38     private static ProviderContext providerContext = null;
39     private static EntityOwnershipService entityOwnershipService;
40     private ProviderEntityListener providerEntityListener = null;
41     private static AtomicBoolean hasProviderEntityOwnership = new AtomicBoolean(false);
42
43     public NetvirtProvidersProvider(BundleContext bundleContext, EntityOwnershipService eos) {
44         LOG.info("NetvirtProvidersProvider: bundleContext: {}", bundleContext);
45         this.bundleContext = bundleContext;
46         entityOwnershipService = eos;
47     }
48
49     public static DataBroker getDataBroker() {
50         return dataBroker;
51     }
52
53     public static ProviderContext getProviderContext() {
54         return providerContext;
55     }
56
57     public static boolean isMasterProviderInstance() {
58         return hasProviderEntityOwnership.get();
59     }
60
61     @Override
62     public void close() throws Exception {
63         LOG.info("NetvirtProvidersProvider closed");
64         activator.stop(bundleContext);
65         providerEntityListener.close();
66     }
67
68     @Override
69     public void onSessionInitiated(ProviderContext providerContextRef) {
70         dataBroker = providerContextRef.getSALService(DataBroker.class);
71         providerContext = providerContextRef;
72         LOG.info("NetvirtProvidersProvider: onSessionInitiated dataBroker: {}", dataBroker);
73         this.activator = new ConfigActivator(providerContextRef);
74         try {
75             activator.start(bundleContext);
76         } catch (Exception e) {
77             LOG.warn("Failed to start Netvirt: ", e);
78         }
79         providerEntityListener = new ProviderEntityListener(this, entityOwnershipService);
80     }
81
82     private void handleOwnershipChange(EntityOwnershipChange ownershipChange) {
83         if (ownershipChange.isOwner()) {
84             LOG.info("*This* instance of OVSDB netvirt provider is a MASTER instance");
85             hasProviderEntityOwnership.set(true);
86         } else {
87             LOG.info("*This* instance of OVSDB netvirt provider is a SLAVE instance");
88             hasProviderEntityOwnership.set(false);
89         }
90     }
91
92     private class ProviderEntityListener implements EntityOwnershipListener {
93         private NetvirtProvidersProvider provider;
94         private EntityOwnershipListenerRegistration listenerRegistration;
95         private EntityOwnershipCandidateRegistration candidateRegistration;
96
97         ProviderEntityListener(NetvirtProvidersProvider provider,
98                                EntityOwnershipService entityOwnershipService) {
99             this.provider = provider;
100             this.listenerRegistration =
101                     entityOwnershipService.registerListener(Constants.NETVIRT_OWNER_ENTITY_TYPE, this);
102
103             //register instance entity to get the ownership of the netvirt provider
104             Entity instanceEntity = new Entity(
105                     Constants.NETVIRT_OWNER_ENTITY_TYPE, Constants.NETVIRT_OWNER_ENTITY_TYPE);
106             try {
107                 this.candidateRegistration = entityOwnershipService.registerCandidate(instanceEntity);
108             } catch (CandidateAlreadyRegisteredException e) {
109                 LOG.warn("OVSDB Netvirt Provider instance entity {} was already "
110                         + "registered for ownership", instanceEntity, e);
111             }
112         }
113
114         public void close() {
115             this.listenerRegistration.close();
116             this.candidateRegistration.close();
117         }
118
119         @Override
120         public void ownershipChanged(EntityOwnershipChange ownershipChange) {
121             provider.handleOwnershipChange(ownershipChange);
122         }
123     }
124 }