@Override
public String toString() {
- return "ExceptionMessageWithStackTrace [message=" + message
- + ", stackTrace=" + stackTrace + "]";
+ return message;
}
}
return null;
}
- private synchronized void blankTransaction() {
+ synchronized void blankTransaction() {
// race condition check: config-persister might push new configuration while server is starting up.
ConflictingVersionException lastException = null;
for (int i = 0; i < 10; i++) {
configRegistryJMXRegistrator.registerToJMX(configRegistry);
// track bundles containing factories
- extenderBundleTracker = new ExtenderBundleTracker(context);
+ BlankTransactionServiceTracker blankTransactionServiceTracker = new BlankTransactionServiceTracker(configRegistry);
+ extenderBundleTracker = new ExtenderBundleTracker(context, blankTransactionServiceTracker);
extenderBundleTracker.open();
- BlankTransactionServiceTracker customizer = new BlankTransactionServiceTracker(configRegistry);
- ServiceTracker<?, ?> serviceTracker = new ServiceTracker(context, ModuleFactory.class, customizer);
+ ServiceTracker<?, ?> serviceTracker = new ServiceTracker(context, ModuleFactory.class, blankTransactionServiceTracker);
serviceTracker.open();
}
* Code based on http://www.toedter.com/blog/?p=236
*/
public class ExtenderBundleTracker extends BundleTracker<Object> {
-
+ private final BlankTransactionServiceTracker blankTransactionServiceTracker;
private static final Logger logger = LoggerFactory.getLogger(ExtenderBundleTracker.class);
- public ExtenderBundleTracker(BundleContext context) {
+ public ExtenderBundleTracker(BundleContext context, BlankTransactionServiceTracker blankTransactionServiceTracker) {
super(context, Bundle.ACTIVE, null);
+ this.blankTransactionServiceTracker = blankTransactionServiceTracker;
logger.trace("Registered as extender with context {}", context);
}
@Override
public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
super.removedBundle(bundle,event,object);
+ // workaround for service tracker not getting removed service event
+ blankTransactionServiceTracker.blankTransaction();
}
// TODO:test
public class DirectoryStorageAdapterTest {
Persister tested;
+ private Persister instantiatePersisterFromAdapter(File file){
+ PropertiesProviderTest pp = new PropertiesProviderTest();
+ pp.addProperty("directoryStorage",file.getPath());
+ DirectoryStorageAdapter dsa = new DirectoryStorageAdapter();
+ return dsa.instantiate(pp);
+ }
@Test
public void testEmptyDirectory() throws Exception {
File folder = new File("target/emptyFolder");
folder.mkdir();
- PropertiesProviderTest pp = new PropertiesProviderTest();
- pp.addProperty("directoryStorage",folder.getPath());
- DirectoryStorageAdapter dsa = new DirectoryStorageAdapter();
- tested = dsa.instantiate(pp);
+ tested = instantiatePersisterFromAdapter(folder);
assertEquals(Collections.<ConfigSnapshotHolder>emptyList(), tested.loadLastConfigs());
try {
@Test
public void testOneFile() throws Exception {
File folder = getFolder("oneFile");
- PropertiesProviderTest pp = new PropertiesProviderTest();
- pp.addProperty("directoryStorage",folder.getPath());
- DirectoryStorageAdapter dsa = new DirectoryStorageAdapter();
- tested = dsa.instantiate(pp);
+
+ tested = instantiatePersisterFromAdapter(folder);
List<ConfigSnapshotHolder> results = tested.loadLastConfigs();
assertEquals(1, results.size());
@Test
public void testTwoFiles() throws Exception {
File folder = getFolder("twoFiles");
- PropertiesProviderTest pp = new PropertiesProviderTest();
- pp.addProperty("directoryStorage",folder.getPath());
- DirectoryStorageAdapter dsa = new DirectoryStorageAdapter();
- tested = dsa.instantiate(pp);
+ tested = instantiatePersisterFromAdapter(folder);
List<ConfigSnapshotHolder> results = tested.loadLastConfigs();
assertEquals(2, results.size());
<artifactId>mockito-configuration</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-persister-api</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
</dependencies>
private ConfigSnapshotHolder loadLastConfig(File file, FileType fileType) throws IOException {
switch (fileType) {
case plaintext:
+ logger.warn("Plaintext configuration files are deprecated, and will not be supported in future versions. " +
+ "Use xml files instead");
return DirectoryPersister.loadLastConfig(file);
case xml:
try {
*/
package org.opendaylight.controller.config.persist.storage.directory.autodetect;
+import java.io.File;
+import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.matchers.JUnitMatchers;
import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
-
-import java.io.File;
-import java.util.List;
+import org.opendaylight.controller.config.persist.test.PropertiesProviderTest;
public class AutodetectDirectoryPersisterTest {
@Test
public void testCombined() throws Exception {
File resourcePath = FileTypeTest.getResourceAsFile("/combined/1controller.txt.config");
+ File parentFile = resourcePath.getParentFile();
+
+ AutodetectDirectoryStorageAdapter adapter = new AutodetectDirectoryStorageAdapter();
- AutodetectDirectoryPersister persister = new AutodetectDirectoryPersister(resourcePath.getParentFile());
+ PropertiesProviderTest pp = new PropertiesProviderTest();
+ pp.addProperty("directoryStorage",parentFile.getPath());
+ AutodetectDirectoryPersister persister = (AutodetectDirectoryPersister) adapter.instantiate(pp);
List<ConfigSnapshotHolder> configs = persister.loadLastConfigs();
Assert.assertEquals(2, configs.size());
String snapFromXml = configs.get(1).getConfigSnapshot();
org.junit.Assert.assertThat(snapFromXml, JUnitMatchers.containsString("<config>xml</config>"));
- Assert.assertEquals(configs.get(0).getCapabilities(), configs.get(1).getCapabilities());
- }
+ Assert.assertEquals(configs.get(0).getCapabilities(), configs.get(1).getCapabilities()); }
}
import java.util.SortedSet;
import org.junit.Test;
import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
+import org.opendaylight.controller.config.persist.api.Persister;
+import org.opendaylight.controller.config.persist.test.PropertiesProviderTest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class DirectoryStorageAdapterTest {
- XmlDirectoryPersister tested;
+ Persister tested;
Logger logger = LoggerFactory.getLogger(DirectoryStorageAdapterTest.class.toString());
+ private Persister instantiatePersisterFromAdapter(File file){
+ PropertiesProviderTest pp = new PropertiesProviderTest();
+ pp.addProperty("directoryStorage",file.getPath());
+ XmlDirectoryStorageAdapter dsa = new XmlDirectoryStorageAdapter();
+ return dsa.instantiate(pp);
+ }
+
@Test
public void testEmptyDirectory() throws Exception {
File folder = new File("target/emptyFolder");
folder.mkdir();
- tested = new XmlDirectoryPersister((folder));
+
+ tested = instantiatePersisterFromAdapter(folder);
assertEquals(Collections.<ConfigSnapshotHolder>emptyList(), tested.loadLastConfigs());
try {
@Test
public void testOneFile() throws Exception {
File folder = getFolder("oneFile");
- tested = new XmlDirectoryPersister(folder);
+ tested = instantiatePersisterFromAdapter(folder);
+
logger.info("Testing : "+tested.toString());
List<ConfigSnapshotHolder> results = tested.loadLastConfigs();
assertEquals(1, results.size());
@Test
public void testTwoFiles() throws Exception {
File folder = getFolder("twoFiles");
- tested = new XmlDirectoryPersister((folder));
+ tested = instantiatePersisterFromAdapter(folder);
logger.info("Testing : "+tested.toString());
List<ConfigSnapshotHolder> results = tested.loadLastConfigs();
assertEquals(2, results.size());
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.SortedSet;
@XmlRootElement(name = ConfigSnapshot.SNAPSHOT_ROOT_ELEMENT_NAME)
@XmlElement(name = "capability")
@XmlElementWrapper(name = "required-capabilities")
+ @XmlJavaTypeAdapter(value=StringTrimAdapter.class)
public SortedSet<String> getCapabilities() {
return capabilities;
}
sb.append('}');
return sb.toString();
}
+
}
+
--- /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.config.persist.storage.file.xml.model;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+final class StringTrimAdapter extends XmlAdapter<String, String> {
+ @Override
+ public String unmarshal(String v) throws Exception {
+ if (v == null)
+ return null;
+ return v.trim();
+ }
+
+ @Override
+ public String marshal(String v) throws Exception {
+ if (v == null)
+ return null;
+ return v.trim();
+ }
+}
* @param inputSecret must match configured secret of the implementation
* @param reason Optional string to be logged while shutting down
*/
- void shutdown(String inputSecret, Optional<String> reason);
+ void shutdown(String inputSecret, Long maxWaitTime, Optional<String> reason);
}
public final class ShutdownModule extends AbstractShutdownModule {
private final Bundle systemBundle;
- private final ShutdownModule nullableOldModule;
public ShutdownModule(ModuleIdentifier identifier, Bundle systemBundle) {
super(identifier, null);
singletonCheck(identifier);
this.systemBundle = systemBundle;
- this.nullableOldModule = null;
}
public ShutdownModule(ModuleIdentifier identifier, ShutdownModule oldModule, java.lang.AutoCloseable oldInstance,
super(identifier, null, oldModule, oldInstance);
singletonCheck(identifier);
this.systemBundle = systemBundle;
- this.nullableOldModule = oldModule;
}
private static void singletonCheck(ModuleIdentifier identifier) {
throw new UnsupportedOperationException();
}
- @Override
- public String getSecret() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getOldSecret() {
- throw new UnsupportedOperationException();
- }
-
- String getActualSecret() {
- return super.getSecret();
- }
-
- String getActualOldSecret() {
- return super.getOldSecret();
- }
-
@Override
protected void customValidation() {
- JmxAttributeValidationException.checkNotNull(super.getOldSecret(), oldSecretJmxAttribute);
JmxAttributeValidationException.checkNotNull(super.getSecret(), secretJmxAttribute);
- if (nullableOldModule != null) {
- // if nothing changed, remain valid
- boolean sameAsOldModule = isSame(nullableOldModule);
- if (sameAsOldModule == false) {
- boolean valid = getActualOldSecret().equals(nullableOldModule.getActualSecret());
- JmxAttributeValidationException.checkCondition(valid, "Invalid old secret", oldSecretJmxAttribute);
- }
- }
}
@Override
public java.lang.AutoCloseable createInstance() {
- return new ShutdownServiceImpl(getActualSecret(), systemBundle, getRootRuntimeBeanRegistratorWrapper());
+ return new ShutdownServiceImpl(getSecret(), systemBundle, getRootRuntimeBeanRegistratorWrapper());
}
}
package org.opendaylight.controller.config.yang.shutdown.impl;
import org.opendaylight.controller.config.api.DependencyResolver;
+import org.opendaylight.controller.config.api.DependencyResolverFactory;
import org.opendaylight.controller.config.api.ModuleIdentifier;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
-public class ShutdownModuleFactory extends AbstractShutdownModuleFactory {
-
- @Override
- public org.opendaylight.controller.config.spi.Module createModule(String instanceName, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.api.DynamicMBeanWithInstance old, org.osgi.framework.BundleContext bundleContext) throws Exception {
- org.opendaylight.controller.config.yang.shutdown.impl.ShutdownModule oldModule = null;
- try {
- oldModule = (org.opendaylight.controller.config.yang.shutdown.impl.ShutdownModule) old.getModule();
- } catch(Exception e) {
- return handleChangedClass(old);
- }
- org.opendaylight.controller.config.yang.shutdown.impl.ShutdownModule module = instantiateModule(instanceName, dependencyResolver, oldModule, old.getInstance(), bundleContext);
-
- module.setOldSecret(oldModule.getActualOldSecret());
- module.setSecret(oldModule.getActualSecret());
-
- return module;
- }
+import java.util.Arrays;
+import java.util.Set;
+public class ShutdownModuleFactory extends AbstractShutdownModuleFactory {
public ShutdownModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
ShutdownModule oldModule, AutoCloseable oldInstance,
Bundle systemBundle = bundleContext.getBundle(0);
return new ShutdownModule(new ModuleIdentifier(NAME, instanceName), systemBundle);
}
+
+ @Override
+ public Set<ShutdownModule> getDefaultModules(DependencyResolverFactory dependencyResolverFactory, BundleContext bundleContext) {
+ ModuleIdentifier id = new ModuleIdentifier(NAME, NAME);
+ DependencyResolver dependencyResolver = dependencyResolverFactory.createDependencyResolver(id);
+ ShutdownModule shutdownModule = instantiateModule(NAME, dependencyResolver, bundleContext);
+ return new java.util.HashSet<>(Arrays.asList(shutdownModule));
+ }
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+
public class ShutdownServiceImpl implements ShutdownService, AutoCloseable {
private final ShutdownService impl;
private final ShutdownRuntimeRegistration registration;
}
@Override
- public void shutdown(String inputSecret, Optional<String> reason) {
- impl.shutdown(inputSecret, reason);
+ public void shutdown(String inputSecret, Long maxWaitTime, Optional<String> reason) {
+ impl.shutdown(inputSecret, maxWaitTime, reason);
}
@Override
}
@Override
- public void shutdown(String inputSecret, Optional<String> reason) {
+ public void shutdown(String inputSecret, Long maxWaitTime, Optional<String> reason) {
logger.warn("Shutdown issued with secret {} and reason {}", inputSecret, reason);
try {
Thread.sleep(1000); // prevent brute force attack
if (this.secret.equals(inputSecret)) {
logger.info("Server is shutting down");
- Thread stopSystemBundle = new Thread() {
- @Override
- public void run() {
- try {
- // wait so that JMX response is received
- Thread.sleep(1000);
- systemBundle.stop();
- } catch (BundleException e) {
- logger.warn("Can not stop OSGi server", e);
- } catch (InterruptedException e) {
- logger.warn("Shutdown process interrupted", e);
- }
- }
- };
- stopSystemBundle.start();
-
+ // actual work:
+ Thread stopSystemBundleThread = new StopSystemBundleThread(systemBundle);
+ stopSystemBundleThread.start();
+ if (maxWaitTime != null && maxWaitTime > 0) {
+ Thread systemExitThread = new CallSystemExitThread(maxWaitTime);
+ logger.debug("Scheduling {}", systemExitThread);
+ systemExitThread.start();
+ }
+ // end
} else {
logger.warn("Unauthorized attempt to shut down server");
throw new IllegalArgumentException("Invalid secret");
}
+class StopSystemBundleThread extends Thread {
+ private static final Logger logger = LoggerFactory.getLogger(StopSystemBundleThread.class);
+ private final Bundle systemBundle;
+
+ StopSystemBundleThread(Bundle systemBundle) {
+ super("stop-system-bundle");
+ this.systemBundle = systemBundle;
+ }
+
+ @Override
+ public void run() {
+ try {
+ // wait so that JMX response is received
+ Thread.sleep(1000);
+ systemBundle.stop();
+ } catch (BundleException e) {
+ logger.warn("Can not stop OSGi server", e);
+ } catch (InterruptedException e) {
+ logger.warn("Shutdown process interrupted", e);
+ }
+ }
+}
+
+class CallSystemExitThread extends Thread {
+ private static final Logger logger = LoggerFactory.getLogger(CallSystemExitThread.class);
+ private final long maxWaitTime;
+ CallSystemExitThread(long maxWaitTime) {
+ super("call-system-exit-daemon");
+ setDaemon(true);
+ if (maxWaitTime <= 0){
+ throw new IllegalArgumentException("Cannot schedule to zero or negative time:" + maxWaitTime);
+ }
+ this.maxWaitTime = maxWaitTime;
+ }
+
+ @Override
+ public String toString() {
+ return "CallSystemExitThread{" +
+ "maxWaitTime=" + maxWaitTime +
+ '}';
+ }
+
+ @Override
+ public void run() {
+ try {
+ // wait specified time
+ Thread.sleep(maxWaitTime);
+ logger.error("Since some threads are still running, server is going to shut down via System.exit(1) !");
+ // do a thread dump
+ ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
+ StringBuffer sb = new StringBuffer();
+ for(ThreadInfo info : threads) {
+ sb.append(info);
+ sb.append("\n");
+ }
+ logger.warn("Thread dump:{}", sb);
+ System.exit(1);
+ } catch (InterruptedException e) {
+ logger.info("Interrupted, not going to call System.exit(1)");
+ }
+ }
+}
+
+
class MXBeanImpl implements ShutdownRuntimeMXBean {
private final ShutdownService impl;
}
@Override
- public void shutdown(String inputSecret, String nullableReason) {
+ public void shutdown(String inputSecret, Long maxWaitTime, String nullableReason) {
Optional<String> optionalReason;
if (nullableReason == null) {
optionalReason = Optional.absent();
} else {
optionalReason = Optional.of(nullableReason);
}
- impl.shutdown(inputSecret, optionalReason);
+ impl.shutdown(inputSecret, maxWaitTime, optionalReason);
}
}
type string;
default "";
}
- leaf old-secret {
- type string;
- default "";
- }
}
}
leaf input-secret {
type string;
}
+ leaf max-wait-time {
+ type uint32;
+ description "Maximum time in milliseconds before process is forcibly exited. Zero or null cancels this functionality.";
+ }
leaf reason {
type string;
}
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.opendaylight.controller.config.api.ValidationException;
-import org.opendaylight.controller.config.api.ValidationException.ExceptionMessageWithStackTrace;
import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import javax.management.JMX;
import javax.management.ObjectName;
import java.util.Collections;
-import java.util.Map;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
doReturn(mockedSysBundle).when(mockedContext).getBundle(0);
mockedContext.getBundle(0);
doNothing().when(mockedSysBundle).stop();
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+ // initialize default instance
+ transaction.commit();
}
@Test
}
}
+ private static final ObjectName runtimeON = ObjectNameUtil.createRuntimeBeanName(NAME, NAME, Collections.<String, String>emptyMap());
+
@Test
public void testWithoutSecret() throws Exception {
- ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
- transaction.createModule(NAME, NAME);
- transaction.commit();
// test JMX rpc
- ObjectName runtimeON = ObjectNameUtil.createRuntimeBeanName(NAME, NAME, Collections.<String, String>emptyMap());
+
ShutdownRuntimeMXBean runtime = configRegistryClient.newMXBeanProxy(runtimeON, ShutdownRuntimeMXBean.class);
try {
- runtime.shutdown("foo", null);
+ runtime.shutdown("foo", 60000L, null);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Invalid secret", e.getMessage());
}
- runtime.shutdown("", null);
+ runtime.shutdown("", 60000L, null);
assertStopped();
}
@Test
public void testWithSecret() throws Exception {
ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
- ObjectName on = transaction.createModule(NAME, NAME);
+ ObjectName on = transaction.lookupConfigBean(NAME, NAME);
ShutdownModuleMXBean proxy = transaction.newMXBeanProxy(on, ShutdownModuleMXBean.class);
String secret = "secret";
proxy.setSecret(secret);
transaction.commit();
shutdownViaRuntimeJMX(secret);
-
- // test old secret
- transaction = configRegistryClient.createTransaction();
- on = transaction.lookupConfigBean(NAME, NAME);
- proxy = transaction.newMXBeanProxy(on, ShutdownModuleMXBean.class);
- try {
- rethrowCause(proxy).getOldSecret();
- fail();
- } catch (UnsupportedOperationException e) {
- }
try {
- rethrowCause(proxy).getSecret();
+ ShutdownRuntimeMXBean runtime = JMX.newMXBeanProxy(platformMBeanServer, runtimeON, ShutdownRuntimeMXBean.class);
+ runtime.shutdown("foo", 60000L, null);
fail();
- } catch (UnsupportedOperationException e) {
- }
- // set secret to nothing
- String newSecret = "newSecret";
- proxy.setSecret(newSecret);
- try {
- transaction.commit();
- fail("Old secret not provided - should fail validation");
- } catch (ValidationException e) {
- Map<String, Map<String, ExceptionMessageWithStackTrace>> failedValidations = e.getFailedValidations();
- assertTrue(failedValidations.containsKey(NAME));
- ExceptionMessageWithStackTrace exceptionMessageWithStackTrace = failedValidations.get(NAME).get(NAME);
- assertNotNull(exceptionMessageWithStackTrace);
- assertEquals("OldSecret Invalid old secret", exceptionMessageWithStackTrace.getMessage());
-
+ } catch (IllegalArgumentException e) {
+ assertEquals("Invalid secret", e.getMessage());
}
- proxy.setOldSecret(secret);
- transaction.commit();
- shutdownViaRuntimeJMX(newSecret);
}
private void shutdownViaRuntimeJMX(String secret) throws Exception {
// test JMX rpc
- ObjectName runtimeON = ObjectNameUtil.createRuntimeBeanName(NAME, NAME, Collections.<String, String>emptyMap());
ShutdownRuntimeMXBean runtime = JMX.newMXBeanProxy(platformMBeanServer, runtimeON, ShutdownRuntimeMXBean.class);
try {
- runtime.shutdown("", null);
+ runtime.shutdown("", 60000L, null);
fail();
} catch (IllegalArgumentException e) {
assertEquals("Invalid secret", e.getMessage());
}
- runtime.shutdown(secret, null);
+ runtime.shutdown(secret, 60000L, null);
assertStopped();
}
</execution>
</executions>
</plugin>
+
+ <!--Make checkstyle ignore initial xml configuration files by overriding its configuration from parent-->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <version>${checkstyle.version}</version>
+ <configuration>
+ <excludes>**\/target\/,**\/bin\/,**\/target-ide\/,**\/configuration\/initial\/</excludes>
+ </configuration>
+ </plugin>
</plugins>
</build>
</project>
fi
elif [[ $platform == 'osx' ]]; then
TARGET_FILE=$0
- cd `dirname $TARGET_FILE`
+ cd `dirname "$TARGET_FILE"`
TARGET_FILE=`basename $TARGET_FILE`
# Iterate down a (possible) chain of symlinks
while [ -L "$TARGET_FILE" ]
do
- TARGET_FILE=`readlink $TARGET_FILE`
- cd `dirname $TARGET_FILE`
- TARGET_FILE=`basename $TARGET_FILE`
+ TARGET_FILE=`readlink "$TARGET_FILE"`
+ cd `dirname "$TARGET_FILE"`
+ TARGET_FILE=`basename "$TARGET_FILE"`
done
# Compute the canonicalized name by finding the physical path
JVM at path ${JAVA_HOME}/bin/java check your JAVA_HOME" && exit -1;
if [ -z ${ODL_BASEDIR} ]; then
- basedir=`dirname ${fullpath}`
+ basedir=`dirname "${fullpath}"`
else
basedir=${ODL_BASEDIR}
fi
if [ -z ${ODL_DATADIR} ]; then
- datadir=`dirname ${fullpath}`
+ datadir=`dirname "${fullpath}"`
else
datadir=${ODL_DATADIR}
fi
########################################
# Now add to classpath the OSGi JAR
########################################
-CLASSPATH=${basedir}/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar
-FWCLASSPATH=file:${basedir}/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar
+CLASSPATH="${basedir}"/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar
+FWCLASSPATH=file:"${basedir}"/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar
########################################
# Now add the extensions
fi
fi
+iotmpdir=`echo "${datadir}" | sed 's/ /\\ /g'`
+bdir=`echo "${basedir}" | sed 's/ /\\ /g'`
+confarea=`echo "${datadir}" | sed 's/ /\\ /g'`
+fwclasspath=`echo "${FWCLASSPATH}" | sed 's/ /\\ /g'`
+
if [ "${startdaemon}" -eq 1 ]; then
if [ -e "${pidfile}" ]; then
echo "Another instance of controller running, check with $0 -status"
exit -1
fi
$JAVA_HOME/bin/java ${extraJVMOpts} \
- -Djava.io.tmpdir=${datadir}/work/tmp \
- -Dosgi.install.area=${basedir} \
- -Dosgi.configuration.area=${datadir}/configuration \
- -Dosgi.frameworkClassPath=${FWCLASSPATH} \
- -Dosgi.framework=file:${basedir}/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar \
+ -Djava.io.tmpdir="${iotmpdir}/work/tmp" \
+ -Dosgi.install.area="${bdir}" \
+ -Dosgi.configuration.area="${confarea}/configuration" \
+ -Dosgi.frameworkClassPath="${fwclasspath}" \
+ -Dosgi.framework=file:"${bdir}/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar" \
-Djava.awt.headless=true \
- -classpath ${CLASSPATH} \
+ -classpath "${CLASSPATH}" \
org.eclipse.equinox.launcher.Main \
-console ${daemonport} \
-consoleLog &
exit -1
fi
$JAVA_HOME/bin/java ${extraJVMOpts} \
- -Djava.io.tmpdir=${datadir}/work/tmp \
- -Dosgi.install.area=${basedir} \
- -Dosgi.configuration.area=${datadir}/configuration \
- -Dosgi.frameworkClassPath=${FWCLASSPATH} \
- -Dosgi.framework=file:${basedir}/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar \
+ -Djava.io.tmpdir="${iotmpdir}/work/tmp" \
+ -Dosgi.install.area="${bdir}" \
+ -Dosgi.configuration.area="${confarea}/configuration" \
+ -Dosgi.frameworkClassPath="${fwclasspath}" \
+ -Dosgi.framework=file:"${bdir}/lib/org.eclipse.osgi-3.8.1.v20120830-144521.jar" \
-Djava.awt.headless=true \
- -classpath ${CLASSPATH} \
+ -classpath "${CLASSPATH}" \
org.eclipse.equinox.launcher.Main \
-console \
-consoleLog
+++ /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
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<persisted-snapshots>
+ <snapshots>
+ <snapshot>
+ <required-capabilities>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:cluster:store?module=odl-sal-dom-clustered-store-cfg&revision=2013-10-28
+ </capability>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28</capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05
+ </capability>
+ <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
+ <capability>urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04</capability>
+ <capability>urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17
+ </capability>
+ <capability>urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24
+ </capability>
+ <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>
+ <capability>urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28
+ </capability>
+ </required-capabilities>
+ <configuration>
+
+ <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>
+
+ <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+
+ </services>
+ </data>
+
+ </configuration>
+ </snapshot>
+ </snapshots>
+</persisted-snapshots>
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
import org.opendaylight.yangtools.yang.binding.DataObject
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
import org.opendaylight.controller.sal.core.Edge
import java.util.Set
import org.opendaylight.controller.sal.core.Property
import org.opendaylight.controller.sal.core.NodeConnector
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.LinkId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node
import org.opendaylight.controller.sal.compatibility.InventoryMapping
class TopologyMapping {
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
import org.opendaylight.yangtools.yang.binding.DataObject
import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology
import org.opendaylight.controller.md.compatibility.topology.TopologyMapping
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder
import java.util.ArrayList
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey
import org.opendaylight.controller.sal.core.NodeConnector
import org.opendaylight.controller.sal.topology.TopoEdgeUpdate
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder
import org.opendaylight.controller.sal.core.Edge
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.SourceBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.DestinationBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.SourceBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.DestinationBuilder
class TopologyReader implements RuntimeDataProvider {
package org.opendaylight.controller.md.compatibility.topologymanager
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint
import org.opendaylight.controller.sal.core.NodeConnector
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology
import java.util.Map
import org.opendaylight.controller.sal.core.Edge
import java.util.Set
import java.util.List
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node
import java.util.Collections
import com.google.common.collect.FluentIterable
import java.util.HashSet
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId
import org.opendaylight.controller.sal.compatibility.NodeMapping
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.Source
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.Destination
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.Source
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.Destination
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey
import java.util.HashMap
class AdSalTopologyMapping {
}
def org.opendaylight.controller.sal.core.Node toAdNode(
- org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId node) {
+ org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId node) {
val key = new NodeKey(new NodeId(node))
return new org.opendaylight.controller.sal.core.Node(NodeMapping.MD_SAL_TYPE, key);
}
import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader
import java.util.HashMap
import org.opendaylight.controller.sal.core.Edge
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint
import com.google.common.collect.FluentIterable
class CompatibleTopologyManager extends ConfigurableLinkManager implements ITopologyManager {
import org.opendaylight.controller.sal.binding.api.data.DataProviderService
import org.opendaylight.controller.sal.topology.IPluginInTopologyService
import org.opendaylight.controller.sal.topology.IPluginOutTopologyService
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
import static extension org.opendaylight.controller.sal.compatibility.topology.TopologyMapping.*
import org.opendaylight.controller.sal.core.UpdateType
import org.opendaylight.controller.sal.topology.IPluginOutTopologyService
import org.opendaylight.controller.sal.topology.TopoEdgeUpdate
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link
import org.opendaylight.yangtools.yang.binding.DataObject
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
import static extension org.opendaylight.controller.sal.compatibility.topology.TopologyMapping.*
import org.opendaylight.controller.sal.core.NodeConnector
import org.opendaylight.controller.sal.core.UpdateType
import org.opendaylight.controller.sal.topology.TopoEdgeUpdate
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link
import static com.google.common.base.Preconditions.*
import static extension org.opendaylight.controller.sal.compatibility.NodeMapping.*
import org.opendaylight.controller.sal.binding.api.data.DataProviderService
import org.opendaylight.controller.sal.topology.IPluginOutTopologyService
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey
import org.opendaylight.yangtools.yang.binding.DataObject
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
import org.opendaylight.yangtools.concepts.Registration
import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link
import org.slf4j.LoggerFactory
class TopologyProvider implements AutoCloseable{
+++ /dev/null
-/*
- * Copyright (c) 2013 Ericsson , 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.forwardingrulesmanager.consumer.impl;
-
-import org.eclipse.osgi.framework.console.CommandProvider;
-import org.opendaylight.controller.clustering.services.IClusterContainerServices;
-import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
-import org.opendaylight.controller.sal.binding.api.NotificationService;
-import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
-import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
-import org.opendaylight.controller.sal.core.IContainer;
-import org.opendaylight.controller.sal.utils.ServiceHelper;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class FRMConsumerImpl extends AbstractBindingAwareProvider implements CommandProvider {
- protected static final Logger logger = LoggerFactory.getLogger(FRMConsumerImpl.class);
- private static ProviderContext p_session;
- private static DataBrokerService dataBrokerService;
- private static NotificationService notificationService;
- private FlowConsumerImpl flowImplRef;
- private GroupConsumerImpl groupImplRef;
- private MeterConsumerImpl meterImplRef;
- private static DataProviderService dataProviderService;
- private static IClusterContainerServices clusterContainerService = null;
- private static IContainer container;
-
- @Override
- public void onSessionInitiated(ProviderContext session) {
- FRMConsumerImpl.p_session = session;
-
- if (!getDependentModule()) {
- logger.error("Unable to fetch handlers for dependent modules");
- System.out.println("Unable to fetch handlers for dependent modules");
- return;
- }
-
- if (null != session) {
- notificationService = session.getSALService(NotificationService.class);
-
- if (null != notificationService) {
- dataBrokerService = session.getSALService(DataBrokerService.class);
-
- if (null != dataBrokerService) {
- dataProviderService = session.getSALService(DataProviderService.class);
-
- if (null != dataProviderService) {
- flowImplRef = new FlowConsumerImpl();
- groupImplRef = new GroupConsumerImpl();
- meterImplRef = new MeterConsumerImpl();
- registerWithOSGIConsole();
- } else {
- logger.error("Data Provider Service is down or NULL. "
- + "Accessing data from configuration data store will not be possible");
- System.out.println("Data Broker Service is down or NULL.");
- }
-
- } else {
- logger.error("Data Broker Service is down or NULL.");
- System.out.println("Data Broker Service is down or NULL.");
- }
- } else {
- logger.error("Notification Service is down or NULL.");
- System.out.println("Notification Service is down or NULL.");
- }
- } else {
- logger.error("Consumer session is NULL. Please check if provider is registered");
- System.out.println("Consumer session is NULL. Please check if provider is registered");
- }
-
- }
-
- public static IClusterContainerServices getClusterContainerService() {
- return clusterContainerService;
- }
-
- public static void setClusterContainerService(IClusterContainerServices clusterContainerService) {
- FRMConsumerImpl.clusterContainerService = clusterContainerService;
- }
-
- public static IContainer getContainer() {
- return container;
- }
-
- public static void setContainer(IContainer container) {
- FRMConsumerImpl.container = container;
- }
-
- private void registerWithOSGIConsole() {
- BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
- bundleContext.registerService(CommandProvider.class.getName(), this, null);
- }
-
- private boolean getDependentModule() {
- do {
- clusterContainerService = (IClusterContainerServices) ServiceHelper.getGlobalInstance(
- IClusterContainerServices.class, this);
- try {
- Thread.sleep(4);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } while (clusterContainerService == null);
-
- do {
-
- container = (IContainer) ServiceHelper.getGlobalInstance(IContainer.class, this);
- try {
- Thread.sleep(5);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } while (container == null);
-
- return true;
- }
-
- public static DataProviderService getDataProviderService() {
- return dataProviderService;
- }
-
- public FlowConsumerImpl getFlowImplRef() {
- return flowImplRef;
- }
-
- public GroupConsumerImpl getGroupImplRef() {
- return groupImplRef;
- }
-
- public static ProviderContext getProviderSession() {
- return p_session;
- }
-
- public static NotificationService getNotificationService() {
- return notificationService;
- }
-
- public static DataBrokerService getDataBrokerService() {
- return dataBrokerService;
- }
-
- /*
- * OSGI COMMANDS
- */
- @Override
- public String getHelp() {
- StringBuffer help = new StringBuffer();
- return help.toString();
- }
-
-}
+++ /dev/null
-package org.opendaylight.controller.forwardingrulesmanager.consumer.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
-import org.opendaylight.controller.sal.utils.IPProtocols;
-import org.opendaylight.controller.sal.utils.NetUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
-
-public class FRMUtil {
- protected static final Logger logger = LoggerFactory.getLogger(FRMUtil.class);
- private static final String NAMEREGEX = "^[a-zA-Z0-9]+$";
-
- public static enum operation {
- ADD, DELETE, UPDATE, GET
- };
-
- private enum EtherIPType {
- ANY, V4, V6;
- };
-
- public static boolean isNameValid(String name) {
-
- // Name validation
- if (name == null || name.trim().isEmpty() || !name.matches(NAMEREGEX)) {
- return false;
- }
- return true;
-
- }
-
- public static boolean validateMatch(Flow flow) {
- EtherIPType etype = EtherIPType.ANY;
- EtherIPType ipsrctype = EtherIPType.ANY;
- EtherIPType ipdsttype = EtherIPType.ANY;
-
- Match match = flow.getMatch();
- if (match != null) {
- EthernetMatch ethernetmatch = match.getEthernetMatch();
- IpMatch ipmatch = match.getIpMatch();
- Layer3Match layer3match = match.getLayer3Match();
- VlanMatch vlanmatch = match.getVlanMatch();
- match.getIcmpv4Match();
-
- if (ethernetmatch != null) {
- if ((ethernetmatch.getEthernetSource() != null)
- && !isL2AddressValid(ethernetmatch.getEthernetSource().getAddress().getValue())) {
-
- logger.error("Ethernet source address is not valid. Example: 00:05:b9:7c:81:5f",
- ethernetmatch.getEthernetSource());
- return false;
- }
-
- if ((ethernetmatch.getEthernetDestination() != null)
- && !isL2AddressValid(ethernetmatch.getEthernetDestination().getAddress().getValue())) {
- logger.error("Ethernet destination address is not valid. Example: 00:05:b9:7c:81:5f",
- ethernetmatch.getEthernetDestination());
- return false;
- }
-
- if (ethernetmatch.getEthernetType() != null) {
- long type = ethernetmatch.getEthernetType().getType().getValue().longValue();
- if ((type < 0) || (type > 0xffff)) {
- logger.error("Ethernet type is not valid");
- return false;
- } else {
- if (type == 0x0800) {
- etype = EtherIPType.V4;
- } else if (type == 0x86dd) {
- etype = EtherIPType.V6;
- }
- }
-
- }
- }
-
- if (layer3match != null) {
- if (layer3match instanceof Ipv4Match) {
- if (((Ipv4Match) layer3match).getIpv4Source() != null) {
- if (NetUtils.isIPv4AddressValid(((Ipv4Match) layer3match).getIpv4Source().getValue())) {
- ipsrctype = EtherIPType.V4;
- } else {
- logger.error("IP source address is not valid");
- return false;
- }
-
- } else if (((Ipv4Match) layer3match).getIpv4Destination() != null) {
- if (NetUtils.isIPv4AddressValid(((Ipv4Match) layer3match).getIpv4Destination().getValue())) {
- ipdsttype = EtherIPType.V4;
- } else {
- logger.error("IP Destination address is not valid");
- return false;
- }
-
- }
- } else if (layer3match instanceof Ipv6Match) {
- if (((Ipv6Match) layer3match).getIpv6Source() != null) {
- if (NetUtils.isIPv6AddressValid(((Ipv6Match) layer3match).getIpv6Source().getValue())) {
- ipsrctype = EtherIPType.V6;
- } else {
- logger.error("IPv6 source address is not valid");
- return false;
- }
-
- } else if (((Ipv6Match) layer3match).getIpv6Destination() != null) {
- if (NetUtils.isIPv6AddressValid(((Ipv6Match) layer3match).getIpv6Destination().getValue())) {
- ipdsttype = EtherIPType.V6;
- } else {
- logger.error("IPv6 Destination address is not valid");
- return false;
- }
-
- }
-
- }
-
- if (etype != EtherIPType.ANY) {
- if ((ipsrctype != EtherIPType.ANY) && (ipsrctype != etype)) {
- logger.error("Type mismatch between Ethernet & Src IP");
- return false;
- }
- if ((ipdsttype != EtherIPType.ANY) && (ipdsttype != etype)) {
- logger.error("Type mismatch between Ethernet & Dst IP");
- return false;
- }
- }
- if (ipsrctype != ipdsttype) {
- if (!((ipsrctype == EtherIPType.ANY) || (ipdsttype == EtherIPType.ANY))) {
- logger.error("IP Src Dest Type mismatch");
- return false;
- }
- }
- }
-
- if (ipmatch != null) {
- if (ipmatch.getIpProtocol() != null && !(isProtocolValid(ipmatch.getIpProtocol().toString()))) {
- logger.error("Protocol is not valid");
- return false;
- }
-
- }
-
- if (vlanmatch != null) {
- if (vlanmatch.getVlanId() != null
- && !(isVlanIdValid(vlanmatch.getVlanId().getVlanId().getValue().toString()))) {
- logger.error("Vlan ID is not in the range 0 - 4095");
- return false;
- }
-
- if (vlanmatch.getVlanPcp() != null
- && !(isVlanPriorityValid(vlanmatch.getVlanPcp().getValue().toString()))) {
- logger.error("Vlan priority is not in the range 0 - 7");
- return false;
- }
- }
-
- }
-
- return true;
-
- }
-
- public static boolean validateActions(List<Action> actions) {
-
- if (actions == null || actions.isEmpty()) {
- logger.error("Actions value is null or empty");
- return false;
- }
-
- for (Action curaction : actions) {
- org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = curaction
- .getAction();
- if (action instanceof ControllerActionCase) {
- Integer length = ((ControllerActionCase) action).getControllerAction().getMaxLength();
- if (length < 0 || length > 65294) {
- logger.error("Controller: MaxLength is not valid");
- return false;
- }
- } else if (action instanceof OutputActionCase) {
- Integer length = ((OutputActionCase) action).getOutputAction().getMaxLength();
- Uri outputnodeconnector = ((OutputActionCase) action).getOutputAction().getOutputNodeConnector();
- if (length < 0 || length > 65294) {
- logger.error("OutputAction: MaxLength is not valid");
- return false;
- }
- if (outputnodeconnector != null) {
- if (!outputnodeconnector.getValue().equals(NodeConnectorIDType.ALL)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.CONTROLLER)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.HWPATH)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.ONEPK)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.ONEPK2OPENFLOW)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.ONEPK2PCEP)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.OPENFLOW)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.OPENFLOW2ONEPK)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.OPENFLOW2PCEP)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.PCEP)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.PCEP2ONEPK)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.PCEP2OPENFLOW)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.PRODUCTION)
- || !outputnodeconnector.getValue().equals(NodeConnectorIDType.SWSTACK)) {
- logger.error("Output Action: NodeConnector Type is not valid");
- return false;
- }
-
- }
- } else if (action instanceof PushMplsActionCase) {
- Integer ethertype = ((PushMplsActionCase) action).getPushMplsAction().getEthernetType();
- if (ethertype != null && ethertype != 0x8847 && ethertype != 0x8848) {
- logger.error("Ether Type is not valid for PushMplsAction");
- return false;
- }
- } else if (action instanceof PushPbbActionCase) {
- Integer ethertype = ((PushPbbActionCase) action).getPushPbbAction().getEthernetType();
- if (ethertype != null && ethertype != 0x88E7) {
- logger.error("Ether type is not valid for PushPbbAction");
- return false;
- }
- } else if (action instanceof PushVlanActionCase) {
- Integer ethertype = ((PushVlanActionCase) action).getPushVlanAction().getEthernetType();
- if (ethertype != null && ethertype != 0x8100 && ethertype != 0x88a8) {
- logger.error("Ether Type is not valid for PushVlanAction");
- return false;
- }
- } else if (action instanceof SetDlDstActionCase || action instanceof SetDlSrcActionCase) {
- MacAddress address = ((SetDlDstActionCase) action).getSetDlDstAction().getAddress();
- if (address != null && !isL2AddressValid(address.getValue())) {
- logger.error("SetDlDstAction: Address not valid");
- return false;
- }
- } else if (action instanceof SetDlSrcActionCase) {
- MacAddress address = ((SetDlSrcActionCase) action).getSetDlSrcAction().getAddress();
- if (address != null && !isL2AddressValid(address.getValue())) {
- logger.error("SetDlSrcAction: Address not valid");
- return false;
- }
- } else if (action instanceof SetQueueActionCase) {
- String queue = ((SetQueueActionCase) action).getSetQueueAction().getQueue();
- if (queue != null && !isQueueValid(queue)) {
- logger.error("Queue Id not valid");
- return false;
- }
- } else if (action instanceof SetTpDstActionCase) {
- PortNumber port = ((SetTpDstActionCase) action).getSetTpDstAction().getPort();
- if (port != null && !isPortValid(port)) {
- logger.error("Port not valid");
- }
- } else if (action instanceof SetTpSrcActionCase) {
- PortNumber port = ((SetTpSrcActionCase) action).getSetTpSrcAction().getPort();
- if (port != null && !isPortValid(port)) {
- logger.error("Port not valid");
- }
- } else if (action instanceof SetVlanIdActionCase) {
- VlanId vlanid = ((SetVlanIdActionCase) action).getSetVlanIdAction().getVlanId();
- if (vlanid != null && !isVlanIdValid(vlanid.toString())) {
- logger.error("Vlan ID %s is not in the range 0 - 4095");
- return false;
- }
- } else if (action instanceof SetVlanPcpActionCase) {
- VlanPcp vlanpcp = ((SetVlanPcpActionCase) action).getSetVlanPcpAction().getVlanPcp();
- if (vlanpcp != null && !isVlanPriorityValid(vlanpcp.toString())) {
- logger.error("Vlan priority %s is not in the range 0 - 7");
- return false;
- }
- }
- }
- return true;
-
- }
-
- public static boolean validateInstructions(Flow flow) {
- List<Instruction> instructionsList = new ArrayList<>();
- Instructions instructions = flow.getInstructions();
- if (instructions == null) {
- return false;
- }
- instructionsList = instructions.getInstruction();
-
- for (Instruction instruction : instructionsList) {
- org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.Instruction curInstruction = instruction
- .getInstruction();
- if (curInstruction instanceof GoToTableCase) {
-
- Short tableid = ((GoToTableCase) curInstruction).getGoToTable().getTableId();
- if (tableid < 0) {
- logger.error("table id is not valid");
- return false;
- }
- }
-
- else if (curInstruction instanceof WriteActionsCase) {
-
- List<Action> action = ((WriteActionsCase) curInstruction).getWriteActions().getAction();
- validateActions(action);
-
- }
-
- else if (curInstruction instanceof ApplyActionsCase) {
- List<Action> action = ((ApplyActionsCase) curInstruction).getApplyActions().getAction();
- validateActions(action);
- }
-
- else if (curInstruction instanceof ClearActionsCase) {
- List<Action> action = ((ClearActionsCase) curInstruction).getClearActions().getAction();
- validateActions(action);
- }
-
- else if (curInstruction instanceof MeterCase) {
-
- MeterId meter = ((MeterCase) curInstruction).getMeter().getMeterId();
- if (meter != null && !isValidMeter(meter)) {
- logger.error("Meter Id is not valid");
- return false;
- }
- }
-
- }
-
- return true;
- }
-
- public static boolean isValidMeter(MeterId meter) {
- // TODO
- return true;
- }
-
- public static boolean isQueueValid(String queue) {
- // TODO
- return true;
- }
-
- public static boolean isPortValid(PortNumber port) {
- // TODO
- return true;
- }
-
- public static boolean isL2AddressValid(String mac) {
- if (mac == null) {
- return false;
- }
-
- Pattern macPattern = Pattern.compile("([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}");
- Matcher mm = macPattern.matcher(mac);
- if (!mm.matches()) {
- logger.debug("Ethernet address {} is not valid. Example: 00:05:b9:7c:81:5f", mac);
- return false;
- }
- return true;
- }
-
- public static boolean isProtocolValid(String protocol) {
- IPProtocols proto = IPProtocols.fromString(protocol);
- return (proto != null);
- }
-
- public static boolean isVlanIdValid(String vlanId) {
- int vlan = Integer.decode(vlanId);
- return ((vlan >= 0) && (vlan < 4096));
- }
-
- public static boolean isVlanPriorityValid(String vlanPriority) {
- int pri = Integer.decode(vlanPriority);
- return ((pri >= 0) && (pri < 8));
- }
-}
+++ /dev/null
-package org.opendaylight.controller.forwardingrulesmanager.consumer.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
-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.sal.common.util.Rpcs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemoved;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowUpdated;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotification;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeExperimenterErrorNotification;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SwitchFlowRemoved;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.Tables;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.tables.Table;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.tables.TableBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.tables.TableKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableRef;
-import org.opendaylight.yangtools.concepts.Registration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.NotificationListener;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class FlowConsumerImpl {
- protected static final Logger logger = LoggerFactory.getLogger(FlowConsumerImpl.class);
- private final FlowEventListener flowEventListener = new FlowEventListener();
- private Registration<NotificationListener> listener1Reg;
- private SalFlowService flowService;
- // private FlowDataListener listener;
- private FlowDataCommitHandler commitHandler;
-
- public FlowConsumerImpl() {
- InstanceIdentifier<? extends DataObject> path = InstanceIdentifier.builder(Flows.class).toInstance();
- flowService = FRMConsumerImpl.getProviderSession().getRpcService(SalFlowService.class);
-
- if (null == flowService) {
- logger.error("Consumer SAL Service is down or NULL. FRM may not function as intended");
- return;
- }
-
- // For switch events
- listener1Reg = FRMConsumerImpl.getNotificationService().registerNotificationListener(flowEventListener);
-
- if (null == listener1Reg) {
- logger.error("Listener to listen on flow data modifcation events");
- return;
- }
- // addFlowTest();
- commitHandler = new FlowDataCommitHandler();
- FRMConsumerImpl.getDataProviderService().registerCommitHandler(path, commitHandler);
- }
-
- /**
- * Adds flow to the southbound plugin and our internal database
- *
- * @param path
- * @param dataObject
- */
- private void addFlow(InstanceIdentifier<?> path, Flow dataObject) {
-
- AddFlowInputBuilder input = new AddFlowInputBuilder();
- input.fieldsFrom(dataObject);
- input.setNode((dataObject).getNode());
- input.setFlowTable(new FlowTableRef(createTableInstance(dataObject.getId(), dataObject.getNode())));
- // We send flow to the sounthbound plugin
- flowService.addFlow(input.build());
- }
-
- /**
- * Removes flow to the southbound plugin and our internal database
- *
- * @param path
- * @param dataObject
- */
- private void removeFlow(InstanceIdentifier<?> path, Flow dataObject) {
-
- RemoveFlowInputBuilder input = new RemoveFlowInputBuilder();
- input.fieldsFrom(dataObject);
- input.setNode((dataObject).getNode());
- input.setTableId(dataObject.getTableId());
- input.setFlowTable(new FlowTableRef(createTableInstance((long)dataObject.getTableId(), (dataObject).getNode())));
- // We send flow to the sounthbound plugin
- flowService.removeFlow(input.build());
- }
-
- /**
- * Update flow to the southbound plugin and our internal database
- *
- * @param path
- * @param dataObject
- */
- private void updateFlow(InstanceIdentifier<?> path, Flow updatedFlow, Flow originalFlow) {
-
- UpdateFlowInputBuilder input = new UpdateFlowInputBuilder();
- UpdatedFlowBuilder updatedflowbuilder = new UpdatedFlowBuilder();
- updatedflowbuilder.fieldsFrom(updatedFlow);
- input.setNode(updatedFlow.getNode());
- input.setUpdatedFlow(updatedflowbuilder.build());
- OriginalFlowBuilder ofb = new OriginalFlowBuilder(originalFlow);
- input.setOriginalFlow(ofb.build());
- // We send flow to the sounthbound plugin
- flowService.updateFlow(input.build());
- }
-
- private void commitToPlugin(internalTransaction transaction) {
- Set<Entry<InstanceIdentifier<?>, DataObject>> createdEntries = transaction.getModification()
- .getCreatedConfigurationData().entrySet();
-
- /*
- * This little dance is because updatedEntries contains both created and
- * modified entries The reason I created a new HashSet is because the
- * collections we are returned are immutable.
- */
- Set<Entry<InstanceIdentifier<?>, DataObject>> updatedEntries = new HashSet<Entry<InstanceIdentifier<?>, DataObject>>();
- updatedEntries.addAll(transaction.getModification().getUpdatedConfigurationData().entrySet());
- updatedEntries.removeAll(createdEntries);
-
- Set<InstanceIdentifier<?>> removeEntriesInstanceIdentifiers = transaction.getModification()
- .getRemovedConfigurationData();
- transaction.getModification().getOriginalConfigurationData();
- for (Entry<InstanceIdentifier<?>, DataObject> entry : createdEntries) {
- if (entry.getValue() instanceof Flow) {
- logger.debug("Coming add cc in FlowDatacommitHandler");
- Flow flow = (Flow) entry.getValue();
- boolean status = validate(flow);
- if (!status) {
- return;
- }
- addFlow(entry.getKey(), (Flow) entry.getValue());
- }
- }
-
- for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
- if (entry.getValue() instanceof Flow) {
- logger.debug("Coming update cc in FlowDatacommitHandler");
- Flow updatedFlow = (Flow) entry.getValue();
- Flow originalFlow = (Flow) transaction.modification.getOriginalConfigurationData().get(entry.getKey());
- boolean status = validate(updatedFlow);
- if (!status) {
- return;
- }
- updateFlow(entry.getKey(), updatedFlow, originalFlow);
- }
- }
-
- for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers) {
- DataObject removeValue = transaction.getModification().getOriginalConfigurationData().get(instanceId);
- if (removeValue instanceof Flow) {
- logger.debug("Coming remove cc in FlowDatacommitHandler");
- Flow flow = (Flow) removeValue;
- boolean status = validate(flow);
-
- if (!status) {
- return;
- }
-
- removeFlow(instanceId, (Flow) removeValue);
- }
- }
- }
-
- private final class FlowDataCommitHandler implements DataCommitHandler<InstanceIdentifier<?>, DataObject> {
-
- @SuppressWarnings("unchecked")
- public DataCommitTransaction<InstanceIdentifier<?>, DataObject> requestCommit(DataModification<InstanceIdentifier<?>, DataObject> modification) {
- // We should verify transaction
- logger.debug("Coming in FlowDatacommitHandler");
- internalTransaction transaction = new internalTransaction(modification);
- transaction.prepareUpdate();
- return transaction;
- }
- }
-
- private final class internalTransaction implements DataCommitTransaction<InstanceIdentifier<?>, DataObject> {
-
- private final DataModification<InstanceIdentifier<?>, DataObject> modification;
-
- @Override
- public DataModification<InstanceIdentifier<?>, DataObject> getModification() {
- return modification;
- }
-
- public internalTransaction(DataModification<InstanceIdentifier<?>, DataObject> modification) {
- this.modification = modification;
- }
-
- /**
- * We create a plan which flows will be added, which will be updated and
- * which will be removed based on our internal state.
- *
- */
- void prepareUpdate() {
-
- }
-
- /**
- * We are OK to go with execution of plan
- *
- */
- @Override
- public RpcResult<Void> finish() throws IllegalStateException {
- commitToPlugin(this);
- return Rpcs.getRpcResult(true, null, Collections.<RpcError> emptySet());
- }
-
- /**
- *
- * We should rollback our preparation
- *
- */
- @Override
- public RpcResult<Void> rollback() throws IllegalStateException {
- rollBackFlows(modification);
- return Rpcs.getRpcResult(true, null, Collections.<RpcError> emptySet());
-
- }
- }
-
- private void rollBackFlows(DataModification<InstanceIdentifier<?>, DataObject> modification) {
- Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries = modification.getCreatedConfigurationData().entrySet();
-
- /*
- * This little dance is because updatedEntries contains both created and modified entries
- * The reason I created a new HashSet is because the collections we are returned are immutable.
- */
- Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries = new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
- updatedEntries.addAll(modification.getUpdatedConfigurationData().entrySet());
- updatedEntries.removeAll(createdEntries);
-
- Set<InstanceIdentifier<? >> removeEntriesInstanceIdentifiers = modification.getRemovedConfigurationData();
- for (Entry<InstanceIdentifier<?>, DataObject> entry : createdEntries) {
- if(entry.getValue() instanceof Flow) {
- removeFlow(entry.getKey(),(Flow) entry.getValue()); // because we are rolling back, remove what we would have added.
- }
- }
-
- for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
- if(entry.getValue() instanceof Flow) {
- Flow updatedFlow = (Flow) entry.getValue();
- Flow originalFlow = (Flow) modification.getOriginalConfigurationData().get(entry.getKey());
- updateFlow(entry.getKey(), updatedFlow ,originalFlow);// because we are rolling back, replace the updated with the original
- }
- }
-
- for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers ) {
- DataObject removeValue = (Flow) modification.getOriginalConfigurationData().get(instanceId);
- if(removeValue instanceof Flow) {
- addFlow(instanceId,(Flow) removeValue);// because we are rolling back, add what we would have removed.
-
- }
- }
-}
- final class FlowEventListener implements SalFlowListener {
-
- List<FlowAdded> addedFlows = new ArrayList<>();
- List<FlowRemoved> removedFlows = new ArrayList<>();
- List<FlowUpdated> updatedFlows = new ArrayList<>();
-
- @Override
- public void onFlowAdded(FlowAdded notification) {
- addedFlows.add(notification);
- }
-
- @Override
- public void onFlowRemoved(FlowRemoved notification) {
- removedFlows.add(notification);
- }
-
- @Override
- public void onFlowUpdated(FlowUpdated notification) {
- updatedFlows.add(notification);
- }
-
- @Override
- public void onNodeErrorNotification(NodeErrorNotification notification) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onNodeExperimenterErrorNotification(NodeExperimenterErrorNotification notification) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onSwitchFlowRemoved(SwitchFlowRemoved notification) {
- // TODO Auto-generated method stub
-
- }
- }
-
- public boolean validate(Flow flow) {
- String msg = ""; // Specific part of warn/error log
-
- boolean result = true;
- // flow Name validation
- if (!FRMUtil.isNameValid(flow.getFlowName())) {
- msg = "Invalid Flow name";
- result = false;
- }
-
- // Node Validation
- if (result == true && flow.getNode() == null) {
- msg = "Node is null";
- result = false;
- }
-
- // TODO: Validate we are seeking to program a flow against a valid
- // Node
-
- if (result == true && flow.getPriority() != null) {
- if (flow.getPriority() < 0 || flow.getPriority() > 65535) {
- msg = String.format("priority %s is not in the range 0 - 65535", flow.getPriority());
- result = false;
- }
- }
-
- if (!FRMUtil.validateMatch(flow)) {
- logger.error("Not a valid Match");
- result = false;
- }
- if (!FRMUtil.validateInstructions(flow)) {
- logger.error("Not a valid Instruction");
- result = false;
- }
- if (result == false) {
- logger.warn("Invalid Configuration for flow {}. The failure is {}", flow, msg);
- logger.error("Invalid Configuration ({})", msg);
- }
- return result;
- }
-
- private InstanceIdentifier<?> createTableInstance(Long tableId, NodeRef nodeRef) {
- Table table;
- InstanceIdentifier<Table> tableInstance;
- TableBuilder builder = new TableBuilder();
- builder.setId(tableId);
- builder.setKey(new TableKey(tableId, nodeRef));
- table = builder.build();
- tableInstance = InstanceIdentifier.builder(Tables.class).child(Table.class, table.getKey()).toInstance();
- return tableInstance;
- }
-}
\ No newline at end of file
+++ /dev/null
-package org.opendaylight.controller.forwardingrulesmanager.consumer.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-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.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.opendaylight.controller.clustering.services.CacheConfigException;
-import org.opendaylight.controller.clustering.services.CacheExistException;
-import org.opendaylight.controller.clustering.services.IClusterContainerServices;
-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.DataCommitHandler.DataCommitTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.controller.sal.common.util.Rpcs;
-import org.opendaylight.controller.sal.core.IContainer;
-import org.opendaylight.controller.sal.core.Node;
-import org.opendaylight.controller.sal.utils.GlobalConstants;
-import org.opendaylight.controller.sal.utils.Status;
-import org.opendaylight.controller.sal.utils.StatusCode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.config.rev131024.Groups;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.config.rev131024.groups.Group;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.config.rev131024.groups.GroupKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.GroupAdded;
-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.OriginalGroupBuilder;
-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.GroupId;
-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.yangtools.concepts.Registration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.NotificationListener;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@SuppressWarnings("unused")
-public class GroupConsumerImpl {
-
- protected static final Logger logger = LoggerFactory.getLogger(GroupConsumerImpl.class);
- private final GroupEventListener groupEventListener = new GroupEventListener();
- private Registration<NotificationListener> groupListener;
- private SalGroupService groupService;
- private GroupDataCommitHandler groupCommitHandler;
-
- private IContainer container;
-
- public GroupConsumerImpl() {
-
- InstanceIdentifier<? extends DataObject> path = InstanceIdentifier.builder(Groups.class).toInstance();
- groupService = FRMConsumerImpl.getProviderSession().getRpcService(SalGroupService.class);
-
- if (null == groupService) {
- logger.error("Consumer SAL Group Service is down or NULL. FRM may not function as intended");
- System.out.println("Consumer SAL Group Service is down or NULL.");
- return;
- }
-
- // For switch events
- groupListener = FRMConsumerImpl.getNotificationService().registerNotificationListener(groupEventListener);
-
- if (null == groupListener) {
- logger.error("Listener to listen on group data modifcation events");
- System.out.println("Listener to listen on group data modifcation events.");
- return;
- }
-
- groupCommitHandler = new GroupDataCommitHandler();
- FRMConsumerImpl.getDataProviderService().registerCommitHandler(path, groupCommitHandler);
- }
-
- public Status validateGroup(Group group) {
- String groupName;
- Iterator<Bucket> bucketIterator;
- boolean returnResult;
- Buckets groupBuckets;
-
- if (null != group) {
- groupName = group.getGroupName();
- if (!FRMUtil.isNameValid(groupName)) {
- logger.error("Group Name is invalid %s" + groupName);
- return new Status(StatusCode.BADREQUEST, "Group Name is invalid");
- }
-
- 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");
- }
-
- groupBuckets = group.getBuckets();
-
- if (null != groupBuckets && null != groupBuckets.getBucket()) {
- bucketIterator = groupBuckets.getBucket().iterator();
-
- while (bucketIterator.hasNext()) {
- if (!(FRMUtil.validateActions(bucketIterator.next().getAction()))) {
- logger.error("Error in action bucket");
- return new Status(StatusCode.BADREQUEST, "Invalid Group bucket contents");
- }
- }
- }
- }
-
- return new Status(StatusCode.SUCCESS);
- }
-
- /**
- * Update Group entries to the southbound plugin/inventory and our internal
- * database
- *
- * @param path
- * @param dataObject
- */
- private void updateGroup(InstanceIdentifier<?> path,
- Group updatedGroupDataObject, Group originalGroupDataObject) {
- UpdatedGroupBuilder updateGroupBuilder = null;
- Status groupOperationStatus = validateGroup(updatedGroupDataObject);
-
- if (!groupOperationStatus.isSuccess()) {
- logger.error("Group data object validation failed %s" + updatedGroupDataObject.getGroupName());
- return;
- }
-
- UpdateGroupInputBuilder groupInputBuilder = new UpdateGroupInputBuilder();
- updateGroupBuilder = new UpdatedGroupBuilder(updatedGroupDataObject);
- updateGroupBuilder.setGroupId(new GroupId(updatedGroupDataObject.getId()));
- groupInputBuilder.setNode(updatedGroupDataObject.getNode());
- groupInputBuilder.setUpdatedGroup(updateGroupBuilder.build());
- OriginalGroupBuilder originalGroupBuilder = new OriginalGroupBuilder(originalGroupDataObject);
- groupInputBuilder.setOriginalGroup(originalGroupBuilder.build());
- groupService.updateGroup(groupInputBuilder.build());
- return;
- }
-
- /**
- * Adds Group to the southbound plugin and our internal database
- *
- * @param path
- * @param dataObject
- */
- private void addGroup(InstanceIdentifier<?> path, Group groupAddDataObject) {
- GroupKey groupKey = groupAddDataObject.getKey();
- Status groupOperationStatus = validateGroup(groupAddDataObject);
-
- if (!groupOperationStatus.isSuccess()) {
- logger.error("Group data object validation failed %s" + groupAddDataObject.getGroupName());
- return;
- }
-
- AddGroupInputBuilder groupData = new AddGroupInputBuilder();
- groupData.fieldsFrom(groupAddDataObject);
- groupData.setGroupId(new GroupId(groupAddDataObject.getId()));
- groupData.setNode(groupAddDataObject.getNode());
- groupService.addGroup(groupData.build());
- return;
- }
-
- /**
- * Remove Group to the southbound plugin and our internal database
- *
- * @param path
- * @param dataObject
- */
- private void removeGroup(InstanceIdentifier<?> path, Group groupRemoveDataObject) {
- GroupKey groupKey = groupRemoveDataObject.getKey();
- Status groupOperationStatus = validateGroup(groupRemoveDataObject);
-
- if (!groupOperationStatus.isSuccess()) {
- logger.error("Group data object validation failed %s" + groupRemoveDataObject.getGroupName());
- return;
- }
-
- RemoveGroupInputBuilder groupData = new RemoveGroupInputBuilder();
- groupData.fieldsFrom(groupRemoveDataObject);
- groupData.setGroupId(new GroupId(groupRemoveDataObject.getId()));
- groupData.setNode(groupRemoveDataObject.getNode());
- groupService.removeGroup(groupData.build());
- return;
- }
-
- private RpcResult<Void> commitToPlugin(InternalTransaction transaction) {
- DataModification<InstanceIdentifier<?>, DataObject> modification = transaction.modification;
- //get created entries
- Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries =
- modification.getCreatedConfigurationData().entrySet();
-
- //get updated entries
- Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries =
- new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
-
- updatedEntries.addAll(modification.getUpdatedConfigurationData().entrySet());
- updatedEntries.removeAll(createdEntries);
-
- //get removed entries
- Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers =
- modification.getRemovedConfigurationData();
-
- for (Entry<InstanceIdentifier<? extends DataObject >, DataObject> entry : createdEntries) {
- if(entry.getValue() instanceof Group) {
- addGroup(entry.getKey(), (Group)entry.getValue());
- }
- }
-
- for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
- if(entry.getValue() instanceof Group) {
- Group originalGroup = (Group) modification.getOriginalConfigurationData().get(entry.getKey());
- Group updatedGroup = (Group) entry.getValue();
- updateGroup(entry.getKey(), originalGroup, updatedGroup);
- }
- }
-
- for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers ) {
- DataObject removeValue = modification.getOriginalConfigurationData().get(instanceId);
- if(removeValue instanceof Group) {
- removeGroup(instanceId, (Group)removeValue);
- }
- }
-
- return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
- }
-
- private final class GroupDataCommitHandler implements DataCommitHandler<InstanceIdentifier<?>, DataObject> {
-
- @Override
- public DataCommitTransaction<InstanceIdentifier<?>, DataObject> requestCommit(
- DataModification<InstanceIdentifier<?>, DataObject> modification) {
- InternalTransaction transaction = new InternalTransaction(modification);
- transaction.prepareUpdate();
- return transaction;
- }
- }
-
- private final class InternalTransaction implements DataCommitTransaction<InstanceIdentifier<?>, DataObject> {
-
- private final DataModification<InstanceIdentifier<?>, DataObject> modification;
-
- public InternalTransaction(DataModification<InstanceIdentifier<?>, DataObject> modification) {
- this.modification = modification;
- }
-
- /**
- * We create a plan which flows will be added, which will be updated and
- * which will be removed based on our internal state.
- *
- */
- void prepareUpdate() {
-
- }
-
- /**
- * We are OK to go with execution of plan
- *
- */
- @Override
- public RpcResult<Void> finish() throws IllegalStateException {
-
- RpcResult<Void> rpcStatus = commitToPlugin(this);
- return rpcStatus;
- }
-
- /**
- *
- * We should rollback our preparation
- *
- */
- @Override
- public RpcResult<Void> rollback() throws IllegalStateException {
-
- ///needs to be implemented as per gerrit 3314
- return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
- }
-
- @Override
- public DataModification<InstanceIdentifier<?>, DataObject> getModification() {
- return modification;
- }
-
- }
-
- final class GroupEventListener implements SalGroupListener {
-
- List<GroupAdded> addedGroups = new ArrayList<>();
- List<GroupRemoved> removedGroups = new ArrayList<>();
- List<GroupUpdated> updatedGroups = new ArrayList<>();
-
- @Override
- public void onGroupAdded(GroupAdded notification) {
- addedGroups.add(notification);
- }
-
- @Override
- public void onGroupRemoved(GroupRemoved notification) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onGroupUpdated(GroupUpdated notification) {
- // TODO Auto-generated method stub
-
- }
- }
- }
+++ /dev/null
-package org.opendaylight.controller.forwardingrulesmanager.consumer.impl;
-
-import java.util.List;
-
-import org.opendaylight.controller.sal.core.Node;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-
-/**
- * Interface that describes methods for accessing the flows database.
- */
-public interface IForwardingRulesManager {
-
- /**
- * Returns the specifications of all the flows configured for all the
- * switches on the current container
- *
- * @return the list of flow configurations present in the database
- */
- public List<DataObject> get();
-
- /**
- * Returns the specification of the flow configured for the given network
- * node on the current container
- *
- * @param name
- * the flow name
- * @param n
- * the network node identifier
- * @return the {@code FlowConfig} object
- */
- public DataObject getWithName(String name, Node n);
-
-}
+++ /dev/null
-package org.opendaylight.controller.forwardingrulesmanager.consumer.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-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.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.opendaylight.controller.clustering.services.CacheConfigException;
-import org.opendaylight.controller.clustering.services.CacheExistException;
-import org.opendaylight.controller.clustering.services.IClusterContainerServices;
-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.DataCommitHandler.DataCommitTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.DataModification;
-import org.opendaylight.controller.sal.common.util.Rpcs;
-import org.opendaylight.controller.sal.core.IContainer;
-import org.opendaylight.controller.sal.core.Node;
-import org.opendaylight.controller.sal.utils.GlobalConstants;
-import org.opendaylight.controller.sal.utils.Status;
-import org.opendaylight.controller.sal.utils.StatusCode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
-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.OriginalGroupBuilder;
-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.GroupId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.Meters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.Meter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.MeterKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.BandType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
-import org.opendaylight.yangtools.concepts.Registration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.NotificationListener;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MeterConsumerImpl {
- protected static final Logger logger = LoggerFactory.getLogger(MeterConsumerImpl.class);
- private final MeterEventListener meterEventListener = new MeterEventListener();
- private Registration<NotificationListener> meterListener;
- private SalMeterService meterService;
- private MeterDataCommitHandler commitHandler;
-
- public MeterConsumerImpl() {
- InstanceIdentifier<? extends DataObject> path = InstanceIdentifier.builder(Meters.class).toInstance();
- meterService = FRMConsumerImpl.getProviderSession().getRpcService(SalMeterService.class);
-
- if (null == meterService) {
- logger.error("Consumer SAL Meter Service is down or NULL. FRM may not function as intended");
- System.out.println("Consumer SAL Meter Service is down or NULL.");
- return;
- }
-
- // For switch/plugin events
- meterListener = FRMConsumerImpl.getNotificationService().registerNotificationListener(meterEventListener);
-
- if (null == meterListener) {
- logger.error("Listener to listen on meter data modifcation events");
- System.out.println("Listener to listen on meter data modifcation events.");
- return;
- }
-
- commitHandler = new MeterDataCommitHandler();
- FRMConsumerImpl.getDataProviderService().registerCommitHandler(path, commitHandler);
- }
-
- /**
- * Adds Meter to the southbound plugin and our internal database
- *
- * @param path
- * @param dataObject
- */
- private Status addMeter(InstanceIdentifier<?> path, Meter meterAddDataObject) {
- MeterKey meterKey = meterAddDataObject.getKey();
-
- if (null != meterKey && validateMeter(meterAddDataObject).isSuccess()) {
- AddMeterInputBuilder meterBuilder = new AddMeterInputBuilder();
- meterBuilder.fieldsFrom(meterAddDataObject);
- meterBuilder.setMeterId(new MeterId(meterAddDataObject.getId()));
- meterBuilder.setNode(meterAddDataObject.getNode());
- meterService.addMeter(meterBuilder.build());
- } else {
- return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed");
- }
-
- return new Status(StatusCode.SUCCESS);
- }
-
- /*
- * Update Meter to the southbound plugin and our internal database
- *
- * @param path
- *
- * @param dataObject
- */
- private Status updateMeter(InstanceIdentifier<?> path,
- Meter updatedMeter, Meter originalMeter) {
- UpdatedMeterBuilder updateMeterBuilder = null;
-
- if (validateMeter(updatedMeter).isSuccess()) {
- UpdateMeterInputBuilder updateMeterInputBuilder = new UpdateMeterInputBuilder();
- updateMeterInputBuilder.setNode(updatedMeter.getNode());
- updateMeterBuilder = new UpdatedMeterBuilder();
- updateMeterBuilder.fieldsFrom(updatedMeter);
- updateMeterBuilder.setMeterId(new MeterId(updatedMeter.getId()));
- updateMeterInputBuilder.setUpdatedMeter(updateMeterBuilder.build());
- OriginalMeterBuilder originalMeterBuilder = new OriginalMeterBuilder(originalMeter);
- updateMeterInputBuilder.setOriginalMeter(originalMeterBuilder.build());
- meterService.updateMeter(updateMeterInputBuilder.build());
- } else {
- return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed");
- }
-
- return new Status(StatusCode.SUCCESS);
- }
-
- /*
- * Remove Meter to the southbound plugin and our internal database
- *
- * @param path
- *
- * @param dataObject
- */
- private Status removeMeter(InstanceIdentifier<?> path, Meter meterRemoveDataObject) {
- MeterKey meterKey = meterRemoveDataObject.getKey();
-
- if (null != meterKey && validateMeter(meterRemoveDataObject).isSuccess()) {
- RemoveMeterInputBuilder meterBuilder = new RemoveMeterInputBuilder();
- meterBuilder.fieldsFrom(meterRemoveDataObject);
- meterBuilder.setNode(meterRemoveDataObject.getNode());
- meterBuilder.setMeterId(new MeterId(meterRemoveDataObject.getId()));
- meterService.removeMeter(meterBuilder.build());
- } else {
- return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed");
- }
-
- return new Status(StatusCode.SUCCESS);
- }
-
- public Status validateMeter(Meter meter) {
- String meterName;
- Status returnStatus = null;
-
- if (null != meter) {
- meterName = meter.getMeterName();
- if (!FRMUtil.isNameValid(meterName)) {
- logger.error("Meter Name is invalid %s" + meterName);
- returnStatus = new Status(StatusCode.BADREQUEST, "Meter Name is invalid");
- return returnStatus;
- }
-
- for (int i = 0; i < meter.getMeterBandHeaders().getMeterBandHeader().size(); i++) {
- if (null != meter.getFlags() && !meter.getFlags().isMeterBurst()) {
- if (0 < meter.getMeterBandHeaders().getMeterBandHeader().get(i).getBurstSize()) {
- logger.error("Burst size should only be associated when Burst FLAG is set");
- returnStatus = new Status(StatusCode.BADREQUEST,
- "Burst size should only be associated when Burst FLAG is set");
- break;
- }
- }
- }
-
- if (null != returnStatus && !returnStatus.isSuccess()) {
- return returnStatus;
- } else if (null != meter.getMeterBandHeaders()) {
- BandType setBandType = null;
- DscpRemark dscpRemark = null;
- for (int i = 0; i < meter.getMeterBandHeaders().getMeterBandHeader().size(); i++) {
- setBandType = meter.getMeterBandHeaders().getMeterBandHeader().get(i).getBandType();
- if (setBandType instanceof DscpRemark) {
- dscpRemark = (DscpRemark) setBandType;
- if (0 > dscpRemark.getRate()) {
-
- }
- } else if (setBandType instanceof Drop) {
- if (0 < dscpRemark.getPercLevel()) {
- logger.error("Number of drop Precedence level");
- }
- } else if (setBandType instanceof Experimenter) {
-
- }
- }
- }
- }
- return new Status(StatusCode.SUCCESS);
- }
-
- private RpcResult<Void> commitToPlugin(InternalTransaction transaction) {
- DataModification<InstanceIdentifier<?>, DataObject> modification = transaction.modification;
- //get created entries
- Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries =
- modification.getCreatedConfigurationData().entrySet();
-
- //get updated entries
- Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries =
- new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
-
- updatedEntries.addAll(modification.getUpdatedConfigurationData().entrySet());
- updatedEntries.removeAll(createdEntries);
-
- //get removed entries
- Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers =
- modification.getRemovedConfigurationData();
-
- for (Entry<InstanceIdentifier<? extends DataObject >, DataObject> entry : createdEntries) {
- if(entry.getValue() instanceof Meter) {
- addMeter(entry.getKey(), (Meter)entry.getValue());
- }
- }
-
- for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
- if(entry.getValue() instanceof Meter) {
- Meter originalMeter = (Meter) modification.getOriginalConfigurationData().get(entry.getKey());
- Meter updatedMeter = (Meter) entry.getValue();
- updateMeter(entry.getKey(), originalMeter, updatedMeter);
- }
- }
-
- for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers ) {
- DataObject removeValue = modification.getOriginalConfigurationData().get(instanceId);
- if(removeValue instanceof Meter) {
- removeMeter(instanceId, (Meter)removeValue);
- }
- }
-
- return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
- }
-
- final class InternalTransaction implements DataCommitTransaction<InstanceIdentifier<?>, DataObject> {
-
- private final DataModification<InstanceIdentifier<?>, DataObject> modification;
-
- @Override
- public DataModification<InstanceIdentifier<?>, DataObject> getModification() {
- return modification;
- }
-
- public InternalTransaction(DataModification<InstanceIdentifier<?>, DataObject> modification) {
- this.modification = modification;
- }
-
- /**
- * We create a plan which flows will be added, which will be updated and
- * which will be removed based on our internal state.
- *
- */
- void prepareUpdate() {
-
- }
-
- /**
- * We are OK to go with execution of plan
- *
- */
- @Override
- public RpcResult<Void> finish() throws IllegalStateException {
-
- RpcResult<Void> rpcStatus = commitToPlugin(this);
- return rpcStatus;
- }
-
- /**
- *
- * We should rollback our preparation
- *
- */
- @Override
- public RpcResult<Void> rollback() throws IllegalStateException {
- return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
-
- }
-
- }
-
- private final class MeterDataCommitHandler implements DataCommitHandler<InstanceIdentifier<?>, DataObject> {
- @Override
- public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier<?>, DataObject> requestCommit(
- DataModification<InstanceIdentifier<?>, DataObject> modification) {
- // We should verify transaction
- InternalTransaction transaction = new InternalTransaction(modification);
- transaction.prepareUpdate();
- return transaction;
- }
- }
-
- final class MeterEventListener implements SalMeterListener {
-
- List<MeterAdded> addedMeter = new ArrayList<>();
- List<MeterRemoved> removeMeter = new ArrayList<>();
- List<MeterUpdated> updatedMeter = new ArrayList<>();
-
- @Override
- public void onMeterAdded(MeterAdded notification) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onMeterRemoved(MeterRemoved notification) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void onMeterUpdated(MeterUpdated notification) {
- // TODO Auto-generated method stub
-
- }
- }
-}
+++ /dev/null
-package org.opendaylight.controller.forwardingrulesmanager.consumer.impl;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.opendaylight.controller.clustering.services.IClusterContainerServices;
-import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
-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.sal.common.util.Rpcs;
-import org.opendaylight.controller.sal.core.IContainer;
-import org.opendaylight.controller.sal.utils.ServiceHelper;
-import org.opendaylight.controller.sal.utils.Status;
-import org.opendaylight.controller.sal.utils.StatusCode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.Tables;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.tables.Table;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.SalTableService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTableBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TableFeaturesConsumerImpl {
- protected static final Logger logger = LoggerFactory.getLogger(TableFeaturesConsumerImpl.class);
- private SalTableService tableService;
- private TableDataCommitHandler commitHandler;
- private final IClusterContainerServices clusterContainerService = null;
- private IContainer container;
- private static final String NAMEREGEX = "^[a-zA-Z0-9]+$";
- private boolean inContainerMode; // being used by global instance only
-
- public TableFeaturesConsumerImpl() {
- InstanceIdentifier<? extends DataObject> path = InstanceIdentifier.builder(Tables.class).toInstance();
- tableService = FRMConsumerImpl.getProviderSession().getRpcService(SalTableService.class);
-
- if (null == tableService) {
- logger.error("Consumer SAL Service is down or NULL. FRM may not function as intended");
- System.out.println("Consumer SAL Service is down or NULL.");
- return;
- }
-
- System.out.println("-------------------------------------------------------------------");
- commitHandler = new TableDataCommitHandler();
- FRMConsumerImpl.getDataProviderService().registerCommitHandler(path, commitHandler);
- container = (IContainer) ServiceHelper.getGlobalInstance(IContainer.class, this);
- }
-
- /**
- * Updates TableFeatures to the southbound plugin and our internal database
- *
- * @param path
- * @param dataObject
- */
- private void updateTableFeatures(InstanceIdentifier<?> path, TableFeatures dataObject) {
-
- UpdateTableInputBuilder input = new UpdateTableInputBuilder();
- UpdatedTableBuilder updatedtablebuilder = new UpdatedTableBuilder();
- updatedtablebuilder.fieldsFrom(dataObject);
- List<TableFeatures> features = updatedtablebuilder.build().getTableFeatures();
- for (TableFeatures feature : features) {
- if (feature != null && feature.getMaxEntries() != null) {
- logger.error("Max Entries field is read-only, cannot be changed");
- return;
- }
- }
- input.setUpdatedTable(updatedtablebuilder.build());
-
- // We send table feature update request to the sounthbound plugin
- tableService.updateTable(input.build());
- }
-
- @SuppressWarnings("unchecked")
- private void commitToPlugin(internalTransaction transaction) {
-
- for (@SuppressWarnings("unused")
- Entry<InstanceIdentifier<?>, TableFeatures> entry : transaction.updates.entrySet()) {
- System.out.println("Coming update cc in TableDatacommitHandler");
- updateTableFeatures(entry.getKey(), entry.getValue());
- }
-
- }
-
- private final class TableDataCommitHandler implements DataCommitHandler<InstanceIdentifier<?>, DataObject> {
-
- @SuppressWarnings("unchecked")
- @Override
- public DataCommitTransaction requestCommit(DataModification<InstanceIdentifier<?>, DataObject> modification) {
- // We should verify transaction
- System.out.println("Coming in TableFeaturesDatacommitHandler");
- internalTransaction transaction = new internalTransaction(modification);
- transaction.prepareUpdate();
- return transaction;
- }
- }
-
- private final class internalTransaction implements DataCommitTransaction<InstanceIdentifier<?>, DataObject> {
-
- private final DataModification<InstanceIdentifier<?>, DataObject> modification;
-
- @Override
- public DataModification<InstanceIdentifier<?>, DataObject> getModification() {
- return modification;
- }
-
- public internalTransaction(DataModification<InstanceIdentifier<?>, DataObject> modification) {
- this.modification = modification;
- }
-
- Map<InstanceIdentifier<?>, TableFeatures> updates = new HashMap<>();
- Map<InstanceIdentifier<?>, TableFeatures> createdEntries = new HashMap<>();
-
- /**
- * We create a plan which table features will be updated.
- *
- */
- void prepareUpdate() {
- Set<Entry<InstanceIdentifier<?>, DataObject>> createdEntries = modification.getCreatedConfigurationData().entrySet();
-
- Set<Entry<InstanceIdentifier<?>, DataObject>> puts = modification.getUpdatedConfigurationData().entrySet();
- for (Entry<InstanceIdentifier<?>, DataObject> entry : puts) {
-
- // validating the DataObject
-
- Status status = validate(container, (TableFeatures) entry);
- if (!status.isSuccess()) {
- logger.warn("Invalid Configuration for table features The failure is {}", entry,
- status.getDescription());
- String error = "Invalid Configuration (" + status.getDescription() + ")";
- logger.error(error);
- return;
- }
- if (entry.getValue() instanceof TableFeatures) {
- TableFeatures tablefeatures = (TableFeatures) entry.getValue();
- preparePutEntry(entry.getKey(), tablefeatures);
- }
-
- }
- }
-
- private void preparePutEntry(InstanceIdentifier<?> key, TableFeatures tablefeatures) {
- if (tablefeatures != null) {
- // Updating the Map
- System.out.println("Coming update in TableFeaturesDatacommitHandler");
- updates.put(key, tablefeatures);
- }
- }
-
- /**
- * We are OK to go with execution of plan
- *
- */
- @Override
- public RpcResult<Void> finish() throws IllegalStateException {
-
- commitToPlugin(this);
- // We return true if internal transaction is successful.
- // return Rpcs.getRpcResult(true, null, Collections.emptySet());
- return Rpcs.getRpcResult(true, null, null);
- }
-
- /**
- *
- * We should rollback our preparation
- *
- */
- @Override
- public RpcResult<Void> rollback() throws IllegalStateException {
- // NOOP - we did not modified any internal state during
- // requestCommit phase
- // return Rpcs.getRpcResult(true, null, Collections.emptySet());
- return Rpcs.getRpcResult(true, null, null);
-
- }
-
- public Status validate(IContainer container, TableFeatures dataObject) {
-
- String tablename = dataObject.getName();
- if (tablename == null || tablename.trim().isEmpty() || !tablename.matches(NAMEREGEX)
- || tablename.length() != 32) {
- return new Status(StatusCode.BADREQUEST, "Invalid table name");
- }
-
- return new Status(StatusCode.SUCCESS);
- }
- }
-}
import ietf-inet-types { prefix "inet"; }
import opendaylight-inventory {prefix "inv";}
import opendaylight-topology {prefix "odt";}
- import network-topology {prefix "topo"; revision-date "2013-07-12"; }
+ import network-topology {prefix "topo"; revision-date "2013-10-21"; }
organization "TBD";
import yang-ext { prefix "ext"; }
import ietf-inet-types { prefix "inet"; }
import opendaylight-inventory {prefix "inv";}
- import network-topology {prefix "topo"; revision-date "2013-07-12"; }
+ import network-topology {prefix "topo"; revision-date "2013-10-21"; }
organization "TBD";
import yang-ext { prefix "ext"; }
import ietf-inet-types { prefix "inet"; }
- import network-topology {prefix "topo"; revision-date "2013-07-12"; }
+ import network-topology {prefix "topo"; revision-date "2013-10-21"; }
import opendaylight-topology {prefix "odl";}
organization "TBD";
<sonar.jacoco.itReportPath>../sal-binding-broker/target/jacoco-it.exec</sonar.jacoco.itReportPath>
<netconf.version>0.2.3-SNAPSHOT</netconf.version>
<config.version>0.2.3-SNAPSHOT</config.version>
+ <moxy.controller.version>2.5.0</moxy.controller.version>
</properties>
<build>
</plugins>
<pluginManagement>
<plugins>
- <!--This plugin's configuration is used to store Eclipse
+ <!--This plugin's configuration is used to store Eclipse
m2e settings only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<dependencies>
+
<dependency>
<groupId>org.opendaylight.yangtools.thirdparty</groupId>
<artifactId>xtend-lib-osgi</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-file-adapter</artifactId>
+ <artifactId>config-persister-file-xml-adapter</artifactId>
<version>${config.version}</version>
</dependency>
- <dependency>
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>org.eclipse.persistence.moxy</artifactId>
+ <version>${moxy.controller.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>org.eclipse.persistence.core</artifactId>
+ <version>${moxy.controller.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>netconf-impl</artifactId>
<version>${netconf.version}</version>
<groupId>org.ops4j.pax.exam</groupId>
<artifactId>pax-exam</artifactId>
<version>${exam.version}</version>
- <!-- Compile scope here is intentional, it is used in TestHelper
- class which could be downloaded via nexus and reused in other integration
+ <!-- Compile scope here is intentional, it is used in TestHelper
+ class which could be downloaded via nexus and reused in other integration
tests. -->
<scope>compile</scope>
</dependency>
mavenBundle(CONTROLLER, "config-netconf-connector").versionAsInProject(), //
mavenBundle(CONTROLLER, "netconf-impl").versionAsInProject(), //
- mavenBundle(CONTROLLER, "config-persister-file-adapter").versionAsInProject().noStart());
+ mavenBundle(CONTROLLER, "config-persister-file-xml-adapter").versionAsInProject().noStart(),
+ mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.moxy").versionAsInProject(),
+ mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.core").versionAsInProject());
}
systemProperty("netconf.tcp.client.port").value("18383"), //
systemProperty("netconf.config.persister.active").value("1"), //
systemProperty("netconf.config.persister.1.storageAdapterClass").value(
- "org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter"), //
+ "org.opendaylight.controller.config.persist.storage.file.xml.XmlFileStorageAdapter"), //
systemProperty("netconf.config.persister.1.properties.fileStorage")
- .value(PathUtils.getBaseDir() + "/src/test/resources/controller.config"), //
+ .value(PathUtils.getBaseDir() + "/src/test/resources/controller.xml"), //
systemProperty("netconf.config.persister.1.properties.numberOfBackups").value("1") //
//systemProperty("yangstore.blacklist").value(".*controller.model.*") //
@Inject
@Filter(timeout=60*1000)
BindingAwareBroker broker;
-
+
@Inject
BundleContext bundleContext;
bindingAwareSalBundles(),
configMinumumBundles(),
// BASE Models
- baseModelBundles(),
- flowCapableModelBundles(),
+ baseModelBundles(),
+ flowCapableModelBundles(),
+
+ // Set fail if unresolved bundle present
+ systemProperty("pax.exam.osgi.unresolved.fail").value("true"),
junitAndMockitoBundles());
}
-
+
}
+++ /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:impl">prefix:schema-service-singleton</type>
- <name>yang-schema-service</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:hash-map-data-store</type>
- <name>hash-map-data-store</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:dom-broker-impl</type>
- <name>dom-broker</name>
- <data-store xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-data-store</type>
- <name>ref_hash-map-data-store</name>
- </data-store>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-broker-impl</type>
- <name>binding-broker-impl</name>
- <notification-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-notification-service</type>
- <name>ref_binding-notification-broker</name>
- </notification-service>
- <data-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
- <name>ref_binding-data-broker</name>
- </data-broker>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:runtime-generated-mapping</type>
- <name>runtime-mapping-singleton</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-notification-broker</type>
- <name>binding-notification-broker</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-data-broker</type>
- <name>binding-data-broker</name>
- <dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-broker-osgi-registry</type>
- <name>ref_dom-broker</name>
- </dom-broker>
- <mapping-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding:binding-dom-mapping-service</type>
- <name>ref_runtime-mapping-singleton</name>
- </mapping-service>
- </module>
-</modules>
-<services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
- <service>
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:schema-service</type>
- <instance>
- <name>ref_yang-schema-service</name>
- <provider>/config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-notification-service</type>
- <instance>
- <name>ref_binding-notification-broker</name>
- <provider>/config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-data-store</type>
- <instance>
- <name>ref_hash-map-data-store</name>
- <provider>/config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
- <instance>
- <name>ref_binding-broker-impl</name>
- <provider>/config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding-impl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding-impl:binding-dom-mapping-service</type>
- <instance>
- <name>ref_runtime-mapping-singleton</name>
- <provider>/config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-broker-osgi-registry</type>
- <instance>
- <name>ref_dom-broker</name>
- <provider>/config/modules/module[name='dom-broker-impl']/instance[name='dom-broker']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
- <instance>
- <name>ref_binding-data-broker</name>
- <provider>/config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker']</provider>
- </instance>
- </service>
-</services>
-</data>
-
-
-//END OF SNAPSHOT
-urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28
-urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05
-urn:ietf:params:netconf:capability:candidate:1.0
-urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04
-urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28
-urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24
-urn:ietf:params:netconf:capability:rollback-on-error:1.0
-urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28
-urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16
-urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28
-//END OF CONFIG
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<persisted-snapshots>
+ <snapshots>
+ <snapshot>
+ <required-capabilities>
+ <capability>urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27</capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28
+ </capability>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28</capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05
+ </capability>
+ <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
+ <capability>urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04</capability>
+ <capability>urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28
+ </capability>
+ <capability>urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24
+ </capability>
+ <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>
+ <capability>urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28
+ </capability>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16</capability>
+ <capability>urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28
+ </capability>
+
+ </required-capabilities>
+ <configuration>
+
+ <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:impl">
+ prefix:schema-service-singleton
+ </type>
+ <name>yang-schema-service</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+ prefix:hash-map-data-store
+ </type>
+ <name>hash-map-data-store</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+ prefix:dom-broker-impl
+ </type>
+ <name>dom-broker</name>
+ <data-store xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-data-store
+ </type>
+ <name>ref_hash-map-data-store</name>
+ </data-store>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:binding-broker-impl
+ </type>
+ <name>binding-broker-impl</name>
+ <notification-service
+ xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-notification-service
+ </type>
+ <name>ref_binding-notification-broker</name>
+ </notification-service>
+ <data-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-data-broker
+ </type>
+ <name>ref_binding-data-broker</name>
+ </data-broker>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:runtime-generated-mapping
+ </type>
+ <name>runtime-mapping-singleton</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:binding-notification-broker
+ </type>
+ <name>binding-notification-broker</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:binding-data-broker
+ </type>
+ <name>binding-data-broker</name>
+ <dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-broker-osgi-registry
+ </type>
+ <name>ref_dom-broker</name>
+ </dom-broker>
+ <mapping-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ binding:binding-dom-mapping-service
+ </type>
+ <name>ref_runtime-mapping-singleton</name>
+ </mapping-service>
+ </module>
+ </modules>
+
+ <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+ <service>
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:schema-service
+ </type>
+ <instance>
+ <name>ref_yang-schema-service</name>
+ <provider>
+ /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-notification-service
+ </type>
+ <instance>
+ <name>ref_binding-notification-broker</name>
+ <provider>
+ /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-data-store
+ </type>
+ <instance>
+ <name>ref_hash-map-data-store</name>
+ <provider>
+ /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-broker-osgi-registry
+ </type>
+ <instance>
+ <name>ref_binding-broker-impl</name>
+ <provider>
+ /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding-impl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ binding-impl:binding-dom-mapping-service
+ </type>
+ <instance>
+ <name>ref_runtime-mapping-singleton</name>
+ <provider>
+ /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-broker-osgi-registry
+ </type>
+ <instance>
+ <name>ref_dom-broker</name>
+ <provider>/config/modules/module[name='dom-broker-impl']/instance[name='dom-broker']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-data-broker
+ </type>
+ <instance>
+ <name>ref_binding-data-broker</name>
+ <provider>
+ /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker']
+ </provider>
+ </instance>
+ </service>
+ </services>
+ </data>
+
+ </configuration>
+ </snapshot>
+
+ </snapshots>
+</persisted-snapshots>
+++ /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:impl">prefix:schema-service-singleton</type>
- <name>yang-schema-service</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:hash-map-data-store</type>
- <name>hash-map-data-store</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">prefix:dom-broker-impl</type>
- <name>dom-broker</name>
- <data-store xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-data-store</type>
- <name>ref_hash-map-data-store</name>
- </data-store>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-broker-impl</type>
- <name>binding-broker-impl</name>
- <notification-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-notification-service</type>
- <name>ref_binding-notification-broker</name>
- </notification-service>
- <data-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
- <name>ref_binding-data-broker</name>
- </data-broker>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:runtime-generated-mapping</type>
- <name>runtime-mapping-singleton</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-notification-broker</type>
- <name>binding-notification-broker</name>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-data-broker</type>
- <name>binding-data-broker</name>
- <dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-broker-osgi-registry</type>
- <name>ref_dom-broker</name>
- </dom-broker>
- <mapping-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding:binding-dom-mapping-service</type>
- <name>ref_runtime-mapping-singleton</name>
- </mapping-service>
- </module>
- <module>
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc">prefix:remote-zeromq-rpc-server</type>
- <name>remoter</name>
- <port xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc">5666</port>
- <dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc">
- <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-broker-osgi-registry</type>
- <name>ref_dom-broker</name>
- </dom-broker>
- </module>
-</modules>
-<services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
- <service>
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:schema-service</type>
- <instance>
- <name>ref_yang-schema-service</name>
- <provider>/config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-notification-service</type>
- <instance>
- <name>ref_binding-notification-broker</name>
- <provider>/config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-data-store</type>
- <instance>
- <name>ref_hash-map-data-store</name>
- <provider>/config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
- <instance>
- <name>ref_binding-broker-impl</name>
- <provider>/config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding-impl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding-impl:binding-dom-mapping-service</type>
- <instance>
- <name>ref_runtime-mapping-singleton</name>
- <provider>/config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-broker-osgi-registry</type>
- <instance>
- <name>ref_dom-broker</name>
- <provider>/config/modules/module[name='dom-broker-impl']/instance[name='dom-broker']</provider>
- </instance>
- </service>
- <service>
- <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
- <instance>
- <name>ref_binding-data-broker</name>
- <provider>/config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker']</provider>
- </instance>
- </service>
-</services>
-</data>
-
-
-//END OF SNAPSHOT
-urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28
-urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&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:md:sal:remote:rpc?module=odl-sal-dom-rpc-remote-cfg&revision=2013-10-28
-//END OF CONFIG
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<persisted-snapshots>
+ <snapshots>
+ <snapshot>
+ <required-capabilities>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28
+ </capability>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28</capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc?module=odl-sal-dom-rpc-remote-cfg&revision=2013-10-28
+ </capability>
+ </required-capabilities>
+ <configuration>
+
+ <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:impl">
+ prefix:schema-service-singleton
+ </type>
+ <name>yang-schema-service</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+ prefix:hash-map-data-store
+ </type>
+ <name>hash-map-data-store</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+ prefix:dom-broker-impl
+ </type>
+ <name>dom-broker</name>
+ <data-store xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl">
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-data-store
+ </type>
+ <name>ref_hash-map-data-store</name>
+ </data-store>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:binding-broker-impl
+ </type>
+ <name>binding-broker-impl</name>
+ <notification-service
+ xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-notification-service
+ </type>
+ <name>ref_binding-notification-broker</name>
+ </notification-service>
+ <data-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-data-broker
+ </type>
+ <name>ref_binding-data-broker</name>
+ </data-broker>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:runtime-generated-mapping
+ </type>
+ <name>runtime-mapping-singleton</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:binding-notification-broker
+ </type>
+ <name>binding-notification-broker</name>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ prefix:binding-data-broker
+ </type>
+ <name>binding-data-broker</name>
+ <dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-broker-osgi-registry
+ </type>
+ <name>ref_dom-broker</name>
+ </dom-broker>
+ <mapping-service xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ binding:binding-dom-mapping-service
+ </type>
+ <name>ref_runtime-mapping-singleton</name>
+ </mapping-service>
+ </module>
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc">
+ prefix:remote-zeromq-rpc-server
+ </type>
+ <name>remoter</name>
+ <port xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc">5666</port>
+ <dom-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote:rpc">
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ prefix:dom-broker-osgi-registry
+ </type>
+ <name>ref_dom-broker</name>
+ </dom-broker>
+ </module>
+ </modules>
+
+ <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+ <service>
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:schema-service
+ </type>
+ <instance>
+ <name>ref_yang-schema-service</name>
+ <provider>
+ /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-notification-service
+ </type>
+ <instance>
+ <name>ref_binding-notification-broker</name>
+ <provider>
+ /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-data-store
+ </type>
+ <instance>
+ <name>ref_hash-map-data-store</name>
+ <provider>
+ /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-broker-osgi-registry
+ </type>
+ <instance>
+ <name>ref_binding-broker-impl</name>
+ <provider>
+ /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding-impl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ binding-impl:binding-dom-mapping-service
+ </type>
+ <instance>
+ <name>ref_runtime-mapping-singleton</name>
+ <provider>
+ /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
+ dom:dom-broker-osgi-registry
+ </type>
+ <instance>
+ <name>ref_dom-broker</name>
+ <provider>/config/modules/module[name='dom-broker-impl']/instance[name='dom-broker']
+ </provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-data-broker
+ </type>
+ <instance>
+ <name>ref_binding-data-broker</name>
+ <provider>
+ /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker']
+ </provider>
+ </instance>
+ </service>
+ </services>
+ </data>
+
+ </configuration>
+ </snapshot>
+ </snapshots>
+</persisted-snapshots>
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.SourceBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.DestinationBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.LinkId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.SourceBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.link.attributes.DestinationBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.LinkId
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeBuilder
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNode
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnector
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyBuilder
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
import static extension org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.*
import com.google.common.base.Preconditions;
import org.opendaylight.controller.netconf.util.xml.XmlElement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.List;
public class SimpleAttributeReadingStrategy extends AbstractAttributeReadingStrategy {
+ private static final Logger logger = LoggerFactory.getLogger(SimpleAttributeReadingStrategy.class);
+
public SimpleAttributeReadingStrategy(String nullableDefault) {
super(nullableDefault);
Preconditions.checkState(configNodes.size() == 1, "This element should be present only once " + xmlElement
+ " but was " + configNodes.size());
- String textContent = xmlElement.getTextContent();
+ String textContent = "";
+ try{
+ textContent = xmlElement.getTextContent();
+ }catch(IllegalStateException | NullPointerException e) {
+ // yuma sends <attribute /> for empty value instead of <attribute></attribute>
+ logger.warn("Ignoring exception caused by failure to read text element", e);
+ }
Preconditions.checkNotNull(textContent, "This element should contain text %s", xmlElement);
return AttributeConfigElement.create(postprocessNullableDefault(getNullableDefault()),
@Nullable
@Override
public String apply(@Nullable XmlElement input) {
- return input.getTextContent();
+ // Trim possible leading/tailing whitespace
+ return input.getTextContent().trim();
}
});
}
public String getTextContent() {
Node textChild = element.getFirstChild();
- Preconditions.checkState(textChild instanceof Text, getName() + " should contain text");
+ Preconditions.checkNotNull(textChild, "Child node expected, got null for " + getName() + " : " + element);
+ Preconditions.checkState(textChild instanceof Text, getName() + " should contain text." +
+ Text.class.getName() + " expected, got " + textChild);
String content = textChild.getTextContent();
// Trim needed
return content.trim();
<instructions>
<Import-Package>
org.opendaylight.controller.clustering.services,
+ org.opendaylight.controller.configuration,
org.opendaylight.controller.sal.core,
org.opendaylight.controller.sal.utils,
org.apache.felix.dm,
<artifactId>clustering.services</artifactId>
<version>0.5.0-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>configuration</artifactId>
+ <version>0.4.1-SNAPSHOT</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>networkconfig.neutron</artifactId>
import java.util.Hashtable;
import java.util.Dictionary;
+
import org.apache.felix.dm.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
+import org.opendaylight.controller.configuration.IConfigurationContainerAware;
import org.opendaylight.controller.networkconfig.neutron.INeutronFloatingIPCRUD;
import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD;
* ComponentActivatorAbstractBase.
*
*/
+ @Override
public void init() {
}
* cleanup done by ComponentActivatorAbstractBase
*
*/
+ @Override
public void destroy() {
}
* instantiated in order to get an fully working implementation
* Object
*/
+ @Override
public Object[] getImplementations() {
Object[] res = { NeutronFloatingIPInterface.class,
NeutronRouterInterface.class,
* also optional per-container different behavior if needed, usually
* should not be the case though.
*/
+ @Override
public void configureInstance(Component c, Object imp, String containerName) {
if (imp.equals(NeutronFloatingIPInterface.class)) {
// export the service
c.setInterface(
- new String[] { INeutronFloatingIPCRUD.class.getName() }, null);
+ new String[] { INeutronFloatingIPCRUD.class.getName(),
+ IConfigurationContainerAware.class.getName()}, null);
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("salListenerName", "neutron");
c.add(createContainerServiceDependency(containerName)
if (imp.equals(NeutronRouterInterface.class)) {
// export the service
c.setInterface(
- new String[] { INeutronRouterCRUD.class.getName() }, null);
+ new String[] { INeutronRouterCRUD.class.getName(),
+ IConfigurationContainerAware.class.getName()}, null);
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("salListenerName", "neutron");
c.add(createContainerServiceDependency(containerName)
if (imp.equals(NeutronPortInterface.class)) {
// export the service
c.setInterface(
- new String[] { INeutronPortCRUD.class.getName() }, null);
+ new String[] { INeutronPortCRUD.class.getName(),
+ IConfigurationContainerAware.class.getName()}, null);
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("salListenerName", "neutron");
c.add(createContainerServiceDependency(containerName)
if (imp.equals(NeutronSubnetInterface.class)) {
// export the service
c.setInterface(
- new String[] { INeutronSubnetCRUD.class.getName() }, null);
+ new String[] { INeutronSubnetCRUD.class.getName(),
+ IConfigurationContainerAware.class.getName()}, null);
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("salListenerName", "neutron");
c.add(createContainerServiceDependency(containerName)
if (imp.equals(NeutronNetworkInterface.class)) {
// export the service
c.setInterface(
- new String[] { INeutronNetworkCRUD.class.getName() }, null);
+ new String[] { INeutronNetworkCRUD.class.getName(),
+ IConfigurationContainerAware.class.getName()}, null);
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("salListenerName", "neutron");
c.add(createContainerServiceDependency(containerName)
package org.opendaylight.controller.networkconfig.neutron.implementation;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.felix.dm.Component;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
import org.opendaylight.controller.clustering.services.IClusterServices;
+import org.opendaylight.controller.configuration.IConfigurationContainerAware;
import org.opendaylight.controller.networkconfig.neutron.INeutronFloatingIPCRUD;
import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD;
import org.opendaylight.controller.networkconfig.neutron.NeutronFloatingIP;
import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet;
+import org.opendaylight.controller.sal.utils.GlobalConstants;
+import org.opendaylight.controller.sal.utils.IObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectWriter;
+import org.opendaylight.controller.sal.utils.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD {
+public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConfigurationContainerAware,
+ IObjectReader {
private static final Logger logger = LoggerFactory.getLogger(NeutronFloatingIPInterface.class);
+ private static String ROOT = GlobalConstants.STARTUPHOME.toString();
+ private static final String FILENAME ="neutron.floatingip";
+ private static String fileName;
private String containerName = null;
private IClusterContainerServices clusterContainerService = null;
private void startUp() {
allocateCache();
retrieveCache();
+ if (floatingIPDB.isEmpty()) {
+ loadConfiguration();
+ }
}
/**
// In the Global instance case the containerName is empty
this.containerName = "";
}
+ fileName = ROOT + FILENAME + "_" + containerName + ".conf";
startUp();
}
// IfNBFloatingIPCRUD interface methods
+ @Override
public boolean floatingIPExists(String uuid) {
return floatingIPDB.containsKey(uuid);
}
+ @Override
public NeutronFloatingIP getFloatingIP(String uuid) {
if (!floatingIPExists(uuid))
return null;
return floatingIPDB.get(uuid);
}
+ @Override
public List<NeutronFloatingIP> getAllFloatingIPs() {
Set<NeutronFloatingIP> allIPs = new HashSet<NeutronFloatingIP>();
for (Entry<String, NeutronFloatingIP> entry : floatingIPDB.entrySet()) {
return ans;
}
+ @Override
public boolean addFloatingIP(NeutronFloatingIP input) {
INeutronNetworkCRUD networkCRUD = NeutronCRUDInterfaces.getINeutronNetworkCRUD(this);
INeutronSubnetCRUD subnetCRUD = NeutronCRUDInterfaces.getINeutronSubnetCRUD(this);
return true;
}
+ @Override
public boolean removeFloatingIP(String uuid) {
INeutronNetworkCRUD networkCRUD = NeutronCRUDInterfaces.getINeutronNetworkCRUD(this);
INeutronSubnetCRUD subnetCRUD = NeutronCRUDInterfaces.getINeutronSubnetCRUD(this);
return true;
}
+ @Override
public boolean updateFloatingIP(String uuid, NeutronFloatingIP delta) {
INeutronPortCRUD portCRUD = NeutronCRUDInterfaces.getINeutronPortCRUD(this);
target.setFixedIPAddress(delta.getFixedIPAddress());
return true;
}
+
+ @SuppressWarnings("unchecked")
+ private void loadConfiguration() {
+ ObjectReader objReader = new ObjectReader();
+ ConcurrentMap<String, NeutronFloatingIP> confList = (ConcurrentMap<String, NeutronFloatingIP>)
+ objReader.read(this, fileName);
+
+ if (confList == null) {
+ return;
+ }
+
+ for (String key : confList.keySet()) {
+ floatingIPDB.put(key, confList.get(key));
+ }
+ }
+
+ @Override
+ public Status saveConfiguration() {
+ ObjectWriter objWriter = new ObjectWriter();
+ return objWriter.write(new ConcurrentHashMap<String, NeutronFloatingIP>(floatingIPDB), fileName);
+ }
+
+ @Override
+ public Object readObject(ObjectInputStream ois) throws FileNotFoundException, IOException, ClassNotFoundException {
+ return ois.readObject();
+ }
}
package org.opendaylight.controller.networkconfig.neutron.implementation;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.felix.dm.Component;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
import org.opendaylight.controller.clustering.services.IClusterServices;
+import org.opendaylight.controller.configuration.IConfigurationContainerAware;
import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
+import org.opendaylight.controller.sal.utils.GlobalConstants;
+import org.opendaylight.controller.sal.utils.IObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectWriter;
+import org.opendaylight.controller.sal.utils.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class NeutronNetworkInterface implements INeutronNetworkCRUD {
+public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurationContainerAware,
+ IObjectReader {
private static final Logger logger = LoggerFactory.getLogger(NeutronNetworkInterface.class);
+ private static String ROOT = GlobalConstants.STARTUPHOME.toString();
+ private static final String FILENAME ="neutron.network";
+ private static String fileName;
private String containerName = null;
private ConcurrentMap<String, NeutronNetwork> networkDB;
private void startUp() {
allocateCache();
retrieveCache();
+ if (networkDB.isEmpty()) {
+ loadConfiguration();
+ }
}
/**
// In the Global instance case the containerName is empty
this.containerName = "";
}
+ fileName = ROOT + FILENAME + "_" + containerName + ".conf";
startUp();
}
// IfNBNetworkCRUD methods
+ @Override
public boolean networkExists(String uuid) {
return networkDB.containsKey(uuid);
}
+ @Override
public NeutronNetwork getNetwork(String uuid) {
if (!networkExists(uuid))
return null;
return networkDB.get(uuid);
}
+ @Override
public List<NeutronNetwork> getAllNetworks() {
Set<NeutronNetwork> allNetworks = new HashSet<NeutronNetwork>();
for (Entry<String, NeutronNetwork> entry : networkDB.entrySet()) {
return ans;
}
+ @Override
public boolean addNetwork(NeutronNetwork input) {
if (networkExists(input.getID()))
return false;
return true;
}
+ @Override
public boolean removeNetwork(String uuid) {
if (!networkExists(uuid))
return false;
return true;
}
+ @Override
public boolean updateNetwork(String uuid, NeutronNetwork delta) {
if (!networkExists(uuid))
return false;
return overwrite(target, delta);
}
+ @Override
public boolean networkInUse(String netUUID) {
if (!networkExists(netUUID))
return true;
return true;
return false;
}
+
+ @SuppressWarnings("unchecked")
+ private void loadConfiguration() {
+ ObjectReader objReader = new ObjectReader();
+ ConcurrentMap<String, NeutronNetwork> confList = (ConcurrentMap<String, NeutronNetwork>)
+ objReader.read(this, fileName);
+
+ if (confList == null) {
+ return;
+ }
+
+ for (String key : confList.keySet()) {
+ networkDB.put(key, confList.get(key));
+ }
+ }
+
+ @Override
+ public Status saveConfiguration() {
+ ObjectWriter objWriter = new ObjectWriter();
+ return objWriter.write(new ConcurrentHashMap<String, NeutronNetwork>(networkDB), fileName);
+ }
+
+ @Override
+ public Object readObject(ObjectInputStream ois) throws FileNotFoundException, IOException, ClassNotFoundException {
+ return ois.readObject();
+ }
+
}
package org.opendaylight.controller.networkconfig.neutron.implementation;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.felix.dm.Component;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
import org.opendaylight.controller.clustering.services.IClusterServices;
+import org.opendaylight.controller.configuration.IConfigurationContainerAware;
import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD;
import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD;
import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet;
import org.opendaylight.controller.networkconfig.neutron.Neutron_IPs;
+import org.opendaylight.controller.sal.utils.GlobalConstants;
+import org.opendaylight.controller.sal.utils.IObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectWriter;
+import org.opendaylight.controller.sal.utils.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class NeutronPortInterface implements INeutronPortCRUD {
+public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationContainerAware,
+ IObjectReader {
private static final Logger logger = LoggerFactory.getLogger(NeutronPortInterface.class);
+ private static String ROOT = GlobalConstants.STARTUPHOME.toString();
+ private static final String FILENAME ="neutron.port";
+ private static String fileName;
private String containerName = null;
private IClusterContainerServices clusterContainerService = null;
private void startUp() {
allocateCache();
retrieveCache();
+ if (portDB.isEmpty()) {
+ loadConfiguration();
+ }
+
}
/**
// In the Global instance case the containerName is empty
containerName = "";
}
+ fileName = ROOT + FILENAME + "_" + containerName + ".conf";
startUp();
}
return null;
}
+ @SuppressWarnings("unchecked")
+ private void loadConfiguration() {
+ ObjectReader objReader = new ObjectReader();
+ ConcurrentMap<String, NeutronPort> confList = (ConcurrentMap<String, NeutronPort>)
+ objReader.read(this, fileName);
+
+ if (confList == null) {
+ return;
+ }
+
+ for (String key : confList.keySet()) {
+ portDB.put(key, confList.get(key));
+ }
+ }
+
+ @Override
+ public Status saveConfiguration() {
+ ObjectWriter objWriter = new ObjectWriter();
+ return objWriter.write(new ConcurrentHashMap<String, NeutronPort>(portDB), fileName);
+ }
+
+ @Override
+ public Object readObject(ObjectInputStream ois) throws FileNotFoundException, IOException, ClassNotFoundException {
+ return ois.readObject();
+ }
+
}
package org.opendaylight.controller.networkconfig.neutron.implementation;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.felix.dm.Component;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
import org.opendaylight.controller.clustering.services.IClusterServices;
+import org.opendaylight.controller.configuration.IConfigurationContainerAware;
import org.opendaylight.controller.networkconfig.neutron.INeutronRouterCRUD;
import org.opendaylight.controller.networkconfig.neutron.NeutronRouter;
+import org.opendaylight.controller.sal.utils.GlobalConstants;
+import org.opendaylight.controller.sal.utils.IObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectWriter;
+import org.opendaylight.controller.sal.utils.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class NeutronRouterInterface implements INeutronRouterCRUD {
+public class NeutronRouterInterface implements INeutronRouterCRUD, IConfigurationContainerAware,
+ IObjectReader {
private static final Logger logger = LoggerFactory.getLogger(NeutronRouterInterface.class);
+ private static String ROOT = GlobalConstants.STARTUPHOME.toString();
+ private static final String FILENAME ="neutron.router";
+ private static String fileName;
private String containerName = null;
private IClusterContainerServices clusterContainerService = null;
private void startUp() {
allocateCache();
retrieveCache();
+ if (routerDB.isEmpty()) {
+ loadConfiguration();
+ }
+
}
/**
// In the Global instance case the containerName is empty
this.containerName = "";
}
+ fileName = ROOT + FILENAME + "_" + containerName + ".conf";
startUp();
}
// IfNBRouterCRUD Interface methods
+ @Override
public boolean routerExists(String uuid) {
return routerDB.containsKey(uuid);
}
+ @Override
public NeutronRouter getRouter(String uuid) {
if (!routerExists(uuid))
return null;
return routerDB.get(uuid);
}
+ @Override
public List<NeutronRouter> getAllRouters() {
Set<NeutronRouter> allRouters = new HashSet<NeutronRouter>();
for (Entry<String, NeutronRouter> entry : routerDB.entrySet()) {
return ans;
}
+ @Override
public boolean addRouter(NeutronRouter input) {
if (routerExists(input.getID()))
return false;
return true;
}
+ @Override
public boolean removeRouter(String uuid) {
if (!routerExists(uuid))
return false;
return true;
}
+ @Override
public boolean updateRouter(String uuid, NeutronRouter delta) {
if (!routerExists(uuid))
return false;
return overwrite(target, delta);
}
+ @Override
public boolean routerInUse(String routerUUID) {
if (!routerExists(routerUUID))
return true;
NeutronRouter target = routerDB.get(routerUUID);
return (target.getInterfaces().size() > 0);
}
+
+ @SuppressWarnings("unchecked")
+ private void loadConfiguration() {
+ ObjectReader objReader = new ObjectReader();
+ ConcurrentMap<String, NeutronRouter> confList = (ConcurrentMap<String, NeutronRouter>)
+ objReader.read(this, fileName);
+
+ if (confList == null) {
+ return;
+ }
+
+ for (String key : confList.keySet()) {
+ routerDB.put(key, confList.get(key));
+ }
+ }
+
+ @Override
+ public Status saveConfiguration() {
+ ObjectWriter objWriter = new ObjectWriter();
+ return objWriter.write(new ConcurrentHashMap<String, NeutronRouter>(routerDB), fileName);
+ }
+
+ @Override
+ public Object readObject(ObjectInputStream ois) throws FileNotFoundException, IOException, ClassNotFoundException {
+ return ois.readObject();
+ }
+
}
package org.opendaylight.controller.networkconfig.neutron.implementation;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.felix.dm.Component;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
import org.opendaylight.controller.clustering.services.IClusterServices;
+import org.opendaylight.controller.configuration.IConfigurationContainerAware;
import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD;
import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces;
import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet;
+import org.opendaylight.controller.sal.utils.GlobalConstants;
+import org.opendaylight.controller.sal.utils.IObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectReader;
+import org.opendaylight.controller.sal.utils.ObjectWriter;
+import org.opendaylight.controller.sal.utils.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class NeutronSubnetInterface implements INeutronSubnetCRUD {
+public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfigurationContainerAware,
+ IObjectReader {
private static final Logger logger = LoggerFactory.getLogger(NeutronSubnetInterface.class);
+ private static String ROOT = GlobalConstants.STARTUPHOME.toString();
+ private static final String FILENAME ="neutron.subnet";
+ private static String fileName;
+
private String containerName = null;
private IClusterContainerServices clusterContainerService = null;
private void startUp() {
allocateCache();
retrieveCache();
+ if (subnetDB.isEmpty()) {
+ loadConfiguration();
+ }
+
}
/**
// In the Global instance case the containerName is empty
this.containerName = "";
}
+ fileName = ROOT + FILENAME + "_" + containerName + ".conf";
startUp();
}
// IfNBSubnetCRUD methods
+ @Override
public boolean subnetExists(String uuid) {
return subnetDB.containsKey(uuid);
}
+ @Override
public NeutronSubnet getSubnet(String uuid) {
if (!subnetExists(uuid))
return null;
return subnetDB.get(uuid);
}
+ @Override
public List<NeutronSubnet> getAllSubnets() {
Set<NeutronSubnet> allSubnets = new HashSet<NeutronSubnet>();
for (Entry<String, NeutronSubnet> entry : subnetDB.entrySet()) {
return ans;
}
+ @Override
public boolean addSubnet(NeutronSubnet input) {
String id = input.getID();
if (subnetExists(id))
return true;
}
+ @Override
public boolean removeSubnet(String uuid) {
if (!subnetExists(uuid))
return false;
return true;
}
+ @Override
public boolean updateSubnet(String uuid, NeutronSubnet delta) {
if (!subnetExists(uuid))
return false;
return overwrite(target, delta);
}
+ @Override
public boolean subnetInUse(String subnetUUID) {
if (!subnetExists(subnetUUID))
return true;
NeutronSubnet target = subnetDB.get(subnetUUID);
return (target.getPortsInSubnet().size() > 0);
}
+
+ @SuppressWarnings("unchecked")
+ private void loadConfiguration() {
+ ObjectReader objReader = new ObjectReader();
+ ConcurrentMap<String, NeutronSubnet> confList = (ConcurrentMap<String, NeutronSubnet>)
+ objReader.read(this, fileName);
+
+ if (confList == null) {
+ return;
+ }
+
+ for (String key : confList.keySet()) {
+ subnetDB.put(key, confList.get(key));
+ }
+ }
+
+ @Override
+ public Status saveConfiguration() {
+ ObjectWriter objWriter = new ObjectWriter();
+ return objWriter.write(new ConcurrentHashMap<String, NeutronSubnet>(subnetDB), fileName);
+ }
+
+ @Override
+ public Object readObject(ObjectInputStream ois) throws FileNotFoundException, IOException, ClassNotFoundException {
+ return ois.readObject();
+ }
+
}
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronFloatingIP {
+public class NeutronFloatingIP implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@XmlRootElement(name = "network")
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronNetwork {
+public class NeutronNetwork implements Serializable {
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
+ private static final long serialVersionUID = 1L;
+
@XmlElement (name="id")
String networkUUID; // network UUID
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronPort {
+public class NeutronPort implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronRouter {
+public class NeutronRouter implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
@XmlElement (name="id")
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronRouter_Interface {
+public class NeutronRouter_Interface implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronRouter_NetworkReference {
+public class NeutronRouter_NetworkReference implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronSubnet {
+public class NeutronSubnet implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronSubnet_HostRoute {
+public class NeutronSubnet_HostRoute implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class NeutronSubnet_IPAllocationPool {
+public class NeutronSubnet_IPAllocationPool implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes
@XmlElement(name="end")
String poolEnd;
- public NeutronSubnet_IPAllocationPool() { }
+ public NeutronSubnet_IPAllocationPool() {
+ }
public NeutronSubnet_IPAllocationPool(String lowAddress, String highAddress) {
poolStart = lowAddress;
package org.opendaylight.controller.networkconfig.neutron;
+import java.io.Serializable;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
-public class Neutron_IPs {
+public class Neutron_IPs implements Serializable {
+ private static final long serialVersionUID = 1L;
+
// See OpenStack Network API v2.0 Reference for description of
// annotated attributes