From a9e05354c351d3d88457892e28e2f01993d53142 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Tue, 19 Nov 2013 08:27:07 +0100 Subject: [PATCH] Added configuration options to MD-SAL Added default configuration to distribution which wires MD-SAL components together. Support for configuring wiring of following services: - Binding Aware Broker - Binding Aware Notification Service - Binding Aware Data Broker Service - Mapping service - Binding Independent Broker - Data Store Default configuration wires BA Broker, BA Notification service BA Data Broker and BI Broker together. BA Broker requires now BI Broker to be loaded in order to provide datastore functionality right from the beginning. Updated integration tests, added new test cases for BA to BI integration Change-Id: I7776bb9b2ed75bd5589757633c17f2466b86a04c Signed-off-by: Tony Tkacik --- .../main/resources/configuration/config.ini | 4 +- .../resources/configuration/controller.config | 129 +++++ .../md-sal/sal-binding-broker/pom.xml | 1 - .../binding/impl/BindingBrokerImplModule.java | 53 ++ .../impl/BindingBrokerImplModuleFactory.java | 39 ++ .../BindingBrokerImplSingletonModule.java | 57 --- ...ndingBrokerImplSingletonModuleFactory.java | 56 --- .../binding/impl/DataBrokerImplModule.java | 83 ++++ .../impl/DataBrokerImplModuleFactory.java | 38 ++ .../impl/NotificationBrokerImplModule.java | 48 ++ .../NotificationBrokerImplModuleFactory.java | 19 + .../sal/binding/impl/RpcBrokerImplModule.java | 37 ++ .../impl/RpcBrokerImplModuleFactory.java | 19 + .../binding/impl/RuntimeMappingModule.java | 63 +++ .../impl/RuntimeMappingModuleFactory.java | 58 +++ .../codegen/impl/RuntimeCodeGenerator.xtend | 19 +- .../impl/InstanceIdentifierCodecImpl.xtend | 1 + .../impl/LazyGeneratedCodecRegistry.java | 5 + .../RuntimeGeneratedMappingServiceImpl.xtend | 18 +- .../impl/TransformerGenerator.xtend | 36 +- .../binding/impl/BindingAwareBrokerImpl.xtend | 144 +++--- .../sal/binding/impl/DataBrokerImpl.java | 47 +- .../binding/impl/NotificationBrokerImpl.xtend | 17 +- ...indingIndependentDataServiceConnector.java | 17 +- .../dom/BindingIndependentMappingService.java | 3 +- .../impl/connect/dom/ConnectorActivator.java | 80 ---- .../opendaylight-binding-broker-impl.yang | 128 ++++- .../binding/test/AbstractDataServiceTest.java | 2 +- .../test/bugfix/DOMCodecBug01Test.java | 49 +- .../test/bugfix/DOMCodecBug03Test.java | 54 ++- .../yang/opendaylight-md-sal-binding.yang | 10 + opendaylight/md-sal/sal-binding-it/pom.xml | 451 ++++++++++-------- .../test/sal/binding/it/TestHelper.java | 150 ++++-- .../test/sal/binding/it/AbstractTest.java | 9 +- .../src/test/resources/controller.config | 123 +++++ .../src/test/resources/logback.xml | 5 +- .../common/impl/AbstractDataModification.java | 2 +- opendaylight/md-sal/sal-dom-api/pom.xml | 76 ++- .../sal/core/api/data/DataStore.java | 12 + .../main/yang/opendaylight-md-sal-common.yang | 68 +++ .../main/yang/opendaylight-md-sal-dom.yang | 35 ++ opendaylight/md-sal/sal-dom-broker/pom.xml | 60 ++- .../md/sal/dom/impl/DomBrokerImplModule.java | 55 +++ .../dom/impl/DomBrokerImplModuleFactory.java | 38 ++ .../sal/dom/impl/HashMapDataStoreModule.java | 39 ++ .../impl/HashMapDataStoreModuleFactory.java | 19 + .../SchemaServiceImplSingletonModule.java | 58 +++ ...hemaServiceImplSingletonModuleFactory.java | 46 ++ .../sal/dom/broker/BrokerActivator.java | 73 --- .../dom/broker/BrokerConfigActivator.xtend | 67 +++ .../sal/dom/broker/BrokerImpl.xtend | 10 +- .../sal/dom/broker/SchemaServiceImpl.java | 50 +- .../dom/broker/impl/HashMapDataStore.xtend | 30 +- .../yang/opendaylight-dom-broker-impl.yang | 61 +++ opendaylight/md-sal/samples/pom.xml | 2 +- 55 files changed, 2162 insertions(+), 711 deletions(-) create mode 100644 opendaylight/distribution/opendaylight/src/main/resources/configuration/controller.config create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModuleFactory.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModule.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModuleFactory.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModuleFactory.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModuleFactory.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModule.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModuleFactory.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModule.java create mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModuleFactory.java delete mode 100644 opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/ConnectorActivator.java create mode 100644 opendaylight/md-sal/sal-binding-it/src/test/resources/controller.config create mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataStore.java create mode 100644 opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-common.yang create mode 100644 opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-dom.yang create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModuleFactory.java create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModule.java create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModuleFactory.java create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModuleFactory.java delete mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerActivator.java create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend create mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini index dacdd2546e..e7c87d7cae 100644 --- a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini @@ -22,7 +22,9 @@ netconf.tcp.port=8383 #netconf.tls.keystore= #netconf.tls.keystore.password= -netconf.config.persister.storageAdapterClass=org.opendaylight.controller.netconf.persist.impl.NoOpStorageAdapter +netconf.config.persister.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter +fileStorage=configuration/controller.config +numberOfBackups=1 yangstore.blacklist=.*controller.model.* # Set Default start level for framework diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/controller.config b/opendaylight/distribution/opendaylight/src/main/resources/configuration/controller.config new file mode 100644 index 0000000000..fa0b5893d5 --- /dev/null +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/controller.config @@ -0,0 +1,129 @@ +//START OF CONFIG-LAST + + + + prefix:schema-service-singleton + yang-schema-service + + + prefix:hash-map-data-store + hash-map-data-store + + + prefix:dom-broker-impl + dom-broker + + dom:dom-data-store + ref_hash-map-data-store + + + + prefix:binding-broker-impl + binding-broker-impl + + binding:binding-notification-service + ref_binding-notification-broker + + + binding:binding-data-broker + ref_binding-data-broker + + + + prefix:runtime-generated-mapping + runtime-mapping-singleton + + + prefix:binding-notification-broker + binding-notification-broker + + + prefix:binding-data-broker + binding-data-broker + + dom:dom-broker-osgi-registry + ref_dom-broker + + + binding:binding-dom-mapping-service + ref_runtime-mapping-singleton + + + + + + dom:schema-service + + ref_yang-schema-service + /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service'] + + + + binding:binding-notification-service + + ref_binding-notification-broker + /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker'] + + + + dom:dom-data-store + + ref_hash-map-data-store + /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store'] + + + + binding:binding-broker-osgi-registry + + ref_binding-broker-impl + /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl'] + + + + binding-impl:binding-dom-mapping-service + + ref_runtime-mapping-singleton + /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton'] + + + + dom:dom-broker-osgi-registry + + ref_dom-broker + /config/modules/module[name='dom-broker-impl']/instance[name='dom-broker'] + + + + binding:binding-data-broker + + ref_binding-data-broker + /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker'] + + + + + +//END OF SNAPSHOT +urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:threadpool?module=threadpool&revision=2013-04-09 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05 +urn:ietf:params:netconf:capability:candidate:1.0 +urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04 +urn:opendaylight:params:xml:ns:yang:controller:netty:eventexecutor?module=netty-event-executor&revision=2013-11-12 +urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28 +urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24 +urn:ietf:params:netconf:capability:rollback-on-error:1.0 +urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24 +urn:opendaylight:params:xml:ns:yang:controller:threadpool:impl?module=threadpool-impl&revision=2013-04-05 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16 +urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09 +urn:opendaylight:params:xml:ns:yang:iana?module=iana&revision=2013-08-16 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 +http://netconfcentral.org/ns/toaster?module=toaster&revision=2009-11-20 +urn:opendaylight:params:xml:ns:yang:ieee754?module=ieee754&revision=2013-08-19 +urn:opendaylight:params:xml:ns:yang:nps-concepts?module=nps-concepts&revision=2013-09-30 +//END OF CONFIG diff --git a/opendaylight/md-sal/sal-binding-broker/pom.xml b/opendaylight/md-sal/sal-binding-broker/pom.xml index c356ff6b0e..a5e5c74f4c 100644 --- a/opendaylight/md-sal/sal-binding-broker/pom.xml +++ b/opendaylight/md-sal/sal-binding-broker/pom.xml @@ -16,7 +16,6 @@ - org.opendaylight.yangtools yang-maven-plugin diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java new file mode 100644 index 0000000000..c3fe5f70f1 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java @@ -0,0 +1,53 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-broker-impl +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:33:01 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import org.opendaylight.controller.sal.binding.impl.BindingAwareBrokerImpl; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public final class BindingBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModule +{ + + private BundleContext bundleContext; + + public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, BindingBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void validate(){ + super.validate(); + // Add custom validation for module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + BindingAwareBrokerImpl broker = new BindingAwareBrokerImpl(getBundleContext()); + broker.setDataBroker(getDataBrokerDependency()); + broker.setNotifyBroker(getNotificationServiceDependency()); + broker.start(); + return broker; + } + + public BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModuleFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModuleFactory.java new file mode 100644 index 0000000000..53902510be --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModuleFactory.java @@ -0,0 +1,39 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-broker-impl +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:33:01 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import org.opendaylight.controller.config.api.DependencyResolver; +import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; +import org.opendaylight.controller.config.spi.Module; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public class BindingBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModuleFactory +{ + + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) { + BindingBrokerImplModule module = (BindingBrokerImplModule) super.createModule(instanceName, dependencyResolver, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, + DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception { + BindingBrokerImplModule module = (BindingBrokerImplModule) super.createModule(instanceName, dependencyResolver, old, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModule.java deleted file mode 100644 index ab94db988c..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModule.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2013 Cisco 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 org.opendaylight.controller.config.yang.md.sal.binding.impl; - -import org.opendaylight.controller.sal.binding.impl.BindingAwareBrokerImpl; -import org.osgi.framework.BundleContext; - -import com.google.common.base.Preconditions; - -/** -* -*/ -public final class BindingBrokerImplSingletonModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplSingletonModule -{ - - private BundleContext bundleContext; - - public BindingBrokerImplSingletonModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } - - public BindingBrokerImplSingletonModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, BindingBrokerImplSingletonModule oldModule, java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } - - @Override - public void validate() { - super.validate(); - Preconditions.checkNotNull(getBundleContext()); - } - - - @Override - public boolean canReuseInstance(AbstractBindingBrokerImplSingletonModule oldModule) { - return true; - } - - - public java.lang.AutoCloseable createInstance() { - BindingAwareBrokerImpl broker = new BindingAwareBrokerImpl(getBundleContext()); - broker.start(); - return broker; - } - - public BundleContext getBundleContext() { - return bundleContext; - } - - public void setBundleContext(BundleContext bundleContext) { - this.bundleContext = bundleContext; - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModuleFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModuleFactory.java deleted file mode 100644 index b0a63108f2..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplSingletonModuleFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2013 Cisco 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 org.opendaylight.controller.config.yang.md.sal.binding.impl; - -import org.opendaylight.controller.config.api.DependencyResolver; -import org.opendaylight.controller.config.api.DependencyResolverFactory; -import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; -import org.opendaylight.controller.config.api.ModuleIdentifier; -import org.opendaylight.controller.config.spi.Module; -import org.osgi.framework.BundleContext; - -import java.util.Collections; -import java.util.Set; - -/** -* -*/ -public class BindingBrokerImplSingletonModuleFactory extends - org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplSingletonModuleFactory { - - private static final String SINGLETON_NAME = "binding-broker-singleton"; - public static ModuleIdentifier SINGLETON_IDENTIFIER = new ModuleIdentifier(NAME, SINGLETON_NAME); - - @Override - public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) { - throw new UnsupportedOperationException("Only default instance supported."); - } - - @Override - public Module createModule(String instanceName, DependencyResolver dependencyResolver, - DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception { - Module instance = super.createModule(instanceName, dependencyResolver, old, bundleContext); - ((BindingBrokerImplSingletonModule)instance).setBundleContext(bundleContext); - return instance; - } - - @Override - public Set getDefaultModules(DependencyResolverFactory dependencyResolverFactory, - BundleContext bundleContext) { - - DependencyResolver dependencyResolver = dependencyResolverFactory - .createDependencyResolver(SINGLETON_IDENTIFIER); - BindingBrokerImplSingletonModule instance = new BindingBrokerImplSingletonModule(SINGLETON_IDENTIFIER, - dependencyResolver); - instance.setBundleContext(bundleContext); - - return Collections.singleton(instance); - } - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java new file mode 100644 index 0000000000..8cbfbb6da2 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java @@ -0,0 +1,83 @@ +/** + * Generated file + + * Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-data-broker + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Wed Nov 20 17:33:01 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter; +import org.opendaylight.controller.sal.binding.impl.DataBrokerImpl; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentDataServiceConnector; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService; +import org.opendaylight.controller.sal.core.api.Broker; +import org.opendaylight.controller.sal.core.api.data.DataProviderService; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.osgi.framework.BundleContext; + +import com.google.common.util.concurrent.MoreExecutors; + +/** +* +*/ +public final class DataBrokerImplModule extends + org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractDataBrokerImplModule { + + private BundleContext bundleContext; + + public DataBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, + org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public DataBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, + org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + DataBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void validate() { + super.validate(); + } + + @Override + public java.lang.AutoCloseable createInstance() { + DataBrokerImpl dataBindingBroker = new DataBrokerImpl(); + + // FIXME: obtain via dependency management + ExecutorService executor = Executors.newCachedThreadPool(); + ExecutorService listeningExecutor = MoreExecutors.listeningDecorator(executor); + dataBindingBroker.setExecutor(listeningExecutor); + + + + Broker domBroker = getDomBrokerDependency(); + BindingIndependentMappingService mappingService = getMappingServiceDependency(); + + if (domBroker != null && mappingService != null) { + BindingIndependentDataServiceConnector runtimeMapping = new BindingIndependentDataServiceConnector(); + runtimeMapping.setMappingService(mappingService); + runtimeMapping.setBaDataService(dataBindingBroker); + domBroker.registerProvider(runtimeMapping, getBundleContext()); + } + + return dataBindingBroker; + } + + public BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext2) { + this.bundleContext = bundleContext2; + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModuleFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModuleFactory.java new file mode 100644 index 0000000000..4022dd44ef --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModuleFactory.java @@ -0,0 +1,38 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-data-broker +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:33:01 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import org.opendaylight.controller.config.api.DependencyResolver; +import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; +import org.opendaylight.controller.config.spi.Module; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public class DataBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractDataBrokerImplModuleFactory +{ + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) { + DataBrokerImplModule module = (DataBrokerImplModule) super.createModule(instanceName, dependencyResolver, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, + DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception { + DataBrokerImplModule module = (DataBrokerImplModule) super.createModule(instanceName, dependencyResolver, old, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java new file mode 100644 index 0000000000..72231d17d1 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java @@ -0,0 +1,48 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-notification-broker +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:33:01 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +import org.opendaylight.controller.sal.binding.impl.NotificationBrokerImpl; + +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; + +/** +* +*/ +public final class NotificationBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModule +{ + + public NotificationBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public NotificationBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, NotificationBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void validate(){ + super.validate(); + // Add custom validation for module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + ExecutorService executor = Executors.newFixedThreadPool(5); + ListeningExecutorService listeningExecutor = MoreExecutors.listeningDecorator(executor); + NotificationBrokerImpl broker = new NotificationBrokerImpl(listeningExecutor); + return broker; + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModuleFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModuleFactory.java new file mode 100644 index 0000000000..24ca0bbfaa --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModuleFactory.java @@ -0,0 +1,19 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-notification-broker +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:33:01 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +/** +* +*/ +public class NotificationBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModuleFactory +{ + + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModule.java new file mode 100644 index 0000000000..7824da8939 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModule.java @@ -0,0 +1,37 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-rpc-broker +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:33:01 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +/** +* +*/ +public final class RpcBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRpcBrokerImplModule +{ + + public RpcBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public RpcBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, RpcBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void validate(){ + super.validate(); + // Add custom validation for module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + //TODO:implement + throw new java.lang.UnsupportedOperationException("Unimplemented stub method"); + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModuleFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModuleFactory.java new file mode 100644 index 0000000000..61c7364a43 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RpcBrokerImplModuleFactory.java @@ -0,0 +1,19 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-rpc-broker +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:33:01 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +/** +* +*/ +public class RpcBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRpcBrokerImplModuleFactory +{ + + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModule.java new file mode 100644 index 0000000000..6537b4c64d --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModule.java @@ -0,0 +1,63 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: runtime-generated-mapping +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 18:20:19 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import javassist.ClassPool; + +import org.opendaylight.controller.sal.binding.dom.serializer.impl.RuntimeGeneratedMappingServiceImpl; +import org.osgi.framework.BundleContext; + +import com.google.common.base.Preconditions; + +/** +* +*/ +public final class RuntimeMappingModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModule +{ + + private BundleContext bundleContext; + + public RuntimeMappingModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public RuntimeMappingModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, RuntimeMappingModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void validate(){ + super.validate(); + Preconditions.checkNotNull(bundleContext); + // Add custom validation for module attributes here. + } + + @Override + public boolean canReuseInstance(AbstractRuntimeMappingModule oldModule) { + return true; + } + + @Override + public java.lang.AutoCloseable createInstance() { + RuntimeGeneratedMappingServiceImpl service = new RuntimeGeneratedMappingServiceImpl(); + ClassPool pool = new ClassPool(); // Should be default singleton + service.setPool(pool); + service.start(getBundleContext()); + return service; + } + + private BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModuleFactory.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModuleFactory.java new file mode 100644 index 0000000000..f104c73ba3 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/RuntimeMappingModuleFactory.java @@ -0,0 +1,58 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: runtime-generated-mapping +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 18:20:19 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.binding.impl; + +import java.util.Collections; +import java.util.Set; + +import org.opendaylight.controller.config.api.DependencyResolver; +import org.opendaylight.controller.config.api.DependencyResolverFactory; +import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; +import org.opendaylight.controller.config.api.ModuleIdentifier; +import org.opendaylight.controller.config.spi.Module; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public class RuntimeMappingModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModuleFactory +{ + + + private static RuntimeMappingModule SINGLETON = null; + private static ModuleIdentifier IDENTIFIER = new ModuleIdentifier(NAME, "runtime-mapping-singleton"); + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) { + throw new UnsupportedOperationException("Only default instance supported"); + } + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, + DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception { + RuntimeMappingModule module = (RuntimeMappingModule) super.createModule(instanceName, dependencyResolver, old, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + + @Override + public Set getDefaultModules(DependencyResolverFactory dependencyResolverFactory, + BundleContext bundleContext) { + if(SINGLETON == null) { + DependencyResolver dependencyResolver = dependencyResolverFactory.createDependencyResolver(IDENTIFIER); + SINGLETON = new RuntimeMappingModule(IDENTIFIER , dependencyResolver); + SINGLETON.setBundleContext(bundleContext); + } + + + return Collections.singleton(SINGLETON); + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend index 93c192c0af..e1e66aa9b4 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RuntimeCodeGenerator.xtend @@ -67,7 +67,7 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co override getRouterFor(Class iface) { val contexts = new HashSet> - val instance = >withClassLoader(iface.classLoader) [ | + val instance = >withClassLoaderAndLock(iface.classLoader,lock) [ | val supertype = iface.asCtClass val metadata = supertype.rpcMetadata; val targetCls = createClass(iface.routerName, supertype) [ @@ -218,13 +218,16 @@ class RuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.co protected def resolveInvokerClass(Class class1) { - val invoker = invokerClasses.get(class1); - if (invoker !== null) { - return invoker; - } - val newInvoker = generateListenerInvoker(class1); - invokerClasses.put(class1, newInvoker); - return newInvoker + return withClassLoaderAndLock(class1.classLoader,lock) [| + val invoker = invokerClasses.get(class1); + if (invoker !== null) { + return invoker; + } + val newInvoker = generateListenerInvoker(class1); + invokerClasses.put(class1, newInvoker); + return newInvoker + + ] } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend index fd02fde407..c48aab7327 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/InstanceIdentifierCodecImpl.xtend @@ -119,5 +119,6 @@ class InstanceIdentifierCodecImpl implements InstanceIdentifierCodec { val qnameField = class1.getField("QNAME"); val qnameValue = qnameField.get(null) as QName; classToQName.put(class1,qnameValue); + return qnameValue; } } \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/LazyGeneratedCodecRegistry.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/LazyGeneratedCodecRegistry.java index e8e4c4375d..758ea731dc 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/LazyGeneratedCodecRegistry.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/LazyGeneratedCodecRegistry.java @@ -280,6 +280,11 @@ public class LazyGeneratedCodecRegistry implements // ReferencedTypeImpl typeref = new ReferencedTypeImpl(caseNode.getValue().getPackageName(), caseNode .getValue().getName()); ChoiceCaseNode node = (ChoiceCaseNode) SchemaContextUtil.findDataSchemaNode(module, caseNode.getKey()); + if(node == null) { + LOG.error("YANGTools Bug: SchemaNode for {}, with path {} was not found in context.",typeref.getFullyQualifiedName(), caseNode.getKey()); + continue; + } + @SuppressWarnings("rawtypes") ChoiceCaseCodecImpl value = new ChoiceCaseCodecImpl(node); typeToCaseNodes.putIfAbsent(typeref, value); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/RuntimeGeneratedMappingServiceImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/RuntimeGeneratedMappingServiceImpl.xtend index 4614c60ca1..5b567b1027 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/RuntimeGeneratedMappingServiceImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/RuntimeGeneratedMappingServiceImpl.xtend @@ -39,8 +39,11 @@ import org.slf4j.LoggerFactory import org.opendaylight.controller.sal.binding.dom.serializer.api.ValueWithQName import org.opendaylight.controller.sal.binding.dom.serializer.api.DataContainerCodec import org.opendaylight.yangtools.binding.generator.util.Types +import org.osgi.framework.BundleContext +import java.util.Hashtable +import org.osgi.framework.ServiceRegistration -class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingService, SchemaServiceListener { +class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingService, SchemaServiceListener, AutoCloseable { @Property ClassPool pool; @@ -65,6 +68,8 @@ class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingSer val promisedTypeDefinitions = HashMultimap.>create; val promisedSchemas = HashMultimap.>create; + + ServiceRegistration listenerRegistration override onGlobalContextUpdated(SchemaContext arg0) { recreateBindingContext(arg0); @@ -152,7 +157,7 @@ class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingSer } } - public def void start() { + public def void start(BundleContext ctx) { binding = new TransformerGenerator(pool); registry = new LazyGeneratedCodecRegistry() registry.generator = binding @@ -162,7 +167,9 @@ class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingSer binding.typeToDefinition = typeToDefinition binding.typeToSchemaNode = typeToSchemaNode binding.typeDefinitions = typeDefinitions - + if(ctx !== null) { + listenerRegistration = ctx.registerService(SchemaServiceListener,this,new Hashtable()); + } } private def getTypeDefinition(Type type) { @@ -215,4 +222,9 @@ class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingSer } promisedSchemas.removeAll(builder); } + + override close() throws Exception { + listenerRegistration?.unregister(); + } + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend index 8e059aa22e..96c3872ed0 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/dom/serializer/impl/TransformerGenerator.xtend @@ -211,8 +211,10 @@ class TransformerGenerator { if (transformer !== null) { return transformer; } - val valueTransformer = generateValueTransformer(cls, type); - return valueTransformer; + return withClassLoaderAndLock(cls.classLoader,lock) [| + val valueTransformer = generateValueTransformer(cls, type); + return valueTransformer; + ] } private def generateKeyTransformerFor(Class inputType, GeneratedType typeSpec, ListSchemaNode node) { @@ -235,7 +237,7 @@ class TransformerGenerator { _resultName = QNAME; } java.util.List _childNodes = new java.util.ArrayList(); - «inputType.name» value = («inputType.name») $2; + «inputType.resolvedName» value = («inputType.name») $2; «FOR key : node.keyDefinition» «val propertyName = key.getterName» «val keyDef = node.getDataChildByName(key)» @@ -261,7 +263,7 @@ class TransformerGenerator { «val property = properties.get(propertyName)» «deserializeProperty(keyDef, property, propertyName)»; «ENDFOR» - «inputType.name» _value = new «inputType.name»(«node.keyDefinition.keyConstructorList»); + «inputType.resolvedName» _value = new «inputType.name»(«node.keyDefinition.keyConstructorList»); return _value; } ''' @@ -294,7 +296,7 @@ class TransformerGenerator { private def Class> generateCaseCodec(Class inputType, GeneratedType type, ChoiceCaseNode node) { try { - log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) + log.info("Generating DOM Codec for {} with {}, TCCL is: {}", inputType, inputType.classLoader,Thread.currentThread.contextClassLoader) val ctCls = createClass(type.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); implementsType(BINDING_CODEC) @@ -737,16 +739,25 @@ class TransformerGenerator { val returnType = typeSpec.valueReturnType; if (returnType == null) { - val ctCls = createDummyImplementation(inputType, typeSpec); val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) return ret as Class, Object>>; } + var hasBinding = false; + try { + val bindingCodecClass = loadClassWithTCCL(BINDING_CODEC.name); + hasBinding = true; + } catch (ClassNotFoundException e) { + hasBinding = false; + } + val hasYangBinding = hasBinding val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - implementsType(BINDING_CODEC) - staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) - implementsType(BindingDeserializer.asCtClass) + if(hasYangBinding) { + implementsType(BINDING_CODEC) + staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec) + implementsType(BindingDeserializer.asCtClass) + } method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC body = ''' @@ -849,13 +860,14 @@ class TransformerGenerator { return null; } - private def dispatch Class, Object>> generateValueTransformer( + private def dispatch Class generateValueTransformer( Class inputType, Enumeration typeSpec) { try { log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader) val ctCls = createClass(typeSpec.codecClassName) [ //staticField(Map,"AUGMENTATION_SERIALIZERS"); - implementsType(BINDING_CODEC) + //implementsType(BINDING_CODEC) + method(Object, "toDomValue", Object) [ modifiers = PUBLIC + FINAL + STATIC body = ''' @@ -891,7 +903,7 @@ class TransformerGenerator { val ret = ctCls.toClassImpl(inputType.classLoader, inputType.protectionDomain) log.info("DOM Codec for {} was generated {}", inputType, ret) - return ret as Class, Object>>; + return ret; } catch (CodeGenerationException e) { throw new CodeGenerationException("Cannot compile Transformator for " + inputType, e); } catch (Exception e) { diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend index 31d5d0126f..1762aac090 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend @@ -44,17 +44,18 @@ import static org.opendaylight.controller.sal.binding.impl.util.ClassLoaderUtils import java.util.concurrent.Executors import java.util.Collections import org.opendaylight.yangtools.yang.binding.DataObject -import org.opendaylight.controller.sal.binding.impl.connect.dom.ConnectorActivator +import java.util.concurrent.locks.ReentrantLock +import java.util.concurrent.Callable +import java.util.WeakHashMap +import javax.annotation.concurrent.GuardedBy class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { private static val log = LoggerFactory.getLogger(BindingAwareBrokerImpl) - private InstanceIdentifier root = InstanceIdentifier.builder().toInstance(); - private val clsPool = ClassPool.getDefault() - private var RuntimeCodeGenerator generator; - + private static val clsPool = ClassPool.getDefault() + public static var RuntimeCodeGenerator generator; /** * Map of all Managed Direct Proxies @@ -68,28 +69,29 @@ class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { * * */ - private val Map, RpcRouter> rpcRouters = new ConcurrentHashMap(); + private val Map, RpcRouter> rpcRouters = new WeakHashMap(); @Property - private var NotificationBrokerImpl notifyBroker - + private var NotificationProviderService notifyBroker + @Property - private var DataBrokerImpl dataBroker - + private var DataProviderService dataBroker + @Property var BundleContext brokerBundleContext - + ServiceRegistration notifyProviderRegistration - + ServiceRegistration notifyConsumerRegistration - + ServiceRegistration dataProviderRegistration - + ServiceRegistration dataConsumerRegistration - - ConnectorActivator connectorActivator - - + + private val proxyGenerationLock = new ReentrantLock; + + private val routerGenerationLock = new ReentrantLock; + public new(BundleContext bundleContext) { _brokerBundleContext = bundleContext; } @@ -99,27 +101,13 @@ class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { initGenerator(); val executor = Executors.newCachedThreadPool; + // Initialization of notificationBroker log.info("Starting MD-SAL: Binding Aware Notification Broker"); - notifyBroker = new NotificationBrokerImpl(executor); - notifyBroker.invokerFactory = generator.invokerFactory; log.info("Starting MD-SAL: Binding Aware Data Broker"); - dataBroker = new DataBrokerImpl(); - dataBroker.executor = executor; - val brokerProperties = newProperties(); - - log.info("Starting MD-SAL: Binding Aware Data Broker"); - notifyProviderRegistration = brokerBundleContext.registerService(NotificationProviderService, notifyBroker, - brokerProperties) - notifyConsumerRegistration = brokerBundleContext.registerService(NotificationService, notifyBroker, brokerProperties) - dataProviderRegistration = brokerBundleContext.registerService(DataProviderService, dataBroker, brokerProperties) - dataConsumerRegistration = brokerBundleContext.registerService(DataBrokerService, dataBroker, brokerProperties) - - connectorActivator = new ConnectorActivator(dataBroker,brokerBundleContext); - connectorActivator.start(); log.info("MD-SAL: Binding Aware Broker Started"); } @@ -163,20 +151,37 @@ class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { * If proxy class does not exist for supplied service class it will be generated automatically. */ private def getManagedDirectProxy(Class service) { - var RpcProxyContext existing = null + if ((existing = managedProxies.get(service)) != null) { return existing.proxy } - val proxyInstance = generator.getDirectProxyFor(service) - val rpcProxyCtx = new RpcProxyContext(proxyInstance.class) - val properties = new Hashtable() - rpcProxyCtx.proxy = proxyInstance as RpcService - - properties.salServiceType = SAL_SERVICE_TYPE_CONSUMER_PROXY - rpcProxyCtx.registration = brokerBundleContext.registerService(service, rpcProxyCtx.proxy as T, properties) - managedProxies.put(service, rpcProxyCtx) - return rpcProxyCtx.proxy + return withLock(proxyGenerationLock) [ | + val maybeProxy = managedProxies.get(service); + if (maybeProxy !== null) { + return maybeProxy.proxy; + } + + + val proxyInstance = generator.getDirectProxyFor(service) + val rpcProxyCtx = new RpcProxyContext(proxyInstance.class) + val properties = new Hashtable() + rpcProxyCtx.proxy = proxyInstance as RpcService + properties.salServiceType = SAL_SERVICE_TYPE_CONSUMER_PROXY + rpcProxyCtx.registration = brokerBundleContext.registerService(service, rpcProxyCtx.proxy as T, properties) + managedProxies.put(service, rpcProxyCtx) + return rpcProxyCtx.proxy + ] + } + + private static def T withLock(ReentrantLock lock, Callable method) { + try { + lock.lock(); + val ret = method.call; + return ret; + } finally { + lock.unlock(); + } } /** @@ -190,7 +195,7 @@ class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { val osgiReg = context.bundleContext.registerService(type, service, properties); proxy.delegate = service; - return new RpcServiceRegistrationImpl(type, service, osgiReg,this); + return new RpcServiceRegistrationImpl(type, service, osgiReg, this); } def RoutedRpcRegistration registerRoutedRpcImplementation(Class type, T service, @@ -208,14 +213,20 @@ class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { } // We created Router - val newRouter = generator.getRouterFor(type); - checkState(newRouter !== null); - rpcRouters.put(type, newRouter); - - // We create / update Direct Proxy for router - val proxy = getManagedDirectProxy(type); - proxy.delegate = newRouter.invocationProxy - return newRouter; + return withLock(routerGenerationLock) [ | + val maybeRouter = rpcRouters.get(type); + if (maybeRouter !== null) { + return maybeRouter as RpcRouter; + } + + val newRouter = generator.getRouterFor(type); + checkState(newRouter !== null); + rpcRouters.put(type, newRouter); + // We create / update Direct Proxy for router + val proxy = getManagedDirectProxy(type); + proxy.delegate = newRouter.invocationProxy + return newRouter; + ] } @@ -230,8 +241,8 @@ class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { // Updating internal structure of registration routingTable.updateRoute(path, registration.instance) + // Update routing table / send announce to message bus - val success = paths.put(context, path); } @@ -263,32 +274,32 @@ class BindingAwareBrokerImpl implements BindingAwareBroker, AutoCloseable { routingTable.removeRoute(path) } } - + protected def void unregisterRpcService(RpcServiceRegistrationImpl registration) { val type = registration.serviceType; - + val proxy = managedProxies.get(type); - if(proxy.proxy.delegate === registration.instance) { + if (proxy.proxy.delegate === registration.instance) { proxy.proxy.delegate = null; } } - + def createDelegate(Class type) { getManagedDirectProxy(type); } - + def getRpcRouters() { return Collections.unmodifiableMap(rpcRouters); } - + override close() { dataConsumerRegistration.unregister() dataProviderRegistration.unregister() notifyConsumerRegistration.unregister() notifyProviderRegistration.unregister() } - + } class RoutedRpcRegistrationImpl extends AbstractObjectRegistration implements RoutedRpcRegistration { @@ -332,7 +343,7 @@ class RoutedRpcRegistrationImpl extends AbstractObjectRegi checkClosed() broker.unregisterPath(this, context, path); } - + override getServiceType() { return router.serviceType; } @@ -343,24 +354,25 @@ class RoutedRpcRegistrationImpl extends AbstractObjectRegi } } -class RpcServiceRegistrationImpl extends AbstractObjectRegistration implements RpcRegistration { + +class RpcServiceRegistrationImpl extends AbstractObjectRegistration implements RpcRegistration { val ServiceRegistration osgiRegistration; private var BindingAwareBrokerImpl broker; - + @Property val Class serviceType; - public new(Class type, T service, ServiceRegistration osgiReg,BindingAwareBrokerImpl broker) { + public new(Class type, T service, ServiceRegistration osgiReg, BindingAwareBrokerImpl broker) { super(service); this._serviceType = type; this.osgiRegistration = osgiReg; - this.broker= broker; + this.broker = broker; } override protected removeRegistration() { broker.unregisterRpcService(this); broker = null; } - + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java index 7a1ca11fb6..b08c72aa4c 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java @@ -17,7 +17,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult; public class DataBrokerImpl extends AbstractDataBroker, DataObject, DataChangeListener> implements - DataProviderService { + DataProviderService, AutoCloseable { public DataBrokerImpl() { setDataReadRouter(new BindingAwareDataReaderRouter()); @@ -29,65 +29,68 @@ public class DataBrokerImpl extends AbstractDataBroker T getData(DataStoreIdentifier store, Class rootType) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public T getData(DataStoreIdentifier store, T filter) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public T getCandidateData(DataStoreIdentifier store, Class rootType) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public T getCandidateData(DataStoreIdentifier store, T filter) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public RpcResult editCandidateData(DataStoreIdentifier store, DataRoot changeSet) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public Future> commit(DataStoreIdentifier store) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public DataObject getData(InstanceIdentifier data) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public DataObject getConfigurationData(InstanceIdentifier data) { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public void registerChangeListener(InstanceIdentifier path, DataChangeListener changeListener) { - // TODO Auto-generated method stub - + throw new UnsupportedOperationException("Deprecated"); } @Override + @Deprecated public void unregisterChangeListener(InstanceIdentifier path, DataChangeListener changeListener) { - // TODO Auto-generated method stub - + throw new UnsupportedOperationException("Deprecated"); } - + @Override + public void close() throws Exception { + + } } \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend index 887ef82ca9..cf339ee4f4 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend @@ -24,19 +24,13 @@ import java.util.Collections import org.slf4j.LoggerFactory import java.util.concurrent.Callable -class NotificationBrokerImpl implements NotificationProviderService { +class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable { val Multimap, NotificationListener> listeners; @Property var ExecutorService executor; - @Property - var RuntimeCodeGenerator generator; - - @Property - var NotificationInvokerFactory invokerFactory; - new(ExecutorService executor) { listeners = HashMultimap.create() this.executor = executor; @@ -108,7 +102,7 @@ class NotificationBrokerImpl implements NotificationProviderService { override registerNotificationListener( org.opendaylight.yangtools.yang.binding.NotificationListener listener) { - val invoker = invokerFactory.invokerFor(listener); + val invoker = BindingAwareBrokerImpl.generator.invokerFactory.invokerFor(listener); for (notifyType : invoker.supportedNotifications) { listeners.put(notifyType, invoker.invocationProxy) } @@ -125,6 +119,11 @@ class NotificationBrokerImpl implements NotificationProviderService { listeners.remove(notifyType, reg.invoker.invocationProxy) } } + + override close() { + //FIXME: implement properly. + } + } class GenericNotificationRegistration extends AbstractObjectRegistration> implements ListenerRegistration> { @@ -177,7 +176,9 @@ class NotifyTask implements Callable { override call() { try { + log.info("Delivering notification {} to {}",notification,listener); listener.onNotification(notification); + log.info("Notification delivered {} to {}",notification,listener); } catch (Exception e) { log.error("Unhandled exception thrown by listener: {}", listener, e); } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentDataServiceConnector.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentDataServiceConnector.java index ff897aa41d..10fcbae28a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentDataServiceConnector.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentDataServiceConnector.java @@ -1,5 +1,6 @@ package org.opendaylight.controller.sal.binding.impl.connect.dom; +import java.util.Collection; import java.util.Collections; import java.util.Map.Entry; import java.util.concurrent.ExecutionException; @@ -14,6 +15,8 @@ import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.Data import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider; import org.opendaylight.controller.sal.common.util.Rpcs; +import org.opendaylight.controller.sal.core.api.Provider; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; import org.opendaylight.controller.sal.core.api.data.DataBrokerService; import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -26,7 +29,7 @@ import com.google.common.base.Preconditions; public class BindingIndependentDataServiceConnector implements // RuntimeDataProvider, // - DataCommitHandler, DataObject> { + DataCommitHandler, DataObject>, Provider { private static final InstanceIdentifier ROOT = InstanceIdentifier.builder().toInstance(); @@ -38,7 +41,6 @@ public class BindingIndependentDataServiceConnector implements // @Override public DataObject readOperationalData(InstanceIdentifier path) { - // TODO Auto-generated method stub org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path); CompositeNode result = biDataService.readOperationalData(biPath); return mappingService.dataObjectFromDataDom(path, result); @@ -147,5 +149,16 @@ public class BindingIndependentDataServiceConnector implements // public void setMappingService(BindingIndependentMappingService mappingService) { this.mappingService = mappingService; } + + @Override + public Collection getProviderFunctionality() { + return Collections.emptyList(); + } + + @Override + public void onSessionInitiated(ProviderSession session) { + setBiDataService(session.getService(org.opendaylight.controller.sal.core.api.data.DataProviderService.class)); + start(); + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentMappingService.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentMappingService.java index 8e61c9b3ee..d96f175c56 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentMappingService.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentMappingService.java @@ -17,6 +17,5 @@ public interface BindingIndependentMappingService { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier toDataDom(InstanceIdentifier path); DataObject dataObjectFromDataDom(InstanceIdentifier path, CompositeNode result); - - + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/ConnectorActivator.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/ConnectorActivator.java deleted file mode 100644 index f69e664ee8..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/ConnectorActivator.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.opendaylight.controller.sal.binding.impl.connect.dom; - -import java.util.Collection; -import java.util.Collections; - -import javassist.ClassPool; - -import org.opendaylight.controller.sal.binding.api.data.DataProviderService; -import org.opendaylight.controller.sal.binding.dom.serializer.impl.RuntimeGeneratedMappingServiceImpl; -import org.opendaylight.controller.sal.binding.dom.serializer.impl.TransformerGenerator; -import org.opendaylight.controller.sal.core.api.Broker; -import org.opendaylight.controller.sal.core.api.Provider; -import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; -import org.opendaylight.controller.sal.core.api.data.DataBrokerService; -import org.opendaylight.controller.sal.core.api.model.SchemaService; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.util.tracker.ServiceTracker; -import org.osgi.util.tracker.ServiceTrackerCustomizer; - -public class ConnectorActivator implements Provider, ServiceTrackerCustomizer { - - BindingIndependentDataServiceConnector dataConnector; - BindingIndependentMappingService mappingService; - - private final DataProviderService baDataService; - private BundleContext context; - - private ServiceTracker brokerTracker; - - public ConnectorActivator(DataProviderService dataService, BundleContext context) { - baDataService = dataService; - this.context = context; - brokerTracker = new ServiceTracker<>(context, Broker.class, this); - } - - @Override - public Collection getProviderFunctionality() { - return Collections.emptySet(); - } - - @Override - public void onSessionInitiated(ProviderSession session) { - - RuntimeGeneratedMappingServiceImpl mappingImpl = new RuntimeGeneratedMappingServiceImpl(); - mappingImpl.setPool(new ClassPool()); - SchemaService schemaService = (session.getService(SchemaService.class)); - ClassPool pool = new ClassPool(); - mappingImpl.setBinding(new TransformerGenerator(pool)); - mappingImpl.start(); - schemaService.registerSchemaServiceListener(mappingImpl); - mappingService = mappingImpl; - dataConnector = new BindingIndependentDataServiceConnector(); - dataConnector.setBaDataService(baDataService); - dataConnector.setBiDataService(session.getService(DataBrokerService.class)); - dataConnector.setMappingService(mappingService); - dataConnector.start(); - } - - @Override - public Broker addingService(ServiceReference reference) { - Broker br= context.getService(reference); - br.registerProvider(this, context); - return br; - } - - @Override - public void modifiedService(ServiceReference reference, Broker service) { - // NOOP - } - - @Override - public void removedService(ServiceReference reference, Broker service) { - // NOOP - } - - public void start() { - brokerTracker.open(); - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang b/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang index 72bae68d4c..38770c193c 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang +++ b/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang @@ -3,8 +3,10 @@ module opendaylight-sal-binding-broker-impl { namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl"; prefix "binding-impl"; - import config { prefix config; revision-date 2013-04-05; } - import opendaylight-md-sal-binding {prefix sal;} + import config { prefix config; revision-date 2013-04-05; } + import opendaylight-md-sal-binding {prefix sal;} + import opendaylight-md-sal-dom {prefix dom;} + import opendaylight-md-sal-common {prefix common;} description "Service definition for Binding Aware MD-SAL."; @@ -14,39 +16,123 @@ module opendaylight-sal-binding-broker-impl { "Initial revision"; } - identity binding-broker-impl-singleton { + identity binding-dom-mapping-service { + base config:service-type; + config:java-class "org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService"; + } + + + identity binding-broker-impl { base config:module-type; config:provided-service sal:binding-broker-osgi-registry; - config:java-name-prefix BindingBrokerImplSingleton; + config:java-name-prefix BindingBrokerImpl; + } + + identity binding-data-broker { + base config:module-type; + config:provided-service sal:binding-data-broker; + config:provided-service sal:binding-data-consumer-broker; + config:java-name-prefix DataBrokerImpl; } - - grouping rpc-routing-table { - + identity binding-rpc-broker { + base config:module-type; + config:provided-service sal:binding-rpc-registry; + config:java-name-prefix RpcBrokerImpl; + } + + identity binding-notification-broker { + base config:module-type; + config:provided-service sal:binding-notification-service; + config:provided-service sal:binding-notification-subscription-service; + config:java-name-prefix NotificationBrokerImpl; } + identity runtime-generated-mapping { + base config:module-type; + config:provided-service binding-dom-mapping-service; + config:java-name-prefix RuntimeMapping; + } - grouping rpc-router { - leaf module { - type string; + augment "/config:modules/config:module/config:configuration" { + case binding-broker-impl { + when "/config:modules/config:module/config:type = 'binding-broker-impl'"; + + /* + container rpc-registry { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity sal:binding-rpc-registry; + } + } + }*/ + + container data-broker { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity sal:binding-data-broker; + } + } + } + + container notification-service { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity sal:binding-notification-service; + } + } + } } - container routing-tables { - list routing-table { - uses rpc-routing-table; + } + + augment "/config:modules/config:module/config:configuration" { + case binding-data-broker { + when "/config:modules/config:module/config:type = 'binding-data-broker'"; + container dom-broker { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity dom:dom-broker-osgi-registry; + } + } } + container mapping-service { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity binding-dom-mapping-service; + } + } + } } } + + augment "/config:modules/config:module/config:state" { + case runtime-generated-mapping { + when "/config:modules/config:module/config:type = 'runtime-generated-mapping'"; + } + } augment "/config:modules/config:module/config:state" { - case binding-broker-impl-singleton { - when "/config:modules/config:module/config:type = 'binding-broker-impl-singleton'"; - - container rpc-routers { - list rpc-router { - uses rpc-router; - } - } + case binding-data-broker { + when "/config:modules/config:module/config:type = 'binding-data-broker'"; + uses common:data-state; + } + } + augment "/config:modules/config:module/config:state" { + case binding-rpc-broker { + when "/config:modules/config:module/config:type = 'binding-rpc-broker'"; + uses common:rpc-state; + } + } + augment "/config:modules/config:module/config:state" { + case binding-notification-broker { + when "/config:modules/config:module/config:type = 'binding-notification-broker'"; + uses common:notification-state; } } } \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/AbstractDataServiceTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/AbstractDataServiceTest.java index 7d8a8f1fff..d047f9c5f2 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/AbstractDataServiceTest.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/AbstractDataServiceTest.java @@ -67,7 +67,7 @@ public abstract class AbstractDataServiceTest { mappingService = mappingServiceImpl; File pathname = new File("target/gen-classes-debug"); //System.out.println("Generated classes are captured in " + pathname.getAbsolutePath()); - mappingServiceImpl.start(); + mappingServiceImpl.start(null); //mappingServiceImpl.getBinding().setClassFileCapturePath(pathname); connectorServiceImpl = new BindingIndependentDataServiceConnector(); diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug01Test.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug01Test.java index 4e7628fd06..5ef4cc1097 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug01Test.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug01Test.java @@ -15,6 +15,8 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionBuilder; @@ -39,6 +41,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBu import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -68,8 +72,7 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest { private static final Map NODE_KEY_BI = Collections. singletonMap(NODE_ID_QNAME, NODE_ID); - private static final InstanceIdentifier NODES_INSTANCE_ID_BA = InstanceIdentifier.builder() // - .node(Nodes.class) // + private static final InstanceIdentifier NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) // // .toInstance(); private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODES_INSTANCE_ID_BI = // @@ -99,9 +102,8 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest { .nodeWithKey(Flow.QNAME, FLOW_KEY_BI) // .toInstance(); private static final InstanceIdentifier FLOW_INSTANCE_ID_BA = // - InstanceIdentifier.builder() // - .node(Flows.class) // - .node(Flow.class, FLOW_KEY) // + InstanceIdentifier.builder(Flows.class) // + .child(Flow.class, FLOW_KEY) // .toInstance(); @@ -180,8 +182,6 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest { flow.setKey(FLOW_KEY); flow.setMatch(match.build()); flow.setNode(NODE_REF); - - InstructionsBuilder instructions = new InstructionsBuilder(); InstructionBuilder instruction = new InstructionBuilder(); ApplyActionsBuilder applyActions = new ApplyActionsBuilder(); @@ -191,6 +191,7 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest { actionList.add(new ActionBuilder().setAction(popMplsAction.build()).build()); applyActions.setAction(actionList ); + instruction.setInstruction(applyActions.build()); @@ -205,6 +206,33 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest { assertNotNull(ret); assertEquals(TransactionStatus.COMMITED, ret.getResult()); } + + private void createFlow2() throws Exception { + DataModificationTransaction modification = baDataService.beginTransaction(); + long id = 123; + FlowKey key = new FlowKey(id, new NodeRef(NODE_INSTANCE_ID_BA)); + InstanceIdentifier path1; + FlowBuilder flow = new FlowBuilder(); + flow.setKey(key); + MatchBuilder match = new MatchBuilder(); + Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder(); + // ipv4Match.setIpv4Destination(new Ipv4Prefix(cliInput.get(4))); + match.setLayer4Match(new TcpMatchBuilder().build()); + flow.setMatch(match.build()); + DropAction dropAction = new DropActionBuilder().build(); + // ActionBuilder action = new ActionBuilder(); + + // List actions = Collections + // .singletonList(action.build()); + // flow.setAction(actions); + flow.setPriority(2); + System.out.println("Putting the configuration Data................"); + path1 = InstanceIdentifier.builder(Flows.class).child(Flow.class, key).toInstance(); + // DataObject cls = (DataObject) modification.readConfigurationData(path1); + modification.putConfigurationData(path1, flow.build()); + modification.commit(); + + } private class CreateFlowTask implements Callable { @@ -220,6 +248,7 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest { //startSyncObject.wait(); //Thread.sleep(500); createFlow(); + createFlow2(); } catch (Exception e) { throw new RuntimeException(e); } @@ -228,10 +257,10 @@ public class DOMCodecBug01Test extends AbstractDataServiceTest { } private void verifyDataAreStoredProperly() { - CompositeNode biFlow = biDataService.readConfigurationData(FLOW_INSTANCE_ID_BI); + CompositeNode biFlows = biDataService.readConfigurationData(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.of(Flows.QNAME)); + assertNotNull(biFlows); + CompositeNode biFlow = biFlows.getFirstCompositeByName(Flow.QNAME); assertNotNull(biFlow); - CompositeNode biMatch = biFlow.getFirstCompositeByName(QName.create(Flow.QNAME, Match.QNAME.getLocalName())); - assertNotNull(biMatch); } diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug03Test.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug03Test.java index ae54591a23..282aa564ac 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug03Test.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/DOMCodecBug03Test.java @@ -23,8 +23,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.Fl import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; @@ -35,6 +39,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.vlan.match.fields.VlanIdBuilder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.CompositeNode; @@ -58,8 +63,7 @@ public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataCh private static final Map NODE_KEY_BI = Collections. singletonMap(NODE_ID_QNAME, NODE_ID); - private static final InstanceIdentifier NODES_INSTANCE_ID_BA = InstanceIdentifier.builder() // - .node(Nodes.class) // + private static final InstanceIdentifier NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) // .toInstance(); private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODES_INSTANCE_ID_BI = // @@ -67,8 +71,7 @@ public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataCh .node(Nodes.QNAME) // .toInstance(); - private static final InstanceIdentifier NODE_INSTANCE_ID_BA = InstanceIdentifier.builder() // - .node(Nodes.class) // + private static final InstanceIdentifier NODE_INSTANCE_ID_BA = InstanceIdentifier.builder(NODES_INSTANCE_ID_BA) // .child(Node.class, NODE_KEY).toInstance(); private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = // @@ -120,6 +123,49 @@ public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataCh verifyNodes(nodes,original); + + testAddingNodeConnector(); + + + + testNodeRemove(); + + + } + + private void testAddingNodeConnector() throws Exception { + + NodeConnectorId ncId = new NodeConnectorId("openflow:1:bar"); + NodeConnectorKey nodeKey = new NodeConnectorKey(ncId ); + InstanceIdentifier ncInstanceId = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).child(NodeConnector.class, nodeKey).toInstance(); + NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder(); + ncBuilder.setId(ncId); + ncBuilder.setKey(nodeKey); + NodeConnector connector = ncBuilder.build(); + DataModificationTransaction transaction = baDataService.beginTransaction(); + transaction.putOperationalData(ncInstanceId, connector); + RpcResult result = transaction.commit().get(); + + Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA); + assertNotNull(node); + assertNotNull(node.getNodeConnector()); + assertFalse(node.getNodeConnector().isEmpty()); + NodeConnector readedNc = node.getNodeConnector().get(0); + assertNotNull(readedNc); + + + + + } + + private void testNodeRemove() throws Exception { + DataModificationTransaction transaction = baDataService.beginTransaction(); + transaction.removeOperationalData(NODE_INSTANCE_ID_BA); + RpcResult result = transaction.commit().get(); + assertEquals(TransactionStatus.COMMITED, result.getResult()); + + Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA); + assertNull(node); } private void verifyNodes(Nodes nodes,Node original) { diff --git a/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang b/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang index bf3d7abd1e..38f0da3ccc 100644 --- a/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang +++ b/opendaylight/md-sal/sal-binding-config/src/main/yang/opendaylight-md-sal-binding.yang @@ -23,6 +23,11 @@ module opendaylight-md-sal-binding { config:java-class "org.opendaylight.controller.sal.binding.api.data.DataProviderService"; } + identity binding-data-consumer-broker { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.binding.api.data.DataBrokerService"; + } + identity binding-rpc-registry { base "config:service-type"; config:java-class "org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"; @@ -33,4 +38,9 @@ module opendaylight-md-sal-binding { config:java-class "org.opendaylight.controller.sal.binding.api.NotificationProviderService"; } + identity binding-notification-subscription-service { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.binding.api.NotificationService"; + } + } \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-it/pom.xml b/opendaylight/md-sal/sal-binding-it/pom.xml index e242b9ecee..27d426791f 100644 --- a/opendaylight/md-sal/sal-binding-it/pom.xml +++ b/opendaylight/md-sal/sal-binding-it/pom.xml @@ -1,215 +1,252 @@ - 4.0.0 - - sal-parent - org.opendaylight.controller - 1.0-SNAPSHOT - - sal-binding-it - - scm:git:ssh://git.opendaylight.org:29418/controller.git - scm:git:ssh://git.opendaylight.org:29418/controller.git - https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + sal-parent + org.opendaylight.controller + 1.0-SNAPSHOT + + sal-binding-it + + scm:git:ssh://git.opendaylight.org:29418/controller.git + scm:git:ssh://git.opendaylight.org:29418/controller.git + https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL + - - 3.0.0 - 1.5.0 - - ../sal-binding-broker/target/jacoco.exec - ../sal-binding-broker/target/jacoco-it.exec - + + 3.0.0 + 1.5.0 + + ../sal-binding-broker/target/jacoco.exec + ../sal-binding-broker/target/jacoco-it.exec + 0.2.3-SNAPSHOT + 0.2.3-SNAPSHOT + - - - - org.ops4j.pax.exam - maven-paxexam-plugin - 1.2.4 - - - generate-config - - generate-depends-file - - - - - - org.jacoco - jacoco-maven-plugin - - org.opendaylight.controller.* - - - - pre-test - - prepare-agent - - - - post-test - test - - report - - - - - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - - org.ops4j.pax.exam - - - maven-paxexam-plugin - - - [1.2.4,) - - - - generate-depends-file - - - - - - - - - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - ../sal-binding-broker/target/jacoco-it.exec - org.opendaylight.controller.* - - - - pre-test - - prepare-agent - - - - post-test - - true - - - - - - - + + + + org.ops4j.pax.exam + maven-paxexam-plugin + 1.2.4 + + + generate-config + + generate-depends-file + + + + + + org.jacoco + jacoco-maven-plugin + + org.opendaylight.controller.* + + + + pre-test + + prepare-agent + + + + post-test + test + + report + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + + org.ops4j.pax.exam + + + maven-paxexam-plugin + + + [1.2.4,) + + + + generate-depends-file + + + + + + + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + ../sal-binding-broker/target/jacoco-it.exec + org.opendaylight.controller.* + + + + pre-test + + prepare-agent + + + + post-test + + true + + + + + + + - - - org.opendaylight.yangtools.thirdparty - xtend-lib-osgi - 2.4.3 - test - - - org.opendaylight.controller - sal-binding-broker-impl - 1.0-SNAPSHOT - provided - - - org.ops4j.pax.exam - pax-exam-container-native - ${exam.version} - test - - - org.ops4j.pax.exam - pax-exam-junit4 - ${exam.version} - test - - - org.ops4j.pax.exam - pax-exam - ${exam.version} - - compile - - - org.ops4j.pax.exam - pax-exam-link-mvn - ${exam.version} - test - - - equinoxSDK381 - org.eclipse.osgi - 3.8.1.v20120830-144521 - test - - - org.slf4j - log4j-over-slf4j - 1.7.2 - - - ch.qos.logback - logback-core - 1.0.9 - - - ch.qos.logback - logback-classic - 1.0.9 - - - org.mockito - mockito-all - test - - - org.opendaylight.controller.model - model-flow-service - 1.0-SNAPSHOT - provided - - - org.opendaylight.controller - config-manager - 0.2.3-SNAPSHOT - - - org.opendaylight.controller.model - model-flow-management - 1.0-SNAPSHOT - provided - - + + + org.opendaylight.yangtools.thirdparty + xtend-lib-osgi + 2.4.3 + test + + + org.opendaylight.controller + sal-binding-broker-impl + 1.0-SNAPSHOT + provided + + + org.ops4j.pax.exam + pax-exam-container-native + ${exam.version} + test + + + org.ops4j.pax.exam + pax-exam-junit4 + ${exam.version} + test + + + org.opendaylight.controller + config-netconf-connector + ${netconf.version} + test + + + org.opendaylight.controller + yang-store-impl + ${config.version} + + + org.opendaylight.controller + logback-config + ${config.version} + + + org.opendaylight.controller + config-persister-impl + ${config.version} + + + org.opendaylight.controller + config-persister-file-adapter + ${config.version} + + + org.opendaylight.controller + netconf-impl + ${netconf.version} + + + org.opendaylight.controller + netconf-client + ${netconf.version} + + + org.ops4j.pax.exam + pax-exam + ${exam.version} + + compile + + + org.ops4j.pax.exam + pax-exam-link-mvn + ${exam.version} + test + + + equinoxSDK381 + org.eclipse.osgi + 3.8.1.v20120830-144521 + test + + + org.slf4j + log4j-over-slf4j + 1.7.2 + + + ch.qos.logback + logback-core + 1.0.9 + + + ch.qos.logback + logback-classic + 1.0.9 + + + org.mockito + mockito-all + test + + + org.opendaylight.controller.model + model-flow-service + 1.0-SNAPSHOT + provided + + + org.opendaylight.controller + config-manager + 0.2.3-SNAPSHOT + + + org.opendaylight.controller.model + model-flow-management + 1.0-SNAPSHOT + provided + + org.opendaylight.yangtools.thirdparty antlr4-runtime-osgi-nohead 4.0 - - + + diff --git a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java index 2f9c397632..0eace4daac 100644 --- a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java +++ b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java @@ -4,9 +4,12 @@ import static org.ops4j.pax.exam.CoreOptions.frameworkProperty; import static org.ops4j.pax.exam.CoreOptions.junitBundles; import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import static org.ops4j.pax.exam.CoreOptions.repository; +import static org.ops4j.pax.exam.CoreOptions.repositories; +import static org.ops4j.pax.exam.CoreOptions.systemProperty; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.options.DefaultCompositeOption; +import org.ops4j.pax.exam.util.PathUtils; public class TestHelper { @@ -15,62 +18,107 @@ public class TestHelper { public static final String CONTROLLER_MODELS = "org.opendaylight.controller.model"; public static final String YANGTOOLS_MODELS = "org.opendaylight.yangtools.model"; + private static final String OPENDAYLIGHT_SNAPSHOT = "http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/"; + private static final String OPENDAYLIGHT_RELEASE = "http://nexus.opendaylight.org/content/repositories/opendaylight.release/"; public static Option mdSalCoreBundles() { return new DefaultCompositeOption( // - mavenBundle(YANGTOOLS, "concepts").versionAsInProject(), // - mavenBundle(YANGTOOLS, "yang-binding").versionAsInProject(), // - mavenBundle(YANGTOOLS, "yang-common").versionAsInProject(), // - mavenBundle(CONTROLLER, "sal-common").versionAsInProject(), // - mavenBundle(CONTROLLER, "sal-common-api").versionAsInProject(), // - mavenBundle(CONTROLLER, "sal-common-impl").versionAsInProject(), // - - mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(), - mavenBundle("com.google.guava", "guava").versionAsInProject(), // + mavenBundle(YANGTOOLS, "concepts").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "yang-binding").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "yang-common").versionAsInProject(), // // + mavenBundle(CONTROLLER, "sal-common").versionAsInProject(), // // + mavenBundle(CONTROLLER, "sal-common-api").versionAsInProject(), // // + mavenBundle(CONTROLLER, "sal-common-impl").versionAsInProject(), // // + + mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(), // + mavenBundle("com.google.guava", "guava").versionAsInProject(), // // mavenBundle(YANGTOOLS + ".thirdparty", "xtend-lib-osgi").versionAsInProject() // ); } public static Option configMinumumBundles() { return new DefaultCompositeOption( - mavenBundle(CONTROLLER, "config-api").versionAsInProject(), // - mavenBundle(CONTROLLER, "config-manager").versionAsInProject(), // - mavenBundle("commons-io", "commons-io").versionAsInProject() - ); + mavenBundle("org.opendaylight.bgpcep", "framework").versionAsInProject(), // + mavenBundle("org.opendaylight.bgpcep", "util").versionAsInProject(), // + mavenBundle("commons-codec", "commons-codec").versionAsInProject(), + + mavenBundle(CONTROLLER, "config-api").versionAsInProject(), // // + mavenBundle(CONTROLLER, "config-manager").versionAsInProject(), // // + mavenBundle("commons-io", "commons-io").versionAsInProject(), // + mavenBundle(CONTROLLER, "config-api").versionAsInProject(), // + mavenBundle(CONTROLLER, "config-manager").versionAsInProject(), // + mavenBundle(CONTROLLER, "config-util").versionAsInProject(), // + mavenBundle(CONTROLLER, "yang-jmx-generator").versionAsInProject(), // + mavenBundle(CONTROLLER, "yang-store-api").versionAsInProject(), // + mavenBundle(CONTROLLER, "yang-store-impl").versionAsInProject(), // + mavenBundle(CONTROLLER, "logback-config").versionAsInProject(), // + mavenBundle(CONTROLLER, "config-persister-api").versionAsInProject(), // + mavenBundle(CONTROLLER, "netconf-api").versionAsInProject(), // + + mavenBundle(CONTROLLER, "netconf-client").versionAsInProject(), // + mavenBundle(CONTROLLER, "netconf-util").versionAsInProject(), // + mavenBundle(CONTROLLER + ".thirdparty", "ganymed", "1.0-SNAPSHOT"), // + mavenBundle(CONTROLLER, "netconf-mapping-api").versionAsInProject(), // + + mavenBundle(CONTROLLER, "config-persister-impl").versionAsInProject(), // + + mavenBundle("io.netty", "netty-handler").versionAsInProject(), // + mavenBundle("io.netty", "netty-codec").versionAsInProject(), // + mavenBundle("io.netty", "netty-buffer").versionAsInProject(), // + mavenBundle("io.netty", "netty-transport").versionAsInProject(), // + mavenBundle("io.netty", "netty-common").versionAsInProject(), // + + mavenBundle("org.opendaylight.controller.thirdparty", "exificient", "0.9.2-SNAPSHOT"), // + + mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.xerces", "2.11.0_1"), + mavenBundle("org.eclipse.birt.runtime.3_7_1", "org.apache.xml.resolver", "1.2.0"), + + mavenBundle(CONTROLLER, "config-netconf-connector").versionAsInProject(), // + mavenBundle(CONTROLLER, "netconf-impl").versionAsInProject(), // + + mavenBundle(CONTROLLER, "config-persister-file-adapter").versionAsInProject().noStart()); + } - + public static Option bindingAwareSalBundles() { return new DefaultCompositeOption( // - mavenBundle(CONTROLLER, "sal-binding-api").versionAsInProject(), // - mavenBundle(CONTROLLER, "sal-binding-config").versionAsInProject(), - mavenBundle(CONTROLLER, "sal-binding-broker-impl").versionAsInProject(), // - mavenBundle("org.javassist", "javassist").versionAsInProject(), // - mavenBundle(CONTROLLER, "sal-common-util").versionAsInProject(), // - - mavenBundle(YANGTOOLS, "yang-data-api").versionAsInProject(), // - mavenBundle(YANGTOOLS, "yang-data-impl").versionAsInProject(), // - mavenBundle(YANGTOOLS, "yang-model-api").versionAsInProject(), // - mavenBundle(YANGTOOLS, "yang-model-util").versionAsInProject(), // - mavenBundle(YANGTOOLS, "yang-parser-api").versionAsInProject(), - mavenBundle(YANGTOOLS, "yang-parser-impl").versionAsInProject(), - - - mavenBundle(YANGTOOLS, "binding-generator-spi").versionAsInProject(), // - mavenBundle(YANGTOOLS, "binding-model-api").versionAsInProject(), // - mavenBundle(YANGTOOLS, "binding-generator-util").versionAsInProject(), + mavenBundle(CONTROLLER, "sal-binding-api").versionAsInProject(), // // + mavenBundle(CONTROLLER, "sal-binding-config").versionAsInProject(), // + mavenBundle(CONTROLLER, "sal-binding-broker-impl").versionAsInProject(), // // + mavenBundle("org.javassist", "javassist").versionAsInProject(), // // + mavenBundle(CONTROLLER, "sal-common-util").versionAsInProject(), // // + + mavenBundle(YANGTOOLS, "yang-data-api").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "yang-data-impl").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "yang-model-api").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "yang-model-util").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "yang-parser-api").versionAsInProject(), // mavenBundle(YANGTOOLS, "yang-parser-impl").versionAsInProject(), - mavenBundle(YANGTOOLS, "binding-type-provider").versionAsInProject(), - mavenBundle(YANGTOOLS, "binding-generator-api").versionAsInProject(), - mavenBundle(YANGTOOLS, "binding-generator-spi").versionAsInProject(), + + mavenBundle(YANGTOOLS, "binding-generator-spi").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "binding-model-api").versionAsInProject(), // // + mavenBundle(YANGTOOLS, "binding-generator-util").versionAsInProject(), // + mavenBundle(YANGTOOLS, "yang-parser-impl").versionAsInProject(), // + mavenBundle(YANGTOOLS, "binding-type-provider").versionAsInProject(), // + mavenBundle(YANGTOOLS, "binding-generator-api").versionAsInProject(), mavenBundle(YANGTOOLS, + "binding-generator-spi").versionAsInProject(), // mavenBundle(YANGTOOLS, "binding-generator-impl").versionAsInProject(), - - + mavenBundle(CONTROLLER, "sal-core-api").versionAsInProject().update(), // - mavenBundle(CONTROLLER, "sal-broker-impl").versionAsInProject(), // + mavenBundle(CONTROLLER, "sal-broker-impl").versionAsInProject(), // // mavenBundle(CONTROLLER, "sal-core-spi").versionAsInProject().update(), // - - mavenBundle(YANGTOOLS + ".thirdparty", "antlr4-runtime-osgi-nohead").versionAsInProject() // - ); + + mavenBundle(YANGTOOLS + ".thirdparty", "antlr4-runtime-osgi-nohead").versionAsInProject(), // // + + systemProperty("netconf.tcp.address").value("0.0.0.0"), // + systemProperty("netconf.tcp.port").value("18383"), // + systemProperty("netconf.config.persister.storageAdapterClass").value( + "org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter"), // + systemProperty("fileStorage").value(PathUtils.getBaseDir() + "/src/test/resources/controller.config"), // + systemProperty("numberOfBackups").value("1") // + //systemProperty("yangstore.blacklist").value(".*controller.model.*") // + + ); } @@ -83,8 +131,8 @@ public class TestHelper { public static Option flowCapableModelBundles() { return new DefaultCompositeOption( // - mavenBundle(CONTROLLER_MODELS, "model-flow-base").versionAsInProject(), // - mavenBundle(CONTROLLER_MODELS, "model-flow-service").versionAsInProject(), // + mavenBundle(CONTROLLER_MODELS, "model-flow-base").versionAsInProject(), // // + mavenBundle(CONTROLLER_MODELS, "model-flow-service").versionAsInProject(), // // mavenBundle(CONTROLLER_MODELS, "model-inventory").versionAsInProject() // ); @@ -92,22 +140,18 @@ public class TestHelper { public static Option baseModelBundles() { return new DefaultCompositeOption( // - mavenBundle(YANGTOOLS_MODELS, "yang-ext").versionAsInProject(), // - mavenBundle(YANGTOOLS_MODELS, "ietf-inet-types").versionAsInProject(), // - mavenBundle(YANGTOOLS_MODELS, "ietf-yang-types").versionAsInProject(), // - mavenBundle(YANGTOOLS_MODELS, "opendaylight-l2-types").versionAsInProject(), // + mavenBundle(YANGTOOLS_MODELS, "yang-ext").versionAsInProject(), // // + mavenBundle(YANGTOOLS_MODELS, "ietf-inet-types").versionAsInProject(), // // + mavenBundle(YANGTOOLS_MODELS, "ietf-yang-types").versionAsInProject(), // // + mavenBundle(YANGTOOLS_MODELS, "opendaylight-l2-types").versionAsInProject(), // // mavenBundle(CONTROLLER_MODELS, "model-inventory").versionAsInProject()); } public static Option junitAndMockitoBundles() { return new DefaultCompositeOption( - // Repository required to load harmcrest (OSGi-fied version). - repository("http://repository.springsource.com/maven/bundles/external").id( - "com.springsource.repository.bundles.external"), - - // Mockito - mavenBundle("org.mockito", "mockito-all", "1.9.5"), - junitBundles(), + // Repository required to load harmcrest (OSGi-fied version). + // Mockito + mavenBundle("org.mockito", "mockito-all", "1.9.5"), junitBundles(), /* * Felix has implicit boot delegation enabled by default. It diff --git a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/AbstractTest.java b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/AbstractTest.java index 41b1e310a0..338561ab48 100644 --- a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/AbstractTest.java +++ b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/AbstractTest.java @@ -11,6 +11,7 @@ import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.options.DefaultCompositeOption; +import org.ops4j.pax.exam.util.Filter; import org.ops4j.pax.exam.util.PathUtils; import org.osgi.framework.BundleContext; @@ -24,8 +25,9 @@ public abstract class AbstractTest { public static final String YANGTOOLS_MODELS = "org.opendaylight.yangtools.model"; @Inject + @Filter(timeout=60*1000) BindingAwareBroker broker; - + @Inject BundleContext bundleContext; @@ -55,13 +57,14 @@ public abstract class AbstractTest { mavenBundle("org.slf4j", "log4j-over-slf4j").versionAsInProject(), // mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(), // mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(), // + systemProperty("osgi.bundles.defaultStartLevel").value("4"), - configMinumumBundles(), + mdSalCoreBundles(), bindingAwareSalBundles(), - + configMinumumBundles(), // BASE Models baseModelBundles(), flowCapableModelBundles(), junitAndMockitoBundles()); } diff --git a/opendaylight/md-sal/sal-binding-it/src/test/resources/controller.config b/opendaylight/md-sal/sal-binding-it/src/test/resources/controller.config new file mode 100644 index 0000000000..28c3becc98 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-it/src/test/resources/controller.config @@ -0,0 +1,123 @@ +//START OF CONFIG-LAST + + + + prefix:schema-service-singleton + yang-schema-service + + + prefix:hash-map-data-store + hash-map-data-store + + + prefix:dom-broker-impl + dom-broker + + dom:dom-data-store + ref_hash-map-data-store + + + + prefix:binding-broker-impl + binding-broker-impl + + binding:binding-notification-service + ref_binding-notification-broker + + + binding:binding-data-broker + ref_binding-data-broker + + + + prefix:runtime-generated-mapping + runtime-mapping-singleton + + + prefix:binding-notification-broker + binding-notification-broker + + + prefix:binding-data-broker + binding-data-broker + + dom:dom-broker-osgi-registry + ref_dom-broker + + + binding:binding-dom-mapping-service + ref_runtime-mapping-singleton + + + + + + dom:schema-service + + ref_yang-schema-service + /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service'] + + + + binding:binding-notification-service + + ref_binding-notification-broker + /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker'] + + + + dom:dom-data-store + + ref_hash-map-data-store + /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store'] + + + + binding:binding-broker-osgi-registry + + ref_binding-broker-impl + /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl'] + + + + binding-impl:binding-dom-mapping-service + + ref_runtime-mapping-singleton + /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton'] + + + + dom:dom-broker-osgi-registry + + ref_dom-broker + /config/modules/module[name='dom-broker-impl']/instance[name='dom-broker'] + + + + binding:binding-data-broker + + ref_binding-data-broker + /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker'] + + + + + + +//END OF SNAPSHOT +urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05 +urn:ietf:params:netconf:capability:candidate:1.0 +urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04 +urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28 +urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24 +urn:ietf:params:netconf:capability:rollback-on-error:1.0 +urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16 +urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 +//END OF CONFIG diff --git a/opendaylight/md-sal/sal-binding-it/src/test/resources/logback.xml b/opendaylight/md-sal/sal-binding-it/src/test/resources/logback.xml index 2d63ce5744..1d17796373 100644 --- a/opendaylight/md-sal/sal-binding-it/src/test/resources/logback.xml +++ b/opendaylight/md-sal/sal-binding-it/src/test/resources/logback.xml @@ -7,7 +7,10 @@ - + + + + diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java index c9e1d6e330..bee863321f 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java @@ -179,7 +179,7 @@ public abstract class AbstractDataModification

