X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfiguration%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfiguration%2Finternal%2FContainerConfigurationService.java;h=9c1d391daa7b8e80eec73ce454e30a6b768efe4d;hp=5f1db6b597d707c649b5d094ae15a1a19e62b5d7;hb=31241964f69149641ac3d22f8ff43d09584c36d2;hpb=dad78e1fc8a7c67fa4b88cf09d6a952443462feb diff --git a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java index 5f1db6b597..9c1d391daa 100644 --- a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java +++ b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java @@ -9,21 +9,31 @@ package org.opendaylight.controller.configuration.internal; +import java.io.File; +import java.util.ArrayList; import java.util.Collections; +import java.util.Dictionary; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentMap; +import org.apache.felix.dm.Component; import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; import org.opendaylight.controller.configuration.ConfigurationEvent; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationAware; import org.opendaylight.controller.configuration.IConfigurationContainerAware; import org.opendaylight.controller.configuration.IConfigurationContainerService; +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.opendaylight.controller.sal.utils.StatusCode; import org.slf4j.Logger; @@ -34,11 +44,10 @@ import org.slf4j.LoggerFactory; * * @brief Backend functionality for all ConfigurationService related tasks. * - * */ -public class ContainerConfigurationService implements IConfigurationContainerService, IConfigurationAware, - ICacheUpdateAware { +public class ContainerConfigurationService implements IConfigurationContainerService, + IConfigurationAware, ICacheUpdateAware { public static final String CONTAINER_SAVE_EVENT_CACHE = "config.container.event.save"; private static final Logger logger = LoggerFactory.getLogger(ContainerConfigurationService.class); private IClusterContainerServices clusterServices; @@ -50,6 +59,9 @@ public class ContainerConfigurationService implements IConfigurationContainerSer */ private Set configurationAwareList = Collections .synchronizedSet(new HashSet()); + private String root; + private ObjectReader objReader; + private ObjectWriter objWriter; public void addConfigurationContainerAware( IConfigurationContainerAware configurationAware) { @@ -79,12 +91,23 @@ public class ContainerConfigurationService implements IConfigurationContainerSer } } - public void init() { + void init(Component c) { + Dictionary props = c.getServiceProperties(); + String containerName = (props != null) ? (String) props.get("containerName") : GlobalConstants.DEFAULT.toString(); + root = String.format("%s%s/", GlobalConstants.STARTUPHOME.toString(), containerName); + if (!new File(root).exists()) { + boolean created = new File(root).mkdir(); + if (!created) { + logger.error("Failed to create startup config directory for container {}", containerName); + } + } } public void start() { allocateCache(); retrieveCache(); + objReader = new ObjectReader(); + objWriter = new ObjectWriter(); } public void destroy() { @@ -92,6 +115,18 @@ public class ContainerConfigurationService implements IConfigurationContainerSer this.configurationAwareList.clear(); } + /** + * Function called by the dependency manager before Container is Stopped and Destroyed. + */ + public void containerStop() { + // Remove container directory along with its startup files + File[] files = new File(root).listFiles(); + for (File file : files) { + file.delete(); + } + new File(root).delete(); + } + @Override public Status saveConfiguration() { boolean success = true; @@ -171,4 +206,26 @@ public class ContainerConfigurationService implements IConfigurationContainerSer logger.error("Failed to retrieve configuration Cache"); } } + + @Override + public Status persistConfiguration(List config, String fileName) { + String destination = String.format("%s%s", root, fileName); + return objWriter.write(config, destination); + } + + @Override + public List retrieveConfiguration(IObjectReader reader, String fileName) { + if (!clusterServices.amICoordinator()) { + return Collections.emptyList(); + } + String source = String.format("%s%s", root, fileName); + Object obj = objReader.read(reader, source); + if (obj == null) { + return Collections. emptyList(); + } + if (obj instanceof ConcurrentMap) { + return new ArrayList(((ConcurrentMap)obj).values()); + } + return (List) obj; + } }