2 * Copyright (c) 2014, 2015 Red Hat, Inc. and others. All rights reserved.
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
9 package org.opendaylight.ovsdb.openstack.netvirt.providers;
11 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
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;
27 import java.util.concurrent.atomic.AtomicBoolean;
30 * @author Sam Hague (shague@redhat.com)
32 public class NetvirtProvidersProvider implements BindingAwareProvider, AutoCloseable {
33 private static final Logger LOG = LoggerFactory.getLogger(NetvirtProvidersProvider.class);
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);
43 public NetvirtProvidersProvider(BundleContext bundleContext, EntityOwnershipService eos) {
44 LOG.info("NetvirtProvidersProvider: bundleContext: {}", bundleContext);
45 this.bundleContext = bundleContext;
46 entityOwnershipService = eos;
49 public static DataBroker getDataBroker() {
53 public static ProviderContext getProviderContext() {
54 return providerContext;
57 public static boolean isMasterProviderInstance() {
58 return hasProviderEntityOwnership.get();
62 public void close() throws Exception {
63 LOG.info("NetvirtProvidersProvider closed");
64 activator.stop(bundleContext);
65 providerEntityListener.close();
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);
75 activator.start(bundleContext);
76 } catch (Exception e) {
77 LOG.warn("Failed to start Netvirt: ", e);
79 providerEntityListener = new ProviderEntityListener(this, entityOwnershipService);
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);
87 LOG.info("*This* instance of OVSDB netvirt provider is a SLAVE instance");
88 hasProviderEntityOwnership.set(false);
92 private class ProviderEntityListener implements EntityOwnershipListener {
93 private NetvirtProvidersProvider provider;
94 private EntityOwnershipListenerRegistration listenerRegistration;
95 private EntityOwnershipCandidateRegistration candidateRegistration;
97 ProviderEntityListener(NetvirtProvidersProvider provider,
98 EntityOwnershipService entityOwnershipService) {
99 this.provider = provider;
100 this.listenerRegistration =
101 entityOwnershipService.registerListener(Constants.NETVIRT_OWNER_ENTITY_TYPE, this);
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);
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);
114 public void close() {
115 this.listenerRegistration.close();
116 this.candidateRegistration.close();
120 public void ownershipChanged(EntityOwnershipChange ownershipChange) {
121 provider.handleOwnershipChange(ownershipChange);