X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fconfiguration%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfiguration%2Finternal%2FConfigurationService.java;h=de7621110e21637b93d1b3531fbe579470b2e6f1;hb=f4bad4be4f0838122b9799d133878877088e870d;hp=e4d55d11fb39e126d2dbb99f0ceb0cb6672d7069;hpb=9cec08e30cb7d7da40d6bb716623c92c1db41f54;p=controller.git 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 e4d55d11fb..de7621110e 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,6 +9,7 @@ package org.opendaylight.controller.configuration.internal; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; @@ -25,6 +26,7 @@ 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.GlobalConstants; import org.opendaylight.controller.sal.utils.IObjectReader; @@ -42,13 +44,13 @@ import org.slf4j.LoggerFactory; * */ -public class ConfigurationService implements IConfigurationService, ICacheUpdateAware { +public class ConfigurationService implements IConfigurationService, ICacheUpdateAware { private static final Logger logger = LoggerFactory .getLogger(ConfigurationService.class); public static final String SAVE_EVENT_CACHE = "config.event.save"; - private static final Object ROOT = GlobalConstants.STARTUPHOME.toString(); + private static final String ROOT = GlobalConstants.STARTUPHOME.toString(); private IClusterGlobalServices clusterServices; - private ConcurrentMap configEvent; + private ConcurrentMap configEvent; private Set configurationAwareList = Collections .synchronizedSet(new HashSet()); private ObjectReader objReader; @@ -83,6 +85,9 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate public void init() { logger.info("ConfigurationService Manager init"); + + // Create the default startup directory, so that container unaware apps can initiate save + createContainerDirectory(ROOT + GlobalConstants.DEFAULT.toString()); } public void start() { @@ -100,31 +105,85 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate @Override public Status saveConfigurations() { if (configEvent != null) { - configEvent.put(ConfigurationEvent.SAVE, ""); + configEvent.put(ConfigurationEvent.SAVE.toString(), ""); } return saveConfigurationsInternal(); } + + private List getContainerDirectoryList() { + List containerList = new ArrayList(); + for (IConfigurationAware configurationAware : this.configurationAwareList) { + if (configurationAware instanceof IConfigurationContainerService) { + String containerFilePath = ((IConfigurationContainerService)configurationAware).getConfigurationRoot(); + containerList.add(containerFilePath); + } + } + return containerList; + } + + private void createContainerDirectory(IConfigurationAware configurationAware) { + String containerFilePath = ((IConfigurationContainerService) configurationAware).getConfigurationRoot(); + createContainerDirectory(containerFilePath); + } + + private void createContainerDirectory(String containerFilePath) { + + try { + if (!new File(containerFilePath).exists()) { + boolean created = new File(containerFilePath).mkdir(); + if (!created) { + logger.error("Failed to create config directory: {}", containerFilePath); + } + } + } catch (Exception e) { + logger.error("Failed to create config directory: {} ({})", containerFilePath, e.getMessage()); + } + } + + 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"); } } @Override - public void entryCreated(ConfigurationEvent key, String cacheName, + public void entryCreated(String key, String cacheName, boolean originLocal) { if (originLocal) { return; @@ -132,18 +191,18 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate } @Override - public void entryUpdated(ConfigurationEvent key, String new_value, + public void entryUpdated(String key, String new_value, String cacheName, boolean originLocal) { if (originLocal) { return; } - if (key == ConfigurationEvent.SAVE) { + if (key.equals(ConfigurationEvent.SAVE.toString())) { saveConfigurationsInternal(); } } @Override - public void entryDeleted(ConfigurationEvent key, String cacheName, + public void entryDeleted(String key, String cacheName, boolean originLocal) { if (originLocal) { return; @@ -171,7 +230,7 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate logger.error("uninitialized clusterServices, can't retrieve cache"); return; } - configEvent = (ConcurrentMap) this.clusterServices.getCache(SAVE_EVENT_CACHE); + configEvent = (ConcurrentMap) this.clusterServices.getCache(SAVE_EVENT_CACHE); if (configEvent == null) { logger.error("Failed to retrieve configuration Cache"); }