X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fforwarding%2Fstaticrouting%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fforwarding%2Fstaticrouting%2Finternal%2FStaticRoutingImplementation.java;h=2ce2465d976e28a82a7a3bc8e66ddc9df144300c;hb=3979e330c9f95a898c54a9234f3a07e3b2ae4349;hp=89d24192455231487b926ce1b727b9cb76c4c71d;hpb=d059b1faef43031951d426048974fa9b32dceba3;p=controller.git 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 89d2419245..2ce2465d97 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 @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -16,7 +15,6 @@ import java.net.Inet4Address; import java.net.InetAddress; import java.nio.ByteBuffer; import java.util.Collections; -import java.util.Date; import java.util.Dictionary; import java.util.EnumSet; import java.util.HashSet; @@ -43,6 +41,8 @@ import org.opendaylight.controller.forwarding.staticrouting.IForwardingStaticRou import org.opendaylight.controller.forwarding.staticrouting.IStaticRoutingAware; import org.opendaylight.controller.forwarding.staticrouting.StaticRoute; import org.opendaylight.controller.forwarding.staticrouting.StaticRouteConfig; +import org.opendaylight.controller.hosttracker.HostIdFactory; +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; @@ -58,10 +58,9 @@ import org.slf4j.LoggerFactory; /** * Static Routing feature provides the bridge between SDN and Non-SDN networks. */ -public class StaticRoutingImplementation implements IfNewHostNotify, - IForwardingStaticRouting, IObjectReader, IConfigurationContainerAware { - private static Logger log = LoggerFactory - .getLogger(StaticRoutingImplementation.class); +public class StaticRoutingImplementation implements IfNewHostNotify, IForwardingStaticRouting, IObjectReader, + IConfigurationContainerAware { + private static Logger log = LoggerFactory.getLogger(StaticRoutingImplementation.class); private static String ROOT = GlobalConstants.STARTUPHOME.toString(); ConcurrentMap staticRoutes; ConcurrentMap staticRouteConfigs; @@ -101,14 +100,8 @@ public class StaticRoutingImplementation implements IfNewHostNotify, return staticRouteConfigs; } - public void setStaticRouteConfigs( - ConcurrentMap staticRouteConfigs) { - this.staticRouteConfigs = staticRouteConfigs; - } - @Override - public Object readObject(ObjectInputStream ois) - throws FileNotFoundException, IOException, ClassNotFoundException { + public Object readObject(ObjectInputStream ois) throws FileNotFoundException, IOException, ClassNotFoundException { // Perform the class deserialization locally, from inside the package // where the class is defined return ois.readObject(); @@ -117,8 +110,8 @@ public class StaticRoutingImplementation implements IfNewHostNotify, @SuppressWarnings("unchecked") private void loadConfiguration() { ObjectReader objReader = new ObjectReader(); - ConcurrentMap confList = (ConcurrentMap) objReader - .read(this, staticRoutesFileName); + ConcurrentMap confList = (ConcurrentMap) objReader.read( + this, staticRoutesFileName); if (confList == null) { return; @@ -129,7 +122,6 @@ public class StaticRoutingImplementation implements IfNewHostNotify, } } - private Status saveConfig() { return saveConfigInternal(); } @@ -138,9 +130,8 @@ public class StaticRoutingImplementation implements IfNewHostNotify, Status status; ObjectWriter objWriter = new ObjectWriter(); - status = objWriter.write( - new ConcurrentHashMap( - staticRouteConfigs), staticRoutesFileName); + status = objWriter.write(new ConcurrentHashMap(staticRouteConfigs), + staticRoutesFileName); if (status.isSuccess()) { return status; @@ -150,23 +141,19 @@ public class StaticRoutingImplementation implements IfNewHostNotify, } @SuppressWarnings("deprecation") - private void allocateCaches() { + private void allocateCaches() { if (this.clusterContainerService == null) { - log - .info("un-initialized clusterContainerService, can't create cache"); + log.info("un-initialized clusterContainerService, can't create cache"); return; } try { - clusterContainerService.createCache( - "forwarding.staticrouting.routes", EnumSet - .of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache( - "forwarding.staticrouting.configs", EnumSet - .of(IClusterServices.cacheMode.TRANSACTIONAL)); + clusterContainerService.createCache("forwarding.staticrouting.routes", + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + clusterContainerService.createCache("forwarding.staticrouting.configs", + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); } catch (CacheExistException cee) { - log - .error("\nCache already exists - destroy and recreate if needed"); + log.error("\nCache already exists - destroy and recreate if needed"); } catch (CacheConfigException cce) { log.error("\nCache configuration invalid - check cache mode"); } @@ -175,8 +162,7 @@ public class StaticRoutingImplementation implements IfNewHostNotify, @SuppressWarnings({ "unchecked", "deprecation" }) private void retrieveCaches() { if (this.clusterContainerService == null) { - log - .info("un-initialized clusterContainerService, can't retrieve cache"); + log.info("un-initialized clusterContainerService, can't retrieve cache"); return; } @@ -201,7 +187,7 @@ public class StaticRoutingImplementation implements IfNewHostNotify, try { ra.staticRouteUpdate(s, update); } catch (Exception e) { - log.error("",e); + log.error("", e); } } } @@ -209,25 +195,29 @@ public class StaticRoutingImplementation implements IfNewHostNotify, } private class NotifyStaticRouteWorker implements Callable { + + private String name; private StaticRoute staticRoute; private boolean added; - public NotifyStaticRouteWorker(StaticRoute s, boolean update) { + public NotifyStaticRouteWorker(String name, StaticRoute s, boolean update) { + this.name = name; this.staticRoute = s; this.added = update; } @Override public Object call() throws Exception { - if (!added - || (staticRoute.getType() == StaticRoute.NextHopType.SWITCHPORT)) { + if (!added || (staticRoute.getType() == StaticRoute.NextHopType.SWITCHPORT)) { notifyStaticRouteUpdate(staticRoute, added); } else { InetAddress nh = staticRoute.getNextHopAddress(); - HostNodeConnector host = hostTracker.hostQuery(nh); + // HostTracker hosts db key scheme implementation + IHostId id = HostIdFactory.create(nh, null); + HostNodeConnector host = hostTracker.hostQuery(id); if (host == null) { log.debug("Next hop {} is not present, try to discover it", nh.getHostAddress()); - Future future = hostTracker.discoverHost(nh); + Future future = hostTracker.discoverHost(id); if (future != null) { try { host = future.get(); @@ -241,6 +231,10 @@ public class StaticRoutingImplementation implements IfNewHostNotify, if (host != null) { log.debug("Next hop {} is found", nh.getHostAddress()); staticRoute.setHost(host); + // static route object has changed + // put the changed object back in the cache + // for it to sync + staticRoutes.put(name, staticRoute); notifyStaticRouteUpdate(staticRoute, added); } else { log.debug("Next hop {} is still not present, try again later", nh.getHostAddress()); @@ -250,8 +244,8 @@ public class StaticRoutingImplementation implements IfNewHostNotify, } } - private void checkAndUpdateListeners(StaticRoute staticRoute, boolean added) { - NotifyStaticRouteWorker worker = new NotifyStaticRouteWorker(staticRoute, added); + private void checkAndUpdateListeners(String name, StaticRoute staticRoute, boolean added) { + NotifyStaticRouteWorker worker = new NotifyStaticRouteWorker(name, staticRoute, added); try { executor.submit(worker); } catch (Exception e) { @@ -263,17 +257,22 @@ public class StaticRoutingImplementation implements IfNewHostNotify, if (host == null) { return; } - for (StaticRoute s : staticRoutes.values()) { - if (s.getType() == StaticRoute.NextHopType.SWITCHPORT) { + for (Map.Entry s : staticRoutes.entrySet()) { + StaticRoute route = s.getValue(); + if (route.getType() == StaticRoute.NextHopType.SWITCHPORT) { continue; } - if (s.getNextHopAddress().equals(host.getNetworkAddress())) { + if (route.getNextHopAddress().equals(host.getNetworkAddress())) { if (added) { - s.setHost(host); + route.setHost(host); } else { - s.setHost(null); + route.setHost(null); } - notifyStaticRouteUpdate(s, added); + // static route object has changed + // put the changed object back in the cache + // for it to sync + staticRoutes.put(s.getKey(), route); + notifyStaticRouteUpdate(route, added); } } } @@ -331,8 +330,7 @@ public class StaticRoutingImplementation implements IfNewHostNotify, public StaticRoute getBestMatchStaticRoute(InetAddress ipAddress) { ByteBuffer bblongestPrefix = null; try { - bblongestPrefix = ByteBuffer.wrap(InetAddress.getByName("0.0.0.0") - .getAddress()); + bblongestPrefix = ByteBuffer.wrap(InetAddress.getByName("0.0.0.0").getAddress()); } catch (Exception e) { return null; } @@ -362,9 +360,8 @@ public class StaticRoutingImplementation implements IfNewHostNotify, return status; } if (staticRouteConfigs.get(config.getName()) != null) { - return new Status(StatusCode.CONFLICT, - "A valid Static Route configuration with this name " + - "already exists. Please use a different name"); + return new Status(StatusCode.CONFLICT, "A valid Static Route configuration with this name " + + "already exists. Please use a different name"); } // Update database @@ -372,10 +369,8 @@ public class StaticRoutingImplementation implements IfNewHostNotify, for (Map.Entry 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"); + return new Status(StatusCode.CONFLICT, "This conflicts with an existing Static Route " + + "Configuration. Please check the configuration " + "and try again"); } } staticRoutes.put(config.getName(), sRoute); @@ -384,7 +379,7 @@ public class StaticRoutingImplementation implements IfNewHostNotify, staticRouteConfigs.put(config.getName(), config); // Notify - checkAndUpdateListeners(sRoute, true); + checkAndUpdateListeners(config.getName(), sRoute, true); return status; } @@ -393,11 +388,10 @@ public class StaticRoutingImplementation implements IfNewHostNotify, staticRouteConfigs.remove(name); StaticRoute sRoute = staticRoutes.remove(name); if (sRoute != null) { - checkAndUpdateListeners(sRoute, false); + checkAndUpdateListeners(name, sRoute, false); return new Status(StatusCode.SUCCESS, null); } - return new Status(StatusCode.NOTFOUND, - "Static Route with name " + name + " is not found"); + return new Status(StatusCode.NOTFOUND, "Static Route with name " + name + " is not found"); } void setClusterContainerService(IClusterContainerServices s) { @@ -427,12 +421,9 @@ public class StaticRoutingImplementation implements IfNewHostNotify, containerName = ""; } - staticRoutesFileName = ROOT + "staticRouting_" + containerName - + ".conf"; + staticRoutesFileName = ROOT + "staticRouting_" + containerName + ".conf"; - log.debug("forwarding.staticrouting starting on container {}", - containerName); - //staticRoutes = new ConcurrentHashMap(); + log.debug("forwarding.staticrouting starting on container {}", containerName); allocateCaches(); retrieveCaches(); this.executor = Executors.newFixedThreadPool(1); @@ -441,32 +432,32 @@ public class StaticRoutingImplementation implements IfNewHostNotify, } /* - * Slow probe to identify any gateway that might have silently appeared - * after the Static Routing Configuration. + * Slow probe to identify any gateway that might have silently appeared + * after the Static Routing Configuration. */ gatewayProbeTimer = new Timer(); gatewayProbeTimer.schedule(new TimerTask() { @Override public void run() { - for (StaticRoute s : staticRoutes.values()) { - if ((s.getType() == StaticRoute.NextHopType.IPADDRESS) - && s.getHost() == null) { - checkAndUpdateListeners(s, true); + for (Map.Entry s : staticRoutes.entrySet()) { + StaticRoute route = s.getValue(); + if ((route.getType() == StaticRoute.NextHopType.IPADDRESS) && route.getHost() == null) { + checkAndUpdateListeners(s.getKey(), route, true); } } } }, 60 * 1000, 60 * 1000); + } /** - * Function called by the dependency manager when at least one - * dependency become unsatisfied or when the component is shutting - * down because for example bundle is being stopped. + * Function called by the dependency manager when at least one dependency + * become unsatisfied or when the component is shutting down because for + * example bundle is being stopped. * */ void destroy() { - log.debug("Destroy all the Static Routing Rules given we are " - + "shutting down"); + log.debug("Destroy all the Static Routing Rules given we are " + "shutting down"); gatewayProbeTimer.cancel(); @@ -475,18 +466,17 @@ public class StaticRoutingImplementation implements IfNewHostNotify, } /** - * Function called by dependency manager after "init ()" is called - * and after the services provided by the class are registered in - * the service registry + * Function called by dependency manager after "init ()" is called and after + * the services provided by the class are registered in the service registry * */ void start() { } /** - * Function called by the dependency manager before the services - * exported by the component are unregistered, this will be - * followed by a "destroy ()" calls + * Function called by the dependency manager before the services exported by + * the component are unregistered, this will be followed by a "destroy ()" + * calls * */ void stop() {