From b212b6f1705c32374c75ea3c784c441419fa5b9f Mon Sep 17 00:00:00 2001 From: Diti Bhatia Date: Fri, 14 Feb 2014 13:42:42 -0800 Subject: [PATCH] Fix for container directory creation/deletion in startup without saving config Change-Id: I423e7c3ab186af5ea5bd0ab6d42553b4f988e82f Signed-off-by: Diti Bhatia --- .../IConfigurationContainerService.java | 8 +++ .../internal/ConfigurationService.java | 57 +++++++++++++++++-- .../ContainerConfigurationService.java | 33 ++++------- .../internal/ContainerManager.java | 34 ----------- 4 files changed, 72 insertions(+), 60 deletions(-) diff --git a/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationContainerService.java b/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationContainerService.java index 2123f6b9eb..ee571b83e1 100644 --- a/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationContainerService.java +++ b/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationContainerService.java @@ -13,4 +13,12 @@ package org.opendaylight.controller.configuration; * Container configuration service */ public interface IConfigurationContainerService extends IConfigurationServiceCommon { + + /** + * Bundle will call this function to ask ContainerConfigurationService to provide the + * directory location of container + * + * @return The path to active container directory + */ + String getConfigurationRoot(); } 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..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,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; @@ -46,7 +48,7 @@ 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 Object ROOT = GlobalConstants.STARTUPHOME.toString(); + private static final String ROOT = GlobalConstants.STARTUPHOME.toString(); private IClusterGlobalServices clusterServices; private ConcurrentMap configEvent; private Set configurationAwareList = Collections @@ -105,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"); } } 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 9c1d391daa..3e067254ed 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,7 +9,6 @@ package org.opendaylight.controller.configuration.internal; -import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Dictionary; @@ -52,14 +51,10 @@ public class ContainerConfigurationService implements IConfigurationContainerSer private static final Logger logger = LoggerFactory.getLogger(ContainerConfigurationService.class); private IClusterContainerServices clusterServices; private ConcurrentMap containerConfigEvent; - /* - * Collection containing the configuration objects. - * This is configuration world: container names (also the map key) - * are maintained as they were configured by user, same case - */ + // Directory which contains the startup files for this container + private String root; private Set configurationAwareList = Collections .synchronizedSet(new HashSet()); - private String root; private ObjectReader objReader; private ObjectWriter objWriter; @@ -93,14 +88,9 @@ public class ContainerConfigurationService implements IConfigurationContainerSer 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); - } - } + String containerName = (props != null) ? (String) props.get("containerName") : + GlobalConstants.DEFAULT.toString(); + root = String.format("%s%s/", GlobalConstants.STARTUPHOME.toString(), containerName); } public void start() { @@ -119,17 +109,18 @@ public class ContainerConfigurationService implements IConfigurationContainerSer * 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(); + // Do nothing + } + + @Override + public String getConfigurationRoot() { + return root; } @Override public Status saveConfiguration() { boolean success = true; + for (IConfigurationContainerAware configurationAware : configurationAwareList) { logger.trace("Save Config triggered for {}", configurationAware.getClass().getSimpleName()); diff --git a/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/ContainerManager.java b/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/ContainerManager.java index ad897fd689..0fee183b67 100644 --- a/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/ContainerManager.java +++ b/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/ContainerManager.java @@ -9,7 +9,6 @@ package org.opendaylight.controller.containermanager.internal; -import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; @@ -751,26 +750,6 @@ public class ContainerManager extends Authorization implements IContaine return status; } - private void removeComponentsStartUpfiles(String containerName) { - String startupLocation = String.format("./%s", GlobalConstants.STARTUPHOME.toString()); - String containerPrint = String.format("_%s.", containerName.toLowerCase(Locale.ENGLISH)); - - File directory = new File(startupLocation); - String[] fileList = directory.list(); - - logger.trace("Deleting startup configuration files for container {}", containerName); - if (fileList != null) { - for (String fileName : fileList) { - if (fileName.contains(containerPrint)) { - String fullPath = String.format("%s/%s", startupLocation, fileName); - File file = new File(fullPath); - boolean done = file.delete(); - logger.trace("{} {}", (done ? "Deleted: " : "Failed to delete: "), fileName); - } - } - } - } - /** * Create and initialize default all resource group and create association * with default well known users and profiles, if not already learnt from @@ -1013,19 +992,6 @@ public class ContainerManager extends Authorization implements IContaine notifyContainerModeChange(delete, notifyLocal); // Notify listeners notifyContainerAwareListeners(container, delete); - - /* - * This is a quick fix until configuration service becomes the - * centralized configuration management place. Here container manager - * will remove the startup files for all the bundles that are present in - * the container being deleted. Do the cleanup here in Container manger - * as do not want to put this temporary code in Configuration manager - * yet which is ODL. - */ - if (delete) { - // TODO: remove when Config Mgr takes over - removeComponentsStartUpfiles(containerName); - } } private void notifyContainerEntryChangeInternal(String containerName, List ncList, UpdateType update, boolean notifyLocal) { -- 2.36.6