From 9255eb1b0531be05266f52175044464fee30a969 Mon Sep 17 00:00:00 2001 From: Alessandro Boch Date: Mon, 27 Jan 2014 00:11:30 -0800 Subject: [PATCH] Migrate bundles' configuration mgmt to ConfigurationService - Change current logic where read/save config is completely managed by each bundle, with moving it to configuration manager. This decoupling will allow configuration manager to decide how to persist the bundles' configurations to disk, withouth necessarely depend on java serialization as today controlelr does. Also now file names can be static and each bundle does not need to track the container context in the file name (which was lame). This allow controller to erase container startup files on container removal, which was not possible today. - Global and in container configuration services to expose two APIs for the other bundles to retrieve and save their config - Per container startup files organized in directories (directory name = container name) - Container startup directory removed on container removal, and created on container creation if not present Change-Id: I58c283eb796cf2a60466a97162428a8c2ae478ae Signed-off-by: Alessandro Boch --- opendaylight/appauth/pom.xml | 29 ---- opendaylight/arphandler/pom.xml | 8 + opendaylight/configuration/api/pom.xml | 3 +- .../IConfigurationServiceCommon.java | 31 ++++ .../configuration/internal/Activator.java | 3 +- .../internal/ConfigurationService.java | 30 +++- .../ContainerConfigurationService.java | 59 ++++++- opendaylight/containermanager/api/pom.xml | 2 - .../containermanager/implementation/pom.xml | 5 - .../containermanager/internal/Activator.java | 6 + .../internal/ContainerManager.java | 49 +++--- opendaylight/forwarding/staticrouting/pom.xml | 11 +- .../staticrouting/internal/Activator.java | 8 + .../internal/StaticRoutingImplementation.java | 51 +++--- .../forwardingrulesmanager/api/pom.xml | 11 -- .../PortGroupConfig.java | 25 ++- .../implementation/pom.xml | 10 -- .../internal/Activator.java | 5 + .../internal/ForwardingRulesManager.java | 86 ++++------ opendaylight/hosttracker/api/pom.xml | 16 -- .../hosttracker/implementation/pom.xml | 20 --- .../hosttracker/integrationtest/pom.xml | 16 ++ .../neutron/implementation/Activator.java | 21 +++ .../NeutronFloatingIPInterface.java | 64 ++++---- .../NeutronNetworkInterface.java | 66 ++++---- .../implementation/NeutronPortInterface.java | 49 +++--- .../NeutronRouterInterface.java | 64 ++++---- .../NeutronSubnetInterface.java | 64 ++++---- .../networkconfiguration/neutron/pom.xml | 5 + .../neutron/NeutronFloatingIP.java | 4 +- .../networkconfig/neutron/NeutronNetwork.java | 4 +- .../networkconfig/neutron/NeutronPort.java | 4 +- .../networkconfig/neutron/NeutronRouter.java | 4 +- .../networkconfig/neutron/NeutronSubnet.java | 3 +- .../networkconfig/neutron/Neutron_IPs.java | 4 +- opendaylight/northbound/commons/pom.xml | 16 +- .../routing/dijkstra_implementation/pom.xml | 4 + opendaylight/statisticsmanager/api/pom.xml | 9 -- .../statisticsmanager/implementation/pom.xml | 11 +- opendaylight/switchmanager/api/pom.xml | 11 +- .../controller/switchmanager/SpanConfig.java | 24 ++- .../switchmanager/SwitchConfig.java | 3 +- .../switchmanager/implementation/pom.xml | 12 +- .../switchmanager/internal/Activator.java | 5 + .../switchmanager/internal/SwitchManager.java | 151 ++++++++---------- .../switchmanager/integrationtest/pom.xml | 12 ++ .../TopologyUserLinkConfig.java | 46 ++++-- .../topologymanager/internal/Activator.java | 6 + .../internal/TopologyManagerImpl.java | 44 +++-- opendaylight/usermanager/api/pom.xml | 24 --- .../controller/usermanager/ServerConfig.java | 31 ++-- .../controller/usermanager/UserConfig.java | 3 +- .../usermanager/implementation/pom.xml | 3 +- .../usermanager/internal/Activator.java | 6 + .../usermanager/internal/UserManager.java | 88 ++++------ 55 files changed, 682 insertions(+), 667 deletions(-) diff --git a/opendaylight/appauth/pom.xml b/opendaylight/appauth/pom.xml index 157a341094..dab75f2c8d 100644 --- a/opendaylight/appauth/pom.xml +++ b/opendaylight/appauth/pom.xml @@ -59,34 +59,5 @@ org.opendaylight.controller usermanager - - junit - junit - - - equinoxSDK381 - javax.servlet - - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-core - - - org.springframework.security - spring-security-web - - - org.springframework.security - spring-security-taglibs - - - org.springframework - org.springframework.transaction - diff --git a/opendaylight/arphandler/pom.xml b/opendaylight/arphandler/pom.xml index c04bccd00d..deb2172b95 100644 --- a/opendaylight/arphandler/pom.xml +++ b/opendaylight/arphandler/pom.xml @@ -56,6 +56,14 @@ + + org.opendaylight.controller + clustering.services + + + org.opendaylight.controller + sal.connection + org.opendaylight.controller switchmanager diff --git a/opendaylight/configuration/api/pom.xml b/opendaylight/configuration/api/pom.xml index 2e9104a4b0..08dbd7c200 100644 --- a/opendaylight/configuration/api/pom.xml +++ b/opendaylight/configuration/api/pom.xml @@ -28,8 +28,7 @@ - org.opendaylight.controller.sal.utils, - org.apache.commons.lang3.builder + org.opendaylight.controller.sal.utils org.opendaylight.controller.configuration diff --git a/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationServiceCommon.java b/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationServiceCommon.java index 05eed6f23f..bbc9ee1ee8 100644 --- a/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationServiceCommon.java +++ b/opendaylight/configuration/api/src/main/java/org/opendaylight/controller/configuration/IConfigurationServiceCommon.java @@ -9,6 +9,9 @@ package org.opendaylight.controller.configuration; +import java.util.List; + +import org.opendaylight.controller.sal.utils.IObjectReader; import org.opendaylight.controller.sal.utils.Status; /** @@ -27,4 +30,32 @@ public interface IConfigurationServiceCommon { * @return the Status object representing the result of the saving request */ Status saveConfigurations(); + + /** + * Bundle will call this function to ask Configuration Manager to persist + * their configurations. It is up to the Configuration Manager to decide + * how the configuration will be persisted + * + * @param config + * The bundle configuration as a collection of + * ConfigurationObject + * @param storeName + * The identifier for this configuration + * @return The Status of the operation + */ + Status persistConfiguration(List config, String storeName); + + /** + * Bundle will call this function to ask Configuration Manager to retrieve + * the configuration identified by the passed store name + * + * @param reader + * The reader object for parsing the configuration provided by + * the caller + * @param storeName + * The identifier for the configuration + * @return The retrieved configuration as a collection of + * ConfigurationObject + */ + List retrieveConfiguration(IObjectReader reader, String storeName); } diff --git a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/Activator.java b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/Activator.java index ae0519903f..c798eeb05d 100644 --- a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/Activator.java +++ b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/Activator.java @@ -128,8 +128,7 @@ public class Activator extends ComponentActivatorAbstractBase { // export the service c.setInterface( new String[] { IConfigurationService.class.getName(), - ICacheUpdateAware.class.getName()}, - props); + ICacheUpdateAware.class.getName() }, props); c.add(createServiceDependency().setService( IClusterGlobalServices.class).setCallbacks( 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..03acfa88eb 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 @@ -12,6 +12,7 @@ package org.opendaylight.controller.configuration.internal; 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 +22,15 @@ 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.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 +45,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 Object 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 +87,8 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate public void start() { allocateCache(); retrieveCache(); + objReader = new ObjectReader(); + objWriter = new ObjectWriter(); } public void destroy() { @@ -164,4 +175,21 @@ 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); + return (obj == null || !(obj instanceof List)) ? Collections. emptyList() + : (List) obj; + } } 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 5f1db6b597..c33fdefd7b 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,21 +9,30 @@ package org.opendaylight.controller.configuration.internal; +import java.io.File; 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,11 +43,10 @@ import org.slf4j.LoggerFactory; * * @brief Backend functionality for all ConfigurationService related tasks. * - * */ -public class ContainerConfigurationService implements IConfigurationContainerService, IConfigurationAware, - ICacheUpdateAware { +public class ContainerConfigurationService implements IConfigurationContainerService, + IConfigurationAware, ICacheUpdateAware { public static final String CONTAINER_SAVE_EVENT_CACHE = "config.container.event.save"; private static final Logger logger = LoggerFactory.getLogger(ContainerConfigurationService.class); private IClusterContainerServices clusterServices; @@ -50,6 +58,9 @@ public class ContainerConfigurationService implements IConfigurationContainerSer */ private Set configurationAwareList = Collections .synchronizedSet(new HashSet()); + private String root; + private ObjectReader objReader; + private ObjectWriter objWriter; public void addConfigurationContainerAware( IConfigurationContainerAware configurationAware) { @@ -79,12 +90,23 @@ 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); + if (!new File(root).exists()) { + boolean created = new File(root).mkdir(); + if (!created) { + logger.error("Failed to create startup config directory for container {}", containerName); + } + } } public void start() { allocateCache(); retrieveCache(); + objReader = new ObjectReader(); + objWriter = new ObjectWriter(); } public void destroy() { @@ -92,6 +114,18 @@ public class ContainerConfigurationService implements IConfigurationContainerSer this.configurationAwareList.clear(); } + /** + * 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(); + } + @Override public Status saveConfiguration() { boolean success = true; @@ -171,4 +205,21 @@ public class ContainerConfigurationService implements IConfigurationContainerSer 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); + return (obj == null || !(obj instanceof List)) ? Collections. emptyList() + : (List) obj; + } } diff --git a/opendaylight/containermanager/api/pom.xml b/opendaylight/containermanager/api/pom.xml index b6c4d4c2a3..3c053f441a 100644 --- a/opendaylight/containermanager/api/pom.xml +++ b/opendaylight/containermanager/api/pom.xml @@ -33,11 +33,9 @@ org.opendaylight.controller.sal.utils, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.action, - org.opendaylight.controller.sal.flowprogrammer, org.opendaylight.controller.sal.match, org.opendaylight.controller.sal.packet, org.opendaylight.controller.sal.reader, - org.apache.commons.lang3.builder, org.slf4j, javax.xml.bind.annotation, javax.xml.bind diff --git a/opendaylight/containermanager/implementation/pom.xml b/opendaylight/containermanager/implementation/pom.xml index 9c160dcf3e..13e847b575 100644 --- a/opendaylight/containermanager/implementation/pom.xml +++ b/opendaylight/containermanager/implementation/pom.xml @@ -30,7 +30,6 @@ org.opendaylight.controller.containermanager, org.opendaylight.controller.appauth.authorization, - org.opendaylight.controller.usermanager, org.opendaylight.controller.configuration, org.opendaylight.controller.clustering.services, org.opendaylight.controller.sal.authorization, @@ -83,9 +82,5 @@ org.opendaylight.controller sal - - org.opendaylight.controller - usermanager - diff --git a/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/Activator.java b/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/Activator.java index 162cbf041a..616a0f24f3 100644 --- a/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/Activator.java +++ b/opendaylight/containermanager/implementation/src/main/java/org/opendaylight/controller/containermanager/internal/Activator.java @@ -19,6 +19,7 @@ import org.apache.felix.dm.Component; import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterGlobalServices; import org.opendaylight.controller.configuration.IConfigurationAware; +import org.opendaylight.controller.configuration.IConfigurationService; import org.opendaylight.controller.containermanager.IContainerAuthorization; import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase; import org.opendaylight.controller.sal.core.IContainer; @@ -130,6 +131,11 @@ public class Activator extends ComponentActivatorAbstractBase { .setCallbacks("setClusterServices", "unsetClusterServices") .setRequired(true)); + c.add(createServiceDependency().setService( + IConfigurationService.class).setCallbacks( + "setConfigurationService", + "unsetConfigurationService").setRequired(true)); + // Key kick-starter for container creation in each component c.add(createServiceDependency().setService(IContainerAware.class) .setCallbacks("setIContainerAware", "unsetIContainerAware") 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 e096c73780..ad897fd689 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 @@ -24,7 +24,6 @@ import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -36,6 +35,7 @@ import org.opendaylight.controller.clustering.services.CacheExistException; 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.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationAware; import org.opendaylight.controller.configuration.IConfigurationService; import org.opendaylight.controller.containermanager.ContainerChangeEvent; @@ -63,8 +63,6 @@ import org.opendaylight.controller.sal.utils.GlobalConstants; import org.opendaylight.controller.sal.utils.IObjectReader; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.NodeCreator; -import org.opendaylight.controller.sal.utils.ObjectReader; -import org.opendaylight.controller.sal.utils.ObjectWriter; import org.opendaylight.controller.sal.utils.ServiceHelper; import org.opendaylight.controller.sal.utils.Status; import org.opendaylight.controller.sal.utils.StatusCode; @@ -76,10 +74,10 @@ public class ContainerManager extends Authorization implements IContaine CommandProvider, ICacheUpdateAware, IContainerInternal, IContainerAuthorization, IConfigurationAware { private static final Logger logger = LoggerFactory.getLogger(ContainerManager.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static String containersFileName = ROOT + "containers.conf"; + private static String CONTAINERS_FILE_NAME = "containers.conf"; private static final String allContainersGroup = "allContainers"; private IClusterGlobalServices clusterServices; + private IConfigurationService configurationService; /* * Collection containing the configuration objects. This is configuration * world: container names (also the map key) are maintained as they were @@ -171,6 +169,16 @@ public class ContainerManager extends Authorization implements IContaine } } + public void setConfigurationService(IConfigurationService service) { + logger.trace("Got configuration service set request {}", service); + this.configurationService = service; + } + + public void unsetConfigurationService(IConfigurationService service) { + logger.trace("Got configuration service UNset request"); + this.configurationService = null; + } + private void allocateCaches() { logger.debug("Container Manager allocating caches"); @@ -290,7 +298,7 @@ public class ContainerManager extends Authorization implements IContaine createDefaultAuthorizationGroups(); // Read startup configuration and create local database - loadConfigurations(); + loadContainerConfig(); } public void destroy() { @@ -728,29 +736,19 @@ public class ContainerManager extends Authorization implements IContaine return flowSpecConfig; } - private void loadConfigurations() { - /* - * Read containers, container flows and finally containers' entries from file - * and program the database accordingly - */ - if ((clusterServices != null) && (clusterServices.amICoordinator())) { - loadContainerConfig(); - } - } - private Status saveContainerConfig() { return saveContainerConfigLocal(); } public Status saveContainerConfigLocal() { - ObjectWriter objWriter = new ObjectWriter(); + Status status = configurationService.persistConfiguration( + new ArrayList(containerConfigs.values()), CONTAINERS_FILE_NAME); - Status status = objWriter.write(new ConcurrentHashMap(containerConfigs), containersFileName); if (!status.isSuccess()) { return new Status(StatusCode.INTERNALERROR, "Failed to save container configurations: " + status.getDescription()); } - return new Status(StatusCode.SUCCESS); + return status; } private void removeComponentsStartUpfiles(String containerName) { @@ -1335,18 +1333,9 @@ public class ContainerManager extends Authorization implements IContaine return ois.readObject(); } - @SuppressWarnings("unchecked") private void loadContainerConfig() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap configMap = (ConcurrentMap) objReader.read(this, - containersFileName); - - if (configMap == null) { - return; - } - - for (Map.Entry configEntry : configMap.entrySet()) { - addContainer(configEntry.getValue()); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, CONTAINERS_FILE_NAME)) { + addContainer((ContainerConfig) conf); } } diff --git a/opendaylight/forwarding/staticrouting/pom.xml b/opendaylight/forwarding/staticrouting/pom.xml index 2a3c08e41f..e02b6bb39e 100644 --- a/opendaylight/forwarding/staticrouting/pom.xml +++ b/opendaylight/forwarding/staticrouting/pom.xml @@ -33,18 +33,15 @@ org.opendaylight.controller.sal.utils, org.opendaylight.controller.sal.core, org.opendaylight.controller.configuration, - org.opendaylight.controller.forwardingrulesmanager, org.opendaylight.controller.hosttracker, org.opendaylight.controller.hosttracker.hostAware, org.opendaylight.controller.clustering.services, org.opendaylight.controller.sal.packet, org.opendaylight.controller.sal.routing, - org.opendaylight.controller.topologymanager, org.eclipse.osgi.framework.console, org.osgi.framework, org.slf4j, - org.apache.felix.dm, - org.apache.commons.lang3.builder + org.apache.felix.dm org.opendaylight.controller.forwarding.staticrouting @@ -61,11 +58,7 @@ org.opendaylight.controller - topologymanager - - - org.opendaylight.controller - forwardingrulesmanager + clustering.services org.opendaylight.controller diff --git a/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/Activator.java b/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/Activator.java index 2b8bbef507..7be9c23677 100644 --- a/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/Activator.java +++ b/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/Activator.java @@ -18,6 +18,7 @@ import org.slf4j.LoggerFactory; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.hosttracker.IfIptoHost; import org.opendaylight.controller.hosttracker.IfNewHostNotify; @@ -35,6 +36,7 @@ public class Activator extends ComponentActivatorAbstractBase { * instantiated in order to get an fully working implementation * Object */ + @Override public Object[] getImplementations() { Object[] res = { StaticRoutingImplementation.class }; return res; @@ -53,6 +55,7 @@ public class Activator extends ComponentActivatorAbstractBase { * also optional per-container different behavior if needed, usually * should not be the case though. */ + @Override public void configureInstance(Component c, Object imp, String containerName) { if (imp.equals(StaticRoutingImplementation.class)) { c.setInterface(new String[] { @@ -74,6 +77,11 @@ public class Activator extends ComponentActivatorAbstractBase { IStaticRoutingAware.class).setCallbacks( "setStaticRoutingAware", "unsetStaticRoutingAware") .setRequired(false)); + + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } } } diff --git a/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/StaticRoutingImplementation.java b/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/StaticRoutingImplementation.java index fe00b774f5..fedf5541d0 100644 --- a/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/StaticRoutingImplementation.java +++ b/opendaylight/forwarding/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/internal/StaticRoutingImplementation.java @@ -14,6 +14,7 @@ import java.io.ObjectInputStream; import java.net.Inet4Address; import java.net.InetAddress; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Collections; import java.util.Dictionary; import java.util.EnumSet; @@ -23,7 +24,6 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -36,7 +36,9 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.forwarding.staticrouting.IForwardingStaticRouting; import org.opendaylight.controller.forwarding.staticrouting.IStaticRoutingAware; import org.opendaylight.controller.forwarding.staticrouting.StaticRoute; @@ -46,10 +48,7 @@ import org.opendaylight.controller.hosttracker.IHostId; import org.opendaylight.controller.hosttracker.IfIptoHost; import org.opendaylight.controller.hosttracker.IfNewHostNotify; import org.opendaylight.controller.hosttracker.hostAware.HostNodeConnector; -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; @@ -61,13 +60,13 @@ import org.slf4j.LoggerFactory; public class StaticRoutingImplementation implements IfNewHostNotify, IForwardingStaticRouting, IObjectReader, IConfigurationContainerAware { private static Logger log = LoggerFactory.getLogger(StaticRoutingImplementation.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); + private static final String STATIC_ROUTES_FILE_NAME = "staticRouting.conf"; ConcurrentMap staticRoutes; ConcurrentMap staticRouteConfigs; private IfIptoHost hostTracker; private Timer gatewayProbeTimer; - private String staticRoutesFileName = null; private IClusterContainerServices clusterContainerService = null; + private IConfigurationContainerService configurationService; private Set staticRoutingAware = Collections .synchronizedSet(new HashSet()); private ExecutorService executor; @@ -95,6 +94,16 @@ public class StaticRoutingImplementation implements IfNewHostNotify, IForwarding } } + public void setConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service set request {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service UNset request"); + this.configurationService = null; + } + @Override public ConcurrentMap getStaticRouteConfigs() { return staticRouteConfigs; @@ -107,18 +116,10 @@ public class StaticRoutingImplementation implements IfNewHostNotify, IForwarding return ois.readObject(); } - @SuppressWarnings("unchecked") - private void loadConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader.read( - this, staticRoutesFileName); - - if (confList == null) { - return; - } - for (StaticRouteConfig conf : confList.values()) { - addStaticRoute(conf); + private void loadConfiguration() { + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, STATIC_ROUTES_FILE_NAME)) { + addStaticRoute((StaticRouteConfig) conf); } } @@ -127,11 +128,8 @@ public class StaticRoutingImplementation implements IfNewHostNotify, IForwarding } public Status saveConfigInternal() { - Status status; - ObjectWriter objWriter = new ObjectWriter(); - - status = objWriter.write(new ConcurrentHashMap(staticRouteConfigs), - staticRoutesFileName); + Status status = configurationService.persistConfiguration( + new ArrayList(staticRouteConfigs.values()), STATIC_ROUTES_FILE_NAME); if (status.isSuccess()) { return status; @@ -140,7 +138,6 @@ public class StaticRoutingImplementation implements IfNewHostNotify, IForwarding } } - @SuppressWarnings("deprecation") private void allocateCaches() { if (this.clusterContainerService == null) { log.trace("un-initialized clusterContainerService, can't create cache"); @@ -159,7 +156,7 @@ public class StaticRoutingImplementation implements IfNewHostNotify, IForwarding } } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCaches() { if (this.clusterContainerService == null) { log.warn("un-initialized clusterContainerService, can't retrieve cache"); @@ -421,15 +418,11 @@ public class StaticRoutingImplementation implements IfNewHostNotify, IForwarding containerName = ""; } - staticRoutesFileName = ROOT + "staticRouting_" + containerName + ".conf"; - log.debug("forwarding.staticrouting starting on container {}", containerName); allocateCaches(); retrieveCaches(); this.executor = Executors.newFixedThreadPool(1); - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadConfiguration(); - } + loadConfiguration(); /* * Slow probe to identify any gateway that might have silently appeared diff --git a/opendaylight/forwardingrulesmanager/api/pom.xml b/opendaylight/forwardingrulesmanager/api/pom.xml index 5583b7a0dd..4687866c29 100644 --- a/opendaylight/forwardingrulesmanager/api/pom.xml +++ b/opendaylight/forwardingrulesmanager/api/pom.xml @@ -33,10 +33,7 @@ org.opendaylight.controller.forwardingrulesmanager - org.opendaylight.controller.clustering.services, org.opendaylight.controller.configuration, - org.opendaylight.controller.hosttracker, - org.opendaylight.controller.hosttracker.hostAware, org.opendaylight.controller.switchmanager, org.opendaylight.controller.sal.action, org.opendaylight.controller.sal.core, @@ -65,18 +62,10 @@ - - org.opendaylight.controller - hosttracker - org.opendaylight.controller configuration - - org.opendaylight.controller - clustering.services - org.opendaylight.controller switchmanager diff --git a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/PortGroupConfig.java b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/PortGroupConfig.java index c634426d43..d0878f982c 100644 --- a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/PortGroupConfig.java +++ b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/PortGroupConfig.java @@ -13,6 +13,8 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import org.opendaylight.controller.configuration.ConfigurationObject; + /** * PortGroupConfig class represents the User's Configuration with a Opaque * Regular Expression String that is parsed and handled by PortGroupProvider. @@ -23,7 +25,7 @@ import java.util.List; * * */ -public class PortGroupConfig implements Serializable { +public class PortGroupConfig extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; private static final String prettyFields[] = { "Name", "Match Criteria" }; @@ -136,23 +138,30 @@ public class PortGroupConfig implements Serializable { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } PortGroupConfig other = (PortGroupConfig) obj; if (matchString == null) { - if (other.matchString != null) + if (other.matchString != null) { return false; - } else if (!matchString.equals(other.matchString)) + } + } else if (!matchString.equals(other.matchString)) { return false; + } if (name == null) { - if (other.name != null) + if (other.name != null) { return false; - } else if (!name.equals(other.name)) + } + } else if (!name.equals(other.name)) { return false; + } return true; } diff --git a/opendaylight/forwardingrulesmanager/implementation/pom.xml b/opendaylight/forwardingrulesmanager/implementation/pom.xml index deaa23e062..eaee390eec 100644 --- a/opendaylight/forwardingrulesmanager/implementation/pom.xml +++ b/opendaylight/forwardingrulesmanager/implementation/pom.xml @@ -36,8 +36,6 @@ org.opendaylight.controller.clustering.services, org.opendaylight.controller.configuration, org.opendaylight.controller.containermanager, - org.opendaylight.controller.hosttracker, - org.opendaylight.controller.hosttracker.hostAware, org.opendaylight.controller.switchmanager, org.opendaylight.controller.sal.action, org.opendaylight.controller.sal.core, @@ -71,10 +69,6 @@ - - org.opendaylight.controller - hosttracker - org.opendaylight.controller configuration @@ -108,10 +102,6 @@ equinoxSDK381 org.apache.felix.gogo.runtime - - junit - junit - org.opendaylight.controller connectionmanager diff --git a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/Activator.java b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/Activator.java index ec8112035f..a53ea111d2 100644 --- a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/Activator.java +++ b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/Activator.java @@ -17,6 +17,7 @@ import org.apache.felix.dm.Component; import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.connectionmanager.IConnectionManager; import org.opendaylight.controller.containermanager.IContainerManager; import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager; @@ -98,6 +99,10 @@ public class Activator extends ComponentActivatorAbstractBase { .setCallbacks("setIContainer", "unsetIContainer").setRequired(true)); c.add(createServiceDependency().setService(IConnectionManager.class) .setCallbacks("setIConnectionManager", "unsetIConnectionManager").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); if (GlobalConstants.DEFAULT.toString().equals(containerName)) { c.add(createServiceDependency().setService(IContainerManager.class) .setCallbacks("setIContainerManager", "unsetIContainerManager").setRequired(true)); diff --git a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java index 9c00220687..bce7dd30ba 100644 --- a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java +++ b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java @@ -33,7 +33,9 @@ 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.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.connectionmanager.IConnectionManager; import org.opendaylight.controller.containermanager.IContainerManager; import org.opendaylight.controller.forwardingrulesmanager.FlowConfig; @@ -66,8 +68,6 @@ import org.opendaylight.controller.sal.match.MatchType; import org.opendaylight.controller.sal.utils.EtherTypes; 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.opendaylight.controller.switchmanager.IInventoryListener; @@ -98,14 +98,15 @@ public class ForwardingRulesManager implements private static final String PORT_REMOVED = "Port removed"; private static final String NODE_DOWN = "Node is Down"; private static final String INVALID_FLOW_ENTRY = "Invalid FlowEntry"; - private String frmFileName; - private String portGroupFileName; + private static final String STATIC_FLOWS_FILE_NAME = "frm_staticflows.conf"; + private static final String PORT_GROUP_FILE_NAME = "portgroup.conf"; private ConcurrentMap staticFlows; private ConcurrentMap staticFlowsOrdinal; private ConcurrentMap portGroupConfigs; private ConcurrentMap> portGroupData; private ConcurrentMap TSPolicies; private IContainerManager containerManager; + private IConfigurationContainerService configurationService; private boolean inContainerMode; // being used by global instance only protected boolean stopping; @@ -1945,22 +1946,7 @@ public class ForwardingRulesManager implements @Override public List getStaticFlows() { - return getStaticFlowsOrderedList(staticFlows, staticFlowsOrdinal.get(0).intValue()); - } - - // TODO: need to come out with a better algorithm for maintaining the order - // of the configuration entries - // with actual one, index associated to deleted entries cannot be reused and - // map grows... - private List getStaticFlowsOrderedList(ConcurrentMap flowMap, int maxKey) { - List orderedList = new ArrayList(); - for (int i = 0; i <= maxKey; i++) { - FlowConfig entry = flowMap.get(i); - if (entry != null) { - orderedList.add(entry); - } - } - return orderedList; + return new ArrayList(staticFlows.values()); } @Override @@ -2003,34 +1989,13 @@ public class ForwardingRulesManager implements return new ArrayList(set); } - @SuppressWarnings("unchecked") private void loadFlowConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader.read(this, - frmFileName); - - ConcurrentMap pgConfig = (ConcurrentMap) objReader.read(this, - portGroupFileName); - - if (pgConfig != null) { - for (ConcurrentMap.Entry entry : pgConfig.entrySet()) { - addPortGroupConfig(entry.getKey(), entry.getValue().getMatchString(), true); - } - } - - if (confList == null) { - return; - } - - int maxKey = 0; - for (Integer key : confList.keySet()) { - if (key.intValue() > maxKey) { - maxKey = key.intValue(); - } + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, PORT_GROUP_FILE_NAME)) { + addPortGroupConfig(((PortGroupConfig) conf).getName(), ((PortGroupConfig) conf).getMatchString(), true); } - for (FlowConfig conf : getStaticFlowsOrderedList(confList, maxKey)) { - addStaticFlowInternal(conf, true); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, STATIC_FLOWS_FILE_NAME)) { + addStaticFlowInternal((FlowConfig) conf, true); } } @@ -2045,19 +2010,22 @@ public class ForwardingRulesManager implements } private Status saveConfigInternal() { - ObjectWriter objWriter = new ObjectWriter(); - ConcurrentMap nonDynamicFlows = new ConcurrentHashMap(); + List nonDynamicFlows = new ArrayList(); + for (Integer ordinal : staticFlows.keySet()) { FlowConfig config = staticFlows.get(ordinal); // Do not save dynamic and controller generated static flows if (config.isDynamic() || config.isInternalFlow()) { continue; } - nonDynamicFlows.put(ordinal, config); + nonDynamicFlows.add(config); } - objWriter.write(nonDynamicFlows, frmFileName); - objWriter.write(new ConcurrentHashMap(portGroupConfigs), portGroupFileName); - return new Status(StatusCode.SUCCESS, null); + + configurationService.persistConfiguration(nonDynamicFlows, STATIC_FLOWS_FILE_NAME); + configurationService.persistConfiguration(new ArrayList(portGroupConfigs.values()), + PORT_GROUP_FILE_NAME); + + return new Status(StatusCode.SUCCESS); } @Override @@ -2432,6 +2400,16 @@ public class ForwardingRulesManager implements } } + public void setConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service set request {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service UNset request"); + this.configurationService = null; + } + @Override public PortGroupProvider getPortGroupProvider() { return portGroupProvider; @@ -2482,8 +2460,6 @@ public class ForwardingRulesManager implements * */ void init() { - frmFileName = GlobalConstants.STARTUPHOME.toString() + "frm_staticflows_" + this.getContainerName() + ".conf"; - portGroupFileName = GlobalConstants.STARTUPHOME.toString() + "portgroup_" + this.getContainerName() + ".conf"; inContainerMode = false; @@ -2655,9 +2631,7 @@ public class ForwardingRulesManager implements /* * Read startup and build database if we are the coordinator */ - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadFlowConfiguration(); - } + loadFlowConfiguration(); } /** diff --git a/opendaylight/hosttracker/api/pom.xml b/opendaylight/hosttracker/api/pom.xml index fbd13e13ef..d84f96d84e 100644 --- a/opendaylight/hosttracker/api/pom.xml +++ b/opendaylight/hosttracker/api/pom.xml @@ -34,14 +34,10 @@ org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.utils, - org.opendaylight.controller.topologymanager, org.opendaylight.controller.sal.packet.address, - org.opendaylight.controller.switchmanager, - org.opendaylight.controller.clustering.services, javax.xml.bind.annotation, javax.xml.bind, org.apache.felix.dm, - org.apache.commons.lang3.builder, org.osgi.service.component, org.slf4j, org.eclipse.osgi.framework.console, @@ -54,18 +50,6 @@ - - org.opendaylight.controller - topologymanager - - - org.opendaylight.controller - switchmanager - - - org.opendaylight.controller - clustering.services - org.opendaylight.controller sal diff --git a/opendaylight/hosttracker/implementation/pom.xml b/opendaylight/hosttracker/implementation/pom.xml index f7ced8ee89..625ababf7a 100644 --- a/opendaylight/hosttracker/implementation/pom.xml +++ b/opendaylight/hosttracker/implementation/pom.xml @@ -97,22 +97,6 @@ - - org.opendaylight.controller - connectionmanager - - - org.opendaylight.controller - connectionmanager.implementation - - - org.opendaylight.controller - sal.connection - - - org.opendaylight.controller - sal.connection.implementation - org.opendaylight.controller topologymanager @@ -137,9 +121,5 @@ junit junit - - org.opendaylight.controller - commons.logback_settings - diff --git a/opendaylight/hosttracker/integrationtest/pom.xml b/opendaylight/hosttracker/integrationtest/pom.xml index c2d30e78c6..eb902528c1 100644 --- a/opendaylight/hosttracker/integrationtest/pom.xml +++ b/opendaylight/hosttracker/integrationtest/pom.xml @@ -34,6 +34,22 @@ org.opendaylight.controller sal.implementation + + org.opendaylight.controller + sal.connection + + + org.opendaylight.controller + sal.connection.implementation + + + org.opendaylight.controller + connectionmanager + + + org.opendaylight.controller + connectionmanager.implementation + org.opendaylight.controller containermanager diff --git a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/Activator.java b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/Activator.java index 351496abb3..c30f659032 100644 --- a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/Activator.java +++ b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/Activator.java @@ -16,6 +16,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.networkconfig.neutron.INeutronFloatingIPCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD; @@ -93,6 +94,10 @@ public class Activator extends ComponentActivatorAbstractBase { .setService(IClusterContainerServices.class) .setCallbacks("setClusterContainerService", "unsetClusterContainerService").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } if (imp.equals(NeutronRouterInterface.class)) { // export the service @@ -105,6 +110,10 @@ public class Activator extends ComponentActivatorAbstractBase { .setService(IClusterContainerServices.class) .setCallbacks("setClusterContainerService", "unsetClusterContainerService").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } if (imp.equals(NeutronPortInterface.class)) { // export the service @@ -117,6 +126,10 @@ public class Activator extends ComponentActivatorAbstractBase { .setService(IClusterContainerServices.class) .setCallbacks("setClusterContainerService", "unsetClusterContainerService").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } if (imp.equals(NeutronSubnetInterface.class)) { // export the service @@ -129,6 +142,10 @@ public class Activator extends ComponentActivatorAbstractBase { .setService(IClusterContainerServices.class) .setCallbacks("setClusterContainerService", "unsetClusterContainerService").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } if (imp.equals(NeutronNetworkInterface.class)) { // export the service @@ -141,6 +158,10 @@ public class Activator extends ComponentActivatorAbstractBase { .setService(IClusterContainerServices.class) .setCallbacks("setClusterContainerService", "unsetClusterContainerService").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } } } diff --git a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronFloatingIPInterface.java b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronFloatingIPInterface.java index b1b2610134..5cbe5cde98 100644 --- a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronFloatingIPInterface.java +++ b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronFloatingIPInterface.java @@ -19,7 +19,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.felix.dm.Component; @@ -27,7 +26,9 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.networkconfig.neutron.INeutronFloatingIPCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD; @@ -36,10 +37,7 @@ import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces; import org.opendaylight.controller.networkconfig.neutron.NeutronFloatingIP; import org.opendaylight.controller.networkconfig.neutron.NeutronPort; import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet; -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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,12 +45,11 @@ import org.slf4j.LoggerFactory; public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConfigurationContainerAware, IObjectReader { private static final Logger logger = LoggerFactory.getLogger(NeutronFloatingIPInterface.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static final String FILENAME ="neutron.floatingip"; - private static String fileName; + private static final String FILE_NAME = "neutron.floatingip.conf"; private String containerName = null; private IClusterContainerServices clusterContainerService = null; + private IConfigurationContainerService configurationService; private ConcurrentMap floatingIPDB; // methods needed for creating caches @@ -69,7 +66,16 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf } } - @SuppressWarnings("deprecation") + public void setConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service set: {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service removed: {}", service); + this.configurationService = null; + } + private void allocateCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't create cache"); @@ -88,7 +94,7 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf logger.debug("Cache successfully created for NeutronFloatingIps"); } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't retrieve cache"); @@ -104,7 +110,6 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf logger.debug("Cache was successfully retrieved for Neutron FloatingIPs"); } - @SuppressWarnings("deprecation") private void destroyCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterMger, can't destroy cache"); @@ -117,9 +122,7 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf private void startUp() { allocateCache(); retrieveCache(); - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadConfiguration(); - } + loadConfiguration(); } /** @@ -136,7 +139,6 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf // In the Global instance case the containerName is empty this.containerName = ""; } - fileName = ROOT + FILENAME + "_" + containerName + ".conf"; startUp(); } @@ -169,6 +171,7 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf // this method uses reflection to update an object from it's delta. + @SuppressWarnings("unused") private boolean overwrite(Object target, Object delta) { Method[] methods = target.getClass().getMethods(); @@ -203,8 +206,9 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf @Override public NeutronFloatingIP getFloatingIP(String uuid) { - if (!floatingIPExists(uuid)) + if (!floatingIPExists(uuid)) { return null; + } return floatingIPDB.get(uuid); } @@ -227,12 +231,14 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf INeutronSubnetCRUD subnetCRUD = NeutronCRUDInterfaces.getINeutronSubnetCRUD(this); INeutronPortCRUD portCRUD = NeutronCRUDInterfaces.getINeutronPortCRUD(this); - if (floatingIPExists(input.getID())) + if (floatingIPExists(input.getID())) { return false; + } //if floating_ip_address isn't there, allocate from the subnet pool NeutronSubnet subnet = subnetCRUD.getSubnet(networkCRUD.getNetwork(input.getFloatingNetworkUUID()).getSubnets().get(0)); - if (input.getFloatingIPAddress() == null) + if (input.getFloatingIPAddress() == null) { input.setFloatingIPAddress(subnet.getLowAddr()); + } subnet.allocateIP(input.getFloatingIPAddress()); //if port_id is there, bind port to this floating ip @@ -251,8 +257,9 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf INeutronSubnetCRUD subnetCRUD = NeutronCRUDInterfaces.getINeutronSubnetCRUD(this); INeutronPortCRUD portCRUD = NeutronCRUDInterfaces.getINeutronPortCRUD(this); - if (!floatingIPExists(uuid)) + if (!floatingIPExists(uuid)) { return false; + } NeutronFloatingIP floatIP = getFloatingIP(uuid); //if floating_ip_address isn't there, allocate from the subnet pool NeutronSubnet subnet = subnetCRUD.getSubnet(networkCRUD.getNetwork(floatIP.getFloatingNetworkUUID()).getSubnets().get(0)); @@ -269,8 +276,9 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf public boolean updateFloatingIP(String uuid, NeutronFloatingIP delta) { INeutronPortCRUD portCRUD = NeutronCRUDInterfaces.getINeutronPortCRUD(this); - if (!floatingIPExists(uuid)) + if (!floatingIPExists(uuid)) { return false; + } NeutronFloatingIP target = floatingIPDB.get(uuid); if (target.getPortUUID() != null) { NeutronPort port = portCRUD.getPort(target.getPortUUID()); @@ -288,25 +296,17 @@ public class NeutronFloatingIPInterface implements INeutronFloatingIPCRUD, IConf return true; } - @SuppressWarnings("unchecked") private void loadConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) - objReader.read(this, fileName); - - if (confList == null) { - return; - } - - for (String key : confList.keySet()) { - floatingIPDB.put(key, confList.get(key)); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, FILE_NAME)) { + NeutronFloatingIP nfIP = (NeutronFloatingIP) conf; + floatingIPDB.put(nfIP.getID(), nfIP); } } @Override public Status saveConfiguration() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write(new ConcurrentHashMap(floatingIPDB), fileName); + return configurationService.persistConfiguration(new ArrayList(floatingIPDB.values()), + FILE_NAME); } @Override diff --git a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronNetworkInterface.java b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronNetworkInterface.java index eda4d21d5d..c6e161b91f 100644 --- a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronNetworkInterface.java +++ b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronNetworkInterface.java @@ -19,7 +19,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.felix.dm.Component; @@ -27,13 +26,12 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD; import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork; -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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,13 +39,12 @@ import org.slf4j.LoggerFactory; public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurationContainerAware, IObjectReader { private static final Logger logger = LoggerFactory.getLogger(NeutronNetworkInterface.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static final String FILENAME ="neutron.network"; - private static String fileName; + private static final String FILE_NAME ="neutron.network.conf"; private String containerName = null; private ConcurrentMap networkDB; private IClusterContainerServices clusterContainerService = null; + private IConfigurationContainerService configurationService; // methods needed for creating caches @@ -63,7 +60,16 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat } } - @SuppressWarnings("deprecation") + public void setConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service set: {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service removed: {}", service); + this.configurationService = null; + } + private void allocateCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't create cache"); @@ -82,7 +88,7 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat logger.debug("Cache successfully created for Neutron Networks"); } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't retrieve cache"); @@ -99,9 +105,7 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat private void startUp() { allocateCache(); retrieveCache(); - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadConfiguration(); - } + loadConfiguration(); } /** @@ -118,11 +122,9 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat // In the Global instance case the containerName is empty this.containerName = ""; } - fileName = ROOT + FILENAME + "_" + containerName + ".conf"; startUp(); } - @SuppressWarnings("deprecation") private void destroyCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterMger, can't destroy cache"); @@ -195,8 +197,9 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat @Override public NeutronNetwork getNetwork(String uuid) { - if (!networkExists(uuid)) + if (!networkExists(uuid)) { return null; + } return networkDB.get(uuid); } @@ -215,8 +218,9 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat @Override public boolean addNetwork(NeutronNetwork input) { - if (networkExists(input.getID())) + if (networkExists(input.getID())) { return false; + } networkDB.putIfAbsent(input.getID(), input); //TODO: add code to find INeutronNetworkAware services and call newtorkCreated on them return true; @@ -224,8 +228,9 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat @Override public boolean removeNetwork(String uuid) { - if (!networkExists(uuid)) + if (!networkExists(uuid)) { return false; + } networkDB.remove(uuid); //TODO: add code to find INeutronNetworkAware services and call newtorkDeleted on them return true; @@ -233,41 +238,36 @@ public class NeutronNetworkInterface implements INeutronNetworkCRUD, IConfigurat @Override public boolean updateNetwork(String uuid, NeutronNetwork delta) { - if (!networkExists(uuid)) + if (!networkExists(uuid)) { return false; + } NeutronNetwork target = networkDB.get(uuid); return overwrite(target, delta); } @Override public boolean networkInUse(String netUUID) { - if (!networkExists(netUUID)) + if (!networkExists(netUUID)) { return true; + } NeutronNetwork target = networkDB.get(netUUID); - if (target.getPortsOnNetwork().size() > 0) + if (target.getPortsOnNetwork().size() > 0) { return true; + } return false; } - @SuppressWarnings("unchecked") private void loadConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) - objReader.read(this, fileName); - - if (confList == null) { - return; - } - - for (String key : confList.keySet()) { - networkDB.put(key, confList.get(key)); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, FILE_NAME)) { + NeutronNetwork nn = (NeutronNetwork) conf; + networkDB.put(nn.getID(), nn); } } @Override public Status saveConfiguration() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write(new ConcurrentHashMap(networkDB), fileName); + return configurationService.persistConfiguration(new ArrayList(networkDB.values()), + FILE_NAME); } @Override diff --git a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronPortInterface.java b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronPortInterface.java index a49888f6c3..6dc0e46b61 100644 --- a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronPortInterface.java +++ b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronPortInterface.java @@ -20,7 +20,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.felix.dm.Component; @@ -28,7 +27,9 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD; @@ -37,10 +38,7 @@ import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork; import org.opendaylight.controller.networkconfig.neutron.NeutronPort; import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet; import org.opendaylight.controller.networkconfig.neutron.Neutron_IPs; -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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,12 +46,11 @@ import org.slf4j.LoggerFactory; public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationContainerAware, IObjectReader { private static final Logger logger = LoggerFactory.getLogger(NeutronPortInterface.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static final String FILENAME ="neutron.port"; - private static String fileName; + private static final String FILE_NAME ="neutron.port.conf"; private String containerName = null; private IClusterContainerServices clusterContainerService = null; + private IConfigurationContainerService configurationService; private ConcurrentMap portDB; // methods needed for creating caches @@ -70,7 +67,16 @@ public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationCon } } - @SuppressWarnings("deprecation") + public void setConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service set: {}", service); + configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service removed: {}", service); + configurationService = null; + } + private void allocateCache() { if (clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't create cache"); @@ -89,7 +95,7 @@ public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationCon logger.debug("Cache successfully created for OpenDOVE"); } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCache() { if (clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't retrieve cache"); @@ -105,7 +111,6 @@ public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationCon logger.debug("Cache was successfully retrieved for Neutron Ports"); } - @SuppressWarnings("deprecation") private void destroyCache() { if (clusterContainerService == null) { logger.error("un-initialized clusterMger, can't destroy cache"); @@ -118,10 +123,7 @@ public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationCon private void startUp() { allocateCache(); retrieveCache(); - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadConfiguration(); - } - + loadConfiguration(); } /** @@ -138,7 +140,6 @@ public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationCon // In the Global instance case the containerName is empty containerName = ""; } - fileName = ROOT + FILENAME + "_" + containerName + ".conf"; startUp(); } @@ -348,25 +349,17 @@ public class NeutronPortInterface implements INeutronPortCRUD, IConfigurationCon return null; } - @SuppressWarnings("unchecked") private void loadConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) - objReader.read(this, fileName); - - if (confList == null) { - return; - } - - for (String key : confList.keySet()) { - portDB.put(key, confList.get(key)); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, FILE_NAME)) { + NeutronPort nn = (NeutronPort) conf; + portDB.put(nn.getID(), nn); } } @Override public Status saveConfiguration() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write(new ConcurrentHashMap(portDB), fileName); + return configurationService.persistConfiguration(new ArrayList(portDB.values()), + FILE_NAME); } @Override diff --git a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronRouterInterface.java b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronRouterInterface.java index 9f8aa1937f..4e19d36fe0 100644 --- a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronRouterInterface.java +++ b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronRouterInterface.java @@ -19,7 +19,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.felix.dm.Component; @@ -27,13 +26,12 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.networkconfig.neutron.INeutronRouterCRUD; import org.opendaylight.controller.networkconfig.neutron.NeutronRouter; -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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,12 +39,11 @@ import org.slf4j.LoggerFactory; public class NeutronRouterInterface implements INeutronRouterCRUD, IConfigurationContainerAware, IObjectReader { private static final Logger logger = LoggerFactory.getLogger(NeutronRouterInterface.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static final String FILENAME ="neutron.router"; - private static String fileName; + private static final String FILE_NAME ="neutron.router.conf"; private String containerName = null; private IClusterContainerServices clusterContainerService = null; + private IConfigurationContainerService configurationService; private ConcurrentMap routerDB; // methods needed for creating caches @@ -62,7 +59,16 @@ public class NeutronRouterInterface implements INeutronRouterCRUD, IConfiguratio } } - @SuppressWarnings("deprecation") + public void setConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service set: {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service removed: {}", service); + this.configurationService = null; + } + private void allocateCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't create cache"); @@ -81,7 +87,7 @@ public class NeutronRouterInterface implements INeutronRouterCRUD, IConfiguratio logger.debug("Cache successfully created for Neutron Routers"); } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't retrieve cache"); @@ -97,7 +103,6 @@ public class NeutronRouterInterface implements INeutronRouterCRUD, IConfiguratio logger.debug("Cache was successfully retrieved for Neutron Routers"); } - @SuppressWarnings("deprecation") private void destroyCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterMger, can't destroy cache"); @@ -110,10 +115,7 @@ public class NeutronRouterInterface implements INeutronRouterCRUD, IConfiguratio private void startUp() { allocateCache(); retrieveCache(); - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadConfiguration(); - } - + loadConfiguration(); } /** @@ -130,7 +132,6 @@ public class NeutronRouterInterface implements INeutronRouterCRUD, IConfiguratio // In the Global instance case the containerName is empty this.containerName = ""; } - fileName = ROOT + FILENAME + "_" + containerName + ".conf"; startUp(); } @@ -198,8 +199,9 @@ public class NeutronRouterInterface implements INeutronRouterCRUD, IConfiguratio @Override public NeutronRouter getRouter(String uuid) { - if (!routerExists(uuid)) + if (!routerExists(uuid)) { return null; + } return routerDB.get(uuid); } @@ -218,55 +220,51 @@ public class NeutronRouterInterface implements INeutronRouterCRUD, IConfiguratio @Override public boolean addRouter(NeutronRouter input) { - if (routerExists(input.getID())) + if (routerExists(input.getID())) { return false; + } routerDB.putIfAbsent(input.getID(), input); return true; } @Override public boolean removeRouter(String uuid) { - if (!routerExists(uuid)) + if (!routerExists(uuid)) { return false; + } routerDB.remove(uuid); return true; } @Override public boolean updateRouter(String uuid, NeutronRouter delta) { - if (!routerExists(uuid)) + if (!routerExists(uuid)) { return false; + } NeutronRouter target = routerDB.get(uuid); return overwrite(target, delta); } @Override public boolean routerInUse(String routerUUID) { - if (!routerExists(routerUUID)) + if (!routerExists(routerUUID)) { return true; + } NeutronRouter target = routerDB.get(routerUUID); return (target.getInterfaces().size() > 0); } - @SuppressWarnings("unchecked") private void loadConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) - objReader.read(this, fileName); - - if (confList == null) { - return; - } - - for (String key : confList.keySet()) { - routerDB.put(key, confList.get(key)); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, FILE_NAME)) { + NeutronRouter nr = (NeutronRouter) conf; + routerDB.put(nr.getID(), nr); } } @Override public Status saveConfiguration() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write(new ConcurrentHashMap(routerDB), fileName); + return configurationService.persistConfiguration(new ArrayList(routerDB.values()), + FILE_NAME); } @Override diff --git a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronSubnetInterface.java b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronSubnetInterface.java index 049fd3283d..025c2f12f7 100644 --- a/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronSubnetInterface.java +++ b/opendaylight/networkconfiguration/neutron/implementation/src/main/java/org/opendaylight/controller/networkconfig/neutron/implementation/NeutronSubnetInterface.java @@ -19,7 +19,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.felix.dm.Component; @@ -27,16 +26,15 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronSubnetCRUD; import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces; import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork; import org.opendaylight.controller.networkconfig.neutron.NeutronSubnet; -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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,13 +42,12 @@ import org.slf4j.LoggerFactory; public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfigurationContainerAware, IObjectReader { private static final Logger logger = LoggerFactory.getLogger(NeutronSubnetInterface.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static final String FILENAME ="neutron.subnet"; - private static String fileName; + private static final String FILE_NAME ="neutron.subnet.conf"; private String containerName = null; private IClusterContainerServices clusterContainerService = null; + private IConfigurationContainerService configurationService; private ConcurrentMap subnetDB; // methods needed for creating caches @@ -67,7 +64,16 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio } } - @SuppressWarnings("deprecation") + public void setConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service set: {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + logger.trace("Configuration service removed: {}", service); + this.configurationService = null; + } + private void allocateCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't create cache"); @@ -86,7 +92,7 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio logger.debug("Cache successfully created for Neutron Subnets"); } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings({ "unchecked" }) private void retrieveCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterContainerService, can't retrieve cache"); @@ -102,7 +108,6 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio logger.debug("Cache was successfully retrieved for Neutron Subnets"); } - @SuppressWarnings("deprecation") private void destroyCache() { if (this.clusterContainerService == null) { logger.error("un-initialized clusterMger, can't destroy cache"); @@ -115,10 +120,7 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio private void startUp() { allocateCache(); retrieveCache(); - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadConfiguration(); - } - + loadConfiguration(); } /** @@ -135,7 +137,6 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio // In the Global instance case the containerName is empty this.containerName = ""; } - fileName = ROOT + FILENAME + "_" + containerName + ".conf"; startUp(); } @@ -203,8 +204,9 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio @Override public NeutronSubnet getSubnet(String uuid) { - if (!subnetExists(uuid)) + if (!subnetExists(uuid)) { return null; + } return subnetDB.get(uuid); } @@ -224,8 +226,9 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio @Override public boolean addSubnet(NeutronSubnet input) { String id = input.getID(); - if (subnetExists(id)) + if (subnetExists(id)) { return false; + } subnetDB.putIfAbsent(id, input); INeutronNetworkCRUD networkIf = NeutronCRUDInterfaces.getINeutronNetworkCRUD(this); @@ -236,8 +239,9 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio @Override public boolean removeSubnet(String uuid) { - if (!subnetExists(uuid)) + if (!subnetExists(uuid)) { return false; + } NeutronSubnet target = subnetDB.get(uuid); INeutronNetworkCRUD networkIf = NeutronCRUDInterfaces.getINeutronNetworkCRUD(this); @@ -249,39 +253,33 @@ public class NeutronSubnetInterface implements INeutronSubnetCRUD, IConfiguratio @Override public boolean updateSubnet(String uuid, NeutronSubnet delta) { - if (!subnetExists(uuid)) + if (!subnetExists(uuid)) { return false; + } NeutronSubnet target = subnetDB.get(uuid); return overwrite(target, delta); } @Override public boolean subnetInUse(String subnetUUID) { - if (!subnetExists(subnetUUID)) + if (!subnetExists(subnetUUID)) { return true; + } NeutronSubnet target = subnetDB.get(subnetUUID); return (target.getPortsInSubnet().size() > 0); } - @SuppressWarnings("unchecked") private void loadConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) - objReader.read(this, fileName); - - if (confList == null) { - return; - } - - for (String key : confList.keySet()) { - subnetDB.put(key, confList.get(key)); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, FILE_NAME)) { + NeutronSubnet ns = (NeutronSubnet) conf; + subnetDB.put(ns.getID(), ns); } } @Override public Status saveConfiguration() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write(new ConcurrentHashMap(subnetDB), fileName); + return configurationService.persistConfiguration(new ArrayList(subnetDB.values()), + FILE_NAME); } @Override diff --git a/opendaylight/networkconfiguration/neutron/pom.xml b/opendaylight/networkconfiguration/neutron/pom.xml index cdbb7d6b81..3f02ec18b3 100644 --- a/opendaylight/networkconfiguration/neutron/pom.xml +++ b/opendaylight/networkconfiguration/neutron/pom.xml @@ -48,6 +48,7 @@ + org.opendaylight.controller.configuration, org.opendaylight.controller.clustering.services, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.utils, @@ -68,6 +69,10 @@ org.opendaylight.controller clustering.services + + org.opendaylight.controller + configuration + org.opendaylight.controller sal diff --git a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronFloatingIP.java b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronFloatingIP.java index 9c8c91b284..9e5aa2d0b4 100644 --- a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronFloatingIP.java +++ b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronFloatingIP.java @@ -17,10 +17,12 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; + @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class NeutronFloatingIP implements Serializable { +public class NeutronFloatingIP extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; // See OpenStack Network API v2.0 Reference for description of diff --git a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronNetwork.java b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronNetwork.java index 1277436e23..5b35dc2b34 100644 --- a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronNetwork.java +++ b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronNetwork.java @@ -18,10 +18,12 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; + @XmlRootElement(name = "network") @XmlAccessorType(XmlAccessType.NONE) -public class NeutronNetwork implements Serializable { +public class NeutronNetwork extends ConfigurationObject implements Serializable { // See OpenStack Network API v2.0 Reference for description of // annotated attributes diff --git a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronPort.java b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronPort.java index bcadba202a..c8ee4e8ccc 100644 --- a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronPort.java +++ b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronPort.java @@ -19,11 +19,13 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; + @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class NeutronPort implements Serializable { +public class NeutronPort extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; // See OpenStack Network API v2.0 Reference for description of diff --git a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronRouter.java b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronRouter.java index ed65c5c91b..fa35f71fd6 100644 --- a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronRouter.java +++ b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronRouter.java @@ -18,10 +18,12 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; + @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class NeutronRouter implements Serializable { +public class NeutronRouter extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; // See OpenStack Network API v2.0 Reference for description of diff --git a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronSubnet.java b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronSubnet.java index fbaa63a148..11a1be2118 100644 --- a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronSubnet.java +++ b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronSubnet.java @@ -20,11 +20,12 @@ import javax.xml.bind.annotation.XmlRootElement; import org.apache.commons.net.util.SubnetUtils; import org.apache.commons.net.util.SubnetUtils.SubnetInfo; +import org.opendaylight.controller.configuration.ConfigurationObject; @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class NeutronSubnet implements Serializable { +public class NeutronSubnet extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; // See OpenStack Network API v2.0 Reference for description of diff --git a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/Neutron_IPs.java b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/Neutron_IPs.java index e862a59e8a..b79e432550 100644 --- a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/Neutron_IPs.java +++ b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/Neutron_IPs.java @@ -15,9 +15,11 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; + @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class Neutron_IPs implements Serializable { +public class Neutron_IPs extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; // See OpenStack Network API v2.0 Reference for description of diff --git a/opendaylight/northbound/commons/pom.xml b/opendaylight/northbound/commons/pom.xml index 70bd0d4734..afd2f2e47f 100644 --- a/opendaylight/northbound/commons/pom.xml +++ b/opendaylight/northbound/commons/pom.xml @@ -65,6 +65,10 @@ + + org.opendaylight.controller + containermanager + org.opendaylight.controller switchmanager @@ -82,17 +86,7 @@ bundlescanner - - com.fasterxml.jackson.core - jackson-annotations - - - - com.fasterxml.jackson.core - jackson-core - - - + com.fasterxml.jackson.core jackson-databind diff --git a/opendaylight/routing/dijkstra_implementation/pom.xml b/opendaylight/routing/dijkstra_implementation/pom.xml index b4a4170a90..44e2efa790 100644 --- a/opendaylight/routing/dijkstra_implementation/pom.xml +++ b/opendaylight/routing/dijkstra_implementation/pom.xml @@ -56,6 +56,10 @@ + + org.opendaylight.controller + clustering.services + org.opendaylight.controller sal diff --git a/opendaylight/statisticsmanager/api/pom.xml b/opendaylight/statisticsmanager/api/pom.xml index b1603d712b..9757e8cadd 100644 --- a/opendaylight/statisticsmanager/api/pom.xml +++ b/opendaylight/statisticsmanager/api/pom.xml @@ -28,7 +28,6 @@ org.opendaylight.controller.forwardingrulesmanager, - org.opendaylight.controller.containermanager, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.flowprogrammer, org.slf4j, org.opendaylight.controller.sal.reader, @@ -48,17 +47,9 @@ org.opendaylight.controller sal - - org.opendaylight.controller - containermanager - org.opendaylight.controller forwardingrulesmanager - - org.opendaylight.controller - clustering.services - diff --git a/opendaylight/statisticsmanager/implementation/pom.xml b/opendaylight/statisticsmanager/implementation/pom.xml index bc7d458c46..8f2ad737f7 100644 --- a/opendaylight/statisticsmanager/implementation/pom.xml +++ b/opendaylight/statisticsmanager/implementation/pom.xml @@ -43,7 +43,6 @@ org.opendaylight.controller.clustering.services, - org.opendaylight.controller.containermanager, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.flowprogrammer, org.opendaylight.controller.sal.reader, @@ -102,7 +101,11 @@ org.opendaylight.controller - containermanager + sal.connection + + + org.opendaylight.controller + switchmanager org.opendaylight.controller @@ -120,9 +123,5 @@ junit junit - - org.opendaylight.controller - commons.logback_settings - diff --git a/opendaylight/switchmanager/api/pom.xml b/opendaylight/switchmanager/api/pom.xml index 010aaa5d41..ebaf83fd39 100644 --- a/opendaylight/switchmanager/api/pom.xml +++ b/opendaylight/switchmanager/api/pom.xml @@ -47,18 +47,13 @@ org.opendaylight.controller.switchmanager - org.opendaylight.controller.clustering.services, org.opendaylight.controller.configuration, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.utils, org.opendaylight.controller.sal.packet, org.opendaylight.controller.sal.inventory, org.slf4j, - org.apache.felix.dm, - org.eclipse.osgi.framework.console, - org.osgi.framework, - javax.xml.bind.annotation, - org.apache.commons.lang3.builder + javax.xml.bind.annotation ${project.basedir}/META-INF @@ -89,10 +84,6 @@ - - org.opendaylight.controller - clustering.services - org.opendaylight.controller configuration diff --git a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SpanConfig.java b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SpanConfig.java index 4bb6438b32..eeccf1080b 100644 --- a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SpanConfig.java +++ b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SpanConfig.java @@ -14,6 +14,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.utils.GUIField; @@ -23,7 +24,7 @@ import org.slf4j.LoggerFactory; /** * The class represents a Span Port configuration for a network node. */ -public class SpanConfig implements Serializable { +public class SpanConfig extends ConfigurationObject implements Serializable { protected static final Logger logger = LoggerFactory .getLogger(SpanConfig.class); private static final long serialVersionUID = 1L; @@ -73,23 +74,30 @@ public class SpanConfig implements Serializable { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } SpanConfig other = (SpanConfig) obj; if (nodeId == null) { - if (other.nodeId != null) + if (other.nodeId != null) { return false; - } else if (!nodeId.equals(other.nodeId)) + } + } else if (!nodeId.equals(other.nodeId)) { return false; + } if (spanPort == null) { - if (other.spanPort != null) + if (other.spanPort != null) { return false; - } else if (!spanPort.equals(other.spanPort)) + } + } else if (!spanPort.equals(other.spanPort)) { return false; + } return true; } diff --git a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SwitchConfig.java b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SwitchConfig.java index ba9d1a12f3..28c811c669 100644 --- a/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SwitchConfig.java +++ b/opendaylight/switchmanager/api/src/main/java/org/opendaylight/controller/switchmanager/SwitchConfig.java @@ -12,6 +12,7 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.sal.core.Description; import org.opendaylight.controller.sal.core.ForwardingMode; import org.opendaylight.controller.sal.core.Property; @@ -22,7 +23,7 @@ import org.opendaylight.controller.sal.utils.StatusCode; /** * The class describes a switch configuration */ -public class SwitchConfig implements Cloneable, Serializable { +public class SwitchConfig extends ConfigurationObject implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private final String nodeId; private final Map nodeProperties; diff --git a/opendaylight/switchmanager/implementation/pom.xml b/opendaylight/switchmanager/implementation/pom.xml index 01a73af18c..e16c6051d3 100644 --- a/opendaylight/switchmanager/implementation/pom.xml +++ b/opendaylight/switchmanager/implementation/pom.xml @@ -45,9 +45,9 @@ + org.opendaylight.controller.configuration, org.opendaylight.controller.switchmanager, org.opendaylight.controller.clustering.services, - org.opendaylight.controller.configuration, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.utils, org.opendaylight.controller.sal.packet, @@ -96,11 +96,11 @@ org.opendaylight.controller - clustering.services + configuration org.opendaylight.controller - configuration + clustering.services org.opendaylight.controller @@ -120,11 +120,11 @@ equinoxSDK381 - org.apache.felix.gogo.runtime + org.eclipse.osgi - org.opendaylight.controller - commons.logback_settings + equinoxSDK381 + org.apache.felix.gogo.runtime diff --git a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/Activator.java b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/Activator.java index f55fc8e5ee..002e06c0bf 100644 --- a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/Activator.java +++ b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/Activator.java @@ -12,6 +12,7 @@ package org.opendaylight.controller.switchmanager.internal; import org.apache.felix.dm.Component; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase; import org.opendaylight.controller.sal.inventory.IInventoryService; import org.opendaylight.controller.sal.inventory.IListenInventoryUpdates; @@ -95,6 +96,10 @@ public class Activator extends ComponentActivatorAbstractBase { IClusterContainerServices.class).setCallbacks( "setClusterContainerService", "unsetClusterContainerService").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } } diff --git a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java index d8e6a7412f..770180c04e 100644 --- a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java +++ b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManager.java @@ -35,7 +35,9 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.sal.core.Bandwidth; import org.opendaylight.controller.sal.core.Config; import org.opendaylight.controller.sal.core.ConstructionException; @@ -56,8 +58,6 @@ import org.opendaylight.controller.sal.reader.NodeDescription; import org.opendaylight.controller.sal.utils.GlobalConstants; import org.opendaylight.controller.sal.utils.HexEncode; 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.opendaylight.controller.statisticsmanager.IStatisticsManager; @@ -86,8 +86,9 @@ import org.slf4j.LoggerFactory; public class SwitchManager implements ISwitchManager, IConfigurationContainerAware, IObjectReader, IListenInventoryUpdates, CommandProvider { private static Logger log = LoggerFactory.getLogger(SwitchManager.class); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private String subnetFileName, spanFileName, switchConfigFileName; + private static final String SUBNETS_FILE_NAME = "subnets.conf"; + private static final String SPAN_FILE_NAME = "spanPorts.conf"; + private static final String SWITCH_CONFIG_FILE_NAME = "switchConfig.conf"; private final List spanNodeConnectors = new CopyOnWriteArrayList(); // Collection of Subnets keyed by the InetAddress private ConcurrentMap subnets; @@ -101,6 +102,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa private ConcurrentMap controllerProps; private IInventoryService inventoryService; private IStatisticsManager statisticsManager; + private IConfigurationContainerService configurationService; private final Set switchManagerAware = Collections .synchronizedSet(new HashSet()); private final Set inventoryListeners = Collections @@ -116,9 +118,9 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa * only subnet returned. As soon as a user-configured subnet is created this one will * vanish. */ - protected static SubnetConfig DEFAULT_SUBNETCONFIG; - protected static Subnet DEFAULT_SUBNET; - protected static String DEFAULT_SUBNET_NAME = "default (cannot be modifed)"; + protected static final SubnetConfig DEFAULT_SUBNETCONFIG; + protected static final Subnet DEFAULT_SUBNET; + protected static final String DEFAULT_SUBNET_NAME = "default (cannot be modifed)"; static{ DEFAULT_SUBNETCONFIG = new SubnetConfig(DEFAULT_SUBNET_NAME, "0.0.0.0/0", new ArrayList()); DEFAULT_SUBNET = new Subnet(DEFAULT_SUBNETCONFIG); @@ -164,32 +166,17 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } public void startUp() { - String container = this.getContainerName(); - // Initialize configuration file names - subnetFileName = ROOT + "subnets_" + container + ".conf"; - spanFileName = ROOT + "spanPorts_" + container + ".conf"; - switchConfigFileName = ROOT + "switchConfig_" + container + ".conf"; - // Instantiate cluster synced variables allocateCaches(); retrieveCaches(); - /* - * Read startup and build database if we are the coordinator - */ - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadSubnetConfiguration(); - loadSpanConfiguration(); - loadSwitchConfiguration(); - } - // Add controller MAC, if first node in the cluster if (!controllerProps.containsKey(MacAddress.name)) { byte controllerMac[] = getHardwareMAC(); if (controllerMac != null) { Property existing = controllerProps.putIfAbsent(MacAddress.name, new MacAddress(controllerMac)); if (existing == null && log.isTraceEnabled()) { - log.trace("Container {}: Setting controller MAC address in the cluster: {}", container, + log.trace("Container {}: Setting controller MAC address in the cluster: {}", getContainerName(), HexEncode.bytesToHexStringFormat(controllerMac)); } } @@ -365,14 +352,10 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa @Override public List getNetworkDevices() { - Set nodeSet = getNodes(); List swList = new ArrayList(); - if (nodeSet != null) { - for (Node node : nodeSet) { - swList.add(getSwitchByNode(node)); - } + for (Node node : getNodes()) { + swList.add(getSwitchByNode(node)); } - return swList; } @@ -702,48 +685,21 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa return ois.readObject(); } - @SuppressWarnings("unchecked") private void loadSubnetConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader - .read(this, subnetFileName); - - if (confList == null) { - return; - } - - for (SubnetConfig conf : confList.values()) { - addSubnet(conf); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, SUBNETS_FILE_NAME)) { + addSubnet((SubnetConfig) conf); } } - @SuppressWarnings("unchecked") private void loadSpanConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader - .read(this, spanFileName); - - if (confList == null) { - return; - } - - for (SpanConfig conf : confList.values()) { - addSpanConfig(conf); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, SPAN_FILE_NAME)) { + addSpanConfig((SpanConfig) conf); } } - @SuppressWarnings("unchecked") private void loadSwitchConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader - .read(this, switchConfigFileName); - - if (confList == null) { - return; - } - - for (SwitchConfig conf : confList.values()) { - updateNodeConfig(conf); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, SWITCH_CONFIG_FILE_NAME)) { + updateNodeConfig((SwitchConfig) conf); } } @@ -944,24 +900,36 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa } public Status saveSwitchConfigInternal() { - Status retS = null, retP = null; - ObjectWriter objWriter = new ObjectWriter(); - - retS = objWriter.write(new ConcurrentHashMap( - subnetsConfigList), subnetFileName); - retP = objWriter.write(new ConcurrentHashMap( - spanConfigList), spanFileName); - retS = objWriter.write(new ConcurrentHashMap( - nodeConfigList), switchConfigFileName); - if (retS.equals(retP)) { - if (retS.isSuccess()) { - return retS; - } else { - return new Status(StatusCode.INTERNALERROR, "Save failed"); - } + Status status; + short number = 0; + status = configurationService.persistConfiguration( + new ArrayList(subnetsConfigList.values()), SUBNETS_FILE_NAME); + if (status.isSuccess()) { + number++; + } else { + log.warn("Failed to save subnet gateway configurations: " + status.getDescription()); + } + status = configurationService.persistConfiguration(new ArrayList(spanConfigList.values()), + SPAN_FILE_NAME); + if (status.isSuccess()) { + number++; } else { + log.warn("Failed to save span port configurations: " + status.getDescription()); + } + status = configurationService.persistConfiguration(new ArrayList(nodeConfigList.values()), + SWITCH_CONFIG_FILE_NAME); + if (status.isSuccess()) { + number++; + } else { + log.warn("Failed to save node configurations: " + status.getDescription()); + } + if (number == 0) { + return new Status(StatusCode.INTERNALERROR, "Save failed"); + } + if (number < 3) { return new Status(StatusCode.INTERNALERROR, "Partial save failure"); } + return status; } @Override @@ -1436,10 +1404,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa if (macAddress == null) { log.warn("Failed to acquire controller MAC: No physical interface found"); // This happens when running controller on windows VM, for example - // TODO: Try parsing the OS command output - // For now provide a quick fix for the release - macAddress = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x0c, (byte) 0x60, (byte) 0x0D, (byte) 0x10 }; - log.debug("Assigning custom MAC address to controller"); + // Try parsing the OS command output } return macAddress; } @@ -1655,7 +1620,6 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa isDefaultContainer = containerName.equals(GlobalConstants.DEFAULT .toString()); - startUp(); } /** @@ -1674,6 +1638,15 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa * */ void start() { + startUp(); + + /* + * Read startup and build database if we are the coordinator + */ + loadSubnetConfiguration(); + loadSpanConfiguration(); + loadSwitchConfiguration(); + // OSGI console registerWithOSGIConsole(); } @@ -1695,6 +1668,16 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa void stop() { } + public void setConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service set request {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service UNset request"); + this.configurationService = null; + } + public void setInventoryService(IInventoryService service) { log.trace("Got inventory service set request {}", service); this.inventoryService = service; @@ -2169,9 +2152,7 @@ public class SwitchManager implements ISwitchManager, IConfigurationContainerAwa if (configuredNotConnectedNodes != null) { for (Node node : configuredNotConnectedNodes) { Switch sw = getSwitchByNode(node); - if (sw != null) { - configuredNotConnectedSwitches.add(sw); - } + configuredNotConnectedSwitches.add(sw); } } return configuredNotConnectedSwitches; diff --git a/opendaylight/switchmanager/integrationtest/pom.xml b/opendaylight/switchmanager/integrationtest/pom.xml index 2fa9c26a90..204caf01b4 100644 --- a/opendaylight/switchmanager/integrationtest/pom.xml +++ b/opendaylight/switchmanager/integrationtest/pom.xml @@ -58,6 +58,18 @@ org.opendaylight.controller configuration.implementation + + org.opendaylight.controller + hosttracker + + + org.opendaylight.controller + hosttracker.implementation + + + org.opendaylight.controller + topologymanager + org.opendaylight.controller protocol_plugins.stub diff --git a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java index 1b1e6f49d1..3532ab78e0 100644 --- a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java +++ b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/TopologyUserLinkConfig.java @@ -16,6 +16,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.sal.core.NodeConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +26,7 @@ import org.slf4j.LoggerFactory; */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class TopologyUserLinkConfig implements Serializable { +public class TopologyUserLinkConfig extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(TopologyUserLinkConfig.class); @@ -38,19 +39,24 @@ public class TopologyUserLinkConfig implements Serializable { private String name; + @Override public String toString() { return name; } public static STATUS fromString(String str) { - if (str == null) + if (str == null) { return LINKDOWN; - if (str.equals(SUCCESS.toString())) + } + if (str.equals(SUCCESS.toString())) { return SUCCESS; - if (str.equals(LINKDOWN.toString())) + } + if (str.equals(LINKDOWN.toString())) { return LINKDOWN; - if (str.equals(INCORRECT.toString())) + } + if (str.equals(INCORRECT.toString())) { return INCORRECT; + } return LINKDOWN; } } @@ -111,19 +117,18 @@ public class TopologyUserLinkConfig implements Serializable { } public boolean isValidNodeConnector(String nodeConnectorStr) { - NodeConnector nc = NodeConnector.fromString(nodeConnectorStr); - if (nc == null) return false; - return true; + return (NodeConnector.fromString(nodeConnectorStr) != null); } public boolean isValid() { - if (name == null || srcNodeConnector == null || dstNodeConnector == null) { + if (!isValidResourceName(name)) { + logger.debug("Invalid name in user link: {}", name); return false; } if (!isValidNodeConnector(srcNodeConnector) || !isValidNodeConnector(dstNodeConnector)) { - logger.debug("Invalid NodeConnector in user link: {}", this); + logger.debug("Invalid NodeConnector in user link: {}", name); return false; } @@ -146,23 +151,30 @@ public class TopologyUserLinkConfig implements Serializable { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } TopologyUserLinkConfig other = (TopologyUserLinkConfig) obj; if (dstNodeConnector == null) { - if (other.dstNodeConnector != null) + if (other.dstNodeConnector != null) { return false; - } else if (!dstNodeConnector.equals(other.dstNodeConnector)) + } + } else if (!dstNodeConnector.equals(other.dstNodeConnector)) { return false; + } if (srcNodeConnector == null) { - if (other.srcNodeConnector != null) + if (other.srcNodeConnector != null) { return false; - } else if (!srcNodeConnector.equals(other.srcNodeConnector)) + } + } else if (!srcNodeConnector.equals(other.srcNodeConnector)) { return false; + } return true; } diff --git a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/Activator.java b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/Activator.java index b2a096aa7b..4ccbb0197d 100644 --- a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/Activator.java +++ b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/Activator.java @@ -18,6 +18,7 @@ import org.apache.felix.dm.Component; import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase; import org.opendaylight.controller.sal.topology.IListenTopoUpdates; import org.opendaylight.controller.sal.topology.ITopologyService; @@ -101,6 +102,11 @@ public class Activator extends ComponentActivatorAbstractBase { IClusterContainerServices.class).setCallbacks( "setClusterContainerService", "unsetClusterContainerService").setRequired(true)); + + c.add(createContainerServiceDependency(containerName).setService( + IConfigurationContainerService.class).setCallbacks( + "setConfigurationContainerService", + "unsetConfigurationContainerService").setRequired(true)); } } } diff --git a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java index b0570fb7f9..3618547ac8 100644 --- a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java +++ b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java @@ -36,7 +36,9 @@ 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.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationContainerAware; +import org.opendaylight.controller.configuration.IConfigurationContainerService; import org.opendaylight.controller.sal.core.Edge; import org.opendaylight.controller.sal.core.Host; import org.opendaylight.controller.sal.core.Node; @@ -47,11 +49,8 @@ import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.topology.IListenTopoUpdates; import org.opendaylight.controller.sal.topology.ITopologyService; import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; -import org.opendaylight.controller.sal.utils.GlobalConstants; import org.opendaylight.controller.sal.utils.IObjectReader; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; -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.opendaylight.controller.switchmanager.ISwitchManager; @@ -80,9 +79,11 @@ public class TopologyManagerImpl implements protected static final String TOPOHOSTSDB = "topologymanager.hostsDB"; protected static final String TOPONODECONNECTORDB = "topologymanager.nodeConnectorDB"; protected static final String TOPOUSERLINKSDB = "topologymanager.userLinksDB"; + private static final String USER_LINKS_FILE_NAME = "userTopology.conf"; private static final Logger log = LoggerFactory.getLogger(TopologyManagerImpl.class); private ITopologyService topoService; private IClusterContainerServices clusterContainerService; + private IConfigurationContainerService configurationService; private ISwitchManager switchManager; // DB of all the Edges with properties which constitute our topology private ConcurrentMap> edgesDB; @@ -97,8 +98,6 @@ public class TopologyManagerImpl implements // Topology Manager Aware listeners - for clusterwide updates private Set topologyManagerClusterWideAware = new CopyOnWriteArraySet(); - private static String ROOT = GlobalConstants.STARTUPHOME.toString(); - private String userLinksFileName; private ConcurrentMap userLinksDB; private BlockingQueue notifyQ = new LinkedBlockingQueue(); private volatile Boolean shuttingDown = false; @@ -164,6 +163,16 @@ public class TopologyManagerImpl implements } } + public void setConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service set request {}", service); + this.configurationService = service; + } + + public void unsetConfigurationContainerService(IConfigurationContainerService service) { + log.trace("Got configuration service UNset request"); + this.configurationService = null; + } + void setSwitchManager(ISwitchManager s) { log.debug("Adding ISwitchManager: {}", s); this.switchManager = s; @@ -193,11 +202,9 @@ public class TopologyManagerImpl implements containerName = "UNKNOWN"; } - userLinksFileName = ROOT + "userTopology_" + containerName + ".conf"; registerWithOSGIConsole(); - if ((clusterContainerService != null) && (clusterContainerService.amICoordinator())) { - loadConfiguration(); - } + loadConfiguration(); + // Restore the shuttingDown status on init of the component shuttingDown = false; notifyThread = new Thread(new TopologyNotify(notifyQ)); @@ -292,16 +299,9 @@ public class TopologyManagerImpl implements notifyThread = null; } - @SuppressWarnings("unchecked") private void loadConfiguration() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = - (ConcurrentMap) objReader.read(this, userLinksFileName); - - if (confList != null) { - for (TopologyUserLinkConfig conf : confList.values()) { - addUserLink(conf); - } + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, USER_LINKS_FILE_NAME)) { + addUserLink((TopologyUserLinkConfig) conf); } } @@ -311,12 +311,10 @@ public class TopologyManagerImpl implements } public Status saveConfigInternal() { - ObjectWriter objWriter = new ObjectWriter(); - - Status saveStatus = objWriter.write( - new ConcurrentHashMap(userLinksDB), userLinksFileName); + Status saveStatus = configurationService.persistConfiguration( + new ArrayList(userLinksDB.values()), USER_LINKS_FILE_NAME); - if (! saveStatus.isSuccess()) { + if (!saveStatus.isSuccess()) { return new Status(StatusCode.INTERNALERROR, "Topology save failed: " + saveStatus.getDescription()); } return saveStatus; diff --git a/opendaylight/usermanager/api/pom.xml b/opendaylight/usermanager/api/pom.xml index 3b518cc5bc..768ccba138 100644 --- a/opendaylight/usermanager/api/pom.xml +++ b/opendaylight/usermanager/api/pom.xml @@ -26,25 +26,21 @@ - org.opendaylight.controller.clustering.services, org.opendaylight.controller.configuration, org.opendaylight.controller.sal.authorization, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.packet, org.opendaylight.controller.sal.utils, - org.opendaylight.controller.containermanager, org.slf4j, org.eclipse.osgi.framework.console, org.osgi.framework, org.apache.felix.dm, - org.apache.commons.lang3.builder, org.apache.commons.logging, javax.servlet, javax.servlet.http, org.springframework.security.web.context, org.springframework.security.core, org.springframework.security.core.context, - org.apache.commons.lang3, org.springframework.security.authentication, org.springframework.security.core.authority, org.springframework.security.core.userdetails, @@ -62,14 +58,6 @@ - - org.opendaylight.controller - containermanager - - - org.opendaylight.controller - clustering.services - org.opendaylight.controller configuration @@ -87,10 +75,6 @@ javax.servlet - - org.springframework.security - spring-security-config - org.springframework.security spring-security-core @@ -99,13 +83,5 @@ org.springframework.security spring-security-web - - org.springframework.security - spring-security-taglibs - - - org.springframework - org.springframework.transaction - diff --git a/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/ServerConfig.java b/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/ServerConfig.java index f50f9e71c9..3145f2095f 100644 --- a/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/ServerConfig.java +++ b/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/ServerConfig.java @@ -11,11 +11,13 @@ package org.opendaylight.controller.usermanager; import java.io.Serializable; +import org.opendaylight.controller.configuration.ConfigurationObject; + /** * Configuration Java Object which represents a Remote AAA server configuration * information for User Manager. */ -public class ServerConfig implements Serializable { +public class ServerConfig extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; // Order matters: JSP file expects following fields in the following order @@ -57,28 +59,37 @@ public class ServerConfig implements Serializable { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } ServerConfig other = (ServerConfig) obj; if (ip == null) { - if (other.ip != null) + if (other.ip != null) { return false; - } else if (!ip.equals(other.ip)) + } + } else if (!ip.equals(other.ip)) { return false; + } if (protocol == null) { - if (other.protocol != null) + if (other.protocol != null) { return false; - } else if (!protocol.equals(other.protocol)) + } + } else if (!protocol.equals(other.protocol)) { return false; + } if (secret == null) { - if (other.secret != null) + if (other.secret != null) { return false; - } else if (!secret.equals(other.secret)) + } + } else if (!secret.equals(other.secret)) { return false; + } return true; } diff --git a/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java b/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java index 83532a1012..75fcec5b3c 100644 --- a/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java +++ b/opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/UserConfig.java @@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.sal.authorization.AuthResultEnum; import org.opendaylight.controller.sal.packet.BitBufferHelper; import org.opendaylight.controller.sal.utils.HexEncode; @@ -38,7 +39,7 @@ import org.slf4j.LoggerFactory; */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class UserConfig implements Serializable { +public class UserConfig extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; private static Logger log = LoggerFactory.getLogger(UserConfig.class); private static final boolean strongPasswordCheck = Boolean.getBoolean("enableStrongPasswordCheck"); diff --git a/opendaylight/usermanager/implementation/pom.xml b/opendaylight/usermanager/implementation/pom.xml index 84ca46a21b..08f7dcb313 100644 --- a/opendaylight/usermanager/implementation/pom.xml +++ b/opendaylight/usermanager/implementation/pom.xml @@ -26,8 +26,8 @@ - org.opendaylight.controller.clustering.services, org.opendaylight.controller.configuration, + org.opendaylight.controller.clustering.services, org.opendaylight.controller.sal.authorization, org.opendaylight.controller.sal.core, org.opendaylight.controller.sal.packet, @@ -102,5 +102,6 @@ org.slf4j jcl-over-slf4j + diff --git a/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/Activator.java b/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/Activator.java index 77da099d67..26e10a6b04 100644 --- a/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/Activator.java +++ b/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/Activator.java @@ -12,6 +12,7 @@ package org.opendaylight.controller.usermanager.internal; import org.apache.felix.dm.Component; import org.opendaylight.controller.clustering.services.IClusterGlobalServices; import org.opendaylight.controller.configuration.IConfigurationAware; +import org.opendaylight.controller.configuration.IConfigurationService; import org.opendaylight.controller.containermanager.IContainerAuthorization; import org.opendaylight.controller.sal.authorization.IResourceAuthorization; import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase; @@ -102,6 +103,11 @@ public class Activator extends ComponentActivatorAbstractBase { "setClusterGlobalService", "unsetClusterGlobalService") .setRequired(true)); + c.add(createServiceDependency().setService( + IConfigurationService.class).setCallbacks( + "setConfigurationService", + "unsetConfigurationService").setRequired(true)); + c.add(createServiceDependency().setService(IAAAProvider.class) .setCallbacks("addAAAProvider", "removeAAAProvider") .setRequired(false)); diff --git a/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/UserManager.java b/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/UserManager.java index 5d673fbca4..be4b796a56 100644 --- a/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/UserManager.java +++ b/opendaylight/usermanager/implementation/src/main/java/org/opendaylight/controller/usermanager/internal/UserManager.java @@ -31,15 +31,14 @@ import org.opendaylight.controller.clustering.services.CacheConfigException; import org.opendaylight.controller.clustering.services.CacheExistException; import org.opendaylight.controller.clustering.services.IClusterGlobalServices; import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.configuration.ConfigurationObject; import org.opendaylight.controller.configuration.IConfigurationAware; +import org.opendaylight.controller.configuration.IConfigurationService; import org.opendaylight.controller.containermanager.IContainerAuthorization; import org.opendaylight.controller.sal.authorization.AuthResultEnum; import org.opendaylight.controller.sal.authorization.IResourceAuthorization; import org.opendaylight.controller.sal.authorization.UserLevel; -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.opendaylight.controller.usermanager.AuthResponse; @@ -76,11 +75,10 @@ public class UserManager implements IUserManager, IObjectReader, private static final String DEFAULT_ADMIN = "admin"; private static final String DEFAULT_ADMIN_PASSWORD = "admin"; private static final String DEFAULT_ADMIN_ROLE = UserLevel.NETWORKADMIN.toString(); - private static final String ROOT = GlobalConstants.STARTUPHOME.toString(); - private static final String USERS_FILE_NAME = ROOT + "users.conf"; - private static final String SERVERS_FILE_NAME = ROOT + "servers.conf"; - private static final String AUTH_FILE_NAME = ROOT + "authorization.conf"; - private static final String RECOVERY_FILE = ROOT + "NETWORK_ADMIN_PASSWORD_RECOVERY"; + private static final String USERS_FILE_NAME = "users.conf"; + private static final String SERVERS_FILE_NAME = "servers.conf"; + private static final String AUTH_FILE_NAME = "authorization.conf"; + private static final String RECOVERY_FILE = "NETWORK_ADMIN_PASSWORD_RECOVERY"; private ConcurrentMap localUserConfigList; private ConcurrentMap remoteServerConfigList; // local authorization info for remotely authenticated users @@ -88,6 +86,7 @@ public class UserManager implements IUserManager, IObjectReader, private ConcurrentMap activeUsers; private ConcurrentMap authProviders; private IClusterGlobalServices clusterGlobalService = null; + private IConfigurationService configurationService; private SecurityContextRepository securityContextRepo = new UserSecurityContextRepository(); private IContainerAuthorization containerAuthorizationClient; private Set applicationAuthorizationClients; @@ -204,11 +203,9 @@ public class UserManager implements IUserManager, IObjectReader, /* * Do not load local startup file if we are not the coordinator */ - if ((clusterGlobalService != null) && (clusterGlobalService.amICoordinator())) { - loadUserConfig(); - loadServerConfig(); - loadAuthConfig(); - } + loadUserConfig(); + loadServerConfig(); + loadAuthConfig(); } private void loadSecurityKeys() { @@ -408,9 +405,8 @@ public class UserManager implements IUserManager, IObjectReader, } private Status saveLocalUserListInternal() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write(new ConcurrentHashMap( - localUserConfigList), USERS_FILE_NAME); + return configurationService.persistConfiguration( + new ArrayList(localUserConfigList.values()), USERS_FILE_NAME); } @Override @@ -419,9 +415,8 @@ public class UserManager implements IUserManager, IObjectReader, } private Status saveAAAServerListInternal() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write(new ConcurrentHashMap( - remoteServerConfigList), SERVERS_FILE_NAME); + return configurationService.persistConfiguration( + new ArrayList(remoteServerConfigList.values()), SERVERS_FILE_NAME); } @Override @@ -430,10 +425,8 @@ public class UserManager implements IUserManager, IObjectReader, } private Status saveAuthorizationListInternal() { - ObjectWriter objWriter = new ObjectWriter(); - return objWriter.write( - new ConcurrentHashMap( - authorizationConfList), AUTH_FILE_NAME); + return configurationService.persistConfiguration( + new ArrayList(authorizationConfList.values()), AUTH_FILE_NAME); } @Override @@ -444,48 +437,21 @@ public class UserManager implements IUserManager, IObjectReader, return ois.readObject(); } - @SuppressWarnings("unchecked") private void loadUserConfig() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader - .read(this, USERS_FILE_NAME); - - if (confList == null) { - return; - } - - for (UserConfig conf : confList.values()) { - addRemoveLocalUserInternal(conf, false); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, USERS_FILE_NAME)) { + addRemoveLocalUserInternal((UserConfig) conf, false); } } - @SuppressWarnings("unchecked") private void loadServerConfig() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader - .read(this, SERVERS_FILE_NAME); - - if (confList == null) { - return; - } - - for (ServerConfig conf : confList.values()) { - addAAAServer(conf); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, SERVERS_FILE_NAME)) { + addAAAServer((ServerConfig) conf); } } - @SuppressWarnings("unchecked") private void loadAuthConfig() { - ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader - .read(this, AUTH_FILE_NAME); - - if (confList == null) { - return; - } - - for (AuthorizationConfig conf : confList.values()) { - addAuthInfo(conf); + for (ConfigurationObject conf : configurationService.retrieveConfiguration(this, AUTH_FILE_NAME)) { + addAuthInfo((AuthorizationConfig) conf); } } @@ -817,6 +783,16 @@ public class UserManager implements IUserManager, IObjectReader, } } + public void setConfigurationService(IConfigurationService service) { + logger.trace("Got configuration service set request {}", service); + this.configurationService = service; + } + + public void unsetConfigurationService(IConfigurationService service) { + logger.trace("Got configuration service UNset request"); + this.configurationService = null; + } + void unsetContainerAuthClient(IContainerAuthorization s) { if (this.containerAuthorizationClient == s) { this.containerAuthorizationClient = null; -- 2.36.6