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%2FConfigurationService.java;h=4c0f3a2da5f08b409e6c751e9e8828359ce7e850;hp=e6bbcf8eb6cdacfe81232e52201f2588bd91e7d9;hb=fa3bc33c3103f8b52a57954d024e4b390ea01c94;hpb=dad78e1fc8a7c67fa4b88cf09d6a952443462feb diff --git a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java index e6bbcf8eb6..4c0f3a2da5 100644 --- a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java +++ b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java @@ -9,9 +9,12 @@ package org.opendaylight.controller.configuration.internal; +import java.io.File; +import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentMap; @@ -21,10 +24,16 @@ import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterGlobalServices; 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.IConfigurationContainerService; import org.opendaylight.controller.configuration.IConfigurationService; -import org.opendaylight.controller.sal.utils.StatusCode; +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; import org.slf4j.LoggerFactory; @@ -39,10 +48,13 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate private static final Logger logger = LoggerFactory .getLogger(ConfigurationService.class); public static final String SAVE_EVENT_CACHE = "config.event.save"; + private static final String ROOT = GlobalConstants.STARTUPHOME.toString(); private IClusterGlobalServices clusterServices; private ConcurrentMap configEvent; private Set configurationAwareList = Collections .synchronizedSet(new HashSet()); + private ObjectReader objReader; + private ObjectWriter objWriter; public int getConfigurationAwareListSize() { @@ -78,6 +90,8 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate public void start() { allocateCache(); retrieveCache(); + objReader = new ObjectReader(); + objWriter = new ObjectWriter(); } public void destroy() { @@ -93,21 +107,66 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate return saveConfigurationsInternal(); } + + private List getContainerDirectoryList() { + List containerList = new ArrayList(); + for (IConfigurationAware configurationAware : this.configurationAwareList) { + if (configurationAware instanceof IConfigurationContainerService) { + String containerFilePath = ((ContainerConfigurationService)configurationAware).getConfigurationRoot(); + containerList.add(containerFilePath); + } + } + return containerList; + } + + private void createContainerDirectory(IConfigurationAware configurationAware) { + String containerFilePath = ((ContainerConfigurationService) configurationAware).getConfigurationRoot(); + if (!new File(containerFilePath).exists()) { + boolean created = new File(containerFilePath).mkdir(); + if (!created) { + logger.error("Failed to create startup config directory: {}", containerFilePath); + } + } + } + + private void clearStaleContainerDirectories() { + List activeContainers = getContainerDirectoryList(); + for (File file : new File(ROOT).listFiles()) { + if (file.isDirectory() && !activeContainers.contains(file.toPath() + File.separator)) { + logger.trace("Removing directory for container {}", file.getName()); + for (File innerFile : file.listFiles()) { + innerFile.delete(); + } + boolean removed = file.delete(); + if (!removed) { + logger.warn("Failed to remove stale directory: {}", file.getName()); + } + } + } + } + + private Status saveConfigurationsInternal() { boolean success = true; for (IConfigurationAware configurationAware : configurationAwareList) { + if (configurationAware instanceof IConfigurationContainerService) { + // Create directory for new containers + createContainerDirectory(configurationAware); + } Status status = configurationAware.saveConfiguration(); if (!status.isSuccess()) { success = false; - logger.warn("Failed to save config for {}", - configurationAware.getClass().getName()); + logger.warn("Failed to save config for {}", configurationAware.getClass().getName()); } } + // Remove startup directories of containers that were removed from + // the configuration but not saved + clearStaleContainerDirectories(); + if (success) { return new Status(StatusCode.SUCCESS); } else { - return new Status(StatusCode.INTERNALERROR, - "Failed to Save All Configurations"); + return new Status(StatusCode.INTERNALERROR, "Failed to Save All Configurations"); } } @@ -164,4 +223,26 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate 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; + } }