-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
- <artifactId>concepts</artifactId>
- <version>${opendaylight.yangtools.version}</version>
+ <artifactId>yang-binding</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-common</artifactId>
</dependency>
</dependencies>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
- <Import-Package>
- javax.management,
- org.opendaylight.yangtools.concepts,
- org.osgi.framework,
- </Import-Package>
<Export-Package>
org.opendaylight.controller.config.api,
org.opendaylight.controller.config.api.annotations,
org.opendaylight.controller.config.api.jmx,
org.opendaylight.controller.config.api.jmx.constants,
org.opendaylight.controller.config.api.runtime,
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.rpc.context.rev130617.*,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.*,
</Export-Package>
</instructions>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-maven-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
</plugins>
</build>
</project>
org.opendaylight.controller.config.manager.*,
javax.annotation.*,
</Private-Package>
- <Import-Package>
- org.opendaylight.controller.config.api.*,
- org.opendaylight.controller.config.spi.*,
- org.slf4j,
- javax.management,
- org.osgi.framework,
- org.opendaylight.yangtools.concepts.*,
- org.apache.commons.io,
- org.osgi.util.tracker,
- </Import-Package>
<Export-Package>
</Export-Package>
</instructions>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
- <Import-Package>
- com.google.common.base,
- org.w3c.dom,
- org.osgi.framework,
- </Import-Package>
<Export-Package>
org.opendaylight.controller.config.persist.api,
org.opendaylight.controller.config.persist.api.storage,
</Fragment-Host>
<Provide-Capability>org.opendaylight.controller.config.persister.storage.adapter
</Provide-Capability>
- <Import-Package>
- org.osgi.framework,
- com.google.common.base,
- com.google.common.collect,
- com.google.common.io,
- javax.xml.parsers,
- javax.xml.transform,
- javax.xml.transform.dom,
- javax.xml.transform.stream,
- org.apache.commons.lang3,
- org.opendaylight.controller.config.persist.api,
- org.slf4j,
- org.w3c.dom,
- org.xml.sax,
- </Import-Package>
</instructions>
</configuration>
</plugin>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-subsystem</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>config-plugin-parent</artifactId>
+ <name>${project.artifactId}</name>
+ <packaging>pom</packaging>
+ <prerequisites>
+ <maven>3.0.4</maven>
+ </prerequisites>
+
+ <properties>
+ <jmxGeneratorPath>${project.build.directory}/generated-sources/config</jmxGeneratorPath>
+ </properties>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>config</id>
+ <goals>
+ <goal>generate-sources</goal>
+ </goals>
+ <configuration>
+ <codeGenerators>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ </codeGeneratorClass>
+ <outputBaseDir>${jmxGeneratorPath}</outputBaseDir>
+ <additionalConfiguration>
+ <namespaceToPackage1>
+ urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
+ </namespaceToPackage1>
+ </additionalConfiguration>
+ </generator>
+ </codeGenerators>
+ <inspectDependencies>true</inspectDependencies>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>yang-jmx-generator-plugin</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+
+ <!-- tell eclipse about generated source folders -->
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.8</version>
+ <executions>
+ <execution>
+ <id>add-source</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>add-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>${jmxGeneratorPath}</source>
+ </sources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+</project>
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
+ <artifactId>config-plugin-parent</artifactId>
<version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<artifactId>logback-config</artifactId>
<name>${project.artifactId}</name>
<instructions>
<Private-Package>
</Private-Package>
- <Import-Package>
- ch.qos.logback.classic,
- ch.qos.logback.classic.encoder,
- ch.qos.logback.classic.filter,
- ch.qos.logback.classic.spi,
- ch.qos.logback.core,
- ch.qos.logback.core.status,
- ch.qos.logback.core.encoder,
- ch.qos.logback.core.rolling,
- org.opendaylight.controller.config.api,
- org.opendaylight.controller.config.api.runtime,
- org.opendaylight.controller.config.api.annotations,
- org.opendaylight.controller.config.spi,
- com.google.common.base,
- com.google.common.collect,
- org.apache.commons.lang3,
- org.slf4j,
- org.osgi.framework
- </Import-Package>
<Export-Package>
org.opendaylight.controller.config.yang.logback.config,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.logback.config.rev130716.*,
</Export-Package>
</instructions>
</configuration>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
- <version>0.2.3-SNAPSHOT</version>
+ <artifactId>config-plugin-parent</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>netty-config-api</artifactId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
- <Import-Package>
- org.opendaylight.controller.config.api.*,
- io.netty.channel,
- io.netty.util,
- io.netty.util.concurrent
- </Import-Package>
<Export-Package>
- org.opendaylight.controller.config.yang.netty
+ org.opendaylight.controller.config.yang.netty,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.rev131119.*,
</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
-</project>
\ No newline at end of file
+</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
- <version>0.2.3-SNAPSHOT</version>
+ <artifactId>config-plugin-parent</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>netty-event-executor-config</artifactId>
<instructions>
<Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
<Export-Package>
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.eventexecutor.rev131112.*,
</Export-Package>
- <Import-Package>
- com.google.common.base,
- org.opendaylight.controller.config.yang.netty,
- io.netty.util.concurrent,
- org.opendaylight.controller.config.api,
- org.opendaylight.controller.config.api.annotations,
- org.opendaylight.controller.config.api.runtime,
- org.opendaylight.controller.config.spi,
- org.slf4j,
- org.osgi.framework
- </Import-Package>
</instructions>
</configuration>
</plugin>
</site>
</distributionManagement>
-</project>
\ No newline at end of file
+</project>
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
+ <artifactId>config-plugin-parent</artifactId>
<version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<instructions>
<Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
<Export-Package>
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.threadgroup.rev131107.*,
</Export-Package>
- <Import-Package>
- com.google.common.base,
- io.netty.channel.nio,
- org.opendaylight.controller.config.yang.netty,
- io.netty.util.concurrent,
- org.opendaylight.controller.config.api,
- org.opendaylight.controller.config.api.annotations,
- org.opendaylight.controller.config.api.runtime,
- org.opendaylight.controller.config.spi,
- org.slf4j,
- org.osgi.framework
- </Import-Package>
</instructions>
</configuration>
</plugin>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
- <version>0.2.3-SNAPSHOT</version>
+ <artifactId>config-plugin-parent</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>netty-timer-config</artifactId>
<instructions>
<Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
<Export-Package>
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.netty.timer.rev131119.*,
</Export-Package>
- <Import-Package>
- javax.management,
- com.google.common.base,
- org.opendaylight.controller.config.yang.netty,
- org.opendaylight.controller.config.yang.threadpool,
- io.netty.util,
- org.opendaylight.controller.config.api,
- org.opendaylight.controller.config.api.annotations,
- org.opendaylight.controller.config.api.runtime,
- org.opendaylight.controller.config.spi,
- org.slf4j,
- org.osgi.framework
- </Import-Package>
</instructions>
</configuration>
</plugin>
<url>${basedir}/target/site/${project.artifactId}</url>
</site>
</distributionManagement>
-</project>
\ No newline at end of file
+</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>config-api</module>
<module>config-manager</module>
+ <module>config-plugin-parent</module>
<module>config-util</module>
<module>config-persister-api</module>
<module>config-persister-file-adapter</module>
<opendaylight.yang.version>0.5.9-SNAPSHOT</opendaylight.yang.version>
<opendaylight.binding.version>0.6.0-SNAPSHOT</opendaylight.binding.version>
<opendaylight.yangtools.version>0.1.1-SNAPSHOT</opendaylight.yangtools.version>
- <jmxGeneratorPath>${project.build.directory}/generated-sources/config</jmxGeneratorPath>
</properties>
<dependencies>
<artifactId>yang-store-api</artifactId>
<version>${config.version}</version>
</dependency>
+
+ <!-- MD-SAL -->
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-binding</artifactId>
+ <version>${opendaylight.binding.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-common</artifactId>
+ <version>${opendaylight.yang.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>concepts</artifactId>
+ <version>${opendaylight.yangtools.version}</version>
+ </dependency>
</dependencies>
</dependencyManagement>
</plugin>
</plugins>
-
-
<pluginManagement>
<plugins>
<plugin>
<version>${opendaylight.yang.version}</version>
<executions>
<execution>
+ <id>sal</id>
<goals>
<goal>generate-sources</goal>
</goals>
<configuration>
+ <yangFilesRootDir>src/main/yang</yangFilesRootDir>
<codeGenerators>
<generator>
<codeGeneratorClass>
- org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
</codeGeneratorClass>
- <outputBaseDir>${jmxGeneratorPath}</outputBaseDir>
- <additionalConfiguration>
- <namespaceToPackage1>
- urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
- </namespaceToPackage1>
- </additionalConfiguration>
+ <outputBaseDir>
+ target/generated-sources/sal
+ </outputBaseDir>
+ </generator>
+ <generator>
+ <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
+ <outputBaseDir>target/site</outputBaseDir>
</generator>
</codeGenerators>
<inspectDependencies>true</inspectDependencies>
</executions>
<dependencies>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-jmx-generator-plugin</artifactId>
- <version>${config.version}</version>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>maven-sal-api-gen-plugin</artifactId>
+ <version>${opendaylight.binding.version}</version>
+ <type>jar</type>
</dependency>
</dependencies>
</plugin>
- <!-- tell eclipse about generated source folders -->
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>1.8</version>
- <executions>
- <execution>
- <id>add-source</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>${jmxGeneratorPath}</source>
- </sources>
- </configuration>
- </execution>
- </executions>
- </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
- <version>0.2.3-SNAPSHOT</version>
+ <artifactId>config-plugin-parent</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>threadpool-config-api</artifactId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
- <Import-Package>
- org.opendaylight.controller.config.api.*,
- com.google.common.eventbus,
- </Import-Package>
<Export-Package>
org.opendaylight.controller.config.threadpool,
- org.opendaylight.controller.config.yang.threadpool
+ org.opendaylight.controller.config.yang.threadpool,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.threadpool.rev130409.*,
</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
-</project>
\ No newline at end of file
+</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
- <version>0.2.3-SNAPSHOT</version>
+ <artifactId>config-plugin-parent</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>threadpool-config-impl</artifactId>
javax.annotation.*,
org.opendaylight.controller.config.yang.threadpool.impl,
</Private-Package>
- <Import-Package>
- org.opendaylight.controller.config.api.*,
- org.opendaylight.controller.config.spi.*,
- org.opendaylight.controller.config.threadpool,
- org.opendaylight.controller.config.yang.threadpool,
- javax.management,
- org.osgi.framework,
- org.slf4j,
- com.google.common.*
- </Import-Package>
<Export-Package>
- org.opendaylight.controller.config.threadpool.util
+ org.opendaylight.controller.config.threadpool.util,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.threadpool.impl.rev130405.*,
</Export-Package>
</instructions>
</configuration>
public String getDefinition() {
return definition;
}
+
+ public boolean isArray() {
+ return type.endsWith("[]");
+ }
}
dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, ${field.name}, ${field.name}JmxAttribute);
</#if>
</#list>
+ customValidation();
+ }
+
+ protected void customValidation(){
+
}
// caches of resolved dependencies
public boolean canReuseInstance(${typeDeclaration.name} oldModule){
// allow reusing of old instance if no parameters was changed
- return equals(oldModule);
+ return isSame(oldModule);
}
public ${instanceType} reuseInstance(${instanceType} oldInstance){
public abstract ${instanceType} createInstance();
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- ${typeDeclaration.name} other = (${typeDeclaration.name}) obj;
-
-
+ public boolean isSame(${typeDeclaration.name} other) {
+ if (other == null) {
+ throw new IllegalArgumentException("Parameter 'other' is null");
+ }
<#list moduleFields as field>
<#if field.dependent==true>
if (${field.name}Dependency == null) {
if (other.${field.name}Dependency != null)
return false;
- } else if (!${field.name}Dependency.equals(other.${field.name}Dependency))
+ } else if (!${field.name}Dependency.equals(other.${field.name}Dependency)) {
return false;
+ }
<#else>
if (${field.name} == null) {
- if (other.${field.name} != null)
+ if (other.${field.name} != null) {
return false;
- } else if (!${field.name}.equals(other.${field.name}))
+ }
+ } else if
+ <#if field.array == false>
+ (${field.name}.equals(other.${field.name}) == false)
+ <#else>
+ (java.util.Arrays.equals(${field.name},other.${field.name}) == false)
+ </#if>
+ {
return false;
+ }
</#if>
</#list>
return true;
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ${typeDeclaration.name} that = (${typeDeclaration.name}) o;
+
+ return identifier.equals(that.identifier);
+ }
+
+ @Override
+ public int hashCode() {
+ return identifier.hashCode();
+ }
}
package ${packageName};
<@javadocD object=javadoc/>
-<@typeDeclarationD object=typeDeclaration/>
-{
+<@typeDeclarationD object=typeDeclaration/> {
public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver) {
super(identifier, dependencyResolver);
}
- public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver, ${typeDeclaration.name} oldModule, ${instanceType} oldInstance) {
+ public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver,
+ ${typeDeclaration.name} oldModule, ${instanceType} oldInstance) {
+
super(identifier, dependencyResolver, oldModule, oldInstance);
}
@Override
- public void validate(){
- super.validate();
+ protected void customValidation(){
// Add custom validation for module attributes here.
}
assertContains(reqIfc, PackageTranslatorTest.EXPECTED_PACKAGE_PREFIX
+ ".threads.ThreadFactoryServiceInterface");
- assertEquals("Incorrenct number of generated methods", 24,
+ assertEquals("Incorrenct number of generated methods", 27,
visitor.methods.size());
assertEquals("Incorrenct number of generated method descriptions", 3,
visitor.methodDescriptions.size());
<Private-Package>
org.opendaylight.controller.config.yangjmxgenerator.plugin.util,
</Private-Package>
- <Import-Package>
- org.slf4j,
- com.google.common.base,
- com.google.common.collect,
- javax.management.*,
- <!-- YANGTOOLS -->
- org.opendaylight.yangtools.binding.generator.util,
- org.opendaylight.yangtools.sal.binding.generator.spi,
- org.opendaylight.yangtools.sal.binding.model.api,
- org.opendaylight.yangtools.yang.common,
- org.opendaylight.yangtools.yang.model.api
- </Import-Package>
<Export-Package>
org.opendaylight.controller.config.yangjmxgenerator,
org.opendaylight.controller.config.yangjmxgenerator.attribute,
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
- <Import-Package>
- org.opendaylight.controller.config.yangjmxgenerator,
- org.opendaylight.yangtools.yang.model.api
- </Import-Package>
<Export-Package>
org.opendaylight.controller.config.yang.store.api,
</Export-Package>
<configuration>
<instructions>
<Bundle-Activator>org.opendaylight.controller.config.yang.store.impl.YangStoreActivator</Bundle-Activator>
- <Import-Package>
- org.opendaylight.controller.config.yang.store.api,
- org.opendaylight.controller.config.yangjmxgenerator,
- com.google.common.base,
- com.google.common.collect,
- com.google.common.primitives,
- org.apache.commons.io,
- org.osgi.framework,
- org.osgi.util.tracker,
- org.slf4j,
- <!-- YANGTOOLS -->
- org.opendaylight.yangtools.sal.binding.yang.types,
- org.opendaylight.yangtools.yang.common,
- org.opendaylight.yangtools.yang.model.api,
- org.opendaylight.yangtools.sal.binding.generator.spi,
- org.opendaylight.yangtools.yang.parser.impl,
- </Import-Package>
<Export-Package>
</Export-Package>
</instructions>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-subsystem</artifactId>
+ <artifactId>config-plugin-parent</artifactId>
<version>0.2.3-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
</parent>
<artifactId>yang-test</artifactId>
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl yang module local name: impl-dep
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
package org.opendaylight.controller.config.yang.test.impl;
-
/**
*
*/
-public final class DepTestImplModule
- extends
- org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModule {
+public final class DepTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModule
+ {
- public DepTestImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
- super(name, dependencyResolver);
+ public DepTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+ super(identifier, dependencyResolver);
}
- public DepTestImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+ public DepTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
DepTestImplModule oldModule, java.lang.AutoCloseable oldInstance) {
- super(name, dependencyResolver, oldModule, oldInstance);
+
+ super(identifier, dependencyResolver, oldModule, oldInstance);
}
@Override
- public void validate() {
- super.validate();
+ protected void customValidation(){
// Add custom validation for module attributes here.
}
}
};
}
-
}
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl yang module local name: impl-dep
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
package org.opendaylight.controller.config.yang.test.impl;
/**
*
*/
-public class DepTestImplModuleFactory
- extends
- org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModuleFactory {
+public class DepTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractDepTestImplModuleFactory
+{
+
}
--- /dev/null
+ return new AutoCloseable() {
+ @Override
+ public void close() throws Exception {
+ }
+ };
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl yang module local name: impl-netconf
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
package org.opendaylight.controller.config.yang.test.impl;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
/**
*
*/
-public final class NetconfTestImplModule
- extends
- org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModule {
+public final class NetconfTestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModule
+ {
- public NetconfTestImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
- super(name, dependencyResolver);
+ public NetconfTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+ super(identifier, dependencyResolver);
}
- public NetconfTestImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+ public NetconfTestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
NetconfTestImplModule oldModule, java.lang.AutoCloseable oldInstance) {
- super(name, dependencyResolver, oldModule, oldInstance);
+
+ super(identifier, dependencyResolver, oldModule, oldInstance);
}
@Override
- public void validate() {
- super.validate();
+ protected void customValidation(){
// Add custom validation for module attributes here.
}
@Override
public java.lang.AutoCloseable createInstance() {
- return registerRuntimeBeans();
+ return NetconfTestImplModuleUtil.registerRuntimeBeans(this);
}
-
- private NetconfTestImplRuntimeRegistration registerRuntimeBeans() {
- NetconfTestImplRuntimeRegistration reg = getRootRuntimeBeanRegistratorWrapper().register(new NetconfTestImplRuntimeMXBean() {
-
- @Override
- public Long getCreatedSessions() {
- return getSimpleLong();
- }
-
- @Override
- public Asdf getAsdf() {
- final Asdf asdf = new Asdf();
- asdf.setSimpleString("asdf");
- return asdf;
- }
-
- @Override
- public String noArg(final String arg1) {
- return arg1.toUpperCase();
- }
-
- });
-
- for (int i = 0; i < getSimpleShort(); i++) {
- final int finalI = i;
-
- reg.register(new InnerRunningDataAdditionalRuntimeMXBean() {
- @Override
- public Integer getSimpleInt3() {
- return getSimpleTest();
- }
-
- @Override
- public Deep4 getDeep4() {
- final Deep4 d = new Deep4();
- d.setBoool(false);
- return d;
- }
-
- @Override
- public String getSimpleString() {
- return Integer.toString(finalI);
- }
-
- @Override
- public void noArgInner() {
- }
- });
-
- InnerRunningDataRuntimeRegistration innerReg = reg.register(new InnerRunningDataRuntimeMXBean() {
- @Override
- public Integer getSimpleInt3() {
- return finalI;
- }
-
- @Override
- public Deep2 getDeep2() {
- return new Deep2();
- }
- });
-
- for (int j = 0; j < getSimpleShort(); j++) {
- final int finalJ = j;
- innerReg.register(new InnerInnerRunningDataRuntimeMXBean() {
- @Override
- public List<NotStateBean> getNotStateBean() {
- NotStateBean b1 = new NotStateBean();
- b1.setElement("not state");
- return Lists.newArrayList(b1);
- }
-
- @Override
- public Integer getSimpleInt3() {
- return finalJ;
- }
-
- @Override
- public Deep3 getDeep3() {
- return new Deep3();
- }
-
- @Override
- public List<String> getListOfStrings() {
- return Lists.newArrayList("l1", "l2");
- }
-
- @Override
- public List<RetValList> listOutput() {
- return Lists.newArrayList(new RetValList());
- }
-
- @Override
- public Boolean noArgInnerInner(Integer integer, Boolean aBoolean) {
- return aBoolean;
- }
-
- @Override
- public RetValContainer containerOutput() {
- return new RetValContainer();
- }
-
- @Override
- public List<String> leafListOutput() {
- return Lists.newArrayList("1", "2");
- }
- });
- }
- }
-
- return reg;
- }
-
}
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl yang module local name: impl-netconf
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
package org.opendaylight.controller.config.yang.test.impl;
/**
*
*/
-public class NetconfTestImplModuleFactory
- extends
- org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModuleFactory {
+public class NetconfTestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractNetconfTestImplModuleFactory
+{
+
}
--- /dev/null
+return NetconfTestImplModuleUtil.registerRuntimeBeans(this);
--- /dev/null
+/**
+ * @author Tomas Olvecky
+ *
+ * 11 2013
+ *
+ * Copyright (c) 2013 by Cisco Systems, Inc.
+ * All rights reserved.
+ */
+package org.opendaylight.controller.config.yang.test.impl;
+
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+public class NetconfTestImplModuleUtil {
+ static NetconfTestImplRuntimeRegistration registerRuntimeBeans(final NetconfTestImplModule module) {
+ NetconfTestImplRuntimeRegistration reg = module.getRootRuntimeBeanRegistratorWrapper().register(new NetconfTestImplRuntimeMXBean() {
+
+ @Override
+ public Long getCreatedSessions() {
+ return module.getSimpleLong();
+ }
+
+ @Override
+ public Asdf getAsdf() {
+ final Asdf asdf = new Asdf();
+ asdf.setSimpleString("asdf");
+ return asdf;
+ }
+
+ @Override
+ public String noArg(final String arg1) {
+ return arg1.toUpperCase();
+ }
+
+ });
+
+ for (int i = 0; i < module.getSimpleShort(); i++) {
+ final int finalI = i;
+
+ reg.register(new InnerRunningDataAdditionalRuntimeMXBean() {
+ @Override
+ public Integer getSimpleInt3() {
+ return module.getSimpleTest();
+ }
+
+ @Override
+ public Deep4 getDeep4() {
+ final Deep4 d = new Deep4();
+ d.setBoool(false);
+ return d;
+ }
+
+ @Override
+ public String getSimpleString() {
+ return Integer.toString(finalI);
+ }
+
+ @Override
+ public void noArgInner() {
+ }
+ });
+
+ InnerRunningDataRuntimeRegistration innerReg = reg.register(new InnerRunningDataRuntimeMXBean() {
+ @Override
+ public Integer getSimpleInt3() {
+ return finalI;
+ }
+
+ @Override
+ public Deep2 getDeep2() {
+ return new Deep2();
+ }
+ });
+
+ for (int j = 0; j < module.getSimpleShort(); j++) {
+ final int finalJ = j;
+ innerReg.register(new InnerInnerRunningDataRuntimeMXBean() {
+ @Override
+ public List<NotStateBean> getNotStateBean() {
+ NotStateBean b1 = new NotStateBean();
+ b1.setElement("not state");
+ return Lists.newArrayList(b1);
+ }
+
+ @Override
+ public Integer getSimpleInt3() {
+ return finalJ;
+ }
+
+ @Override
+ public Deep3 getDeep3() {
+ return new Deep3();
+ }
+
+ @Override
+ public List<String> getListOfStrings() {
+ return Lists.newArrayList("l1", "l2");
+ }
+
+ @Override
+ public List<RetValList> listOutput() {
+ return Lists.newArrayList(new RetValList());
+ }
+
+ @Override
+ public Boolean noArgInnerInner(Integer integer, Boolean aBoolean) {
+ return aBoolean;
+ }
+
+ @Override
+ public RetValContainer containerOutput() {
+ return new RetValContainer();
+ }
+
+ @Override
+ public List<String> leafListOutput() {
+ return Lists.newArrayList("1", "2");
+ }
+ });
+ }
+ }
+
+ return reg;
+ }
+}
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl yang module local name: impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
package org.opendaylight.controller.config.yang.test.impl;
-
/**
*
*/
-public final class TestImplModule
- extends
- org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModule {
+public final class TestImplModule extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModule
+ {
- public TestImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
- super(name, dependencyResolver);
+ public TestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+ super(identifier, dependencyResolver);
}
- public TestImplModule(
- org.opendaylight.controller.config.api.ModuleIdentifier name,
- org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+ public TestImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
TestImplModule oldModule, java.lang.AutoCloseable oldInstance) {
- super(name, dependencyResolver, oldModule, oldInstance);
+
+ super(identifier, dependencyResolver, oldModule, oldInstance);
}
@Override
- public void validate() {
- super.validate();
+ protected void customValidation(){
// Add custom validation for module attributes here.
}
}
};
}
-
}
-/**
- * Generated file
-
- * Generated from: yang module name: config-test-impl yang module local name: impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Fri Sep 27 13:02:28 CEST 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
package org.opendaylight.controller.config.yang.test.impl;
/**
*
*/
-public class TestImplModuleFactory
- extends
- org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModuleFactory {
+public class TestImplModuleFactory extends org.opendaylight.controller.config.yang.test.impl.AbstractTestImplModuleFactory
+{
+
}
--- /dev/null
+ return new AutoCloseable() {
+ @Override
+ public void close() throws Exception {
+ }
+ };
<version>0.1.1-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustered-datastore-implementation</artifactId>
+ <version>0.4.1-SNAPSHOT</version>
+ </dependency>
+
+
<!-- config-->
<dependency>
<groupId>org.opendaylight.controller</groupId>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-parent</artifactId>
- <version>1.0-SNAPSHOT</version>
- <relativePath>../..</relativePath>
- </parent>
- <scm>
- <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
- <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
- <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
- <tag>HEAD</tag>
- </scm>
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-parent</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <relativePath>../..</relativePath>
+ </parent>
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
+ <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
+ <tag>HEAD</tag>
+ </scm>
- <artifactId>clustered-datastore-implementation</artifactId>
- <version>0.4.1-SNAPSHOT</version>
- <packaging>bundle</packaging>
+ <artifactId>clustered-datastore-implementation</artifactId>
+ <version>0.4.1-SNAPSHOT</version>
+ <packaging>bundle</packaging>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>${bundle.plugin.version}</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Export-Package>
- org.opendaylight.controller.datastore
- </Export-Package>
- <Import-Package>
- javax.xml.bind.annotation,
- org.opendaylight.controller.sal.core,
- org.opendaylight.controller.sal.utils,
- org.opendaylight.controller.sal.packet,
- org.opendaylight.controller.sal.topology,
- org.opendaylight.controller.clustering.services,
- org.opendaylight.controller.md.sal.common.api.data,
- org.opendaylight.controller.sal.common.util,
- org.opendaylight.yangtools.yang.binding,
- org.osgi.service.component,
- org.slf4j,
- org.apache.felix.dm,
- org.apache.commons.lang3.builder,
- org.apache.commons.lang3.tuple,
- org.eclipse.osgi.framework.console,
- org.osgi.framework,
- com.google.common.base
- </Import-Package>
- <Bundle-Activator>
- org.opendaylight.controller.datastore.internal.Activator
- </Bundle-Activator>
- </instructions>
- <manifestLocation>${project.basedir}/META-INF</manifestLocation>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>${bundle.plugin.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ </instructions>
+ <manifestLocation>${project.basedir}/META-INF</manifestLocation>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-maven-plugin</artifactId>
+ <version>0.5.9-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>generate-sources</goal>
+ </goals>
+ <configuration>
+ <codeGenerators>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ </codeGeneratorClass>
+ <outputBaseDir>${project.build.directory}/generated-sources/config</outputBaseDir>
+ <additionalConfiguration>
+ <namespaceToPackage1>
+ urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
+ </namespaceToPackage1>
+ </additionalConfiguration>
+ </generator>
+ </codeGenerators>
+ <inspectDependencies>true</inspectDependencies>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>yang-jmx-generator-plugin</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-api</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-util</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal</artifactId>
- <version>0.5.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>clustering.services</artifactId>
- <version>0.4.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.osgi</artifactId>
- <version>3.8.1.v20120830-144521</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-binding</artifactId>
- </dependency>
- </dependencies>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-core-api</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-util</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-api</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal</artifactId>
+ <version>0.5.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustering.services</artifactId>
+ <version>0.4.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-binding</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-data-api</artifactId>
+ </dependency>
+
+ </dependencies>
</project>
--- /dev/null
+/**
+* Generated file
+
+* Generated from: yang module name: odl-sal-dom-clustered-store-cfg yang module local name: dom-clustered-store-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Wed Nov 27 17:09:17 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.md.sal.dom.cluster.store;
+
+import org.opendaylight.controller.datastore.internal.ClusteredDataStoreManager;
+import org.osgi.framework.BundleContext;
+
+/**
+*
+*/
+public final class ClusteredDataStoreImplModule extends org.opendaylight.controller.config.yang.md.sal.dom.cluster.store.AbstractClusteredDataStoreImplModule
+{
+
+ private BundleContext bundleContext;
+
+ public ClusteredDataStoreImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+ super(identifier, dependencyResolver);
+ }
+
+ public ClusteredDataStoreImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, ClusteredDataStoreImplModule 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() {
+ ClusteredDataStoreManager manager = new ClusteredDataStoreManager();
+ manager.setContext(bundleContext);
+ manager.start();
+ return manager;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+}
--- /dev/null
+/**
+* Generated file
+
+* Generated from: yang module name: odl-sal-dom-clustered-store-cfg yang module local name: dom-clustered-store-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Wed Nov 27 17:09:17 CET 2013
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.md.sal.dom.cluster.store;
+
+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 ClusteredDataStoreImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.dom.cluster.store.AbstractClusteredDataStoreImplModuleFactory
+{
+
+ @Override
+ public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) {
+ ClusteredDataStoreImplModule module =
+ (ClusteredDataStoreImplModule) super.createModule(instanceName, dependencyResolver, bundleContext);
+ module.setBundleContext(bundleContext);
+ return module;
+ }
+
+ @Override
+ public Module createModule(String instanceName, DependencyResolver dependencyResolver,
+ DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception {
+ ClusteredDataStoreImplModule module =
+ (ClusteredDataStoreImplModule) super.createModule(instanceName, dependencyResolver, old, bundleContext);
+ module.setBundleContext(bundleContext);
+ return module;
+ }
+
+}
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.binding.InstanceIdentifier;
+import org.opendaylight.controller.sal.core.api.data.DataStore;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+
+public interface ClusteredDataStore extends DataStore {
+
-public interface ClusteredDataStore extends DataReader<InstanceIdentifier<? extends Object>, Object>, DataCommitHandler<InstanceIdentifier<? extends Object>,Object> {
}
+++ /dev/null
-
-/*
- * 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.datastore.internal;
-
-import org.apache.felix.dm.Component;
-import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
-import org.opendaylight.controller.datastore.ClusteredDataStore;
-import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.Set;
-
-public class Activator extends ComponentActivatorAbstractBase {
- protected static final Logger logger = LoggerFactory
- .getLogger(Activator.class);
-
-
- @Override
- protected Object[] getGlobalImplementations(){
- logger.debug("Calling getGlobalImplementations to return:", ClusteredDataStoreManager.class);
- return new Object[] {
- ClusteredDataStoreManager.class
- };
- }
-
-
- @Override
- protected void configureGlobalInstance(Component c, Object imp){
- if (imp.equals(ClusteredDataStoreManager.class)) {
- Dictionary<String, Set<String>> props = new Hashtable<String, Set<String>>();
-
- c.setInterface(new String[] { ClusteredDataStore.class.getName() }, props);
- logger.debug("configureGlobalInstance adding dependency:", IClusterGlobalServices.class);
-
- c.add(createServiceDependency().setService(
- IClusterGlobalServices.class).setCallbacks(
- "setClusterGlobalServices",
- "unsetClusterGlobalServices").setRequired(true));
-
- }
- }
-
-
-}
package org.opendaylight.controller.datastore.internal;
import com.google.common.base.Preconditions;
+
import org.opendaylight.controller.clustering.services.CacheConfigException;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
import org.opendaylight.controller.datastore.ClusteredDataStore;
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
import org.opendaylight.controller.sal.common.util.Rpcs;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.Collections;
import java.util.EnumSet;
public static final String OPERATIONAL_DATA_CACHE = "clustered_data_store.operational_data_cache";
public static final String CONFIGURATION_DATA_CACHE = "clustered_data_store.configuration_data_cache";
- private final ConcurrentMap operationalDataCache;
- private final ConcurrentMap configurationDataCache;
+ private final ConcurrentMap<InstanceIdentifier, CompositeNode> operationalDataCache;
+ private final ConcurrentMap<InstanceIdentifier, CompositeNode> configurationDataCache;
+
+ private Logger logger = LoggerFactory.getLogger(ClusteredDataStoreImpl.class);
- public ClusteredDataStoreImpl(IClusterGlobalServices clusterGlobalServices) throws CacheExistException, CacheConfigException {
+ public ClusteredDataStoreImpl(IClusterGlobalServices clusterGlobalServices) throws CacheConfigException {
+ logger.info("Constructing clustered data store");
Preconditions.checkNotNull(clusterGlobalServices, "clusterGlobalServices cannot be null");
operationalDataCache = getOrCreateCache(clusterGlobalServices, OPERATIONAL_DATA_CACHE);
- if(operationalDataCache == null){
- Preconditions.checkNotNull(operationalDataCache, "operationalDataCache cannot be null");
- }
+ Preconditions.checkNotNull(operationalDataCache, "operationalDataCache cannot be null");
configurationDataCache = getOrCreateCache(clusterGlobalServices, CONFIGURATION_DATA_CACHE);
- if(configurationDataCache == null){
- Preconditions.checkNotNull(configurationDataCache, "configurationDataCache cannot be null");
- }
-
+ Preconditions.checkNotNull(configurationDataCache, "configurationDataCache cannot be null");
}
@Override
- public DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> requestCommit(DataModification<InstanceIdentifier<? extends Object>, Object> modification) {
+ public DataCommitTransaction<InstanceIdentifier, CompositeNode> requestCommit(DataModification<InstanceIdentifier, CompositeNode> modification) {
return new ClusteredDataStoreTransaction(modification);
}
@Override
- public Object readOperationalData(InstanceIdentifier<? extends Object> path) {
+ public CompositeNode readOperationalData(InstanceIdentifier path) {
Preconditions.checkNotNull(path, "path cannot be null");
return operationalDataCache.get(path);
}
@Override
- public Object readConfigurationData(InstanceIdentifier<? extends Object> path) {
+ public boolean containsConfigurationPath(InstanceIdentifier path) {
+ return configurationDataCache.containsKey(path);
+ }
+
+ @Override
+ public boolean containsOperationalPath(InstanceIdentifier path) {
+ return operationalDataCache.containsKey(path);
+ }
+
+ @Override
+ public Iterable<InstanceIdentifier> getStoredConfigurationPaths() {
+ return configurationDataCache.keySet();
+ }
+
+ @Override
+ public Iterable<InstanceIdentifier> getStoredOperationalPaths() {
+ return operationalDataCache.keySet();
+ }
+
+
+
+ @Override
+ public CompositeNode readConfigurationData(InstanceIdentifier path) {
Preconditions.checkNotNull(path, "path cannot be null");
return configurationDataCache.get(path);
}
private RpcResult<Void> finish(final ClusteredDataStoreTransaction transaction) {
- final DataModification<InstanceIdentifier<? extends Object>,Object> modification = transaction.getModification();
+ final DataModification<InstanceIdentifier,CompositeNode> modification = transaction.getModification();
this.configurationDataCache.putAll(modification.getUpdatedConfigurationData());
this.operationalDataCache.putAll(modification.getUpdatedOperationalData());
- for (final InstanceIdentifier<? extends Object> removal : modification.getRemovedConfigurationData()) {
+ for (final InstanceIdentifier removal : modification.getRemovedConfigurationData()) {
this.configurationDataCache.remove(removal);
}
- for (final InstanceIdentifier<? extends Object> removal : modification.getRemovedOperationalData()) {
+ for (final InstanceIdentifier removal : modification.getRemovedOperationalData()) {
this.operationalDataCache.remove(removal );
}
return cache;
}
- private class ClusteredDataStoreTransaction implements DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> {
- private final DataModification<InstanceIdentifier<? extends Object>,Object> modification;
+ private class ClusteredDataStoreTransaction implements DataCommitTransaction<InstanceIdentifier, CompositeNode> {
+ private final DataModification<InstanceIdentifier,CompositeNode> modification;
- public ClusteredDataStoreTransaction(DataModification<InstanceIdentifier<? extends Object>,Object> modification){
+ public ClusteredDataStoreTransaction(DataModification<InstanceIdentifier,CompositeNode> modification){
Preconditions.checkNotNull(modification, "modification cannot be null");
this.modification = modification;
}
@Override
- public DataModification<InstanceIdentifier<? extends Object>, Object> getModification() {
+ public DataModification<InstanceIdentifier, CompositeNode> getModification() {
return this.modification;
}
-
/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
-
package org.opendaylight.controller.datastore.internal;
+import java.util.Hashtable;
+
import com.google.common.base.Preconditions;
-import org.apache.felix.dm.Component;
+
import org.opendaylight.controller.clustering.services.CacheConfigException;
-import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
import org.opendaylight.controller.datastore.ClusteredDataStore;
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
-public class ClusteredDataStoreManager implements ClusteredDataStore {
+public class ClusteredDataStoreManager implements //
+ ClusteredDataStore, //
+ ServiceTrackerCustomizer<IClusterGlobalServices, IClusterGlobalServices>, //
+ AutoCloseable {
- private ClusteredDataStoreImpl clusteredDataStore = null;
+ private ClusteredDataStore clusteredDataStore = null;
private IClusterGlobalServices clusterGlobalServices = null;
+ private BundleContext context;
+
+ private ServiceReference<IClusterGlobalServices> firstClusterGlobalReference;
+ private ServiceTracker<IClusterGlobalServices, IClusterGlobalServices> clusterTracker;
@Override
- public DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> requestCommit(DataModification<InstanceIdentifier<? extends Object>, Object> modification) {
+ public DataCommitTransaction<InstanceIdentifier, CompositeNode> requestCommit(
+ DataModification<InstanceIdentifier, CompositeNode> modification) {
Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
return clusteredDataStore.requestCommit(modification);
}
@Override
- public Object readOperationalData(InstanceIdentifier<? extends Object> path) {
+ public CompositeNode readOperationalData(InstanceIdentifier path) {
Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
return clusteredDataStore.readOperationalData(path);
}
@Override
- public Object readConfigurationData(InstanceIdentifier<? extends Object> path) {
+ public CompositeNode readConfigurationData(InstanceIdentifier path) {
Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
return clusteredDataStore.readConfigurationData(path);
}
+ public Iterable<InstanceIdentifier> getStoredConfigurationPaths() {
+ Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+ return clusteredDataStore.getStoredConfigurationPaths();
+ }
+
+ public Iterable<InstanceIdentifier> getStoredOperationalPaths() {
+ Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+ return clusteredDataStore.getStoredOperationalPaths();
+ }
- public void setClusterGlobalServices(IClusterGlobalServices clusterGlobalServices){
+ public boolean containsConfigurationPath(InstanceIdentifier path) {
+ Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+ return clusteredDataStore.containsConfigurationPath(path);
+ }
+
+ public boolean containsOperationalPath(InstanceIdentifier path) {
+ Preconditions.checkState(clusteredDataStore != null, "clusteredDataStore cannot be null");
+ return clusteredDataStore.containsOperationalPath(path);
+ }
+
+ public void setClusterGlobalServices(IClusterGlobalServices clusterGlobalServices) {
this.clusterGlobalServices = clusterGlobalServices;
+ try {
+ // Adding creation of the clustered data store in its own method
+ // to make the method unit testable
+ clusteredDataStore = createClusteredDataStore();
+ } catch (CacheConfigException e) {
+ throw new IllegalStateException("could not construct clusteredDataStore");
+ }
}
- public void unsetClusterGlobalServices(IClusterGlobalServices clusterGlobalServices){
- this.clusterGlobalServices = null;
- this.clusteredDataStore = null;
+ @Override
+ public IClusterGlobalServices addingService(ServiceReference<IClusterGlobalServices> reference) {
+ if (clusterGlobalServices == null) {
+ setClusterGlobalServices(context.getService(reference));
+ return clusterGlobalServices;
+ }
+ return null;
+ }
+
+ @Override
+ public void modifiedService(ServiceReference<IClusterGlobalServices> reference, IClusterGlobalServices service) {
+
+ }
+
+ @Override
+ public void removedService(ServiceReference<IClusterGlobalServices> reference, IClusterGlobalServices service) {
+ if (clusterGlobalServices == service) {
+ clusterGlobalServices = null;
+ clusteredDataStore = null;
+ }
}
+ public BundleContext getContext() {
+ return context;
+ }
+ public void setContext(BundleContext context) {
+ this.context = context;
+ }
+
+
/**
* Function called by the dependency manager when all the required
* dependencies are satisfied
- *
+ *
*/
- void init(Component c) {
- try {
- //Adding creation of the clustered data store in its own method to make the method unit testable
- clusteredDataStore = createClusteredDataStore(c);
- } catch (CacheExistException e) {
- throw new IllegalStateException("could not construct clusteredDataStore");
- } catch (CacheConfigException e) {
- throw new IllegalStateException("could not construct clusteredDataStore");
+ public void start() {
+ if (context != null) {
+ clusterTracker = new ServiceTracker<>(context, IClusterGlobalServices.class, this);
+ clusterTracker.open();
+
+ context.registerService(ClusteredDataStore.class, this, new Hashtable<String,Object>());
}
}
- protected ClusteredDataStoreImpl createClusteredDataStore(Component c) throws CacheExistException,CacheConfigException{
- return new ClusteredDataStoreImpl(clusterGlobalServices);
+
+ protected ClusteredDataStore createClusteredDataStore() throws CacheConfigException {
+ return new ClusteredDataStoreImpl(clusterGlobalServices);
+ }
+
+ @Override
+ public void close() throws Exception {
+ clusterTracker.close();
}
}
--- /dev/null
+module odl-sal-dom-clustered-store-cfg {
+ yang-version 1;
+ namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:cluster:store";
+ prefix "binding-impl";
+
+ import config { prefix config; revision-date 2013-04-05; }
+ import opendaylight-md-sal-dom {prefix sal;}
+
+ description
+ "Service definition for MD-SAL Clustered Store.";
+
+ revision "2013-10-28" {
+ description
+ "Initial revision";
+ }
+
+ identity dom-clustered-store-impl {
+ base config:module-type;
+ config:provided-service sal:dom-data-store;
+ config:java-name-prefix ClusteredDataStoreImpl;
+ }
+
+ augment "/config:modules/config:module/config:state" {
+ case dom-clustered-store-impl {
+ when "/config:modules/config:module/config:type = 'dom-clustered-store-impl'";
+ }
+ }
+
+}
\ No newline at end of file
+++ /dev/null
-
-/*
- * 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.datastore.internal;
-
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.ServiceDependency;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
-
-import static junit.framework.Assert.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class ActivatorTest {
-
- private static ServiceDependency serviceDependency;
-
- @BeforeClass
- public static void initialize(){
- serviceDependency = mock(ServiceDependency.class);
- }
-
- private class ActivatorTestImpl extends Activator{
- protected ServiceDependency createServiceDependency() {
- return ActivatorTest.serviceDependency;
- }
- }
-
- @Test
- public void construct(){
- assertNotNull(new Activator());
- }
-
- @Test
- public void construct_OnInvokeOfGlobalImpl_ShouldReturnNotNullObject(){
- Activator activator = new Activator();
-
- assertNotNull(activator.getGlobalImplementations());
- assertEquals(ClusteredDataStoreManager.class,activator.getGlobalImplementations()[0]);
- }
-
- @Test
- public void construct_OnInvokeOfConfigGlobalInstance_ShouldNotThrowAnyExceptions(){
- Activator activator = new ActivatorTestImpl();
-
- Component c = mock(Component.class);
- Object clusterDataStoreMgr = ClusteredDataStoreManager.class;
-
- when(serviceDependency.setService(IClusterGlobalServices.class)).thenReturn(serviceDependency);
- when(serviceDependency.setCallbacks("setClusterGlobalServices",
- "unsetClusterGlobalServices")).thenReturn(serviceDependency);
- when(serviceDependency.setRequired(true)).thenReturn(serviceDependency);
-
-
- activator.configureGlobalInstance(c, clusterDataStoreMgr);
-
-
- }
-
-}
import org.opendaylight.controller.clustering.services.IClusterServices;
import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import java.util.EnumSet;
import java.util.Map;
IClusterGlobalServices mockClusterGlobalServices = createClusterGlobalServices();
- ConcurrentMap mockOperationalDataCache = mock(ConcurrentMap.class);
+ ConcurrentMap<InstanceIdentifier, CompositeNode> mockOperationalDataCache = mock(ConcurrentMap.class);
- Object valueObject = mock(Object.class);
+ CompositeNode valueObject = mock(CompositeNode.class);
when(mockOperationalDataCache.get(path)).thenReturn(valueObject);
IClusterGlobalServices mockClusterGlobalServices = createClusterGlobalServices();
- ConcurrentMap mockConfigurationDataCache = mock(ConcurrentMap.class);
+ ConcurrentMap<InstanceIdentifier, CompositeNode> mockConfigurationDataCache = mock(ConcurrentMap.class);
- Object valueObject = mock(Object.class);
+ CompositeNode valueObject = mock(CompositeNode.class);
when(mockConfigurationDataCache.get(path)).thenReturn(valueObject);
when(mockModification.getUpdatedConfigurationData()).thenReturn(configurationData);
when(mockModification.getUpdatedOperationalData()).thenReturn(operationalData);
- DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> transaction = store.requestCommit(mockModification);
+ DataCommitHandler.DataCommitTransaction<InstanceIdentifier, CompositeNode> transaction = store.requestCommit(mockModification);
transaction.finish();
when(mockModification.getUpdatedConfigurationData()).thenReturn(configurationData);
when(mockModification.getUpdatedOperationalData()).thenReturn(operationalData);
- DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends Object>, Object> transaction = store.requestCommit(mockModification);
+ DataCommitHandler.DataCommitTransaction<InstanceIdentifier, CompositeNode> transaction = store.requestCommit(mockModification);
transaction.rollback();
-
/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
package org.opendaylight.controller.datastore.internal;
+import java.util.concurrent.ConcurrentHashMap;
+
import org.apache.felix.dm.Component;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
public class ClusteredDataStoreManagerTest {
-
- private static ClusteredDataStoreManager clusteredDSMgr = null;
- private IClusterGlobalServices icClusterGlbServices = mock(IClusterGlobalServices.class);
-
- @BeforeClass
- public static void construct(){
- clusteredDSMgr = new ClusteredDataStoreManager();
+
+ private static ClusteredDataStoreManager clusteredDSMgr = null;
+ private IClusterGlobalServices icClusterGlbServices = mock(IClusterGlobalServices.class);
+
+ @BeforeClass
+ public static void construct() {
+ clusteredDSMgr = new ClusteredDataStoreManager();
assertNotNull(clusteredDSMgr);
- }
-
- @Test
- public void construct_OnSetClusterGlobalServices_AssertNoException(){
- icClusterGlbServices = mock(IClusterGlobalServices.class);
-
- clusteredDSMgr.setClusterGlobalServices(icClusterGlbServices);
- }
-
- @Test
- public void construct_OnUnSetClusterGlobalServices_AssertNoException(){
- IClusterGlobalServices icClusterGlbServices = mock(IClusterGlobalServices.class);
-
- clusteredDSMgr.unsetClusterGlobalServices(icClusterGlbServices);
- }
-
- @Test
- public void construct_init_AssertNoException() throws CacheExistException,CacheConfigException{
- ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
-
- ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
- doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
- Component c = mock(Component.class);
-
- clusteredDSManager.init(c);
- }
-
- @Test(expected = IllegalStateException.class)
- public void construct_init_AssertCacheExistException() throws CacheExistException,CacheConfigException{
- ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
- doThrow(CacheExistException.class).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
- Component c = mock(Component.class);
-
- clusteredDSManager.init(c);
- }
-
- @Test(expected = IllegalStateException.class)
- public void construct_init_AssertCacheConfigException() throws CacheExistException,CacheConfigException{
- ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
- doThrow(CacheConfigException.class).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
- Component c = mock(Component.class);
-
- clusteredDSManager.init(c);
- }
-
- @Test
- public void construct_readOperationalData_AssertNoException() throws CacheExistException,CacheConfigException{
- ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
-
- ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
- doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
- Component c = mock(Component.class);
-
- clusteredDSManager.init(c);
-
- Object o = mock(Object.class);
-
- when(clusteredDSImpl.readOperationalData(any(InstanceIdentifier.class))).thenReturn(o);
- assertEquals(o,clusteredDSManager.readOperationalData(any(InstanceIdentifier.class)));
- }
-
-
- @Test
- public void construct_readConfigurationData_AssertNoException() throws CacheExistException,CacheConfigException{
- ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
-
- ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
- doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
- Component c = mock(Component.class);
-
- clusteredDSManager.init(c);
- Object o = mock(Object.class);
-
- when(clusteredDSImpl.readConfigurationData(any(InstanceIdentifier.class))).thenReturn(o);
- assertEquals(o,clusteredDSManager.readConfigurationData(any(InstanceIdentifier.class)));
- }
-
- @Test
- public void construct_requestCommit_AssertNoException() throws CacheExistException,CacheConfigException{
- ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
-
- ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
- doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore(any(Component.class));
- Component c = mock(Component.class);
-
- clusteredDSManager.init(c);
- DataCommitTransaction dataCommitTransaction = mock(DataCommitTransaction.class);
-
- when(clusteredDSImpl.requestCommit(any(DataModification.class))).thenReturn(dataCommitTransaction);
- assertEquals(dataCommitTransaction,clusteredDSManager.requestCommit(any(DataModification.class)));
- }
+ }
+
+ @Test
+ public void construct_OnSetClusterGlobalServices_AssertNoException() {
+ doReturn(new ConcurrentHashMap<InstanceIdentifier, CompositeNode>()).when(icClusterGlbServices).getCache(ClusteredDataStoreImpl.CONFIGURATION_DATA_CACHE);
+ doReturn(new ConcurrentHashMap<InstanceIdentifier, CompositeNode>()).when(icClusterGlbServices).getCache(ClusteredDataStoreImpl.OPERATIONAL_DATA_CACHE);
+ clusteredDSMgr.setClusterGlobalServices(icClusterGlbServices);
+ }
+
+ @Test
+ public void construct_init_AssertNoException() throws CacheExistException, CacheConfigException {
+ ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+ ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+ doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+ clusteredDSManager.start();
+ }
+
+
+ @Test
+ public void construct_readOperationalData_AssertNoException() throws CacheExistException, CacheConfigException {
+ ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+ ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+ doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+ Component c = mock(Component.class);
+
+ clusteredDSManager.start();
+ clusteredDSManager.setClusterGlobalServices(icClusterGlbServices);
+ CompositeNode o = mock(CompositeNode.class);
+
+ when(clusteredDSImpl.readOperationalData(any(InstanceIdentifier.class))).thenReturn(o);
+ assertEquals(o, clusteredDSManager.readOperationalData(any(InstanceIdentifier.class)));
+ }
+
+ @Test
+ public void construct_readConfigurationData_AssertNoException() throws CacheExistException, CacheConfigException {
+ ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+ ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+ doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+ Component c = mock(Component.class);
+
+ clusteredDSManager.start();
+ clusteredDSManager.setClusterGlobalServices(icClusterGlbServices);
+
+ CompositeNode o = mock(CompositeNode.class);
+
+ when(clusteredDSImpl.readConfigurationData(any(InstanceIdentifier.class))).thenReturn(o);
+ assertEquals(o, clusteredDSManager.readConfigurationData(any(InstanceIdentifier.class)));
+ }
+
+ @Test
+ public void construct_requestCommit_AssertNoException() throws CacheExistException, CacheConfigException {
+ ClusteredDataStoreImpl clusteredDSImpl = mock(ClusteredDataStoreImpl.class);
+
+ ClusteredDataStoreManager clusteredDSManager = spy(new ClusteredDataStoreManager());
+ doReturn(clusteredDSImpl).when(clusteredDSManager).createClusteredDataStore();
+ IClusterGlobalServices globalServices = mock(IClusterGlobalServices.class);
+ clusteredDSManager.setClusterGlobalServices(globalServices);
+ clusteredDSManager.start();
+ DataCommitTransaction dataCommitTransaction = mock(DataCommitTransaction.class);
+
+ when(clusteredDSImpl.requestCommit(any(DataModification.class))).thenReturn(dataCommitTransaction);
+ assertEquals(dataCommitTransaction, clusteredDSManager.requestCommit(any(DataModification.class)));
+ }
}
<?xml version="1.0" encoding="UTF-8"?>
<project
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
- xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>commons.integrationtest</artifactId>
- <version>0.5.1-SNAPSHOT</version>
- <relativePath>../../../commons/integrationtest</relativePath>
- </parent>
- <scm>
- <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
- <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
- <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
- </scm>
-
- <artifactId>clustered-datastore.integrationtest</artifactId>
- <version>0.4.0-SNAPSHOT</version>
- <dependencies>
-
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-api</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-util</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-impl</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-binding-broker-impl</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal</artifactId>
+ <artifactId>commons.integrationtest</artifactId>
<version>0.5.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>clustering.services</artifactId>
- <version>0.4.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-binding</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>protocol_plugins.stub</artifactId>
- <version>0.4.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal.implementation</artifactId>
- <version>0.4.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>containermanager</artifactId>
- <version>0.5.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>containermanager.it.implementation</artifactId>
- <version>0.5.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>clustering.stub</artifactId>
- <version>0.4.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>clustered-datastore-implementation</artifactId>
- <version>0.4.1-SNAPSHOT</version>
- </dependency>
+ <relativePath>../../../commons/integrationtest</relativePath>
+ </parent>
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
+ <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
+ </scm>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-common</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>concepts</artifactId>
- <version>0.1.1-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <version>1.9.5</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.core</artifactId>
- <version>5.0.0</version>
- </dependency>
+ <artifactId>clustered-datastore.integrationtest</artifactId>
+ <version>0.4.0-SNAPSHOT</version>
+ <dependencies>
-</dependencies>
- <properties>
- <!-- Sonar jacoco plugin to get integration test coverage info -->
- <sonar.jacoco.reportPath>../implementation/target/jacoco.exec</sonar.jacoco.reportPath>
- <sonar.jacoco.itReportPath>../implementaiton/target/jacoco-it.exec</sonar.jacoco.itReportPath>
- </properties>
- <build>
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <version>0.5.3.201107060350</version>
- </plugin>
- </plugins>
- </pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <version>0.5.3.201107060350</version>
- <configuration>
- <destFile>../implementation/target/jacoco-it.exec</destFile>
- <includes>org.opendaylight.controller.*</includes>
- </configuration>
- <executions>
- <execution>
- <id>pre-test</id>
- <goals>
- <goal>prepare-agent</goal>
- </goals>
- </execution>
- <execution>
- <id>post-test</id>
- <configuration>
- <skip>true</skip>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-it</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-api</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-util</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-impl</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal</artifactId>
+ <version>0.5.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustering.services</artifactId>
+ <version>0.4.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-binding</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+ <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+ <version>4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>protocol_plugins.stub</artifactId>
+ <version>0.4.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal.implementation</artifactId>
+ <version>0.4.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>containermanager</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>containermanager.it.implementation</artifactId>
+ <version>0.5.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustering.stub</artifactId>
+ <version>0.4.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustered-datastore-implementation</artifactId>
+ <version>0.4.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+ <artifactId>xtend-lib-osgi</artifactId>
+ <version>2.4.3</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-container-native</artifactId>
+ <version>${exam.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-junit4</artifactId>
+ <version>${exam.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-netconf-connector</artifactId>
+ <version>${netconf.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>yang-store-impl</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>logback-config</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-impl</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-file-adapter</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-impl</artifactId>
+ <version>${netconf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-client</artifactId>
+ <version>${netconf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>concepts</artifactId>
+ <version>0.1.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-data-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>1.9.5</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-manager</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-management</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+ <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+ <version>4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+ <artifactId>xtend-lib-osgi</artifactId>
+ <version>2.4.3</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-container-native</artifactId>
+ <version>${exam.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-junit4</artifactId>
+ <version>${exam.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-netconf-connector</artifactId>
+ <version>${netconf.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>yang-store-impl</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>logback-config</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-impl</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-file-adapter</artifactId>
+ <version>${config.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-impl</artifactId>
+ <version>${netconf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-client</artifactId>
+ <version>${netconf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-link-mvn</artifactId>
+ <version>${exam.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.osgi</artifactId>
+ <version>3.8.1.v20120830-144521</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>log4j-over-slf4j</artifactId>
+ <version>1.7.2</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-core</artifactId>
+ <version>1.0.9</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>1.0.9</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-service</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-manager</artifactId>
+ <version>0.2.3-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-management</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+ <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+ <version>4.0</version>
+ </dependency>
+ </dependencies>
+ <properties>
+ <!-- Sonar jacoco plugin to get integration test coverage info -->
+ <sonar.jacoco.reportPath>../implementation/target/jacoco.exec</sonar.jacoco.reportPath>
+ <sonar.jacoco.itReportPath>../implementaiton/target/jacoco-it.exec</sonar.jacoco.itReportPath>
+ </properties>
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <version>0.5.3.201107060350</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <version>0.5.3.201107060350</version>
+ <configuration>
+ <destFile>../implementation/target/jacoco-it.exec</destFile>
+ <includes>org.opendaylight.controller.*</includes>
+ </configuration>
+ <executions>
+ <execution>
+ <id>pre-test</id>
+ <goals>
+ <goal>prepare-agent</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>post-test</id>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
</project>
package org.opendaylight.controller.datastore;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.junit.Before;
+import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.DataModification;
+import org.opendaylight.controller.test.sal.binding.it.TestHelper;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.util.Filter;
import org.ops4j.pax.exam.util.PathUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import static org.ops4j.pax.exam.CoreOptions.junitBundles;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.CoreOptions.systemPackages;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import static org.mockito.Mockito.mock;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.when;
-
@RunWith(PaxExam.class)
public class ClusteredDataStoreIT {
- private Logger log = LoggerFactory
- .getLogger(ClusteredDataStoreIT.class);
+ private Logger log = LoggerFactory.getLogger(ClusteredDataStoreIT.class);
// get the OSGI bundle context
@Inject
private BundleContext bc;
@Inject
+ @Filter(timeout=60*1000)
private ClusteredDataStore clusteredDS;
+
// Configure the OSGi container
@Configuration
public Option[] config() {
return options(
//
systemProperty("logback.configurationFile").value(
- "file:" + PathUtils.getBaseDir()
- + "/src/test/resources/logback.xml"),
+ "file:" + PathUtils.getBaseDir() + "/src/test/resources/logback.xml"),
// To start OSGi console for inspection remotely
systemProperty("osgi.console").value("2401"),
// Set the systemPackages (used by clustering)
mavenBundle("equinoxSDK381", "org.apache.felix.gogo.shell").versionAsInProject(),
// List logger bundles
mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(),
- mavenBundle("org.slf4j", "log4j-over-slf4j")
- .versionAsInProject(),
- mavenBundle("ch.qos.logback", "logback-core")
- .versionAsInProject(),
- mavenBundle("ch.qos.logback", "logback-classic")
- .versionAsInProject(),
+ mavenBundle("org.slf4j", "log4j-over-slf4j").versionAsInProject(),
+ mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(),
+ mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(),
// needed by statisticsmanager
- mavenBundle("org.opendaylight.controller", "containermanager")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "containermanager.it.implementation")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "clustering.services")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "clustering.stub")
- .versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "containermanager").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "containermanager.it.implementation").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "clustering.services").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "clustering.stub").versionAsInProject(),
// List all the bundles on which the test case depends
- mavenBundle("org.opendaylight.controller", "sal")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "sal.implementation")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "protocol_plugins.stub")
- .versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "sal").versionAsInProject(),
+ TestHelper.baseModelBundles(),
+ TestHelper.configMinumumBundles(),
+ TestHelper.bindingIndependentSalBundles(),
+ TestHelper.bindingAwareSalBundles(),
+ TestHelper.mdSalCoreBundles(),
+ mavenBundle("org.opendaylight.controller", "config-api").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "sal.implementation").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "protocol_plugins.stub").versionAsInProject(),
- //clustered-data-store-implementation dependencies
- mavenBundle("com.google.guava", "guava")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "sal-common-api")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "sal-common-util")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.controller", "sal-common-impl")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.yangtools", "yang-binding")
- .versionAsInProject(),
+ // sal-common-impl
+ mavenBundle("org.eclipse.xtend", "org.eclipse.xtend.lib").versionAsInProject(),
+ mavenBundle("org.eclipse.xtext", "org.eclipse.xtext.xbase.lib").versionAsInProject(),
+ // clustered-data-store-implementation dependencies
+ mavenBundle("com.google.guava", "guava").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "sal-core-api").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "sal-common-api").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "sal-common-util").versionAsInProject(),
+ mavenBundle("org.opendaylight.controller", "sal-common-impl").versionAsInProject(),
+ mavenBundle("org.opendaylight.yangtools", "yang-model-api").versionAsInProject(),
+ mavenBundle("org.opendaylight.yangtools", "yang-binding").versionAsInProject(),
- //sal-common-api dependencies
- mavenBundle("org.opendaylight.controller", "sal-common")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.yangtools", "yang-common")
- .versionAsInProject(),
- mavenBundle("org.opendaylight.yangtools", "concepts")
- .versionAsInProject(),
- mavenBundle("org.osgi", "org.osgi.core")
- .versionAsInProject(),
- //adding new maven bundles
- mavenBundle("org.mockito", "mockito-all")
- .versionAsInProject(),
+ // sal-common-api dependencies
+ mavenBundle("org.opendaylight.controller", "sal-common").versionAsInProject(),
+ mavenBundle("org.opendaylight.yangtools", "yang-common").versionAsInProject(),
+ mavenBundle("org.opendaylight.yangtools", "concepts").versionAsInProject(),
+ mavenBundle("org.osgi", "org.osgi.core").versionAsInProject(),
+ // adding new maven bundles
+ mavenBundle("org.mockito", "mockito-all").versionAsInProject(),
+
+ // yang-data-api
+ mavenBundle("org.opendaylight.yangtools", "yang-data-api").versionAsInProject(),
// needed by hosttracker
- mavenBundle("org.opendaylight.controller", "clustered-datastore-implementation")
- .versionAsInProject(),
- mavenBundle("org.jboss.spec.javax.transaction",
- "jboss-transaction-api_1.1_spec").versionAsInProject(),
- mavenBundle("org.apache.commons", "commons-lang3")
- .versionAsInProject(),
- mavenBundle("org.apache.felix",
- "org.apache.felix.dependencymanager")
- .versionAsInProject(), junitBundles());
+ mavenBundle("org.opendaylight.controller", "clustered-datastore-implementation").versionAsInProject(),
+ mavenBundle("org.jboss.spec.javax.transaction", "jboss-transaction-api_1.1_spec").versionAsInProject(),
+ mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(),
+ mavenBundle("org.apache.felix", "org.apache.felix.dependencymanager").versionAsInProject(),
+ junitBundles());
}
private String stateToString(int state) {
}
}
- @Before
- public void areWeReady() {
- assertNotNull(bc);
- boolean debugit = false;
- Bundle b[] = bc.getBundles();
- for (int i = 0; i < b.length; i++) {
- int state = b[i].getState();
- if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) {
- log.debug("Bundle:" + b[i].getSymbolicName() + " state:"
- + stateToString(state));
- debugit = true;
- }
- }
- if (debugit) {
- log.debug("Do some debugging because some bundle is "
- + "unresolved");
- }
- }
-
@Test
- public void testBundleContextClusteredDS_NotNull() throws Exception{
+ public void testBundleContextClusteredDS_NotNull() throws Exception {
ServiceReference serviceReference = bc.getServiceReference(ClusteredDataStore.class);
ClusteredDataStore store = ClusteredDataStore.class.cast(bc.getService(serviceReference));
assertNotNull(store);
}
@Test
- public void testInjected_ClusteredDS_NotNull(){
+ public void testInjected_ClusteredDS_NotNull() {
assertNotNull(clusteredDS);
}
@Test
- public void requestCommit_readConfigurationData_ShouldVerifyDataAndNoException(){
+ public void requestCommit_readConfigurationData_ShouldVerifyDataAndNoException() {
DataModification dataModification = mock(DataModification.class);
HashMap map = new HashMap();
List list = new ArrayList();
list.add("key");
- InstanceIdentifier key = new InstanceIdentifier(list,String.class);
- map.put(key, "value");
+ InstanceIdentifier key = new InstanceIdentifier(list);
+ map.put(key, mock(CompositeNode.class));
when(dataModification.getUpdatedConfigurationData()).thenReturn(map);
DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
dataCommitTrans.finish();
- String value = (String)clusteredDS.readConfigurationData(key);
- assertEquals("value",value);
+ Object value = clusteredDS.readConfigurationData(key);
+ Assert.assertNotNull(value);
}
@Test(expected = NullPointerException.class)
- public void requestCommit_ShouldThrowException(){
+ public void requestCommit_ShouldThrowException() {
DataModification dataModification = null;
DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
dataCommitTrans.finish();
}
@Test
- public void requestCommit_readOperationalData_ShouldVerifyDataAndNoException(){
+ public void requestCommit_readOperationalData_ShouldVerifyDataAndNoException() {
DataModification dataModification = mock(DataModification.class);
HashMap map = new HashMap();
List list = new ArrayList();
list.add("key");
- InstanceIdentifier key = new InstanceIdentifier(list,String.class);
- map.put(key, "value");
+ InstanceIdentifier key = new InstanceIdentifier(list);
+ map.put(key, mock(CompositeNode.class));
when(dataModification.getUpdatedOperationalData()).thenReturn(map);
DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
dataCommitTrans.finish();
- String value = (String)clusteredDS.readOperationalData(key);
- assertEquals("value",value);
+ Object value = clusteredDS.readOperationalData(key);
+ Assert.assertNotNull(value);
}
@Test
- public void requestCommit_readConfigurationData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException(){
+ public void requestCommit_readConfigurationData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException() {
DataModification dataModification = mock(DataModification.class);
HashMap map = new HashMap();
List list = new ArrayList();
list.add("key");
- InstanceIdentifier key = new InstanceIdentifier(list,String.class);
+ InstanceIdentifier key = new InstanceIdentifier(list);
map.put(key, "value");
when(dataModification.getUpdatedConfigurationData()).thenReturn(map);
DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
dataCommitTrans.finish();
list = new ArrayList();
list.add("key1");
- InstanceIdentifier key1 = new InstanceIdentifier(list,String.class);
+ InstanceIdentifier key1 = new InstanceIdentifier(list);
- String value = (String)clusteredDS.readConfigurationData(key1);
+ Object value = clusteredDS.readConfigurationData(key1);
assertNull(value);
}
@Test
- public void requestCommit_readOperationalData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException(){
+ public void requestCommit_readOperationalData_NonExistingKey_ShouldVerifyNoMappedValueAndNoException() {
DataModification dataModification = mock(DataModification.class);
HashMap map = new HashMap();
List list = new ArrayList();
list.add("key");
- InstanceIdentifier key = new InstanceIdentifier(list,String.class);
- map.put(key, "value");
+ InstanceIdentifier key = new InstanceIdentifier(list);
+ map.put(key, mock(CompositeNode.class));
when(dataModification.getUpdatedOperationalData()).thenReturn(map);
DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
dataCommitTrans.finish();
list = new ArrayList();
list.add("key1");
- InstanceIdentifier key1 = new InstanceIdentifier(list,String.class);
+ InstanceIdentifier key1 = new InstanceIdentifier(list);
- String value = (String)clusteredDS.readOperationalData(key1);
+ Object value = clusteredDS.readOperationalData(key1);
assertNull(value);
}
@Test(expected = NullPointerException.class)
- public void requestCommit_readConfigurationData_WithNullPathShouldThrowException(){
+ public void requestCommit_readConfigurationData_WithNullPathShouldThrowException() {
DataModification dataModification = mock(DataModification.class);
HashMap map = new HashMap();
List list = new ArrayList();
list.add("key");
- InstanceIdentifier key = new InstanceIdentifier(list,String.class);
+ InstanceIdentifier key = new InstanceIdentifier(list);
map.put(key, "value");
when(dataModification.getUpdatedConfigurationData()).thenReturn(map);
DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
dataCommitTrans.finish();
- String value = (String)clusteredDS.readConfigurationData(null);
+ Object value = clusteredDS.readConfigurationData(null);
}
@Test(expected = NullPointerException.class)
- public void requestCommit_readOperationalData_WithNullPathShouldThrowException(){
+ public void requestCommit_readOperationalData_WithNullPathShouldThrowException() {
DataModification dataModification = mock(DataModification.class);
HashMap map = new HashMap();
List list = new ArrayList();
list.add("key");
- InstanceIdentifier key = new InstanceIdentifier(list,String.class);
+ InstanceIdentifier key = new InstanceIdentifier(list);
map.put(key, "value");
when(dataModification.getOriginalOperationalData()).thenReturn(map);
DataCommitTransaction dataCommitTrans = clusteredDS.requestCommit(dataModification);
dataCommitTrans.finish();
- String value = (String)clusteredDS.readOperationalData(null);
+ Object value = clusteredDS.readOperationalData(null);
}
+
}
--- /dev/null
+//START OF CONFIG-LAST
+<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+<modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:cluster:store">prefix:dom-clustered-store-impl</type>
+ <name>cluster-data-store</name>
+ </module>
+</modules>
+</data>
+
+
+//END OF SNAPSHOT
+urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:cluster:store?module=odl-sal-dom-clustered-store-cfg&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: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:common?module=opendaylight-md-sal-common&revision=2013-10-28
+//END OF CONFIG
</encoder>
</appender>
- <root level="error">
+ <root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>
private void addFlow(InstanceIdentifier<?> path, Flow dataObject) {
AddFlowInputBuilder input = new AddFlowInputBuilder();
+
List<Instruction> inst = (dataObject).getInstructions().getInstruction();
input.setNode((dataObject).getNode());
input.setPriority((dataObject).getPriority());
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupRemoved;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes.GroupType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.Meter;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
return new Status(StatusCode.BADREQUEST, "Group record does not exist");
}*/
- if (!(group.getGroupType().getIntValue() >= GroupType.GroupAll.getIntValue() && group.getGroupType()
- .getIntValue() <= GroupType.GroupFf.getIntValue())) {
+ if (!(group.getGroupType().getIntValue() >= GroupTypes.GroupAll.getIntValue() && group.getGroupType()
+ .getIntValue() <= GroupTypes.GroupFf.getIntValue())) {
logger.error("Invalid Group type %d" + group.getGroupType().getIntValue());
return new Status(StatusCode.BADREQUEST, "Invalid Group type");
}
type uint32;
}
- grouping group-types {
- leaf group-type {
- type enumeration {
- enum group-all;
- enum group-select;
- enum group-indirect;
- enum group-ff;
- }
- }
+ typedef group-types {
+ type enumeration {
+ enum group-all;
+ enum group-select;
+ enum group-indirect;
+ enum group-ff;
+ }
}
typedef group-capabilities {
- type enumeration {
- enum select-weight;
- enum select-liveness;
- enum chaining;
- enum chaining-checks;
- }
- }
+ type enumeration {
+ enum select-weight;
+ enum select-liveness;
+ enum chaining;
+ enum chaining-checks;
+ }
+ }
+
+ identity group-type {
+ description "Base identity for all the available group types";
+ }
+
+ identity group-all {
+ base group-type;
+ description "All (multicast/broadcast) group";
+ }
+
+ identity group-select {
+ base group-type;
+ description "Select group";
+ }
+
+ identity group-indirect {
+ base group-type;
+ description "Indirect group";
+ }
+
+ identity group-ff {
+ base group-type;
+ description "Fast failover group";
+ }
+ identity group-capability {
+ description "Base identity for all the supported group capabilities";
+ }
+
+ identity select-weight{
+ base group-capability;
+ description "Support weight for select groups";
+ }
+
+ identity select-liveness{
+ base group-capability;
+ description "Support liveness for select groups";
+ }
+
+ identity chaining{
+ base group-capability;
+ description "Support chaining groups";
+ }
+
+ identity chaining-checks{
+ base group-capability;
+ description "Check chaining for loops and delete";
+ }
grouping group {
- uses group-types;
+ leaf group-type {
+ type group-types;
+ }
leaf group-id {
type group-id;
}
grouping group-features {
- leaf types {
- type bits {
- bit group-all;
- bit group-select;
- bit group-indirect;
- bit group-ff;
- }
- }
+
+ leaf-list group-types-supported {
+ type identityref {
+ base group-type;
+ }
+ }
- leaf capabilities {
- type bits {
- bit select-weight;
- bit select-liveness;
- bit chaining;
- bit chaining-checks;
- }
- }
+ leaf-list group-capabilities-supported {
+ type identityref {
+ base group-capability;
+ }
+ }
leaf-list max-groups {
type uint32;
type uint32;
}
- grouping meter-flags {
- leaf flags {
- type bits {
- bit meter-kbps;
- bit meter-pktps;
- bit meter-burst;
- bit meter-stats;
- }
- }
+ typedef meter-flags {
+ type bits {
+ bit meter-kbps;
+ bit meter-pktps;
+ bit meter-burst;
+ bit meter-stats;
+ }
}
- grouping meter-band-type {
- leaf flags {
- type bits {
- bit ofpmbt-drop;
- bit ofpmbt-dscp-remark;
- bit ofpmbt-experimenter;
- }
+ identity meter-capability {
+ description "Base identity for all the supported meter capabilities/flags";
+ }
+ identity meter-kbps {
+ base meter-capability;
+ description "Rate value in kb/s (kilo-bit per second)";
+ }
+ identity meter-pktps {
+ base meter-capability;
+ description "Rate value in packet/sec.";
+ }
+ identity meter-burst {
+ base meter-capability;
+ description "Do burst size.";
+ }
+ identity meter-stats {
+ base meter-capability;
+ description "Collect statistics.";
+ }
+
+ typedef meter-band-type {
+ type bits {
+ bit ofpmbt-drop;
+ bit ofpmbt-dscp-remark;
+ bit ofpmbt-experimenter;
}
}
+ identity meter-band {
+ description "Base identity for all the band type available";
+ }
+ identity meter-band-drop {
+ base meter-band;
+ description "Drop packet";
+ }
+ identity meter-band-dscp-remark {
+ base meter-band;
+ description "Remark DSCP in the IP header";
+ }
+ identity meter-band-experimenter {
+ base meter-band;
+ description "Experimenter meter band";
+ }
+
grouping band-type {
choice band-type {
case drop {
grouping meter {
- uses meter-flags;
+ leaf flags {
+ type meter-flags;
+ }
leaf meter-id {
type meter-id;
}
container meter-band-types {
- uses meter-band-type;
+ leaf flags {
+ type meter-band-type;
+ }
}
leaf rate {
type yang:counter32;
}
- leaf band_types {
- type yang:counter32;
- }
+ leaf-list meter-band-supported {
+ type identityref {
+ base meter-band;
+ }
+ }
- leaf capabilities {
- type yang:counter32;
- }
+ leaf-list meter-capabilities-supported {
+ type identityref {
+ base meter-capability;
+ }
+ }
leaf max_bands {
type uint8;
description "Initial revision of group statistics service";
}
- augment "/inv:nodes/inv:node" {
- ext:augment-identifier "node-group-statistics";
+ grouping group-statistics {
container group-statistics {
//config "false";
uses group-types:group-statistics-reply;
}
+ }
+
+ augment "/inv:nodes/inv:node" {
+ ext:augment-identifier "node-group-statistics";
+ uses group-statistics;
}
- augment "/inv:nodes/inv:node" {
- ext:augment-identifier "node-group-desc-stats";
+ grouping group-desc {
container group-desc {
//config "false";
uses group-types:group-desc-stats-reply;
}
- }
+ }
augment "/inv:nodes/inv:node" {
- ext:augment-identifier "node-group-features";
- container group-features {
+ ext:augment-identifier "node-group-desc-stats";
+ uses group-desc;
+ }
+
+ grouping group-features {
+ container group-features {
//config "false";
uses group-types:group-features-reply;
}
}
+
+ augment "/inv:nodes/inv:node" {
+ ext:augment-identifier "node-group-features";
+ uses group-features;
+ }
// RPC calls
rpc get-all-group-statistics {
</dependency>
</dependencies>
</plugin>
-
+
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>${osgi.core.version}</version>
- <scope>provided</scope>
+ <scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<groupId>org.eclipse.xtend</groupId>
<artifactId>org.eclipse.xtend.lib</artifactId>
</dependency>
- <dependency>
- <groupId>org.eclipse.xtend</groupId>
- <artifactId>org.eclipse.xtend.standalone</artifactId>
- <version>2.4.3</version>
- <scope>runtime</scope>
- </dependency>
+ <dependency>
+ <groupId>org.eclipse.xtend</groupId>
+ <artifactId>org.eclipse.xtend.standalone</artifactId>
+ <version>2.4.3</version>
+ <scope>runtime</scope>
+ </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-binding-config</artifactId>
<version>${slf4j.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-statistics</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
/**
*
*/
-public final class BindingBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModule
-{
+public final class BindingBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModule {
private BundleContext bundleContext;
/**
*
*/
-public class BindingBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModuleFactory
-{
+public class BindingBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModuleFactory {
@Override
/**
-* Generated file
+ * 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
-*/
+ * 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;
/**
*
*/
-public class DataBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractDataBrokerImplModuleFactory
-{
+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);
+ 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);
+ DataBrokerImplModule module = (DataBrokerImplModule) super.createModule(instanceName, dependencyResolver, old,
+ bundleContext);
module.setBundleContext(bundleContext);
return module;
}
/**
-* 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
-*/
+ * 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;
/**
*
*/
-public final class NotificationBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModule
-{
+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) {
+ 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) {
+ 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(){
+ public void validate() {
super.validate();
// Add custom validation for module attributes here.
}
/**
-* Generated file
+ * 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
-*/
+ * 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
-{
-
+public class NotificationBrokerImplModuleFactory extends
+ org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractNotificationBrokerImplModuleFactory {
}
/**
-* Generated file
+ * 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
-*/
+ * 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 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) {
+ 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) {
+ 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(){
+ public void validate() {
super.validate();
// Add custom validation for module attributes here.
}
@Override
public java.lang.AutoCloseable createInstance() {
- //TODO:implement
+ // TODO:implement
throw new java.lang.UnsupportedOperationException("Unimplemented stub method");
}
}
/**
-* Generated file
+ * 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
-*/
+ * 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
-{
-
+public class RpcBrokerImplModuleFactory extends
+ org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRpcBrokerImplModuleFactory {
}
/**
-* Generated file
+ * 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
-*/
+ * 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;
/**
*
*/
-public final class RuntimeMappingModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModule
-{
+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) {
+ 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) {
+ 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(){
+ public void validate() {
super.validate();
Preconditions.checkNotNull(bundleContext);
// Add custom validation for module attributes here.
}
-
+
@Override
public boolean canReuseInstance(AbstractRuntimeMappingModule oldModule) {
return true;
/**
-* Generated file
+ * 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
-*/
+ * 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;
/**
*
*/
-public class RuntimeMappingModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModuleFactory
-{
+public class RuntimeMappingModuleFactory extends
+ org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractRuntimeMappingModuleFactory {
-
- private static RuntimeMappingModule SINGLETON = null;
+ 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);
+ RuntimeMappingModule module = (RuntimeMappingModule) super.createModule(instanceName, dependencyResolver, old,
+ bundleContext);
module.setBundleContext(bundleContext);
return module;
}
-
+
@Override
public Set<RuntimeMappingModule> getDefaultModules(DependencyResolverFactory dependencyResolverFactory,
BundleContext bundleContext) {
- if(SINGLETON == null) {
+ if (SINGLETON == null) {
DependencyResolver dependencyResolver = dependencyResolverFactory.createDependencyResolver(IDENTIFIER);
- SINGLETON = new RuntimeMappingModule(IDENTIFIER , dependencyResolver);
+ SINGLETON = new RuntimeMappingModule(IDENTIFIER, dependencyResolver);
SINGLETON.setBundleContext(bundleContext);
}
-
-
+
return Collections.singleton(SINGLETON);
}
import org.opendaylight.yangtools.yang.binding.BindingCodec;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
-import org.opendaylight.yangtools.yang.data.api.Node;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class CodecMapping {
+ private static final Logger LOG = LoggerFactory.getLogger(CodecMapping.class);
+
public static final String INSTANCE_IDENTIFIER_CODEC = "INSTANCE_IDENTIFIER_CODEC";
public static final String CLASS_TO_CASE_MAP = "CLASS_TO_CASE";
public static final String COMPOSITE_TO_CASE = "COMPOSITE_TO_CASE";
public static final String AUGMENTATION_CODEC = "AUGMENTATION_CODEC";
- public static void setIdentifierCodec(Class obj,InstanceIdentifierCodec codec) {
+ public static void setIdentifierCodec(Class<?> obj,InstanceIdentifierCodec codec) {
Field instanceIdField;
try {
instanceIdField = obj.getField(INSTANCE_IDENTIFIER_CODEC);
- instanceIdField.set(null, codec);
+ if(obj != null) {
+ instanceIdField.set(null, codec);
+ }
} catch (NoSuchFieldException e) {
- // NOOP
- } catch (SecurityException e) {
- // NOOP
- } catch (IllegalAccessException e) {
- // NOOp
+ LOG.debug("Instance identifier codec is not needed for {}",obj.getName(),e);
+ } catch (SecurityException | IllegalAccessException e) {
+ LOG.error("Instance identifier could not be set for {}",obj.getName(),e);
}
}
instanceIdField = codec.getField(CLASS_TO_CASE_MAP);
instanceIdField.set(null, classToCaseRawCodec);
} catch (NoSuchFieldException e) {
- // NOOP
- } catch (SecurityException e) {
- // NOOP
- } catch (IllegalAccessException e) {
- // NOOp
+ LOG.debug("BUG: Class to case mappping is not needed for {}",codec.getName(),e);
+ } catch (SecurityException | IllegalAccessException e) {
+ LOG.error("Class to case mappping could not be set for {}",codec.getName(),e);
}
-
-
}
public static void setCompositeNodeToCaseMap(Class<? extends BindingCodec<?,?>> codec,
instanceIdField = codec.getField(COMPOSITE_TO_CASE);
instanceIdField.set(null, compositeToCase);
} catch (NoSuchFieldException e) {
- // NOOP
- } catch (SecurityException e) {
- // NOOP
- } catch (IllegalAccessException e) {
- // NOOp
+ LOG.debug("BUG: Class to case mappping is not needed for {}",codec.getName(),e);
+ } catch (SecurityException | IllegalAccessException e) {
+ LOG.error("Composite node to case mappping could not be set for {}",codec.getName(),e);
}
}
instanceIdField = dataCodec.getField(AUGMENTATION_CODEC);
instanceIdField.set(null, augmentableCodec);
} catch (NoSuchFieldException e) {
- // NOOP
- } catch (SecurityException e) {
- // NOOP
- } catch (IllegalAccessException e) {
- // NOOp
+ LOG.debug("BUG: Augmentation codec is not needed for {}",dataCodec.getName(),e);
+ } catch (SecurityException | IllegalAccessException e) {
+ LOG.error("Augmentation codec could not be set for {}",dataCodec.getName(),e);
}
}
}
import org.opendaylight.yangtools.yang.binding.Identifiable;
import org.opendaylight.yangtools.yang.binding.Identifier;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
public class CodecTypeUtils {
Identifier<? extends Identifiable<?>> identifier = (Identifier<? extends Identifiable<?>>) key;
return new IdentifiableItem(identifiableType,identifier);
}
-
}
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
-import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@Override
public void onValueCodecCreated(Class<?> valueClass, Class<?> valueCodec) {
- // TODO Auto-generated method stub
-
}
@Override
public void onCaseCodecCreated(Class<?> choiceClass,
Class<? extends BindingCodec<Map<QName, Object>, Object>> choiceCodec) {
- // TODO Auto-generated method stub
-
}
@Override
@Override
public boolean isAcceptable(Node<?> input) {
- if (false == (input instanceof CompositeNode)) {
+ if (!(input instanceof CompositeNode)) {
if (augmenting) {
return checkAugmenting((CompositeNode) input);
} else {
QName parent = input.getNodeType();
for (Node<?> childNode : input.getChildren()) {
QName child = childNode.getNodeType();
- if (false == Objects.equals(parent.getNamespace(), child.getNamespace())) {
- continue;
- }
- if (false == Objects.equals(parent.getRevision(), child.getRevision())) {
+ if (!Objects.equals(parent.getNamespace(), child.getNamespace()) || Objects.equals(parent.getRevision(), child.getRevision())) {
continue;
}
if (validNames.contains(child.getLocalName())) {
@Override
public Set<java.util.Map.Entry<Class, BindingCodec<Object, Object>>> entrySet() {
- return null;
+ return Collections.emptySet();
}
@Override
@Override
public BindingCodec get(Object key) {
- if (false == (key instanceof CompositeNode)) {
+ if (!(key instanceof CompositeNode)) {
return null;
}
for (java.util.Map.Entry<Class, ChoiceCaseCodecImpl<?>> entry : choiceCases.entrySet()) {
@Override
public Collection<BindingCodec<?, ?>> values() {
- return null;
+ return Collections.emptySet();
}
private UnsupportedOperationException notModifiable() {
@Override
public boolean isEmpty() {
- return false;
+ return true;
}
@Override
public Set<T> keySet() {
- return null;
+ return Collections.emptySet();
}
@Override
public Set<java.util.Map.Entry<T, BindingCodec<?, ?>>> entrySet() {
- // TODO Auto-generated method stub
- return null;
+ return Collections.emptySet();
}
@Override
augmentationField.setAccessible(true);
Map<Class, Augmentation> augMap = (Map<Class, Augmentation>) augmentationField.get(input);
return augMap;
- } catch (NoSuchFieldException e) {
-
- } catch (SecurityException e) {
-
- } catch (IllegalArgumentException e) {
-
- } catch (IllegalAccessException e) {
-
- }
+ } catch (IllegalArgumentException | IllegalAccessException |NoSuchFieldException | SecurityException e) {
+ LOG.debug("Could not read augmentations for {}",input,e);
+ }
return Collections.emptyMap();
}
rawAugmentationCodecs.put(key, ret);
return ret;
} catch (InstantiationException e) {
-
+ LOG.error("Can not instantiate raw augmentation codec {}",key.getSimpleName(),e);
} catch (IllegalAccessException e) {
-
+ LOG.debug("BUG: Constructor for {} is not accessible.",key.getSimpleName(),e);
}
return null;
}
try {
deserializationBlock.call()
} catch (Exception e) {
+
// FIXME: Make this block providing more information.
throw new DeserializationException(e);
}
import java.util.Iterator
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema
import java.util.concurrent.ConcurrentHashMap
+import static extension org.opendaylight.controller.sal.binding.impl.util.YangSchemaUtils.*;
class TransformerGenerator {
if (transformer !== null) {
return transformer;
}
- return withClassLoaderAndLock(cls.classLoader,lock) [|
+ return withClassLoaderAndLock(cls.classLoader, lock) [ |
val valueTransformer = generateValueTransformer(cls, type);
return valueTransformer;
]
private def generateKeyTransformerFor(Class<? extends Object> inputType, GeneratedType typeSpec, ListSchemaNode node) {
try {
+
//log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
val properties = typeSpec.allProperties;
val ctCls = createClass(inputType.codecClassName) [
}
«QName.name» _localQName = $1;
java.util.Map _compositeNode = (java.util.Map) $2;
+ boolean _is_empty = true;
«FOR key : node.keyDefinition»
«val propertyName = key.getterName»
«val keyDef = node.getDataChildByName(key)»
«val property = properties.get(propertyName)»
«deserializeProperty(keyDef, property, propertyName)»;
«ENDFOR»
- «inputType.resolvedName» _value = new «inputType.name»(«node.keyDefinition.keyConstructorList»);
+ «inputType.resolvedName» _value = new «inputType.name»(«node.keyDefinition.
+ keyConstructorList»);
return _value;
}
'''
private def Class<? extends BindingCodec<Object, Object>> generateCaseCodec(Class<?> inputType, GeneratedType type,
ChoiceCaseNode node) {
try {
+
//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)
- staticQNameField(inputType);
+ staticQNameField(node.QName);
staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
staticField(it, AUGMENTATION_CODEC, BindingCodec)
method(Object, "toDomStatic", QName, Object) [
«QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
java.util.List _childNodes = new java.util.ArrayList();
«type.resolvedName» value = («type.resolvedName») $2;
- «transformDataContainerBody(type,type.allProperties, node)»
+ «transformDataContainerBody(type, type.allProperties, node)»
return ($r) _childNodes;
}
'''
private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateTransformerFor(
Class<?> inputType, GeneratedType typeSpec, SchemaNode node) {
try {
+
//log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
val ctCls = createClass(typeSpec.codecClassName) [
//staticField(Map,"AUGMENTATION_SERIALIZERS");
- staticQNameField(inputType);
+ staticQNameField(node.QName);
staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
staticField(it, AUGMENTATION_CODEC, BindingCodec)
implementsType(BINDING_CODEC)
private def Class<? extends BindingCodec<Map<QName, Object>, Object>> generateAugmentationTransformerFor(
Class<?> inputType, GeneratedType type, AugmentationSchema node) {
try {
+
//log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
val properties = type.allProperties
val ctCls = createClass(type.codecClassName) [
//staticField(Map,"AUGMENTATION_SERIALIZERS");
- staticQNameField(inputType);
+ staticQNameField(node.augmentationQName);
staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
staticField(it, AUGMENTATION_CODEC, BindingCodec)
implementsType(BINDING_CODEC)
java.util.Map _compositeNode = (java.util.Map) $2;
//System.out.println(_localQName + " " + _compositeNode);
«type.builderName» _builder = new «type.builderName»();
+ boolean _is_empty = true;
«FOR child : node.childNodes»
«val signature = properties.getFor(child)»
«deserializeProperty(child, signature.value, signature.key)»
-
_builder.«signature.key.toSetter»(«signature.key»);
«ENDFOR»
+ if(_is_empty) {
+ return null;
+ }
return _builder.build();
}
'''
private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateTransformerFor(
Class<?> inputType, GeneratedType typeSpec, ChoiceNode node) {
try {
+
//log.info("Generating DOM Codec for {} with {}", inputType, inputType.classLoader)
val ctCls = createClass(typeSpec.codecClassName) [
//staticField(Map,"AUGMENTATION_SERIALIZERS");
private def deserializeNodeContainerBodyImpl(GeneratedType type, HashMap<String, Type> properties,
DataNodeContainer node) {
val ret = '''
- «FOR child : node.childNodes.filter[!augmenting]»
+ boolean _is_empty = true;
+ «FOR child : node.childNodes»
«val signature = properties.getFor(child)»
- «deserializeProperty(child, signature.value, signature.key)»
-
- _builder.«signature.key.toSetter»(«signature.key»);
+ «IF signature !== null»
+ «deserializeProperty(child, signature.value, signature.key)»
+ _builder.«signature.key.toSetter»(«signature.key»);
+ «ENDIF»
«ENDFOR»
'''
return ret;
//System.out.println("Aug. key:" + _entry.getKey());
Class _type = (Class) _entry.getKey();
«Augmentation.resolvedName» _value = («Augmentation.name») _entry.getValue();
- _builder.addAugmentation(_type,_value);
+ if(_value != null) {
+ _builder.addAugmentation(_type,_value);
+ }
}
}
'''
boolean _hasNext = _iterator.hasNext();
while(_hasNext) {
Object _listItem = _iterator.next();
+ _is_empty = false;
//System.out.println(" item" + _listItem);
Object _value = «type.actualTypeArguments.get(0).serializer.resolvedName».fromDomStatic(_localQName,_listItem);
//System.out.println(" value" + _value);
java.util.Iterator _iterator = _dom_«propertyName».iterator();
boolean _hasNext = _iterator.hasNext();
while(_hasNext) {
+ _is_empty = false;
Object _listItem = _iterator.next();
if(_listItem instanceof java.util.Map.Entry) {
Object _innerValue = ((java.util.Map.Entry) _listItem).getValue();
_compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»"));
«type.resolvedName» «propertyName» = null;
if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) {
+ _is_empty = false;
java.util.Map.Entry _dom_«propertyName» = (java.util.Map.Entry) _dom_«propertyName»_list.get(0);
Object _inner_value = _dom_«propertyName».getValue();
«propertyName» = «deserializeValue(type, "_inner_value")»;
_compositeNode.get(«QName.name».create(_localQName,"«schema.QName.localName»"));
«type.resolvedName» «propertyName» = null;
if(_dom_«propertyName»_list != null && _dom_«propertyName»_list.size() > 0) {
-
+ _is_empty = false;
java.util.Map _dom_«propertyName» = (java.util.Map) _dom_«propertyName»_list.get(0);
«propertyName» = «type.serializer.resolvedName».fromDomStatic(_localQName,_dom_«propertyName»);
}
private def dispatch CharSequence deserializeProperty(ChoiceNode schema, Type type, String propertyName) '''
«type.resolvedName» «propertyName» = «type.serializer.resolvedName».fromDomStatic(_localQName,_compositeNode);
+ if(«propertyName» != null) {
+ _is_empty = false;
+ }
'''
private def dispatch String deserializeValue(GeneratedTransferObject type, String domParameter) '''
- («type.resolvedName») «type.valueSerializer.resolvedName».fromDomValue(«domParameter»);
+ («type.resolvedName») «type.valueSerializer.resolvedName».fromDomValue(«domParameter»)
'''
private def dispatch Class<? extends BindingCodec<Map<QName, Object>, Object>> generateValueTransformer(
val hasYangBinding = hasBinding
val ctCls = createClass(typeSpec.codecClassName) [
//staticField(Map,"AUGMENTATION_SERIALIZERS");
- if(hasYangBinding) {
+ if (hasYangBinding) {
implementsType(BINDING_CODEC)
staticField(it, INSTANCE_IDENTIFIER_CODEC, BindingCodec)
implementsType(BindingDeserializer.asCtClass)
return null;
}
- private def dispatch Class<?> generateValueTransformer(
- Class<?> inputType, Enumeration typeSpec) {
+ 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)
-
method(Object, "toDomValue", Object) [
modifiers = PUBLIC + FINAL + STATIC
body = '''
*/
private def getBuilderName(GeneratedType type) '''«type.resolvedName»Builder'''
- private def staticQNameField(CtClass it, Class<?> node) {
- val field = new CtField(ctQName, "QNAME", it);
- field.modifiers = PUBLIC + FINAL + STATIC;
- addField(field, '''«node.name».QNAME''')
- }
-
private def staticQNameField(CtClass it, QName node) {
val field = new CtField(ctQName, "QNAME", it);
field.modifiers = PUBLIC + FINAL + STATIC;
«QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
java.util.List _childNodes = new java.util.ArrayList();
«type.resolvedName» value = («type.resolvedName») $2;
- «transformDataContainerBody(type,type.allProperties, node)»
+ «transformDataContainerBody(type, type.allProperties, node)»
«serializeAugmentations»
return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
}
«QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
java.util.List _childNodes = new java.util.ArrayList();
«type.resolvedName» value = («type.resolvedName») $2;
- «transformDataContainerBody(type,type.allProperties, node)»
+ «transformDataContainerBody(type, type.allProperties, node)»
«serializeAugmentations»
return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
}
«QName.name» _resultName = «QName.name».create($1,QNAME.getLocalName());
java.util.List _childNodes = new java.util.ArrayList();
«type.resolvedName» value = («type.resolvedName») $2;
- «transformDataContainerBody(type,type.allProperties, node)»
+ «transformDataContainerBody(type, type.allProperties, node)»
«serializeAugmentations»
return ($r) java.util.Collections.singletonMap(_resultName,_childNodes);
}
}
'''
- private def transformDataContainerBody(Type type,Map<String, Type> properties, DataNodeContainer node) {
+ private def transformDataContainerBody(Type type, Map<String, Type> properties, DataNodeContainer node) {
val ret = '''
- «FOR child : node.childNodes.filter[!augmenting]»
- «var signature = properties.getFor(child)»
- //System.out.println("«type.name»#«signature.key»" + value.«signature.key»());
- «serializeProperty(child, signature.value, signature.key)»
+ «FOR child : node.childNodes»
+ «val signature = properties.getFor(child)»
+ «IF signature !== null»
+ //System.out.println("«type.name»#«signature.key»" + value.«signature.key»());
+ «serializeProperty(child, signature.value, signature.key)»
+ «ENDIF»
«ENDFOR»
'''
return ret;
}
- def serializeAugmentations() '''
+ private def serializeAugmentations() '''
java.util.List _augmentations = (java.util.List) «AUGMENTATION_CODEC».serialize(value);
if(_augmentations != null) {
_childNodes.addAll(_augmentations);
'''
def Entry<String, Type> getFor(Map<String, Type> map, DataSchemaNode node) {
- val sig = map.get(node.getterName);
- if (sig == null) {
-
+ var sig = map.get(node.getterName);
+ if (sig != null) {
+ return new SimpleEntry(node.getterName, sig);
+ }
+ sig = map.get(node.booleanGetterName);
+ if (sig != null) {
return new SimpleEntry(node.booleanGetterName, map.get(node.booleanGetterName));
}
- return new SimpleEntry(node.getterName, sig);
+ return null;
}
private static def String getBooleanGetterName(DataSchemaNode node) {
private def dispatch CharSequence serializeProperty(ListSchemaNode schema, ParameterizedType type,
String propertyName) '''
«type.resolvedName» «propertyName» = value.«propertyName»();
+ //System.out.println("«propertyName»:" + «propertyName»);
if(«propertyName» != null) {
java.util.Iterator _iterator = «propertyName».iterator();
boolean _hasNext = _iterator.hasNext();
@Override
public void close() throws Exception {
-
if (baCommitHandlerRegistration != null) {
baCommitHandlerRegistration.close();
}
public class CommitHandlersTransactions {
- private static class AllwaysSuccessfulTransaction<P,D> implements DataCommitTransaction<P, D> {
+ private static class AllwaysSuccessfulTransaction<P extends Path<P>,D> implements DataCommitTransaction<P, D> {
private final DataModification<P, D> modification;
package org.opendaylight.controller.sal.binding.impl.util;
-
-
import java.util.concurrent.Callable;
import java.util.concurrent.locks.Lock;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
+import java.util.List;
import com.google.common.base.Optional;
-public class ClassLoaderUtils {
-
- public static <V> V withClassLoader(ClassLoader cls,Callable<V> function) throws Exception {
- return withClassLoaderAndLock(cls, Optional.<Lock>absent(), function);
+public final class ClassLoaderUtils {
+
+ private ClassLoaderUtils() {
+ throw new UnsupportedOperationException("Utility class");
+ }
+
+ public static <V> V withClassLoader(ClassLoader cls, Callable<V> function) throws Exception {
+ return withClassLoaderAndLock(cls, Optional.<Lock> absent(), function);
}
-
- public static <V> V withClassLoaderAndLock(ClassLoader cls,Lock lock,Callable<V> function) throws Exception {
- checkNotNull(lock,"Lock should not be null");
+
+ public static <V> V withClassLoaderAndLock(ClassLoader cls, Lock lock, Callable<V> function) throws Exception {
+ checkNotNull(lock, "Lock should not be null");
return withClassLoaderAndLock(cls, Optional.of(lock), function);
}
-
- public static <V> V withClassLoaderAndLock(ClassLoader cls,Optional<Lock> lock,Callable<V> function) throws Exception {
+
+ public static <V> V withClassLoaderAndLock(ClassLoader cls, Optional<Lock> lock, Callable<V> function)
+ throws Exception {
checkNotNull(cls, "Classloader should not be null");
- checkNotNull(function,"Function should not be null");
- if(lock.isPresent()) {
+ checkNotNull(function, "Function should not be null");
+ if (lock.isPresent()) {
lock.get().lock();
}
ClassLoader oldCls = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(cls);
- V result = function.call();
- return result;
- } finally {
+ return function.call();
+ } finally {
Thread.currentThread().setContextClassLoader(oldCls);
- if(lock.isPresent()) {
+ if (lock.isPresent()) {
lock.get().unlock();
}
}
}
- public static Object construct(Constructor<? extends Object> constructor, ArrayList<Object> objects) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
- Object[] initargs = objects.toArray(new Object[]{});
- return constructor.newInstance(initargs);
+ public static Object construct(Constructor<? extends Object> constructor, List<Object> objects)
+ throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+ Object[] initargs = objects.toArray(new Object[] {});
+ return constructor.newInstance(initargs);
}
-
-
+
public static Class<?> loadClassWithTCCL(String name) throws ClassNotFoundException {
- if("byte[]".equals(name)) {
+ if ("byte[]".equals(name)) {
return byte[].class;
}
-
+
return Thread.currentThread().getContextClassLoader().loadClass(name);
}
}
\ No newline at end of file
--- /dev/null
+package org.opendaylight.controller.sal.binding.impl.util;
+
+import java.util.List;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+
+import com.google.common.base.Preconditions;
+
+public class YangSchemaUtils {
+
+ public static final String AUGMENT_IDENTIFIER = "augment-identifier";
+
+
+ public YangSchemaUtils() {
+ throw new UnsupportedOperationException("Helper class. Instantiation is prohibited");
+ }
+
+
+ public static QName getAugmentationQName(AugmentationSchema augmentation) {
+ Preconditions.checkNotNull(augmentation, "Augmentation must not be null.");
+ QName identifier = getAugmentationIdentifier(augmentation);
+ if(identifier != null) {
+ return identifier;
+ }
+ for(DataSchemaNode child : augmentation.getChildNodes()) {
+ // FIXME: Return true name
+ return QName.create(child.getQName(), "foo_augment");
+ }
+ // FIXME: Allways return a qname with module namespace.
+ return null;
+ }
+
+ public static QName getAugmentationIdentifier(AugmentationSchema augmentation) {
+ for(UnknownSchemaNode extension : augmentation.getUnknownSchemaNodes()) {
+ if(AUGMENT_IDENTIFIER.equals(extension.getNodeType().getLocalName())) {
+ return extension.getQName();
+ }
+ }
+ return null;
+ }
+}
protected ListeningExecutorService executor;
protected BindingIndependentDataServiceConnector connectorServiceImpl;
protected HashMapDataStore rawDataStore;
- private SchemaAwareDataStoreAdapter schemaAwareDataStore;
+ protected SchemaAwareDataStoreAdapter schemaAwareDataStore;
private DataStoreStatsWrapper dataStoreStats;
protected DataStore dataStore;
@After
public void afterTest() {
- log.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ns AverageTime (ns): {} ns",
+ log.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
dataStoreStats.getConfigurationReadCount(), dataStoreStats.getConfigurationReadTotalTime(),
dataStoreStats.getConfigurationReadAverageTime());
- log.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ns AverageTime (ns): {} ns",
+ log.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
dataStoreStats.getOperationalReadCount(), dataStoreStats.getOperationalReadTotalTime(),
dataStoreStats.getOperationalReadAverageTime());
- log.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ns AverageTime (ns): {} ns",
+ log.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
dataStoreStats.getRequestCommitCount(), dataStoreStats.getRequestCommitTotalTime(),
dataStoreStats.getRequestCommitAverageTime());
+
import org.junit.Test;
import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
assertEquals(TransactionStatus.COMMITED, ret2.getResult());
// Data are not in the store.
- assertNull(baDataService.readOperationalData(FLOW_INSTANCE_ID_BA));
+ assertNull(baDataService.readConfigurationData(FLOW_INSTANCE_ID_BA));
}
flow.setNode(NODE_REF);
InstructionsBuilder instructions = new InstructionsBuilder();
InstructionBuilder instruction = new InstructionBuilder();
+
+ instruction.setOrder(10);
ApplyActionsBuilder applyActions = new ApplyActionsBuilder();
List<Action> actionList = new ArrayList<>();
PopMplsActionBuilder popMplsAction = new PopMplsActionBuilder();
popMplsAction.setEthernetType(34);
- actionList.add(new ActionBuilder().setAction(popMplsAction.build()).build());
+ actionList.add(new ActionBuilder().setAction(popMplsAction.build()).setOrder(10).build());
applyActions.setAction(actionList );
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<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action> 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);
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import static org.junit.Assert.*;
return transaction.commit();
}
});
- mappingServiceImpl.onGlobalContextUpdated(getContext(getAllModelFilenames()));
+ SchemaContext ctx = getContext(getAllModelFilenames());
+ schemaAwareDataStore.onGlobalContextUpdated(ctx);
+ mappingServiceImpl.onGlobalContextUpdated(ctx);
RpcResult<TransactionStatus> result = future.get().get();
assertEquals(TransactionStatus.COMMITED, result.getResult());
testAddingNodeConnector();
-
-
-
testNodeRemove();
flow.setNode(NODE_REF);
InstructionsBuilder instructions = new InstructionsBuilder();
InstructionBuilder instruction = new InstructionBuilder();
+ instruction.setOrder(10);
ApplyActionsBuilder applyActions = new ApplyActionsBuilder();
List<Action> actionList = new ArrayList<>();
PopMplsActionBuilder popMplsAction = new PopMplsActionBuilder();
popMplsAction.setEthernetType(34);
- actionList.add(new ActionBuilder().setAction(popMplsAction.build()).build());
+ actionList.add(new ActionBuilder().setAction(popMplsAction.build()).setOrder(0).build());
applyActions.setAction(actionList );
<groupId>org.eclipse.xtend</groupId>
<artifactId>org.eclipse.xtend.lib</artifactId>
</dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
import org.opendaylight.controller.md.sal.common.api.data.DataReader;
+import org.opendaylight.yangtools.concepts.Path;
-public abstract class AbstractDataModification<P /* extends Path<P> */, D> implements DataModification<P, D> {
+public abstract class AbstractDataModification<P extends Path<P>, D> implements DataModification<P, D> {
private final ConcurrentMap<P, D> operationalOriginal;
private final ConcurrentMap<P, D> configurationOriginal;
unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
-
}
@Override
public final void putConfigurationData(P path, D data) {
checkMutable();
-
- if (!hasConfigurationOriginal(path)) {
+ D original = null;
+ if ((original = getConfigurationOriginal(path)) == null) {
configurationCreated.put(path, data);
}
- configurationUpdate.put(path, data);
+ configurationUpdate.put(path, mergeConfigurationData(path,original, data));
configurationRemove.remove(path);
}
@Override
public final void putOperationalData(P path, D data) {
checkMutable();
- if (!hasOperationalOriginal(path)) {
+ D original = null;
+ if ((original = getOperationalOriginal(path)) == null) {
operationalCreated.put(path, data);
}
- operationalUpdate.put(path, data);
+ operationalUpdate.put(path, mergeOperationalData(path,original,data));
operationalRemove.remove(path);
}
@Override
public final void removeOperationalData(P path) {
checkMutable();
- hasOperationalOriginal(path);
+ getOperationalOriginal(path);
operationalUpdate.remove(path);
operationalRemove.put(path, path);
}
@Override
public final void removeConfigurationData(P path) {
checkMutable();
- hasConfigurationOriginal(path);
+ getConfigurationOriginal(path);
configurationUpdate.remove(path);
configurationRemove.put(path, path);
}
return reader.readConfigurationData(path);
}
- private boolean hasConfigurationOriginal(P path) {
- if (configurationOriginal.containsKey(path)) {
- return true;
+ private D getConfigurationOriginal(P path) {
+ D data = configurationOriginal.get(path);
+ if (data != null) {
+ return data;
}
- D data = reader.readConfigurationData(path);
+ data = reader.readConfigurationData(path);
if (data != null) {
configurationOriginal.putIfAbsent(path, data);
- return true;
+ return data;
}
- return false;
+ return null;
}
- private boolean hasOperationalOriginal(P path) {
- if (operationalOriginal.containsKey(path)) {
- return true;
+ private D getOperationalOriginal(P path) {
+ D data = operationalOriginal.get(path);
+ if (data != null) {
+ return data;
}
- D data = reader.readOperationalData(path);
+ data = reader.readOperationalData(path);
if (data != null) {
operationalOriginal.putIfAbsent(path, data);
- return true;
+ return data;
}
- return false;
+ return null;
+ }
+
+ protected D mergeOperationalData(P path,D stored, D modified) {
+ return modified;
+ }
+
+ protected D mergeConfigurationData(P path,D stored, D modified) {
+ return modified;
}
}
* @param <P>
* @param <D>
*/
-public abstract class AbstractDataReadRouter<P extends Path<?>, D> implements DataReader<P, D> {
+public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements DataReader<P, D> {
Multimap<P, DataReaderRegistration<P, D>> configReaders = HashMultimap.create();
Multimap<P, DataReaderRegistration<P, D>> operationalReaders = HashMultimap.create();
@Override
public boolean apply(Entry<P, DataReaderRegistration<P, D>> input) {
- final Path key = input.getKey();
- return key.contains(path) || ((Path) path).contains(key);
+ final P key = input.getKey();
+ return key.contains(path) || ((P) path).contains(key);
}
};
}
- private class ConfigurationDataReaderRegistration<P extends Path<?>, D> extends DataReaderRegistration<P, D> {
+ @SuppressWarnings("hiding")
+ private class ConfigurationDataReaderRegistration<P extends Path<P>, D> extends DataReaderRegistration<P, D> {
public ConfigurationDataReaderRegistration(P key, DataReader<P, D> instance) {
super(key, instance);
}
}
- private class OperationalDataReaderRegistration<P extends Path<?>, D> extends DataReaderRegistration<P, D> {
+ @SuppressWarnings("hiding")
+ private class OperationalDataReaderRegistration<P extends Path<P>, D> extends DataReaderRegistration<P, D> {
public OperationalDataReaderRegistration(P key, DataReader<P, D> instance) {
super(key, instance);
}
}
- private abstract static class DataReaderRegistration<P extends Path<?>, D> extends
+ private abstract static class DataReaderRegistration<P extends Path<P>, D> extends
AbstractObjectRegistration<DataReader<P, D>> {
private final P key;
import org.opendaylight.yangtools.concepts.Path
import org.slf4j.LoggerFactory
import java.util.HashSet
-import java.util.Map.Entry
-import java.util.Iterator
import java.util.Collection
import com.google.common.collect.FluentIterable;
import java.util.Set
import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandlerRegistration
import org.opendaylight.controller.md.sal.common.api.RegistrationListener
import org.opendaylight.yangtools.concepts.util.ListenerRegistry
-import java.util.concurrent.atomic.AtomicLong
import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent
abstract class AbstractDataBroker<P extends Path<P>, D, DCL extends DataChangeListener<P, D>> implements DataModificationTransactionFactory<P, D>, //
import org.opendaylight.controller.md.sal.common.api.data.DataChange;
import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.concepts.Path;
-public class DataChangeEventImpl<P, D> implements DataChangeEvent<P, D> {
+public class DataChangeEventImpl<P extends Path<P>, D> implements DataChangeEvent<P, D>, Immutable {
private final DataChange<P, D> dataChange;
import java.util.Set;
import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.concepts.Path;
-public class InitialDataChangeEventImpl<P,D> implements DataChangeEvent<P, D> {
+public class InitialDataChangeEventImpl<P extends Path<P>,D> implements DataChangeEvent<P, D>, Immutable {
- private final D originalOperationalTree;
- private final D originalConfigurationTree;
+ private final D updatedOperationalTree;
+ private final D updatedConfigurationTree;
+ private final Map<P,D> updatedConfigurationData;
+ private final Map<P,D> updatedOperationalData;
public InitialDataChangeEventImpl(D configTree, D operTree) {
- originalConfigurationTree = configTree;
- originalOperationalTree = operTree;
+ updatedConfigurationTree = configTree;
+ updatedOperationalTree = operTree;
+ updatedConfigurationData = Collections.emptyMap();
+ updatedOperationalData = Collections.emptyMap();
+ }
+
+ public InitialDataChangeEventImpl(D configTree, D operTree, Map<P, D> updatedCfgData, Map<P, D> updatedOperData) {
+ updatedConfigurationTree = configTree;
+ updatedOperationalTree = operTree;
+ updatedConfigurationData = updatedCfgData;
+ updatedOperationalData = updatedOperData;
}
@Override
}
@Override
public Map<P, D> getUpdatedConfigurationData() {
- return Collections.emptyMap();
+ return updatedConfigurationData;
}
@Override
public D getUpdatedConfigurationSubtree() {
- return originalConfigurationTree;
+ return updatedConfigurationTree;
}
@Override
public D getUpdatedOperationalSubtree() {
- return originalOperationalTree;
+ return updatedOperationalTree;
}
@Override
public D getOriginalConfigurationSubtree() {
- return originalConfigurationTree;
+ return updatedConfigurationTree;
}
@Override
public D getOriginalOperationalSubtree() {
- return originalOperationalTree;
+ return updatedOperationalTree;
}
@Override
public Map<P, D> getUpdatedOperationalData() {
- return Collections.emptyMap();
+ return updatedOperationalData;
}
<artifactId>sal-common-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
-
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-data-impl</artifactId>
- <version>0.5.9-SNAPSHOT</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-common-impl</artifactId>
<artifactId>config-api</artifactId>
<version>0.2.3-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-data-impl</artifactId>
+ <version>0.5.9-SNAPSHOT</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-parser-impl</artifactId>
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
import org.opendaylight.controller.sal.core.api.data.DataStore
import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter
+import org.opendaylight.controller.sal.core.api.model.SchemaServiceListener
class BrokerConfigActivator implements AutoCloseable {
wrappedStore = new SchemaAwareDataStoreAdapter();
wrappedStore.changeDelegate(store);
wrappedStore.setValidationEnabled(false);
+
+ context.registerService(SchemaServiceListener,wrappedStore,emptyProperties)
dataService.registerConfigurationReader(ROOT, wrappedStore);
dataService.registerCommitHandler(ROOT, wrappedStore);
import static com.google.common.base.Preconditions.*;
public class SchemaServiceImpl implements //
-SchemaService, //
-ServiceTrackerCustomizer<SchemaServiceListener, SchemaServiceListener>, //
-AutoCloseable {
+ SchemaService, //
+ ServiceTrackerCustomizer<SchemaServiceListener, SchemaServiceListener>, //
+ AutoCloseable {
private static final Logger logger = LoggerFactory.getLogger(SchemaServiceImpl.class);
private ListenerRegistry<SchemaServiceListener> listeners;
private BundleTracker<Object> bundleTracker;
private final YangStoreCache cache = new YangStoreCache();
- private ServiceTracker<SchemaServiceListener,SchemaServiceListener> listenerTracker;
+ private ServiceTracker<SchemaServiceListener, SchemaServiceListener> listenerTracker;
public ListenerRegistry<SchemaServiceListener> getListeners() {
return listeners;
if (listeners == null) {
listeners = new ListenerRegistry<>();
}
-
+
listenerTracker = new ServiceTracker<>(context, SchemaServiceListener.class, this);
bundleTracker = new BundleTracker<Object>(context, BundleEvent.RESOLVED | BundleEvent.UNRESOLVED, scanner);
bundleTracker.open();
throw new UnsupportedOperationException();
}
-
@Override
public ListenerRegistration<SchemaServiceListener> registerSchemaServiceListener(SchemaServiceListener listener) {
return listeners.register(listener);
}
-
+
@Override
public void close() throws Exception {
bundleTracker.close();
private synchronized boolean tryToUpdateState(Collection<URL> changedURLs, Multimap<Bundle, URL> proposedNewState,
boolean adding) {
- Preconditions.checkArgument(changedURLs.size() > 0, "No change can occur when no URLs are changed");
+ Preconditions.checkArgument(!changedURLs.isEmpty(), "No change can occur when no URLs are changed");
try {
// consistent state
} catch (Exception e) {
// inconsistent state
logger.debug(
- "SchemaService is falling back on last consistent state containing {}, inconsistent yang files {}, reason {}",
- consistentBundlesToYangURLs, inconsistentBundlesToYangURLs, e.toString());
+ "SchemaService is falling back on last consistent state containing {}, inconsistent yang files {}",
+ consistentBundlesToYangURLs, inconsistentBundlesToYangURLs, e);
return false;
}
}
private void updateCache(SchemaContext snapshot) {
cache.cacheYangStore(consistentBundlesToYangURLs, snapshot);
-
+
Object[] services = listenerTracker.getServices();
- if(services != null) {
- for(Object rawListener : services) {
+ 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);
+ logger.error("Exception occured during invoking listener", e);
}
}
}
try {
listener.getInstance().onGlobalContextUpdated(snapshot);
} catch (Exception e) {
- logger.error("Exception occured during invoking listener",e);
+ logger.error("Exception occured during invoking listener", e);
}
}
}
// system bundle might have config-api on classpath &&
// config-api contains yang files =>
// system bundle might contain yang files from that bundle
- if (bundle.getBundleId() == 0)
+ if (bundle.getBundleId() == 0) {
return bundle;
+ }
Enumeration<URL> enumeration = bundle.findEntries("META-INF/yang", "*.yang", false);
if (enumeration != null && enumeration.hasMoreElements()) {
proposedNewState.putAll(inconsistentBundlesToYangURLs);
proposedNewState.putAll(bundle, addedURLs);
boolean adding = true;
-
+
if (tryToUpdateState(addedURLs, proposedNewState, adding) == false) {
inconsistentBundlesToYangURLs.putAll(bundle, addedURLs);
}
this.cachedContextSnapshot = ctx;
}
}
-
+
@Override
public SchemaServiceListener addingService(ServiceReference<SchemaServiceListener> reference) {
-
+
SchemaServiceListener listener = context.getService(reference);
SchemaContext _ctxContext = getGlobalContext();
- if(getContext() != null) {
+ if (getContext() != null) {
listener.onGlobalContextUpdated(_ctxContext);
}
return listener;
}
-
+
@Override
public void modifiedService(ServiceReference<SchemaServiceListener> reference, SchemaServiceListener service) {
// NOOP
}
-
+
@Override
public void removedService(ServiceReference<SchemaServiceListener> reference, SchemaServiceListener service) {
context.ungetService(reference);
} finally {
final long endTime = System.nanoTime();
final long runTime = endTime - startTime;
- cfgReadTimeTotal.addAndGet(runTime);
+ operReadTimeTotal.addAndGet(runTime);
}
}
return requestCommitCount.get();
}
- public final long getConfigurationReadTotalTime() {
- return cfgReadTimeTotal.get();
+ public final double getConfigurationReadTotalTime() {
+ return cfgReadTimeTotal.get() / 1000.0d;
}
- public final long getOperationalReadTotalTime() {
- return operReadTimeTotal.get();
+ public final double getOperationalReadTotalTime() {
+ return operReadTimeTotal.get() / 1000.0d;
}
- public final long getRequestCommitTotalTime() {
- return requestCommitTimeTotal.get();
+ public final double getRequestCommitTotalTime() {
+ return requestCommitTimeTotal.get() / 1000.0d;
}
- public final long getConfigurationReadAverageTime() {
+ public final double getConfigurationReadAverageTime() {
long readCount = cfgReadCount.get();
if(readCount == 0) {
return 0;
}
- return cfgReadTimeTotal.get() / readCount;
+ return getConfigurationReadTotalTime() / readCount;
}
- public final long getOperationalReadAverageTime() {
+ public final double getOperationalReadAverageTime() {
long readCount = operReadCount.get();
if(readCount == 0) {
return 0;
}
- return operReadTimeTotal.get() / readCount;
+ return getOperationalReadTotalTime() / readCount;
}
- public final long getRequestCommitAverageTime() {
+ public final double getRequestCommitAverageTime() {
long count = requestCommitCount.get();
if(count == 0) {
return 0;
}
- return requestCommitTimeTotal.get() / count;
+ return getRequestCommitTotalTime() / count;
}
}
import java.util.Set
import java.util.Collections
import org.opendaylight.yangtools.concepts.AbstractObjectRegistration
-import org.opendaylight.controller.md.sal.common.impl.ListenerRegistry
import org.opendaylight.controller.sal.core.api.RpcRegistrationListener
import org.slf4j.LoggerFactory
+import org.opendaylight.yangtools.concepts.util.ListenerRegistry
class RpcRouterImpl implements RpcRouter, Identifiable<String> {
+++ /dev/null
-package org.opendaylight.controller.sal.dom.broker.impl
-
-import org.opendaylight.yangtools.yang.model.api.SchemaContext
-import org.opendaylight.yangtools.yang.data.api.CompositeNode
-
-class SchemaAwareDataMerger {
-
- private SchemaContext schema;
-
-
-
-
-}
\ No newline at end of file
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
import org.opendaylight.controller.md.sal.common.api.data.DataReader;
+import org.opendaylight.controller.md.sal.common.impl.AbstractDataModification;
import org.opendaylight.controller.md.sal.common.impl.util.AbstractLockableDelegator;
import org.opendaylight.controller.sal.core.api.data.DataStore;
import org.opendaylight.controller.sal.core.api.model.SchemaServiceListener;
import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.Node;
import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.util.YangDataOperations;
+import org.opendaylight.yangtools.yang.util.YangSchemaUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.FluentIterable;
import static com.google.common.base.Preconditions.*;
+import org.opendaylight.yangtools.yang.util.YangDataOperations;
public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataStore> implements //
DataStore, //
private SchemaContext schema = null;
private boolean validationEnabled = false;
- private SchemaAwareDataMerger dataMerger = null;
private DataReader<InstanceIdentifier, CompositeNode> reader = new MergeFirstLevelReader();
@Override
public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier, CompositeNode> requestCommit(
DataModification<InstanceIdentifier, CompositeNode> modification) {
validateAgainstSchema(modification);
- DataModification<InstanceIdentifier, CompositeNode> cleanedUp = prepareMergedTransaction(modification);
+ NormalizedDataModification cleanedUp = prepareMergedTransaction(modification);
+ cleanedUp.status = TransactionStatus.SUBMITED;
return retrieveDelegate().requestCommit(cleanedUp);
}
this.schema = null;
}
- private DataModification<InstanceIdentifier, CompositeNode> prepareMergedTransaction(
+ protected CompositeNode mergeData(InstanceIdentifier path, CompositeNode stored, CompositeNode modified, boolean config) {
+ long startTime = System.nanoTime();
+ try {
+ DataSchemaNode node = schemaNodeFor(path);
+ return YangDataOperations.merge(node,stored,modified,config);
+ } finally {
+ //System.out.println("Merge time: " + ((System.nanoTime() - startTime) / 1000.0d));
+ }
+ }
+
+
+ private DataSchemaNode schemaNodeFor(InstanceIdentifier path) {
+ checkState(schema != null,"YANG Schema is not available");
+ return YangSchemaUtils.getSchemaNode(schema, path);
+ }
+
+ private NormalizedDataModification prepareMergedTransaction(
DataModification<InstanceIdentifier, CompositeNode> original) {
// NOOP for now
- return original;
+ NormalizedDataModification normalized = new NormalizedDataModification(original);
+ for (Entry<InstanceIdentifier,CompositeNode> entry : original.getUpdatedConfigurationData().entrySet()) {
+ normalized.putConfigurationData(entry.getKey(), entry.getValue());
+ }
+ for (Entry<InstanceIdentifier,CompositeNode> entry : original.getUpdatedOperationalData().entrySet()) {
+ normalized.putOperationalData(entry.getKey(), entry.getValue());
+ }
+ for (InstanceIdentifier entry : original.getRemovedConfigurationData()) {
+ normalized.removeConfigurationData(entry);
+ }
+ for(InstanceIdentifier entry : original.getRemovedOperationalData()) {
+ normalized.removeOperationalData(entry);
+ }
+ return normalized;
}
private final Comparator<Entry<InstanceIdentifier, CompositeNode>> preparationComparator = new Comparator<Entry<InstanceIdentifier, CompositeNode>>() {
}
}
}
+
+ private class NormalizedDataModification extends AbstractDataModification<InstanceIdentifier, CompositeNode> {
+
+ private Object identifier;
+ private TransactionStatus status;
+
+ public NormalizedDataModification(DataModification<InstanceIdentifier, CompositeNode> original) {
+ super(getDelegate());
+ identifier = original;
+ status = TransactionStatus.NEW;
+ }
+
+ @Override
+ public Object getIdentifier() {
+ return this.identifier;
+ }
+
+ @Override
+ public TransactionStatus getStatus() {
+ return status;
+ }
+
+ @Override
+ public Future<RpcResult<TransactionStatus>> commit() {
+ throw new UnsupportedOperationException("Commit should not be invoked on this");
+ }
+
+ @Override
+ protected CompositeNode mergeConfigurationData(InstanceIdentifier path,CompositeNode stored, CompositeNode modified) {
+ return mergeData(path,stored, modified,true);
+ }
+
+ @Override
+ protected CompositeNode mergeOperationalData(InstanceIdentifier path,CompositeNode stored, CompositeNode modified) {
+ // TODO Auto-generated method stub
+ return mergeData(path,stored,modified,false);
+ }
+
+ }
+
}
--- /dev/null
+package org.opendaylight.yangtools.yang.util
+
+import org.opendaylight.yangtools.yang.data.api.CompositeNode
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
+import static com.google.common.base.Preconditions.*;
+import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl
+import java.util.ArrayList
+
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
+import org.opendaylight.yangtools.yang.data.api.Node
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
+import java.util.List
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode
+import java.util.Collections
+import static extension org.opendaylight.yangtools.yang.util.YangDataUtils.*;
+import java.util.HashSet
+import org.opendaylight.yangtools.yang.common.QName
+
+class YangDataOperations {
+
+ static def CompositeNode merge(DataSchemaNode schema, CompositeNode stored, CompositeNode modified, boolean config) {
+ checkConfigurational(schema, config);
+ if (stored === null) {
+ return modified;
+ }
+
+ if (schema instanceof ListSchemaNode || schema instanceof ContainerSchemaNode) {
+ return mergeContainer(schema as DataNodeContainer, stored, modified, config);
+ }
+ throw new IllegalArgumentException("Supplied node is not data node container.");
+ }
+
+ private def static checkConfigurational(DataSchemaNode node, boolean config) {
+ if (config) {
+ checkArgument(node.configuration, "Supplied composite node is not configurational.");
+ }
+ }
+
+ private static dispatch def Iterable<? extends Node<?>> mergeMultiple(LeafSchemaNode node, List<Node<?>> original,
+ List<Node<?>> modified, boolean configurational) {
+ checkArgument(original.size === 1);
+ checkArgument(modified.size === 1);
+ checkConfigurational(node, configurational);
+ return modified;
+ }
+
+ private static dispatch def Iterable<? extends Node<?>> mergeMultiple(LeafListSchemaNode node,
+ List<Node<?>> original, List<Node<?>> modified, boolean configurational) {
+ return modified;
+ }
+
+ private static dispatch def Iterable<? extends Node<?>> mergeMultiple(ContainerSchemaNode node,
+ List<Node<?>> original, List<Node<?>> modified, boolean configurational) {
+ checkArgument(original.size === 1);
+ checkArgument(modified.size === 1);
+ return Collections.singletonList(
+ merge(node, original.get(0) as CompositeNode, modified.get(0) as CompositeNode, configurational));
+ }
+
+ private static dispatch def Iterable<? extends Node<?>> mergeMultiple(ListSchemaNode node, List<Node<?>> original,
+ List<Node<?>> modified, boolean configurational) {
+ checkConfigurational(node,configurational);
+ if(node.keyDefinition === null || node.keyDefinition.empty) {
+ return modified;
+ }
+ val originalMap = (original as List).toIndexMap(node.keyDefinition);
+ val modifiedMap = (modified as List).toIndexMap(node.keyDefinition);
+
+ val List<Node<?>> mergedNodes = new ArrayList(original.size + modified.size);
+ for(entry : modifiedMap.entrySet) {
+ val originalEntry = originalMap.get(entry.key);
+ if(originalEntry != null) {
+ originalMap.remove(entry.key);
+ mergedNodes.add(merge(node,originalEntry,entry.value,configurational));
+
+ }
+ }
+ mergedNodes.addAll(originalMap.values);
+ return mergedNodes;
+ }
+
+ static private def CompositeNode mergeContainer(DataNodeContainer schema, CompositeNode stored,
+ CompositeNode modified, boolean config) {
+ if (stored == null) {
+ return modified;
+ }
+ checkNotNull(stored)
+ checkNotNull(modified)
+ checkArgument(stored.nodeType == modified.nodeType);
+
+ val mergedChildNodes = new ArrayList<Node<?>>(stored.children.size + modified.children.size);
+
+ val toProcess = new HashSet<QName>(stored.keySet);
+ toProcess.addAll(modified.keySet);
+
+ for (qname : toProcess) {
+ val schemaChild = schema.getDataChildByName(qname);
+ val storedChildren = stored.get(qname);
+ val modifiedChildren = modified.get(qname);
+
+ if (modifiedChildren !== null && !modifiedChildren.empty) {
+ if (storedChildren === null || storedChildren.empty || schemaChild === null) {
+ mergedChildNodes.addAll(modifiedChildren);
+ } else {
+ mergedChildNodes.addAll(mergeMultiple(schemaChild, storedChildren, modifiedChildren, config));
+ }
+ } else if (storedChildren !== null && !storedChildren.empty) {
+ mergedChildNodes.addAll(storedChildren);
+ }
+ }
+ return new CompositeNodeTOImpl(stored.nodeType, null, mergedChildNodes);
+ }
+
+}
--- /dev/null
+package org.opendaylight.yangtools.yang.util;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.SimpleNode;
+
+import static com.google.common.base.Preconditions.*;
+
+public class YangDataUtils {
+
+ public YangDataUtils() {
+ // TODO Auto-generated constructor stub
+ }
+
+
+
+ public static Map<Map<QName,Object>,CompositeNode> toIndexMap(List<CompositeNode> nodes,List<QName> keys) {
+ ConcurrentHashMap<Map<QName,Object>,CompositeNode> ret = new ConcurrentHashMap<>();
+ for(CompositeNode node : nodes) {
+ Map<QName, Object> key = getKeyMap(node,keys);
+ ret.put(key, node);
+ }
+ return ret;
+ }
+
+
+
+ public static Map<QName,Object> getKeyMap(CompositeNode node, List<QName> keys) {
+ Map<QName,Object> map = new HashMap<>();
+ for(QName key : keys) {
+ SimpleNode<?> keyNode = node.getFirstSimpleByName(QName.create(node.getNodeType(), key.getLocalName()));
+ checkArgument(keyNode != null,"Node must contains all keys.");
+ Object value = keyNode.getValue();
+ map.put(key, value);
+
+ }
+ return map;
+ }
+}
--- /dev/null
+package org.opendaylight.yangtools.yang.util;
+
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
+import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
+import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
+
+import static com.google.common.base.Preconditions.*;
+
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+
+public class YangSchemaUtils {
+
+ private static final Function<PathArgument, QName> QNAME_FROM_PATH_ARGUMENT = new Function<PathArgument, QName>(){
+
+ @Override
+ public QName apply(PathArgument input) {
+ if(input == null) {
+ return null;
+ }
+ return input.getNodeType();
+ }
+ };
+
+ private YangSchemaUtils() {
+ throw new UnsupportedOperationException("Utility class.");
+ }
+
+
+ public static DataSchemaNode getSchemaNode(SchemaContext schema,InstanceIdentifier path) {
+ checkArgument(schema != null,"YANG Schema must not be null.");
+ checkArgument(path != null,"Path must not be null.");
+ return getSchemaNode(schema, FluentIterable.from(path.getPath()).transform(QNAME_FROM_PATH_ARGUMENT));
+ }
+
+ public static DataSchemaNode getSchemaNode(SchemaContext schema,Iterable<QName> path) {
+ checkArgument(schema != null,"YANG Schema must not be null.");
+ checkArgument(path != null,"Path must not be null.");
+ if(!path.iterator().hasNext()){
+ return toRootDataNode(schema);
+ }
+
+ QName firstNode = path.iterator().next();
+ DataNodeContainer previous = schema.findModuleByNamespaceAndRevision(firstNode.getNamespace(),
+ firstNode.getRevision());
+ Iterator<QName> iterator = path.iterator();
+
+ while (iterator.hasNext()) {
+ checkArgument(previous!= null, "Supplied path does not resolve into valid schema node.");
+ QName arg = iterator.next();
+ DataSchemaNode currentNode = previous.getDataChildByName(arg);
+ if (currentNode == null && previous instanceof DataNodeContainer) {
+ currentNode = searchInChoices(previous, arg);
+ }
+ if (currentNode instanceof DataNodeContainer) {
+ previous = (DataNodeContainer) currentNode;
+ } else if (currentNode instanceof LeafSchemaNode || currentNode instanceof LeafListSchemaNode) {
+ checkArgument(!iterator.hasNext(), "Path nests inside leaf node, which is not allowed.");
+ return currentNode;
+ }
+ }
+ return (DataSchemaNode) previous;
+ }
+
+
+ private static DataSchemaNode searchInChoices(DataNodeContainer node, QName arg) {
+ Set<DataSchemaNode> children = node.getChildNodes();
+ for (DataSchemaNode child : children) {
+ if (child instanceof ChoiceNode) {
+ ChoiceNode choiceNode = (ChoiceNode) child;
+ DataSchemaNode potential = searchInCases(choiceNode, arg);
+ if (potential != null) {
+ return potential;
+ }
+ }
+ }
+ return null;
+ }
+
+ private static DataSchemaNode searchInCases(ChoiceNode choiceNode, QName arg) {
+ Set<ChoiceCaseNode> cases = choiceNode.getCases();
+ for (ChoiceCaseNode caseNode : cases) {
+ DataSchemaNode node = caseNode.getDataChildByName(arg);
+ if (node != null) {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ private static ContainerSchemaNode toRootDataNode(SchemaContext schema) {
+ return new NetconfDataRootNode(schema);
+ }
+
+ private static final class NetconfDataRootNode implements ContainerSchemaNode {
+
+ public NetconfDataRootNode(SchemaContext schema) {
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public YangNode getParent() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Set<TypeDefinition<?>> getTypeDefinitions() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Set<DataSchemaNode> getChildNodes() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Set<GroupingDefinition> getGroupings() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public DataSchemaNode getDataChildByName(QName name) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public DataSchemaNode getDataChildByName(String name) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Set<UsesNode> getUses() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Set<AugmentationSchema> getAvailableAugmentations() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isAugmenting() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isAddedByUses() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isConfiguration() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public ConstraintDefinition getConstraints() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public QName getQName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public SchemaPath getPath() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getDescription() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getReference() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Status getStatus() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isPresenceContainer() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ }
+
+}
import java.util.List;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.features.GroupFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
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.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
private Thread statisticsRequesterThread;
- private final InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder().node(Nodes.class).toInstance();
+ private final InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder(Nodes.class).toInstance();
+ private final int STATS_THREAD_EXECUTION_TIME= 50000;
//Local caching of stats
private final ConcurrentMap<NodeId,NodeStatistics> statisticsCache =
try {
statsRequestSender();
- Thread.sleep(5000);
+ Thread.sleep(STATS_THREAD_EXECUTION_TIME);
}catch (Exception e){
spLogger.error("Exception occurred while sending stats request : {}",e);
}
}
});
- spLogger.debug("Statistics requester thread started with timer interval : {}",5000);
+ spLogger.debug("Statistics requester thread started with timer interval : {}",STATS_THREAD_EXECUTION_TIME);
- //statisticsRequesterThread.start();
+ statisticsRequesterThread.start();
spLogger.info("Statistics Provider started.");
}
InstanceIdentifier<Node> targetInstanceId = InstanceIdentifier.builder(Nodes.class).child(Node.class,targetNode.getKey()).toInstance();
NodeRef targetNodeRef = new NodeRef(targetInstanceId);
- sendAllGroupStatisticsRequest(targetNodeRef);
-
- sendAllMeterStatisticsRequest(targetNodeRef);
-
- sendGroupDescriptionRequest(targetNodeRef);
-
- sendGroupFeaturesRequest(targetNodeRef);
-
- sendMeterConfigStatisticsRequest(targetNodeRef);
-
- sendMeterFeaturesRequest(targetNodeRef);
+ try{
+ sendAllGroupStatisticsRequest(targetNodeRef);
+ Thread.sleep(1000);
+ sendAllMeterStatisticsRequest(targetNodeRef);
+ Thread.sleep(1000);
+ sendGroupDescriptionRequest(targetNodeRef);
+ Thread.sleep(1000);
+ sendMeterConfigStatisticsRequest(targetNodeRef);
+ Thread.sleep(1000);
+ }catch(Exception e){
+ spLogger.error("Exception occured while sending statistics request : {}", e);
+ }
}
}
}
groupStatsService.getGroupDescription(input.build());
}
- private void sendGroupFeaturesRequest(NodeRef targetNode){
-
- GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder();
-
- input.setNode(targetNode);
-
- @SuppressWarnings("unused")
- Future<RpcResult<GetGroupFeaturesOutput>> response =
- groupStatsService.getGroupFeatures(input.build());
- }
-
private void sendAllMeterStatisticsRequest(NodeRef targetNode){
GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder();
meterStatsService.getAllMeterConfigStatistics(input.build());
}
- private void sendMeterFeaturesRequest(NodeRef targetNode){
-
- GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder();
-
- input.setNode(targetNode);
-
- @SuppressWarnings("unused")
- Future<RpcResult<GetMeterFeaturesOutput>> response =
- meterStatsService.getMeterFeatures(input.build());
- }
public ConcurrentMap<NodeId, NodeStatistics> getStatisticsCache() {
return statisticsCache;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatisticsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupDescBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupFeaturesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.nodes.node.GroupStatisticsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.desc.GroupDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.features.GroupFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.statistics.GroupStatisticsBuilder;
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;
nodeData.addAugmentation(NodeMeterConfigStats.class, meterConfig.build());
InstanceIdentifier<? extends Object> refValue = ref.getValue();
- it.putRuntimeData(refValue, nodeData.build());
+ it.putOperationalData(refValue, nodeData.build());
it.commit();
}
nodeData.addAugmentation(NodeMeterStatistics.class, meterStats.build());
InstanceIdentifier<? extends Object> refValue = ref.getValue();
- it.putRuntimeData(refValue, nodeData.build());
+ it.putOperationalData(refValue, nodeData.build());
it.commit();
}
nodeData.addAugmentation(NodeGroupDescStats.class, groupDesc.build());
InstanceIdentifier<? extends Object> refValue = ref.getValue();
- it.putRuntimeData(refValue, nodeData.build());
+ it.putOperationalData(refValue, nodeData.build());
it.commit();
}
nodeData.addAugmentation(NodeGroupStatistics.class, groupStats.build());
InstanceIdentifier<? extends Object> refValue = ref.getValue();
- it.putRuntimeData(refValue, nodeData.build());
+ it.putOperationalData(refValue, nodeData.build());
it.commit();
}
cache.put(notification.getId(), new NodeStatistics());
}
MeterFeaturesBuilder meterFeature = new MeterFeaturesBuilder();
- meterFeature.setBandTypes(notification.getBandTypes());
- meterFeature.setCapabilities(notification.getCapabilities());
+ meterFeature.setMeterBandSupported(notification.getMeterBandSupported());
+ meterFeature.setMeterCapabilitiesSupported(notification.getMeterCapabilitiesSupported());
meterFeature.setMaxBands(notification.getMaxBands());
meterFeature.setMaxColor(notification.getMaxColor());
meterFeature.setMaxMeter(notification.getMaxMeter());
nodeData.addAugmentation(NodeMeterFeatures.class, nodeMeterFeatures.build());
InstanceIdentifier<? extends Object> refValue = ref.getValue();
- it.putRuntimeData(refValue, nodeData.build());
+ it.putOperationalData(refValue, nodeData.build());
it.commit();
}
@Override
public void onGroupFeaturesUpdated(GroupFeaturesUpdated notification) {
+
//Add statistics to local cache
ConcurrentMap<NodeId, NodeStatistics> cache = this.statisticsManager.getStatisticsCache();
if(!cache.containsKey(notification.getId())){
GroupFeaturesBuilder groupFeatures = new GroupFeaturesBuilder();
groupFeatures.setActions(notification.getActions());
- groupFeatures.setCapabilities(notification.getCapabilities());
- groupFeatures.setTypes(notification.getTypes());
+ groupFeatures.setGroupCapabilitiesSupported(notification.getGroupCapabilitiesSupported());
+ groupFeatures.setGroupTypesSupported(notification.getGroupTypesSupported());
groupFeatures.setMaxGroups(notification.getMaxGroups());
cache.get(notification.getId()).setGroupFeatures(groupFeatures.build());
nodeData.addAugmentation(NodeGroupFeatures.class, nodeGroupFeatures.build());
InstanceIdentifier<? extends Object> refValue = ref.getValue();
- it.putRuntimeData(refValue, nodeData.build());
+ it.putOperationalData(refValue, nodeData.build());
it.commit();
}
private NodeRef getNodeRef(NodeKey nodeKey){
- InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder().node(Nodes.class);
- return new NodeRef(builder.node(Node.class,nodeKey).toInstance());
+ InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey);
+ return new NodeRef(builder.toInstance());
}
}
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-directory-adapter</artifactId>
+ <version>${parent.version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
if (maybeConfig.isPresent()) {
logger.debug("Last config found {}", persister);
ConflictingVersionException lastException = null;
- int maxAttempts = 30;
- for(int i = 0 ; i < maxAttempts; i++) {
- registerToNetconf(maybeConfig.get().getCapabilities());
-
- final String configSnapshot = maybeConfig.get().getConfigSnapshot();
- logger.trace("Pushing following xml to netconf {}", configSnapshot);
- try {
- pushLastConfig(XmlUtil.readXmlToElement(configSnapshot));
- return;
- } catch(ConflictingVersionException e) {
- closeClientAndDispatcher(netconfClient, netconfClientDispatcher);
- lastException = e;
- Thread.sleep(1000);
- } catch (SAXException | IOException e) {
- throw new IllegalStateException("Unable to load last config", e);
- }
- }
- throw new IllegalStateException("Failed to push configuration, maximum attempt count has been reached: "
- + maxAttempts, lastException);
+ pushLastConfigWithRetries(maybeConfig, lastException);
} else {
// this ensures that netconf is initialized, this is first
registerAsJMXListener();
}
+ private void pushLastConfigWithRetries(Optional<ConfigSnapshotHolder> maybeConfig, ConflictingVersionException lastException) throws InterruptedException {
+ int maxAttempts = 30;
+ for(int i = 0 ; i < maxAttempts; i++) {
+ registerToNetconf(maybeConfig.get().getCapabilities());
+
+ final String configSnapshot = maybeConfig.get().getConfigSnapshot();
+ logger.trace("Pushing following xml to netconf {}", configSnapshot);
+ try {
+ pushLastConfig(XmlUtil.readXmlToElement(configSnapshot));
+ return;
+ } catch(ConflictingVersionException e) {
+ closeClientAndDispatcher(netconfClient, netconfClientDispatcher);
+ lastException = e;
+ Thread.sleep(1000);
+ } catch (SAXException | IOException e) {
+ throw new IllegalStateException("Unable to load last config", e);
+ }
+ }
+ throw new IllegalStateException("Failed to push configuration, maximum attempt count has been reached: "
+ + maxAttempts, lastException);
+ }
+
private synchronized long registerToNetconf(Set<String> expectedCaps) throws InterruptedException {
Set<String> currentCapabilities = Sets.newHashSet();
}
private void registerAsJMXListener() {
+ logger.trace("Called registerAsJMXListener");
try {
mbeanServer.addNotificationListener(on, this, null, null);
} catch (InstanceNotFoundException | IOException e) {
public static class PersisterWithConfiguration {
- public final Persister storage;
+ private final Persister storage;
private final boolean readOnly;
public PersisterWithConfiguration(Persister storage, boolean readOnly) {
this.readOnly = readOnly;
}
+ @VisibleForTesting
+ public Persister getStorage() {
+ return storage;
+ }
+
+ @VisibleForTesting
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+
@Override
public String toString() {
return "PersisterWithConfiguration{" +
--- /dev/null
+/*
+ * 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.netconf.persist.impl;
+
+import com.google.common.base.Optional;
+import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
+import org.opendaylight.controller.config.persist.api.Persister;
+import org.opendaylight.controller.config.persist.api.PropertiesProvider;
+import org.opendaylight.controller.config.persist.api.StorageAdapter;
+
+import java.io.IOException;
+
+public class DummyAdapter implements StorageAdapter, Persister {
+
+ static int persist = 0;
+
+ @Override
+ public void persistConfig(ConfigSnapshotHolder holder) throws IOException {
+ persist++;
+ }
+
+ static int load = 0;
+
+ @Override
+ public Optional<ConfigSnapshotHolder> loadLastConfig() throws IOException {
+ load++;
+ return Optional.absent();
+ }
+
+ static int props = 0;
+
+ @Override
+ public Persister instantiate(PropertiesProvider propertiesProvider) {
+ props++;
+ return this;
+ }
+
+ @Override
+ public void close() {
+ }
+
+}
package org.opendaylight.controller.netconf.persist.impl;
import com.google.common.base.Optional;
-import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
import org.opendaylight.controller.config.persist.api.Persister;
-import org.opendaylight.controller.config.persist.api.PropertiesProvider;
-import org.opendaylight.controller.config.persist.api.StorageAdapter;
import org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter;
import org.opendaylight.controller.netconf.persist.impl.osgi.ConfigPersisterActivator;
import org.opendaylight.controller.netconf.persist.impl.osgi.PropertiesProviderBaseImpl;
-import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Properties;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertEquals;
import static org.junit.matchers.JUnitMatchers.containsString;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.opendaylight.controller.netconf.persist.impl.PersisterAggregator.PersisterWithConfiguration;
+import static org.opendaylight.controller.netconf.persist.impl.PersisterAggregatorTest.TestingPropertiesProvider.loadFile;
public class PersisterAggregatorTest {
- @Mock
- TestingPropertiesProvider propertiesProvider;
- class TestingPropertiesProvider extends PropertiesProviderBaseImpl {
- TestingPropertiesProvider() {
+ static class TestingPropertiesProvider extends PropertiesProviderBaseImpl {
+
+ private static Properties prop = new Properties();
+
+ public TestingPropertiesProvider() {
super(null);
}
+ public static TestingPropertiesProvider loadFile(String fileName) {
+ try {
+ prop.load(TestingPropertiesProvider.class.getClassLoader().getResourceAsStream(fileName));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return new TestingPropertiesProvider();
+ }
+
@Override
public String getFullKeyForReporting(String key) {
- return "prefix." + key;
+ return ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER + "." + key;
}
@Override
public String getProperty(String key) {
- throw new UnsupportedOperationException("should be mocked");
+ return prop.getProperty(getFullKeyForReporting(key));
}
- }
- @Before
- public void setUpMocks() {
- MockitoAnnotations.initMocks(this);
- doCallRealMethod().when(propertiesProvider).getFullKeyForReporting(anyString());
+ @Override
+ public String getPropertyWithoutPrefix(String fullKey){
+ return prop.getProperty(fullKey);
+ }
}
- @Ignore
@Test
- public void testFromProperties() throws Exception {
- doReturn("").when(propertiesProvider).getProperty(ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER);
- doReturn(MockAdapter.class.getName()).when(propertiesProvider).getProperty(
- ConfigPersisterActivator.STORAGE_ADAPTER_CLASS_PROP_SUFFIX);
- doReturn("false").when(propertiesProvider).getProperty("readOnly");
+ public void testDummyAdapter() throws Exception {
+ PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(loadFile("test1.properties"));
+ List<PersisterWithConfiguration> persisters = persisterAggregator.getPersisterWithConfigurations();
+ assertEquals(1, persisters.size());
+ PersisterWithConfiguration persister = persisters.get(0);
+ assertEquals(DummyAdapter.class.getName() ,persister.getStorage().getClass().getName());
+ assertFalse(persister.isReadOnly());
- PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(propertiesProvider);
persisterAggregator.persistConfig(null);
persisterAggregator.loadLastConfig();
persisterAggregator.persistConfig(null);
persisterAggregator.loadLastConfig();
- assertEquals(2, MockAdapter.persist);
- assertEquals(2, MockAdapter.load);
- assertEquals(1, MockAdapter.props);
+ assertEquals(2, DummyAdapter.persist);
+ assertEquals(2, DummyAdapter.load);
+ assertEquals(1, DummyAdapter.props);
}
-
- @Ignore
@Test
- public void testFromProperties2() throws Exception {
- String prefix = "";
- doReturn(prefix).when(propertiesProvider).getProperty(ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER);
- doReturn(FileStorageAdapter.class.getName()).when(propertiesProvider).getProperty(
- ConfigPersisterActivator.STORAGE_ADAPTER_CLASS_PROP_SUFFIX);
-
- doReturn("target" + File.separator + "generated-test-sources" + File.separator + "testFile").when(
- propertiesProvider).getProperty("prefix.properties.fileStorage");
- doReturn("propertiesProvider").when(propertiesProvider).toString();
- doReturn(null).when(propertiesProvider).getProperty("prefix.properties.numberOfBackups");
-
- PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(propertiesProvider);
+ public void testLoadFromPropertyFile() throws Exception {
+ PersisterAggregator persisterAggregator = PersisterAggregator.createFromProperties(loadFile("test2.properties"));
+ List<PersisterWithConfiguration> persisters = persisterAggregator.getPersisterWithConfigurations();
+ assertEquals(1, persisters.size());
+ PersisterWithConfiguration persister = persisters.get(0);
+ assertEquals(FileStorageAdapter.class.getName() ,persister.getStorage().getClass().getName());
+ assertFalse(persister.isReadOnly());
}
- @Ignore
@Test
- public void testFromProperties3() throws Exception {
- doReturn("").when(propertiesProvider).getProperty(ConfigPersisterActivator.NETCONF_CONFIG_PERSISTER);
- doReturn(FileStorageAdapter.class.getName()).when(propertiesProvider).getProperty(
- ConfigPersisterActivator.STORAGE_ADAPTER_CLASS_PROP_SUFFIX);
- doReturn("target" + File.separator + "generated-test-sources" + File.separator + "testFile").when(
- propertiesProvider).getProperty("prefix.properties.fileStorage");
- doReturn("false").when(propertiesProvider).getProperty("readOnly");
- doReturn("propertiesProvider").when(propertiesProvider).toString();
- doReturn("0").when(propertiesProvider).getProperty("prefix.properties.numberOfBackups");
+ public void testFileStorageNumberOfBackups() throws Exception {
try {
- PersisterAggregator.createFromProperties(propertiesProvider);
+ PersisterAggregator.createFromProperties(loadFile("test3.properties"));
fail();
} catch (RuntimeException e) {
assertThat(
@Test
public void loadLastConfig() throws Exception {
- List<PersisterAggregator.PersisterWithConfiguration> persisterWithConfigurations = new ArrayList<>();
- PersisterAggregator.PersisterWithConfiguration first = new PersisterAggregator.PersisterWithConfiguration(mock(Persister.class), false);
+ List<PersisterWithConfiguration> persisterWithConfigurations = new ArrayList<>();
+ PersisterWithConfiguration first = new PersisterWithConfiguration(mock(Persister.class), false);
ConfigSnapshotHolder ignored = mock(ConfigSnapshotHolder.class);
- doReturn(Optional.of(ignored)).when(first.storage).loadLastConfig(); // should be ignored
+ doReturn(Optional.of(ignored)).when(first.getStorage()).loadLastConfig(); // should be ignored
ConfigSnapshotHolder used = mock(ConfigSnapshotHolder.class);
- PersisterAggregator.PersisterWithConfiguration second = new PersisterAggregator.PersisterWithConfiguration(mock(Persister.class), false);
- doReturn(Optional.of(used)).when(second.storage).loadLastConfig(); // should be used
+ PersisterWithConfiguration second = new PersisterWithConfiguration(mock(Persister.class), false);
+ doReturn(Optional.of(used)).when(second.getStorage()).loadLastConfig(); // should be used
- PersisterAggregator.PersisterWithConfiguration third = new PersisterAggregator.PersisterWithConfiguration(mock(Persister.class), false);
- doReturn(Optional.absent()).when(third.storage).loadLastConfig();
+ PersisterWithConfiguration third = new PersisterWithConfiguration(mock(Persister.class), false);
+ doReturn(Optional.absent()).when(third.getStorage()).loadLastConfig();
persisterWithConfigurations.add(first);
persisterWithConfigurations.add(second);
assertEquals(used, configSnapshotHolderOptional.get());
}
- @Ignore
- @Test
- public void test() throws Exception {
-// Persister storage = mock(Persister.class);
-// doReturn(null).when(storage).loadLastConfig();
-// doNothing().when(storage).persistConfig(any(ConfigSnapshotHolder.class));
-//
-// PersisterAggregator persister = new PersisterAggregator(storage);
-// persister.loadLastConfig();
-// persister.persistConfig(null);
-//
-// verify(storage).loadLastConfig();
-// verify(storage).persistConfig(any(ConfigSnapshotHolder.class));
- }
-
- public static class MockAdapter implements StorageAdapter, Persister {
-
- static int persist = 0;
-
- @Override
- public void persistConfig(ConfigSnapshotHolder holder) throws IOException {
- persist++;
- }
-
- static int load = 0;
-
- @Override
- public Optional<ConfigSnapshotHolder> loadLastConfig() throws IOException {
- load++;
- return Optional.absent();
- }
-
- static int props = 0;
-
- @Override
- public Persister instantiate(PropertiesProvider propertiesProvider) {
- props++;
- return this;
- }
-
- @Override
- public void close() {
- }
-
- }
-
}
--- /dev/null
+netconf.config.persister.active=1
+netconf.config.persister.1.storageAdapterClass=org.opendaylight.controller.netconf.persist.impl.DummyAdapter
+netconf.config.persister.1.properties.fileStorage=configuration/initial/
\ No newline at end of file
--- /dev/null
+netconf.config.persister.active=2
+# read startup configuration
+netconf.config.persister.1.storageAdapterClass=org.opendaylight.controller.config.persist.storage.directory.DirectoryStorageAdapter
+netconf.config.persister.1.properties.directoryStorage=configuration/initial/
+netconf.config.persister.1.readonly=true
+
+netconf.config.persister.2.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter
+netconf.config.persister.2.properties.fileStorage=configuration/current/controller.config.2.txt
+netconf.config.persister.2.properties.numberOfBackups=3
\ No newline at end of file
--- /dev/null
+netconf.config.persister.active=3
+netconf.config.persister.3.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter
+netconf.config.persister.3.properties.fileStorage=configuration/current/controller.config.2.txt
+netconf.config.persister.3.properties.numberOfBackups=0
\ No newline at end of file