From 0779bbaa14a81905ac2afbfa87d99e80de993f1a Mon Sep 17 00:00:00 2001 From: Yevgeny Khodorkovsky Date: Tue, 18 Feb 2014 19:16:15 -0800 Subject: [PATCH] ConfigurationService to create default config dir - Have ConfigurationService create a default startup config directory, so that container unaware apps/modules can initiate and individual save. - Semantic fixes in IConfigurationContainerService - Bump configuration api rev since methods were added since last rev Change-Id: Ifec274c258859a402f6dad7394c43c28ed162b95 Signed-off-by: Yevgeny Khodorkovsky --- opendaylight/commons/opendaylight/pom.xml | 2 +- opendaylight/configuration/api/pom.xml | 2 +- .../IConfigurationContainerService.java | 18 ++++++++++---- .../configuration/implementation/pom.xml | 2 +- .../internal/ConfigurationService.java | 24 ++++++++++++++----- .../ContainerConfigurationService.java | 24 ++++++++++++++++--- 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/opendaylight/commons/opendaylight/pom.xml b/opendaylight/commons/opendaylight/pom.xml index d32be92fc8..328dfafe3f 100644 --- a/opendaylight/commons/opendaylight/pom.xml +++ b/opendaylight/commons/opendaylight/pom.xml @@ -98,7 +98,7 @@ 0.5.1-SNAPSHOT 0.5.1-SNAPSHOT 0.5.1-SNAPSHOT - 0.4.2-SNAPSHOT + 0.4.3-SNAPSHOT 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT 0.4.2-SNAPSHOT diff --git a/opendaylight/configuration/api/pom.xml b/opendaylight/configuration/api/pom.xml index 97b2d25fc1..8a5cd99a10 100644 --- a/opendaylight/configuration/api/pom.xml +++ b/opendaylight/configuration/api/pom.xml @@ -15,7 +15,7 @@ configuration - 0.4.2-SNAPSHOT + 0.4.3-SNAPSHOT bundle 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 ee571b83e1..b8461ce3b3 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 @@ -15,10 +15,20 @@ package org.opendaylight.controller.configuration; public interface IConfigurationContainerService extends IConfigurationServiceCommon { /** - * Bundle will call this function to ask ContainerConfigurationService to provide the - * directory location of container + * This function returns the path to the configuration directory of the + * current container. * - * @return The path to active container directory + * @return The path to active container's configuration directory */ - String getConfigurationRoot(); + public String getConfigurationRoot(); + + /** + * Function checks whether there exists a saved configuration for this + * container (This is essentially checking whether the container's root + * configuration directory exists) + * + * @return True iff container config has been saved at least once + */ + public boolean hasBeenSaved(); + } diff --git a/opendaylight/configuration/implementation/pom.xml b/opendaylight/configuration/implementation/pom.xml index 8259243fdc..0846dc58a3 100644 --- a/opendaylight/configuration/implementation/pom.xml +++ b/opendaylight/configuration/implementation/pom.xml @@ -15,7 +15,7 @@ configuration.implementation - 0.4.2-SNAPSHOT + 0.4.3-SNAPSHOT bundle 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 4c0f3a2da5..dd73675070 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 @@ -85,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() { @@ -112,7 +115,7 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate List containerList = new ArrayList(); for (IConfigurationAware configurationAware : this.configurationAwareList) { if (configurationAware instanceof IConfigurationContainerService) { - String containerFilePath = ((ContainerConfigurationService)configurationAware).getConfigurationRoot(); + String containerFilePath = ((IConfigurationContainerService)configurationAware).getConfigurationRoot(); containerList.add(containerFilePath); } } @@ -120,12 +123,21 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate } 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); + 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()); } } 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 3e067254ed..a36d4cc6d7 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,6 +9,7 @@ package org.opendaylight.controller.configuration.internal; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Dictionary; @@ -57,6 +58,7 @@ public class ContainerConfigurationService implements IConfigurationContainerSer .synchronizedSet(new HashSet()); private ObjectReader objReader; private ObjectWriter objWriter; + private String containerName; public void addConfigurationContainerAware( IConfigurationContainerAware configurationAware) { @@ -88,7 +90,7 @@ public class ContainerConfigurationService implements IConfigurationContainerSer void init(Component c) { Dictionary props = c.getServiceProperties(); - String containerName = (props != null) ? (String) props.get("containerName") : + containerName = (props != null) ? (String) props.get("containerName") : GlobalConstants.DEFAULT.toString(); root = String.format("%s%s/", GlobalConstants.STARTUPHOME.toString(), containerName); } @@ -127,13 +129,14 @@ public class ContainerConfigurationService implements IConfigurationContainerSer Status status = configurationAware.saveConfiguration(); if (!status.isSuccess()) { success = false; - logger.warn("Failed to save config for {}", configurationAware.getClass().getSimpleName()); + logger.warn("Failed to save config for {} ({})", configurationAware.getClass().getSimpleName(), + status.getDescription()); } } 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 one or more configurations"); } } @@ -200,6 +203,10 @@ public class ContainerConfigurationService implements IConfigurationContainerSer @Override public Status persistConfiguration(List config, String fileName) { + if (!hasBeenSaved()) { + return new Status(StatusCode.NOTALLOWED, + String.format("Container %s has not been saved yet", containerName)); + } String destination = String.format("%s%s", root, fileName); return objWriter.write(config, destination); } @@ -219,4 +226,15 @@ public class ContainerConfigurationService implements IConfigurationContainerSer } return (List) obj; } + + @Override + public boolean hasBeenSaved() { + try { + File configRoot = new File(this.getConfigurationRoot()); + return configRoot.exists(); + } catch (Exception e) { + return false; + } + + } } -- 2.36.6