From: Tomas Olvecky Date: Wed, 27 Nov 2013 12:52:20 +0000 (+0100) Subject: Add config-persister-directory-adapter. X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~306^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=9f8c38b083e9244b1628aad73c05c0e768772640 Add config-persister-directory-adapter. This implementation reads initial configuration from a directory. It can combine multiple files into one snapshot to be sent to netconf. It does not support writing when configuration changes. Change-Id: I6d92ce6a7221c424f64b2fe07b61fee30e9590f0 Signed-off-by: Tomas Olvecky --- diff --git a/opendaylight/config/config-persister-directory-adapter/pom.xml b/opendaylight/config/config-persister-directory-adapter/pom.xml new file mode 100644 index 0000000000..b2da71eea2 --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + config-subsystem + org.opendaylight.controller + 0.2.3-SNAPSHOT + .. + + config-persister-directory-adapter + ${project.artifactId} + bundle + + + + + ${project.groupId} + config-persister-api + + + org.apache.commons + commons-lang3 + + + com.google.guava + guava + + + org.slf4j + slf4j-api + + + commons-io + commons-io + + + + + org.opendaylight.bgpcep + mockito-configuration + test + + + + + + + + + org.codehaus.groovy.maven + gmaven-plugin + + + generate-sources + + execute + + + + System.setProperty("osgiversion", "${project.version}".replace('-', '.')) + + + + + + + org.apache.felix + maven-bundle-plugin + + + ${project.groupId}.config-persister-impl;bundle-version=${osgiversion} + + org.opendaylight.controller.config.persister.storage.adapter + + + com.google.common.base, + com.google.common.io, + org.apache.commons.io, + org.opendaylight.controller.config.persist.api, + org.slf4j + + + + + + + + diff --git a/opendaylight/config/config-persister-directory-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryPersister.java b/opendaylight/config/config-persister-directory-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryPersister.java new file mode 100644 index 0000000000..cf4ef98bdc --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryPersister.java @@ -0,0 +1,177 @@ +/* + * 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.directory; + +import com.google.common.base.Charsets; +import com.google.common.base.Optional; +import com.google.common.io.Files; +import org.apache.commons.io.IOUtils; +import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder; +import org.opendaylight.controller.config.persist.api.Persister; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; + +public class DirectoryPersister implements Persister { + private static final Logger logger = LoggerFactory.getLogger(DirectoryPersister.class); + private static final Charset ENCODING = Charsets.UTF_8; + + static final String MODULES_START = "//MODULES START"; + static final String SERVICES_START = "//SERVICES START"; + static final String CAPABILITIES_START = "//CAPABILITIES START"; + + + private final File storage; + private final String header, middle, footer; + + public DirectoryPersister(File storage) { + checkArgument(storage.exists() && storage.isDirectory(), "Storage directory does not exist: " + storage); + this.storage = storage; + header = readResource("header.txt"); + middle = readResource("middle.txt"); + footer = readResource("footer.txt"); + + } + + private static String readResource(String resource) { + try { + return IOUtils.toString(DirectoryPersister.class.getResourceAsStream("/" + resource)); + } catch (IOException e) { + throw new IllegalStateException("Cannot load " + resource, e); + } + } + + @Override + public void persistConfig(ConfigSnapshotHolder holder) throws IOException { + throw new UnsupportedOperationException("This adapter is read only. Please set readonly=true on " + getClass()); + } + + @Override + public Optional loadLastConfig() throws IOException { + File[] filesArray = storage.listFiles(); + if (filesArray.length == 0) { + return Optional.absent(); + } + List sortedFiles = new ArrayList<>(Arrays.asList(filesArray)); + Collections.sort(sortedFiles); + // combine all found files + + SortedSet combinedCapabilities = new TreeSet<>(); + StringBuilder modulesBuilder = new StringBuilder(), servicesBuilder = new StringBuilder(); + for (File file : sortedFiles) { + logger.trace("Adding file '{}' to combined result", file); + + final MyLineProcessor lineProcessor = new MyLineProcessor(); + Files.readLines(file, ENCODING, lineProcessor); + + modulesBuilder.append(lineProcessor.getModules()); + servicesBuilder.append(lineProcessor.getServices()); + combinedCapabilities.addAll(lineProcessor.getCapabilities()); + } + String combinedSnapshot = header + modulesBuilder.toString() + middle + servicesBuilder.toString() + footer; + ConfigSnapshotHolder result = new ConfigSnapshotHolderImpl(combinedSnapshot, combinedCapabilities); + return Optional.of(result); + } + + + @Override + public void close() { + + } + + @Override + public String toString() { + return "FileStorageAdapter [storage=" + storage + "]"; + } +} + +class MyLineProcessor implements com.google.common.io.LineProcessor { + + private boolean inModules, inServices, inCapabilities; + private final StringBuffer modulesBuffer = new StringBuffer(), servicesBuilder = new StringBuffer(); + private final SortedSet caps = new TreeSet<>(); + + @Override + public String getResult() { + return null; + } + + @Override + public boolean processLine(String line) throws IOException { + + String lineWithNewLine = line + System.lineSeparator(); + if (line.equals(DirectoryPersister.MODULES_START)) { + checkState(inModules == false && inServices == false && inCapabilities == false); + inModules = true; + } else if (line.equals(DirectoryPersister.SERVICES_START)) { + checkState(inModules == true && inServices == false && inCapabilities == false); + inModules = false; + inServices = true; + } else if (line.equals(DirectoryPersister.CAPABILITIES_START)) { + checkState(inModules == false && inServices == true && inCapabilities == false); + inServices = false; + inCapabilities = true; + } else if (inModules) { + modulesBuffer.append(lineWithNewLine); + } else if (inServices) { + servicesBuilder.append(lineWithNewLine); + } else { + caps.add(line); + } + return true; + } + + String getModules() { + checkState(inCapabilities); + return modulesBuffer.toString(); + } + + String getServices() { + checkState(inCapabilities); + return servicesBuilder.toString(); + } + + SortedSet getCapabilities() { + checkState(inCapabilities); + return caps; + } + +} + +class ConfigSnapshotHolderImpl implements ConfigSnapshotHolder { + + private final String snapshot; + private final SortedSet caps; + + public ConfigSnapshotHolderImpl(String configSnapshot, SortedSet capabilities) { + this.snapshot = configSnapshot; + this.caps = capabilities; + } + + @Override + public String getConfigSnapshot() { + return snapshot; + } + + @Override + public SortedSet getCapabilities() { + return caps; + } +} diff --git a/opendaylight/config/config-persister-directory-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryStorageAdapter.java b/opendaylight/config/config-persister-directory-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryStorageAdapter.java new file mode 100644 index 0000000000..69c8fba9da --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryStorageAdapter.java @@ -0,0 +1,39 @@ +/* + * 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.directory; + +import com.google.common.base.Preconditions; +import org.opendaylight.controller.config.persist.api.Persister; +import org.opendaylight.controller.config.persist.api.PropertiesProvider; +import org.opendaylight.controller.config.persist.api.StorageAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; + +/** + * StorageAdapter that retrieves initial configuration from a directory. If multiple files are present, snapshot and + * required capabilities will be merged together. Writing to this persister is not supported. + */ +public class DirectoryStorageAdapter implements StorageAdapter { + private static final Logger logger = LoggerFactory.getLogger(DirectoryStorageAdapter.class); + + public static final String DIRECTORY_STORAGE_PROP = "directoryStorage"; + + + @Override + public Persister instantiate(PropertiesProvider propertiesProvider) { + String fileStorageProperty = propertiesProvider.getProperty(DIRECTORY_STORAGE_PROP); + Preconditions.checkNotNull(fileStorageProperty, "Unable to find " + propertiesProvider.getFullKeyForReporting(DIRECTORY_STORAGE_PROP)); + File storage = new File(fileStorageProperty); + logger.debug("Using {}", storage); + return new DirectoryPersister(storage); + } + +} diff --git a/opendaylight/config/config-persister-directory-adapter/src/main/resources/footer.txt b/opendaylight/config/config-persister-directory-adapter/src/main/resources/footer.txt new file mode 100644 index 0000000000..d4dcc62822 --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/main/resources/footer.txt @@ -0,0 +1,2 @@ + + diff --git a/opendaylight/config/config-persister-directory-adapter/src/main/resources/header.txt b/opendaylight/config/config-persister-directory-adapter/src/main/resources/header.txt new file mode 100644 index 0000000000..90ed41c3da --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/main/resources/header.txt @@ -0,0 +1,2 @@ + + diff --git a/opendaylight/config/config-persister-directory-adapter/src/main/resources/middle.txt b/opendaylight/config/config-persister-directory-adapter/src/main/resources/middle.txt new file mode 100644 index 0000000000..f728cfdd95 --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/main/resources/middle.txt @@ -0,0 +1,2 @@ + + diff --git a/opendaylight/config/config-persister-directory-adapter/src/test/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryStorageAdapterTest.java b/opendaylight/config/config-persister-directory-adapter/src/test/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryStorageAdapterTest.java new file mode 100644 index 0000000000..53ab4c210e --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/test/java/org/opendaylight/controller/config/persist/storage/directory/DirectoryStorageAdapterTest.java @@ -0,0 +1,91 @@ +/* + * 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.directory; + +import com.google.common.base.Optional; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder; + +import java.io.File; +import java.io.IOException; +import java.util.SortedSet; +import java.util.TreeSet; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class DirectoryStorageAdapterTest { + DirectoryPersister tested; + SortedSet expectedCapabilities; + String expectedSnapshot; + + @Before + public void setUp() throws Exception { + expectedCapabilities = new TreeSet<>(IOUtils.readLines(getClass().getResourceAsStream("/expectedCapabilities.txt"))); + expectedSnapshot = IOUtils.toString(getClass().getResourceAsStream("/expectedSnapshot.xml")); + } + + @Test + public void testEmptyDirectory() throws Exception { + File folder = new File("target/emptyFolder"); + folder.mkdir(); + tested = new DirectoryPersister((folder)); + assertEquals(Optional.absent(), tested.loadLastConfig()); + + try { + tested.persistConfig(new ConfigSnapshotHolder() { + @Override + public String getConfigSnapshot() { + throw new RuntimeException(); + } + + @Override + public SortedSet getCapabilities() { + throw new RuntimeException(); + } + }); + fail(); + } catch (UnsupportedOperationException e) { + + } + } + + private File getFolder(String folderName) { + File result = new File(("src/test/resources/" + + folderName).replace("/", File.separator)); + assertTrue(result + " is not a directory", result.isDirectory()); + return result; + } + + @Test + public void testOneFile() throws Exception { + File folder = getFolder("oneFile"); + tested = new DirectoryPersister((folder)); + assertExpected(); + } + + private void assertExpected() throws IOException { + Optional maybeResult = tested.loadLastConfig(); + assertTrue(maybeResult.isPresent()); + ConfigSnapshotHolder result = maybeResult.get(); + assertEquals(expectedCapabilities, result.getCapabilities()); + assertEquals(expectedSnapshot, result.getConfigSnapshot()); + } + + @Test + public void testTwoFiles() throws Exception { + File folder = getFolder("twoFiles"); + tested = new DirectoryPersister((folder)); + assertExpected(); + } + +} diff --git a/opendaylight/config/config-persister-directory-adapter/src/test/resources/expectedCapabilities.txt b/opendaylight/config/config-persister-directory-adapter/src/test/resources/expectedCapabilities.txt new file mode 100644 index 0000000000..84c85b740c --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/test/resources/expectedCapabilities.txt @@ -0,0 +1,20 @@ +urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:threadpool?module=threadpool&revision=2013-04-09 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05 +urn:ietf:params:netconf:capability:candidate:1.0 +urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04 +urn:opendaylight:params:xml:ns:yang:controller:netty:eventexecutor?module=netty-event-executor&revision=2013-11-12 +urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28 +urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24 +urn:ietf:params:netconf:capability:rollback-on-error:1.0 +urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24 +urn:opendaylight:params:xml:ns:yang:controller:threadpool:impl?module=threadpool-impl&revision=2013-04-05 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16 +urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09 +urn:opendaylight:params:xml:ns:yang:iana?module=iana&revision=2013-08-16 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:ieee754?module=ieee754&revision=2013-08-19 diff --git a/opendaylight/config/config-persister-directory-adapter/src/test/resources/expectedSnapshot.xml b/opendaylight/config/config-persister-directory-adapter/src/test/resources/expectedSnapshot.xml new file mode 100644 index 0000000000..a6a57d704a --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/test/resources/expectedSnapshot.xml @@ -0,0 +1,103 @@ + + + + prefix:schema-service-singleton + yang-schema-service + + + prefix:hash-map-data-store + hash-map-data-store + + + prefix:dom-broker-impl + dom-broker + + dom:dom-data-store + ref_hash-map-data-store + + + + prefix:binding-broker-impl + binding-broker-impl + + binding:binding-notification-service + ref_binding-notification-broker + + + binding:binding-data-broker + ref_binding-data-broker + + + + prefix:runtime-generated-mapping + runtime-mapping-singleton + + + prefix:binding-notification-broker + binding-notification-broker + + + prefix:binding-data-broker + binding-data-broker + + dom:dom-broker-osgi-registry + ref_dom-broker + + + binding:binding-dom-mapping-service + ref_runtime-mapping-singleton + + + + + + dom:schema-service + + ref_yang-schema-service + /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service'] + + + + binding:binding-notification-service + + ref_binding-notification-broker + /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker'] + + + + dom:dom-data-store + + ref_hash-map-data-store + /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store'] + + + + binding:binding-broker-osgi-registry + + ref_binding-broker-impl + /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl'] + + + + binding-impl:binding-dom-mapping-service + + ref_runtime-mapping-singleton + /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton'] + + + + dom:dom-broker-osgi-registry + + ref_dom-broker + /config/modules/module[name='dom-broker-impl']/instance[name='dom-broker'] + + + + binding:binding-data-broker + + ref_binding-data-broker + /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker'] + + + + diff --git a/opendaylight/config/config-persister-directory-adapter/src/test/resources/oneFile/controller.config.txt b/opendaylight/config/config-persister-directory-adapter/src/test/resources/oneFile/controller.config.txt new file mode 100644 index 0000000000..99b4cb9891 --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/test/resources/oneFile/controller.config.txt @@ -0,0 +1,120 @@ +//MODULES START + + prefix:schema-service-singleton + yang-schema-service + + + prefix:hash-map-data-store + hash-map-data-store + + + prefix:dom-broker-impl + dom-broker + + dom:dom-data-store + ref_hash-map-data-store + + + + prefix:binding-broker-impl + binding-broker-impl + + binding:binding-notification-service + ref_binding-notification-broker + + + binding:binding-data-broker + ref_binding-data-broker + + + + prefix:runtime-generated-mapping + runtime-mapping-singleton + + + prefix:binding-notification-broker + binding-notification-broker + + + prefix:binding-data-broker + binding-data-broker + + dom:dom-broker-osgi-registry + ref_dom-broker + + + binding:binding-dom-mapping-service + ref_runtime-mapping-singleton + + +//SERVICES START + + dom:schema-service + + ref_yang-schema-service + /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service'] + + + + binding:binding-notification-service + + ref_binding-notification-broker + /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker'] + + + + dom:dom-data-store + + ref_hash-map-data-store + /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store'] + + + + binding:binding-broker-osgi-registry + + ref_binding-broker-impl + /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl'] + + + + binding-impl:binding-dom-mapping-service + + ref_runtime-mapping-singleton + /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton'] + + + + dom:dom-broker-osgi-registry + + ref_dom-broker + /config/modules/module[name='dom-broker-impl']/instance[name='dom-broker'] + + + + binding:binding-data-broker + + ref_binding-data-broker + /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker'] + + +//CAPABILITIES START +urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:threadpool?module=threadpool&revision=2013-04-09 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05 +urn:ietf:params:netconf:capability:candidate:1.0 +urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04 +urn:opendaylight:params:xml:ns:yang:controller:netty:eventexecutor?module=netty-event-executor&revision=2013-11-12 +urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28 +urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24 +urn:ietf:params:netconf:capability:rollback-on-error:1.0 +urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24 +urn:opendaylight:params:xml:ns:yang:controller:threadpool:impl?module=threadpool-impl&revision=2013-04-05 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16 +urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09 +urn:opendaylight:params:xml:ns:yang:iana?module=iana&revision=2013-08-16 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:ieee754?module=ieee754&revision=2013-08-19 diff --git a/opendaylight/config/config-persister-directory-adapter/src/test/resources/twoFiles/controller.config1.txt b/opendaylight/config/config-persister-directory-adapter/src/test/resources/twoFiles/controller.config1.txt new file mode 100644 index 0000000000..6ae48fb84b --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/test/resources/twoFiles/controller.config1.txt @@ -0,0 +1,82 @@ +//MODULES START + + prefix:schema-service-singleton + yang-schema-service + + + prefix:hash-map-data-store + hash-map-data-store + + + prefix:dom-broker-impl + dom-broker + + dom:dom-data-store + ref_hash-map-data-store + + + + prefix:binding-broker-impl + binding-broker-impl + + binding:binding-notification-service + ref_binding-notification-broker + + + binding:binding-data-broker + ref_binding-data-broker + + + + prefix:runtime-generated-mapping + runtime-mapping-singleton + + + prefix:binding-notification-broker + binding-notification-broker + +//SERVICES START + + dom:schema-service + + ref_yang-schema-service + /config/modules/module[name='schema-service-singleton']/instance[name='yang-schema-service'] + + + + binding:binding-notification-service + + ref_binding-notification-broker + /config/modules/module[name='binding-notification-broker']/instance[name='binding-notification-broker'] + + + + dom:dom-data-store + + ref_hash-map-data-store + /config/modules/module[name='hash-map-data-store']/instance[name='hash-map-data-store'] + + + + binding:binding-broker-osgi-registry + + ref_binding-broker-impl + /config/modules/module[name='binding-broker-impl']/instance[name='binding-broker-impl'] + + + + binding-impl:binding-dom-mapping-service + + ref_runtime-mapping-singleton + /config/modules/module[name='runtime-generated-mapping']/instance[name='runtime-mapping-singleton'] + + + + dom:dom-broker-osgi-registry + + ref_dom-broker + /config/modules/module[name='dom-broker-impl']/instance[name='dom-broker'] + + +//CAPABILITIES START +urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27 diff --git a/opendaylight/config/config-persister-directory-adapter/src/test/resources/twoFiles/controller.config2.txt b/opendaylight/config/config-persister-directory-adapter/src/test/resources/twoFiles/controller.config2.txt new file mode 100644 index 0000000000..ad9138f5d2 --- /dev/null +++ b/opendaylight/config/config-persister-directory-adapter/src/test/resources/twoFiles/controller.config2.txt @@ -0,0 +1,41 @@ +//MODULES START + + prefix:binding-data-broker + binding-data-broker + + dom:dom-broker-osgi-registry + ref_dom-broker + + + binding:binding-dom-mapping-service + ref_runtime-mapping-singleton + + +//SERVICES START + + binding:binding-data-broker + + ref_binding-data-broker + /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker'] + + +//CAPABILITIES START +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:threadpool?module=threadpool&revision=2013-04-09 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom?module=opendaylight-md-sal-dom&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:config?module=config&revision=2013-04-05 +urn:ietf:params:netconf:capability:candidate:1.0 +urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04 +urn:opendaylight:params:xml:ns:yang:controller:netty:eventexecutor?module=netty-event-executor&revision=2013-11-12 +urn:ietf:params:xml:ns:yang:rpc-context?module=rpc-context&revision=2013-06-17 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&revision=2013-10-28 +urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&revision=2010-09-24 +urn:ietf:params:netconf:capability:rollback-on-error:1.0 +urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24 +urn:opendaylight:params:xml:ns:yang:controller:threadpool:impl?module=threadpool-impl&revision=2013-04-05 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16 +urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09 +urn:opendaylight:params:xml:ns:yang:iana?module=iana&revision=2013-08-16 +urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 +urn:opendaylight:params:xml:ns:yang:ieee754?module=ieee754&revision=2013-08-19 diff --git a/opendaylight/config/pom.xml b/opendaylight/config/pom.xml index 22be6f162b..c1eef701da 100644 --- a/opendaylight/config/pom.xml +++ b/opendaylight/config/pom.xml @@ -35,6 +35,7 @@ netty-threadgroup-config netty-event-executor-config netty-timer-config + config-persister-directory-adapter diff --git a/opendaylight/distribution/opendaylight/pom.xml b/opendaylight/distribution/opendaylight/pom.xml index 5f2651659d..d1b1e73636 100644 --- a/opendaylight/distribution/opendaylight/pom.xml +++ b/opendaylight/distribution/opendaylight/pom.xml @@ -216,7 +216,11 @@ config-persister-file-adapter ${config.version} - + + org.opendaylight.controller + config-persister-directory-adapter + ${config.version} + diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini index 24e6cc061a..b5bdb9e903 100644 --- a/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/config.ini @@ -20,10 +20,14 @@ netconf.tcp.port=8383 netconf.ssh.address=0.0.0.0 netconf.ssh.port=1830 -netconf.config.persister.active=1 - -netconf.config.persister.1.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter -netconf.config.persister.1.properties.fileStorage=configuration/controller.config +netconf.config.persister.active=1,2 +# read startup configuration +netconf.config.persister.1.storageAdapterClass=org.opendaylight.controller.config.persist.storage.directory.DirectoryStorageAdapter +netconf.config.persister.1.properties.directoryStorage=configuration/initial/ +netconf.config.persister.1.readonly=true + +netconf.config.persister.2.storageAdapterClass=org.opendaylight.controller.config.persist.storage.file.FileStorageAdapter +netconf.config.persister.2.properties.fileStorage=configuration/current/controller.currentconfig.txt yangstore.blacklist=.*controller.model.* diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/controller-config.1.txt b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/controller-config.1.txt new file mode 100644 index 0000000000..689b45ad3b --- /dev/null +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/controller-config.1.txt @@ -0,0 +1,5 @@ +//MODULES START +//SERVICES START + +//CAPABILITIES START +urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16 diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/controller.config b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/controller-config.2.txt similarity index 94% rename from opendaylight/distribution/opendaylight/src/main/resources/configuration/controller.config rename to opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/controller-config.2.txt index 947c15b35c..acae8866ce 100644 --- a/opendaylight/distribution/opendaylight/src/main/resources/configuration/controller.config +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/controller-config.2.txt @@ -1,6 +1,4 @@ -//START OF CONFIG-LAST - - +//MODULES START prefix:schema-service-singleton yang-schema-service @@ -49,8 +47,7 @@ ref_runtime-mapping-singleton - - +//SERVICES START dom:schema-service @@ -100,10 +97,7 @@ /config/modules/module[name='binding-data-broker']/instance[name='binding-data-broker'] - - - -//END OF SNAPSHOT +//CAPABILITIES START urn:opendaylight:l2:types?module=opendaylight-l2-types&revision=2013-08-27 urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 urn:opendaylight:params:xml:ns:yang:controller:threadpool?module=threadpool&revision=2013-04-09 @@ -119,9 +113,7 @@ urn:ietf:params:netconf:capability:rollback-on-error:1.0 urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types&revision=2010-09-24 urn:opendaylight:params:xml:ns:yang:controller:threadpool:impl?module=threadpool-impl&revision=2013-04-05 urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:impl?module=opendaylight-sal-dom-broker-impl&revision=2013-10-28 -urn:opendaylight:params:xml:ns:yang:controller:logback:config?module=config-logging&revision=2013-07-16 urn:opendaylight:yang:extension:yang-ext?module=yang-ext&revision=2013-07-09 urn:opendaylight:params:xml:ns:yang:iana?module=iana&revision=2013-08-16 urn:opendaylight:params:xml:ns:yang:controller:md:sal:common?module=opendaylight-md-sal-common&revision=2013-10-28 urn:opendaylight:params:xml:ns:yang:ieee754?module=ieee754&revision=2013-08-19 -//END OF CONFIG diff --git a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolder.java b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolder.java index 0e084e9f6d..d9c5dfaded 100644 --- a/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolder.java +++ b/opendaylight/netconf/config-persister-impl/src/main/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolder.java @@ -1,10 +1,9 @@ -/** - * @author Tomas Olvecky +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * - * 11 2013 - * - * Copyright (c) 2013 by Cisco Systems, Inc. - * All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.netconf.persist.impl; diff --git a/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolderTest.java b/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolderTest.java index 5b0ddbb174..d91712f347 100644 --- a/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolderTest.java +++ b/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/CapabilityStrippingConfigSnapshotHolderTest.java @@ -1,62 +1,61 @@ -/** - * @author Tomas Olvecky +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * - * 11 2013 - * - * Copyright (c) 2013 by Cisco Systems, Inc. - * All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.netconf.persist.impl; -//import com.google.common.collect.Sets; -//import org.apache.commons.io.IOUtils; -//import org.junit.Test; -//import org.opendaylight.controller.netconf.persist.impl.osgi.ConfigPersisterActivator; -//import org.opendaylight.controller.netconf.util.xml.XmlUtil; -//import org.w3c.dom.Element; -// -//import java.io.IOException; -//import java.util.Collections; -//import java.util.HashSet; -//import java.util.Set; -//import java.util.regex.Pattern; - -//import static org.junit.Assert.assertEquals; +import com.google.common.collect.Sets; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.opendaylight.controller.netconf.persist.impl.osgi.ConfigPersisterActivator; +import org.opendaylight.controller.netconf.util.xml.XmlUtil; +import org.w3c.dom.Element; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +import static org.junit.Assert.assertEquals; public class CapabilityStrippingConfigSnapshotHolderTest { -// @Test -// public void testCapabilityStripping() throws Exception { -// Set allCapabilities = readLines("/capabilities-all.txt"); -// Set expectedCapabilities = readLines("/capabilities-stripped.txt"); -// String snapshotAsString = readToString("/snapshot.xml"); -// Element element = XmlUtil.readXmlToElement(snapshotAsString); -// { -// CapabilityStrippingConfigSnapshotHolder tested = new CapabilityStrippingConfigSnapshotHolder( -// element, allCapabilities, Pattern.compile( -// ConfigPersisterActivator.DEFAULT_IGNORED_REGEX -// )); -// assertEquals(expectedCapabilities, tested.getCapabilities()); -// assertEquals(Collections.emptySet(), tested.getMissingNamespaces()); -// } -// { -// // test regex -// CapabilityStrippingConfigSnapshotHolder tested = new CapabilityStrippingConfigSnapshotHolder( -// element, allCapabilities, Pattern.compile( -// "^bar" -// )); -// assertEquals(expectedCapabilities, tested.getCapabilities()); -// assertEquals(Sets.newHashSet(ConfigPersisterActivator.DEFAULT_IGNORED_REGEX.substring(1)), -// tested.getMissingNamespaces()); -// } -// } -// -// private Set readLines(String fileName) throws IOException { -// return new HashSet<>(IOUtils.readLines(getClass().getResourceAsStream(fileName))); -// } -// -// private String readToString(String fileName) throws IOException { -// return IOUtils.toString(getClass().getResourceAsStream(fileName)); -// } + @Test + public void testCapabilityStripping() throws Exception { + Set allCapabilities = readLines("/capabilities-all.txt"); + Set expectedCapabilities = readLines("/capabilities-stripped.txt"); + String snapshotAsString = readToString("/snapshot.xml"); + Element element = XmlUtil.readXmlToElement(snapshotAsString); + { + CapabilityStrippingConfigSnapshotHolder tested = new CapabilityStrippingConfigSnapshotHolder( + element, allCapabilities, Pattern.compile( + ConfigPersisterActivator.DEFAULT_IGNORED_REGEX + )); + assertEquals(expectedCapabilities, tested.getCapabilities()); + assertEquals(Collections.emptySet(), tested.getMissingNamespaces()); + } + { + // test regex + CapabilityStrippingConfigSnapshotHolder tested = new CapabilityStrippingConfigSnapshotHolder( + element, allCapabilities, Pattern.compile( + "^bar" + )); + assertEquals(expectedCapabilities, tested.getCapabilities()); + assertEquals(Sets.newHashSet(ConfigPersisterActivator.DEFAULT_IGNORED_REGEX.substring(1)), + tested.getMissingNamespaces()); + } + } + + private Set readLines(String fileName) throws IOException { + return new HashSet<>(IOUtils.readLines(getClass().getResourceAsStream(fileName))); + } + + private String readToString(String fileName) throws IOException { + return IOUtils.toString(getClass().getResourceAsStream(fileName)); + } } diff --git a/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/PersisterAggregatorTest.java b/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/PersisterAggregatorTest.java index f387e08a08..1b4031ac57 100644 --- a/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/PersisterAggregatorTest.java +++ b/opendaylight/netconf/config-persister-impl/src/test/java/org/opendaylight/controller/netconf/persist/impl/PersisterAggregatorTest.java @@ -42,7 +42,6 @@ public class PersisterAggregatorTest { TestingPropertiesProvider propertiesProvider; class TestingPropertiesProvider extends PropertiesProviderBaseImpl { - TestingPropertiesProvider() { super(null); }