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.IConfigurationContainerAware;
* Static Routing feature provides the bridge between SDN and Non-SDN networks.
*/
public class StaticRoutingImplementation implements IfNewHostNotify,
- IForwardingStaticRouting, IObjectReader, IConfigurationContainerAware,
- ICacheUpdateAware<Long, String> {
+ IForwardingStaticRouting, IObjectReader, IConfigurationContainerAware {
private static Logger log = LoggerFactory
.getLogger(StaticRoutingImplementation.class);
private static String ROOT = GlobalConstants.STARTUPHOME.toString();
private IfIptoHost hostTracker;
private Timer gatewayProbeTimer;
private String staticRoutesFileName = null;
- private Map<Long, String> configSaveEvent;
private IClusterContainerServices clusterContainerService = null;
private Set<IStaticRoutingAware> staticRoutingAware = Collections
.synchronizedSet(new HashSet<IStaticRoutingAware>());
}
}
+ @Override
public ConcurrentMap<String, StaticRouteConfig> getStaticRouteConfigs() {
return staticRouteConfigs;
}
private Status saveConfig() {
- // Publish the save config event to the cluster nodes
- configSaveEvent.put(new Date().getTime(), SAVE);
return saveConfigInternal();
}
try {
clusterContainerService.createCache(
"forwarding.staticrouting.routes", EnumSet
- .of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
+ .of(IClusterServices.cacheMode.TRANSACTIONAL));
clusterContainerService.createCache(
"forwarding.staticrouting.configs", EnumSet
- .of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
- clusterContainerService.createCache(
- "forwarding.staticrouting.configSaveEvent", EnumSet
- .of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
-
+ .of(IClusterServices.cacheMode.TRANSACTIONAL));
} catch (CacheExistException cee) {
log
.error("\nCache already exists - destroy and recreate if needed");
if (staticRouteConfigs == null) {
log.error("\nFailed to get rulesDB handle");
}
- configSaveEvent = (ConcurrentMap<Long, String>) clusterContainerService
- .getCache("forwarding.staticrouting.configSaveEvent");
- if (configSaveEvent == null) {
- log.error("\nFailed to get cache for configSaveEvent");
- }
- }
-
- @Override
- public void entryCreated(Long key, String cacheName, boolean local) {
- }
-
- @Override
- public void entryUpdated(Long key, String new_value, String cacheName,
- boolean originLocal) {
- saveConfigInternal();
- }
-
- @Override
- public void entryDeleted(Long key, String cacheName, boolean originLocal) {
}
private void notifyStaticRouteUpdate(StaticRoute s, boolean update) {
}
private void notifyHostUpdate(HostNodeConnector host, boolean added) {
- if (host == null)
+ if (host == null) {
return;
+ }
for (StaticRoute s : staticRoutes.values()) {
- if (s.getType() == StaticRoute.NextHopType.SWITCHPORT)
+ if (s.getType() == StaticRoute.NextHopType.SWITCHPORT) {
continue;
+ }
if (s.getNextHopAddress().equals(host.getNetworkAddress())) {
if (added) {
s.setHost(host);
}
public boolean isIPv4AddressValid(String cidr) {
- if (cidr == null)
+ if (cidr == null) {
return false;
+ }
String values[] = cidr.split("/");
Pattern ipv4Pattern = Pattern
return 0;
}
+ @Override
public StaticRoute getBestMatchStaticRoute(InetAddress ipAddress) {
ByteBuffer bblongestPrefix = null;
try {
return longestPrefixRoute;
}
+ @Override
public Status addStaticRoute(StaticRouteConfig config) {
- Status status;
-
- status = config.isValid();
+ Status status = config.isValid();
if (!status.isSuccess()) {
return status;
}
"A valid Static Route configuration with this name " +
"already exists. Please use a different name");
}
- for (StaticRouteConfig s : staticRouteConfigs.values()) {
- if (s.equals(config)) {
+
+ // Update database
+ StaticRoute sRoute = new StaticRoute(config);
+
+ for (Map.Entry<String, StaticRoute> entry : staticRoutes.entrySet()) {
+ if (entry.getValue().compareTo(sRoute) == 0) {
return new Status(StatusCode.CONFLICT,
- "This conflicts with an existing Static Route " +
- "Configuration. Please check the configuration " +
- "and try again");
+ "This conflicts with an existing Static Route " +
+ "Configuration. Please check the configuration " +
+ "and try again");
}
}
+ staticRoutes.put(config.getName(), sRoute);
+ // Update config databse
staticRouteConfigs.put(config.getName(), config);
- StaticRoute sRoute = new StaticRoute(config);
- staticRoutes.put(config.getName(), sRoute);
+
+ // Notify
checkAndUpdateListeners(sRoute, true);
return status;
}
+ @Override
public Status removeStaticRoute(String name) {
staticRouteConfigs.remove(name);
StaticRoute sRoute = staticRoutes.remove(name);
allocateCaches();
retrieveCaches();
this.executor = Executors.newFixedThreadPool(1);
- if (staticRouteConfigs.isEmpty())
+ if (staticRouteConfigs.isEmpty()) {
loadConfiguration();
+ }
/*
* Slow probe to identify any gateway that might have silently appeared