Fix for container directory creation/deletion in startup without saving config
[controller.git] / opendaylight / configuration / implementation / src / main / java / org / opendaylight / controller / configuration / internal / ContainerConfigurationService.java
index 5f1db6b597d707c649b5d094ae15a1a19e62b5d7..3e067254edb721cd6e5b7adb109c1e96badbadb2 100644 (file)
@@ -9,21 +9,30 @@
 
 package org.opendaylight.controller.configuration.internal;
 
+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,22 +43,20 @@ import org.slf4j.LoggerFactory;
  *
  * @brief  Backend functionality for all ConfigurationService related tasks.
  *
- *
  */
 
-public class ContainerConfigurationService implements IConfigurationContainerService, IConfigurationAware,
-        ICacheUpdateAware<ConfigurationEvent, String> {
+public class ContainerConfigurationService implements IConfigurationContainerService,
+        IConfigurationAware, ICacheUpdateAware<ConfigurationEvent, String> {
     public static final String CONTAINER_SAVE_EVENT_CACHE = "config.container.event.save";
     private static final Logger logger = LoggerFactory.getLogger(ContainerConfigurationService.class);
     private IClusterContainerServices clusterServices;
     private ConcurrentMap <ConfigurationEvent, String> 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<IConfigurationContainerAware> configurationAwareList = Collections
             .synchronizedSet(new HashSet<IConfigurationContainerAware>());
+    private ObjectReader objReader;
+    private ObjectWriter objWriter;
 
     public void addConfigurationContainerAware(
             IConfigurationContainerAware configurationAware) {
@@ -79,12 +86,18 @@ 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);
     }
 
     public void start() {
         allocateCache();
         retrieveCache();
+        objReader = new ObjectReader();
+        objWriter = new ObjectWriter();
     }
 
     public void destroy() {
@@ -92,9 +105,22 @@ public class ContainerConfigurationService implements IConfigurationContainerSer
         this.configurationAwareList.clear();
     }
 
+    /**
+     * Function called by the dependency manager before Container is Stopped and Destroyed.
+     */
+    public void containerStop() {
+        // 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());
 
@@ -171,4 +197,26 @@ public class ContainerConfigurationService implements IConfigurationContainerSer
             logger.error("Failed to retrieve configuration Cache");
         }
     }
+
+    @Override
+    public Status persistConfiguration(List<ConfigurationObject> config, String fileName) {
+        String destination = String.format("%s%s", root, fileName);
+        return objWriter.write(config, destination);
+    }
+
+    @Override
+    public List<ConfigurationObject> 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.<ConfigurationObject> emptyList();
+        }
+        if (obj instanceof ConcurrentMap) {
+            return new ArrayList<ConfigurationObject>(((ConcurrentMap)obj).values());
+        }
+        return (List<ConfigurationObject>) obj;
+    }
 }