*/, D> imple if (operationalOriginal.containsKey(path)) { return true; } - D data = reader.readConfigurationData(path); + D data = reader.readOperationalData(path); if (data != null) { operationalOriginal.putIfAbsent(path, data); return true; diff --git a/opendaylight/md-sal/sal-dom-api/pom.xml b/opendaylight/md-sal/sal-dom-api/pom.xml index ca923f6baa..e52a7c302d 100644 --- a/opendaylight/md-sal/sal-dom-api/pom.xml +++ b/opendaylight/md-sal/sal-dom-api/pom.xml @@ -8,11 +8,73 @@ sal-core-api - scm:git:ssh://git.opendaylight.org:29418/controller.git - scm:git:ssh://git.opendaylight.org:29418/controller.git - https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL + scm:git:ssh://git.opendaylight.org:29418/controller.git + scm:git:ssh://git.opendaylight.org:29418/controller.git + https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL - + + + + org.apache.felix + maven-bundle-plugin + true + + + org.opendaylight.yangtools + yang-maven-plugin + 0.5.9-SNAPSHOT + + + + generate-sources + + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + + ${project.build.directory}/generated-sources/config + + + urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang + + + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + 0.2.3-SNAPSHOT + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.8 + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/config + + + + + + + org.opendaylight.controller @@ -20,10 +82,14 @@ 1.0-SNAPSHOT + + org.opendaylight.controller + config-api + 0.2.3-SNAPSHOT + org.opendaylight.yangtools yang-data-api - 0.5.9-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataStore.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataStore.java new file mode 100644 index 0000000000..1062f5e535 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/data/DataStore.java @@ -0,0 +1,12 @@ +package org.opendaylight.controller.sal.core.api.data; + +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; +import org.opendaylight.controller.md.sal.common.api.data.DataReader; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; + +public interface DataStore extends // + DataReader, + DataCommitHandler { + +} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-common.yang b/opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-common.yang new file mode 100644 index 0000000000..004574defa --- /dev/null +++ b/opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-common.yang @@ -0,0 +1,68 @@ +module opendaylight-md-sal-common { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:common"; + prefix "md-sal-common"; + + description + "Common definition for MD-SAL."; + + revision "2013-10-28" { + description + "Initial revision"; + } + + grouping rpc-routing-table { + + leaf routing-context { + type string; + } + list routes { + leaf path { + type string; + } + leaf destination { + type string; + } + } + + } + + grouping rpc-router { + leaf module { + type string; + } + container routing-tables { + list routing-table { + uses rpc-routing-table; + } + } + } + + grouping rpc-state { + list rpc-router { + uses rpc-router; + } + } + + grouping notification-state { + container notifications { + leaf published { + type uint32; + } + } + } + + grouping data-state { + container transactions { + leaf created { + type uint32; + } + leaf successful { + type uint32; + } + leaf failed { + type uint32; + } + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-dom.yang b/opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-dom.yang new file mode 100644 index 0000000000..b0417eb8a0 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-api/src/main/yang/opendaylight-md-sal-dom.yang @@ -0,0 +1,35 @@ +module opendaylight-md-sal-dom { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom"; + prefix "md-sal-dom"; + + import config { prefix config; revision-date 2013-04-05; } + + description + "Service definition for Binding Aware MD-SAL."; + + revision "2013-10-28" { + description + "Initial revision"; + } + + identity dom-broker-osgi-registry { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.core.api.Broker"; + } + + identity dom-data-broker { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.core.api.data.DataProviderService"; + } + + identity dom-data-store { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.core.api.data.DataStore"; + } + + identity schema-service { + base "config:service-type"; + config:java-class "org.opendaylight.controller.sal.core.api.model.SchemaService"; + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/pom.xml b/opendaylight/md-sal/sal-dom-broker/pom.xml index 62dbe16e41..14ab057398 100644 --- a/opendaylight/md-sal/sal-dom-broker/pom.xml +++ b/opendaylight/md-sal/sal-dom-broker/pom.xml @@ -72,6 +72,43 @@ + + org.opendaylight.yangtools + yang-maven-plugin + 0.5.9-SNAPSHOT + + + + generate-sources + + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + + ${project.build.directory}/generated-sources/config + + + urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang + + + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + 0.2.3-SNAPSHOT + + + + + org.apache.felix maven-bundle-plugin @@ -79,13 +116,32 @@ ${project.groupId}.${project.artifactId} - org.opendaylight.controller.sal.dom.broker.BrokerActivator - org.opendaylight.controller.sal.dom.broker.* + org.opendaylight.controller.sal.dom.broker.*, + org.opendaylight.controller.config.yang.md.sal.dom.impl + + org.codehaus.mojo + build-helper-maven-plugin + 1.8 + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/config + + + + + org.eclipse.xtend xtend-maven-plugin diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java new file mode 100644 index 0000000000..9a4fc6ddc1 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModule.java @@ -0,0 +1,55 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-dom-broker-impl yang module local name: dom-broker-impl +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:04:41 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.dom.impl; + +import org.opendaylight.controller.sal.core.api.data.DataStore; +import org.opendaylight.controller.sal.dom.broker.BrokerConfigActivator; +import org.opendaylight.controller.sal.dom.broker.BrokerImpl; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public final class DomBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractDomBrokerImplModule +{ + + private BundleContext bundleContext; + + public DomBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public DomBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, DomBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void validate(){ + super.validate(); + // Add custom validation for module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + BrokerImpl broker = new BrokerImpl(); + BrokerConfigActivator activator = new BrokerConfigActivator(); + DataStore store = getDataStoreDependency(); + activator.start(broker, store,getBundleContext()); + return broker; + } + + private BundleContext getBundleContext() { + return this.bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModuleFactory.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModuleFactory.java new file mode 100644 index 0000000000..8e9e9f6ac7 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/DomBrokerImplModuleFactory.java @@ -0,0 +1,38 @@ +/** + * Generated file + + * Generated from: yang module name: opendaylight-sal-dom-broker-impl yang module local name: dom-broker-impl + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Wed Nov 20 17:04:41 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ +package org.opendaylight.controller.config.yang.md.sal.dom.impl; + +import org.opendaylight.controller.config.api.DependencyResolver; +import org.opendaylight.controller.config.api.DynamicMBeanWithInstance; +import org.opendaylight.controller.config.spi.Module; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public class DomBrokerImplModuleFactory extends + org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractDomBrokerImplModuleFactory { + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) { + DomBrokerImplModule module = (DomBrokerImplModule) super.createModule(instanceName, dependencyResolver, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, + DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception { + DomBrokerImplModule module = (DomBrokerImplModule) super.createModule(instanceName, dependencyResolver, old, bundleContext); + module.setBundleContext(bundleContext); + return module; + } + +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModule.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModule.java new file mode 100644 index 0000000000..4bcbb08963 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModule.java @@ -0,0 +1,39 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-dom-broker-impl yang module local name: hash-map-data-store +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:01:31 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.dom.impl; + +import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore; + +/** +* +*/ +public final class HashMapDataStoreModule extends org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractHashMapDataStoreModule +{ + + public HashMapDataStoreModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public HashMapDataStoreModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, HashMapDataStoreModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void validate(){ + super.validate(); + // Add custom validation for module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + HashMapDataStore store = new HashMapDataStore(); + return store; + } +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModuleFactory.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModuleFactory.java new file mode 100644 index 0000000000..b9b6816a20 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/HashMapDataStoreModuleFactory.java @@ -0,0 +1,19 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-dom-broker-impl yang module local name: hash-map-data-store +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:01:31 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.dom.impl; + +/** +* +*/ +public class HashMapDataStoreModuleFactory extends org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractHashMapDataStoreModuleFactory +{ + + +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java new file mode 100644 index 0000000000..6b597dea9e --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModule.java @@ -0,0 +1,58 @@ +/** +* Generated file + +* Generated from: yang module name: opendaylight-sal-dom-broker-impl yang module local name: schema-service-singleton +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Wed Nov 20 17:01:31 CET 2013 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.md.sal.dom.impl; + +import org.opendaylight.controller.sal.dom.broker.SchemaServiceImpl; +import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public final class SchemaServiceImplSingletonModule extends org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractSchemaServiceImplSingletonModule +{ + + BundleContext bundleContext; + + public SchemaServiceImplSingletonModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public SchemaServiceImplSingletonModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, SchemaServiceImplSingletonModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public boolean canReuseInstance(AbstractSchemaServiceImplSingletonModule oldModule) { + return true; + } + + public BundleContext getBundleContext() { + return bundleContext; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + @Override + public void validate(){ + super.validate(); + } + + @Override + public java.lang.AutoCloseable createInstance() { + SchemaServiceImpl newInstance = new SchemaServiceImpl(); + newInstance.setContext(getBundleContext()); + newInstance.setParser(new YangParserImpl()); + newInstance.start(); + return newInstance; + } +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModuleFactory.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModuleFactory.java new file mode 100644 index 0000000000..4b73656f72 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/dom/impl/SchemaServiceImplSingletonModuleFactory.java @@ -0,0 +1,46 @@ +/** + * Generated file + + * Generated from: yang module name: opendaylight-sal-dom-broker-impl yang module local name: schema-service-singleton + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Wed Nov 20 17:01:31 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ +package org.opendaylight.controller.config.yang.md.sal.dom.impl; + +import java.util.Collections; +import java.util.Set; + +import org.opendaylight.controller.config.api.DependencyResolver; +import org.opendaylight.controller.config.api.DependencyResolverFactory; +import org.opendaylight.controller.config.api.ModuleIdentifier; +import org.opendaylight.controller.config.spi.Module; +import org.osgi.framework.BundleContext; + +/** +* +*/ +public class SchemaServiceImplSingletonModuleFactory extends + org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractSchemaServiceImplSingletonModuleFactory { + + private static final ModuleIdentifier IDENTIFIER = new ModuleIdentifier(NAME, "yang-schema-service"); + public static SchemaServiceImplSingletonModule SINGLETON; + + @Override + public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) { + throw new UnsupportedOperationException("Only default instance supported."); + } + + @Override + public Set getDefaultModules(DependencyResolverFactory dependencyResolverFactory, + BundleContext bundleContext) { + DependencyResolver dependencyResolver = dependencyResolverFactory.createDependencyResolver(IDENTIFIER); + + if (SINGLETON == null) { + SINGLETON = new SchemaServiceImplSingletonModule(IDENTIFIER, dependencyResolver); + SINGLETON.setBundleContext(bundleContext); + } + return Collections.singleton(SINGLETON); + } +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerActivator.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerActivator.java deleted file mode 100644 index 3af645a2b8..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerActivator.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.opendaylight.controller.sal.dom.broker; - -import java.util.Hashtable; - -import org.opendaylight.controller.sal.core.api.Broker; -import org.opendaylight.controller.sal.core.api.data.DataBrokerService; -import org.opendaylight.controller.sal.core.api.data.DataProviderService; -import org.opendaylight.controller.sal.core.api.model.SchemaService; -import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; -import org.opendaylight.controller.sal.core.api.mount.MountService; -import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; - -public class BrokerActivator implements BundleActivator { - - private static final InstanceIdentifier ROOT = InstanceIdentifier.builder().toInstance(); - BrokerImpl broker; - private ServiceRegistration brokerReg; - private ServiceRegistration schemaReg; - private ServiceRegistration dataReg; - private ServiceRegistration dataProviderReg; - private SchemaServiceImpl schemaService; - private DataBrokerImpl dataService; - private MountPointManagerImpl mountService; - private ServiceRegistration mountReg; - private ServiceRegistration mountProviderReg; - private HashMapDataStore hashMapStore; - - @Override - public void start(BundleContext context) throws Exception { - Hashtable emptyProperties = new Hashtable(); - broker = new BrokerImpl(); - broker.setBundleContext(context); - - - schemaService = new SchemaServiceImpl(); - schemaService.setContext(context); - schemaService.setParser(new YangParserImpl()); - schemaService.start(); - schemaReg = context.registerService(SchemaService.class, schemaService, new Hashtable()); - - dataService = new DataBrokerImpl(); - dataService.setExecutor(broker.getExecutor()); - - dataReg = context.registerService(DataBrokerService.class, dataService, emptyProperties); - dataProviderReg = context.registerService(DataProviderService.class, dataService, emptyProperties); - - hashMapStore = new HashMapDataStore(); - - dataService.registerConfigurationReader(ROOT, hashMapStore); - dataService.registerCommitHandler(ROOT, hashMapStore); - dataService.registerOperationalReader(ROOT, hashMapStore); - - mountService = new MountPointManagerImpl(); - mountService.setDataBroker(dataService); - - mountReg = context.registerService(MountService.class, mountService, emptyProperties); - mountProviderReg = context.registerService(MountProvisionService.class, mountService, emptyProperties); - - brokerReg = context.registerService(Broker.class, broker, emptyProperties); - } - - @Override - public void stop(BundleContext context) throws Exception { - if (brokerReg != null) { - brokerReg.unregister(); - } - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend new file mode 100644 index 0000000000..a6aa0ce32e --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerConfigActivator.xtend @@ -0,0 +1,67 @@ +package org.opendaylight.controller.sal.dom.broker + +import org.osgi.framework.ServiceRegistration +import org.opendaylight.controller.sal.core.api.model.SchemaService +import org.opendaylight.controller.sal.core.api.data.DataBrokerService +import org.opendaylight.controller.sal.core.api.data.DataProviderService +import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService +import org.opendaylight.controller.sal.core.api.mount.MountService +import org.osgi.framework.BundleContext +import java.util.Hashtable +import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier +import org.opendaylight.controller.sal.core.api.data.DataStore + +class BrokerConfigActivator implements AutoCloseable { + + + private static val ROOT = InstanceIdentifier.builder().toInstance(); + + private var ServiceRegistration schemaReg; + private var ServiceRegistration dataReg; + private var ServiceRegistration dataProviderReg; + private var ServiceRegistration mountReg; + private var ServiceRegistration mountProviderReg; + + private var SchemaServiceImpl schemaService; + private var DataBrokerImpl dataService; + private var MountPointManagerImpl mountService; + + public def void start(BrokerImpl broker,DataStore store,BundleContext context) { + val emptyProperties = new Hashtable(); + broker.setBundleContext(context); + + + schemaService = new SchemaServiceImpl(); + schemaService.setContext(context); + schemaService.setParser(new YangParserImpl()); + schemaService.start(); + schemaReg = context.registerService(SchemaService, schemaService, emptyProperties); + + dataService = new DataBrokerImpl(); + dataService.setExecutor(broker.getExecutor()); + + dataReg = context.registerService(DataBrokerService, dataService, emptyProperties); + dataProviderReg = context.registerService(DataProviderService, dataService, emptyProperties); + + dataService.registerConfigurationReader(ROOT, store); + dataService.registerCommitHandler(ROOT, store); + dataService.registerOperationalReader(ROOT, store); + + mountService = new MountPointManagerImpl(); + mountService.setDataBroker(dataService); + + mountReg = context.registerService(MountService, mountService, emptyProperties); + mountProviderReg = context.registerService(MountProvisionService, mountService, emptyProperties); + } + + override def close() { + schemaReg?.unregister(); + dataReg?.unregister(); + dataProviderReg?.unregister(); + mountReg?.unregister(); + mountProviderReg?.unregister(); + } + +} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend index 26fecef688..7ef594bad9 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/BrokerImpl.xtend @@ -30,7 +30,7 @@ import org.opendaylight.controller.sal.dom.broker.spi.RpcRouter import org.opendaylight.yangtools.concepts.ListenerRegistration import org.opendaylight.controller.sal.core.api.RpcRegistrationListener -public class BrokerImpl implements Broker { +public class BrokerImpl implements Broker, AutoCloseable { private static val log = LoggerFactory.getLogger(BrokerImpl); // Broker Generic Context @@ -43,6 +43,9 @@ public class BrokerImpl implements Broker { private var ExecutorService executor = Executors.newFixedThreadPool(5); @Property private var BundleContext bundleContext; + + @Property + private var AutoCloseable deactivator; @Property private var RpcRouter router; @@ -107,4 +110,9 @@ public class BrokerImpl implements Broker { sessions.remove(consumerContextImpl); providerSessions.remove(consumerContextImpl); } + + override close() throws Exception { + deactivator?.close(); + } + } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/SchemaServiceImpl.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/SchemaServiceImpl.java index ba558c51fd..531f9e86c2 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/SchemaServiceImpl.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/SchemaServiceImpl.java @@ -13,6 +13,8 @@ import java.util.zip.Checksum; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.osgi.util.tracker.BundleTracker; import org.osgi.util.tracker.BundleTrackerCustomizer; +import org.osgi.util.tracker.ServiceTracker; +import org.osgi.util.tracker.ServiceTrackerCustomizer; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; @@ -20,6 +22,7 @@ import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleEvent; +import org.osgi.framework.ServiceReference; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.util.ListenerRegistry; import org.opendaylight.controller.sal.core.api.model.SchemaService; @@ -34,9 +37,13 @@ import com.google.common.collect.Collections2; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; + import static com.google.common.base.Preconditions.*; -public class SchemaServiceImpl implements SchemaService, AutoCloseable { +public class SchemaServiceImpl implements // +SchemaService, // +ServiceTrackerCustomizer, // +AutoCloseable { private static final Logger logger = LoggerFactory.getLogger(SchemaServiceImpl.class); private ListenerRegistry listeners; @@ -54,6 +61,8 @@ public class SchemaServiceImpl implements SchemaService, AutoCloseable { private BundleTracker bundleTracker; private final YangStoreCache cache = new YangStoreCache(); + private ServiceTracker listenerTracker; + public ListenerRegistry getListeners() { return listeners; } @@ -84,9 +93,11 @@ public class SchemaServiceImpl implements SchemaService, AutoCloseable { if (listeners == null) { listeners = new ListenerRegistry<>(); } - + + listenerTracker = new ServiceTracker<>(context, SchemaServiceListener.class, this); bundleTracker = new BundleTracker(context, BundleEvent.RESOLVED | BundleEvent.UNRESOLVED, scanner); bundleTracker.open(); + listenerTracker.open(); } public SchemaContext getGlobalContext() { @@ -185,6 +196,18 @@ public class SchemaServiceImpl implements SchemaService, AutoCloseable { private void updateCache(SchemaContext snapshot) { cache.cacheYangStore(consistentBundlesToYangURLs, snapshot); + + Object[] services = listenerTracker.getServices(); + if(services != null) { + for(Object rawListener : services) { + SchemaServiceListener listener = (SchemaServiceListener) rawListener; + try { + listener.onGlobalContextUpdated(snapshot); + } catch (Exception e) { + logger.error("Exception occured during invoking listener",e); + } + } + } for (ListenerRegistration listener : listeners) { try { listener.getInstance().onGlobalContextUpdated(snapshot); @@ -220,6 +243,7 @@ public class SchemaServiceImpl implements SchemaService, AutoCloseable { proposedNewState.putAll(inconsistentBundlesToYangURLs); proposedNewState.putAll(bundle, addedURLs); boolean adding = true; + if (tryToUpdateState(addedURLs, proposedNewState, adding) == false) { inconsistentBundlesToYangURLs.putAll(bundle, addedURLs); } @@ -276,6 +300,26 @@ public class SchemaServiceImpl implements SchemaService, AutoCloseable { this.cachedUrls = setFromMultimapValues(urls); this.cachedContextSnapshot = ctx; } - + } + + @Override + public SchemaServiceListener addingService(ServiceReference reference) { + + SchemaServiceListener listener = context.getService(reference); + SchemaContext _ctxContext = getGlobalContext(); + if(getContext() != null) { + listener.onGlobalContextUpdated(_ctxContext); + } + return listener; + } + + @Override + public void modifiedService(ServiceReference reference, SchemaServiceListener service) { + // NOOP + } + + @Override + public void removedService(ServiceReference reference, SchemaServiceListener service) { + context.ungetService(reference); } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.xtend index 7d57819cbf..e7445e6965 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/HashMapDataStore.xtend @@ -1,7 +1,5 @@ package org.opendaylight.controller.sal.dom.broker.impl -import org.opendaylight.controller.md.sal.common.api.data.DataReader -import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler import org.opendaylight.controller.md.sal.common.api.data.DataModification import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction import org.opendaylight.yangtools.yang.common.RpcResult @@ -12,10 +10,10 @@ import java.util.Collections import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier import org.opendaylight.yangtools.yang.data.api.CompositeNode import static extension org.opendaylight.controller.sal.dom.broker.impl.DataUtils.*; +import org.opendaylight.controller.sal.core.api.data.DataStore +import java.util.HashSet -class HashMapDataStore // -implements // -DataReader, DataCommitHandler { +class HashMapDataStore implements DataStore, AutoCloseable { val Map configuration = new ConcurrentHashMap(); val Map operational = new ConcurrentHashMap(); @@ -45,14 +43,32 @@ DataReader, DataCommitHandler map, InstanceIdentifier identifier) { + val affected = new HashSet(); + for(path : map.keySet) { + if(identifier.contains(path)) { + affected.add(path); + } + } + for(pathToRemove : affected) { + map.remove(pathToRemove); + } + + } + + override close() { + // NOOP + } + } class HashMapDataStoreTransaction implements // diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang b/opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang new file mode 100644 index 0000000000..bf12ac4f01 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/yang/opendaylight-dom-broker-impl.yang @@ -0,0 +1,61 @@ +module opendaylight-sal-dom-broker-impl { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl"; + prefix "binding-impl"; + + import config { prefix config; revision-date 2013-04-05; } + import opendaylight-md-sal-dom {prefix sal;} + + description + "Service definition for Binding Aware MD-SAL."; + + revision "2013-10-28" { + description + "Initial revision"; + } + + identity dom-broker-impl { + base config:module-type; + config:provided-service sal:dom-broker-osgi-registry; + config:java-name-prefix DomBrokerImpl; + } + + identity hash-map-data-store { + base config:module-type; + config:provided-service sal:dom-data-store; + config:java-name-prefix HashMapDataStore; + } + + identity schema-service-singleton { + base config:module-type; + config:provided-service sal:schema-service; + config:java-name-prefix SchemaServiceImplSingleton; + } + + augment "/config:modules/config:module/config:configuration" { + case dom-broker-impl { + when "/config:modules/config:module/config:type = 'dom-broker-impl'"; + container data-store { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity sal:dom-data-store; + } + } + } + } + } + + augment "/config:modules/config:module/config:state" { + case hash-map-data-store { + when "/config:modules/config:module/config:type = 'hash-map-data-store'"; + } + } + + augment "/config:modules/config:module/config:state" { + case schema-service-singleton { + when "/config:modules/config:module/config:type = 'schema-service-singleton'"; + } + } + +} \ No newline at end of file diff --git a/opendaylight/md-sal/samples/pom.xml b/opendaylight/md-sal/samples/pom.xml index 04e0a32ffb..6b87a22418 100644 --- a/opendaylight/md-sal/samples/pom.xml +++ b/opendaylight/md-sal/samples/pom.xml @@ -27,7 +27,7 @@ false - toaster-it + -- 2.36.6