====== SAL Binding ====== How SAL manages providers, consumers services? or How to register Services with SAL? * https://developer.cisco.com/media/mdsal/sal-binding-api/site/apidocs/org/opendaylight/controller/sal/binding/api/package-summary.html * https://developer.cisco.com/media/mdsal/sal-binding-api/site/apidocs/org/opendaylight/controller/sal/binding/api/BindingAwareBroker.html * https://developer.cisco.com/media/mdsal/sal-binding-api/site/apidocs/org/opendaylight/controller/sal/binding/api/BindingAwareProvider.html ===== BindingAwareConsumer ===== * https://developer.cisco.com/media/mdsal/sal-binding-api/site/apidocs/org/opendaylight/controller/sal/binding/api/package-summary.html ===== BindingAwareProvider ===== * https://developer.cisco.com/media/mdsal/sal-binding-api/site/apidocs/org/opendaylight/controller/sal/binding/api/BindingAwareProvider.html#onSessionInitiated%28org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext%29 ===== BindingAwareBroker ===== Binding-aware core of the SAL layer responsible for wiring the SAL consumers. The responsibility of the broker is to maintain registration of SAL functionality Consumers and Providers, store provider and consumer specific context and functionality registration via BindingAwareBroker.ConsumerContext and provide access to infrastructure services, which removes direct dependencies between providers and consumers. The Binding-aware broker is also responsible for translation from Java classes modeling the functionality and data to binding-independent form which is used in SAL Core. Infrastructure services Some examples of infrastructure services: YANG Module service - see RpcConsumerRegistry.getRpcService(Class), BindingAwareBroker.ProviderContext Notification Service - see NotificationService and NotificationProviderService Functionality and Data model Data Store access and modification - see DataBrokerService and DataProviderService **The services are exposed via session**. ===== Session-based access ===== The providers and consumers needs to register in order to use the binding-independent SAL layer and to expose functionality via SAL layer. For more information about session-based access see BindingAwareBroker.ConsumerContext and BindingAwareBroker.ProviderContext ====== Activator ====== org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase implements org.osgi.framework.BundleActivator ===== ComponentActivatorAbstractBase ===== * http://www.frank-durr.de/?tag=osgi * http://www.frank-durr.de/?p=84 * SDN-Hub plugin-exercise SDN-Hub plugin-exerciese code demonstrates how MD-SAL BindingAwareBroker can be injected into the a service (MdsalConsumerImpl). See this code: 18 public class Activator extends ComponentActivatorAbstractBase { 19 /** 20 * Function called when the activator starts just after some 21 * initializations are done by the 22 * ComponentActivatorAbstractBase. 23 */ 24 @Override 25 public void init() { 26 } 27 28 /** 29 * Function called when the activator stops just before the 30 * cleanup done by ComponentActivatorAbstractBase. 31 * 32 */ 33 @Override 34 public void destroy() { 35 } 36 37 /** 38 * Function that is used to communicate to dependency manager the 39 * list of known implementations for services inside a container. 40 * 41 * @return An array containing all the CLASS objects that will be 42 * instantiated in order to get an fully working implementation 43 * Object 44 */ 45 @Override 46 public Object[] getImplementations() { 47 Object[] res = {MdsalConsumerImpl.class, 48 TutorialFlowProgrammer.class, 49 TutorialOvsBridgeManager.class}; 50 return res; 51 } 52 53 /** 54 * Function that is called when configuration of the dependencies 55 * is required. 56 * 57 * @param c dependency manager Component object, used for 58 * configuring the dependencies exported and imported 59 * @param imp Implementation class that is being configured, 60 * needed as long as the same routine can configure multiple 61 * implementations 62 * @param containerName The containerName being configured, this allow 63 * also optional per-container different behavior if needed, usually 64 * should not be the case though. 65 */ 66 @Override 67 public void configureInstance(Component c, Object imp, 68 String containerName) { 69 70 if (imp.equals(MdsalConsumerImpl.class)) { 71 c.setInterface(MdsalConsumer.class.getName(), null); 72 c.add(createServiceDependency().setService(BindingAwareBroker.class).setRequired(true)); <--------- BindingAwareBroker! 73 } 74 75 if (imp.equals(TutorialFlowProgrammer.class)) { 76 c.add(createServiceDependency().setService(MdsalConsumer.class).setRequired(true)); 77 } 78 79 if (imp.equals(TutorialOvsBridgeManager.class)) { 80 c.setInterface(OvsdbInventoryListener.class.getName(), null); 81 c.add(createServiceDependency().setService(OvsdbInventoryService.class).setRequired(true)); 82 c.add(createServiceDependency().setService(OvsdbConfigurationService.class).setRequired(true)); 83 c.add(createServiceDependency().setService(OvsdbConnectionService.class).setRequired(true)); 84 } 85 } 86 } 20 public class MdsalConsumerImpl implements BindingAwareConsumer, MdsalConsumer { 21 22 private BundleContext ctx = null; 23 private volatile BindingAwareBroker broker; 24 private ConsumerContext consumerContext = null; 25 private DataBroker dataBroker; 26 private NotificationService notificationService; 27 28 static final Logger logger = LoggerFactory.getLogger(MdsalConsumerImpl.class); 29 30 void init(Component c) { 31 this.ctx = c.getDependencyManager().getBundleContext(); 32 logger.info("Registered consumer with MD-SAL"); 33 broker.registerConsumer(this, this.ctx); 34 } 35 36 void destroy() { 37 // Now lets close MDSAL session 38 if (this.consumerContext != null) { 39 //this.consumerContext.close(); 40 this.dataBroker = null; 41 this.consumerContext = null; 42 } 43 } 44 45 void start() { 46 } 47 48 void stop() { 49 } 50 51 @Override 52 public void onSessionInitialized(ConsumerContext session) { 53 this.consumerContext = session; 54 dataBroker = session.getSALService(DataBroker.class); 55 notificationService = session.getSALService(NotificationService.class); 56 logger.info("Initialized consumer context {}", session.toString()); 57 } 58 59 @Override 60 public ConsumerContext getConsumerContext() { 61 return consumerContext; 62 } 63 @Override 64 public DataBroker getDataBroker() { 65 return dataBroker; 66 } 67 @Override 68 public NotificationService getNotificationService() { 69 return notificationService; 70 } 71 } ===== AbstractBindingAwareConsumer ===== MD-SAL plugin is activated using AbstractBindingAwareConsumer/Provider, which extends AbstractBrokerAwareActiviator, which implements org.osgi.framework.BundleActivator ===== Headline ===== OVSDB services are registered using org.apache.felix.dm.DependencyActivatorBase.