Configurable Port Stats Collection interval
Change-Id: I4999338ecf1c608f93b66ba979126b2a5deda165
Showing
4 changed files
with
58 additions
and
8 deletions
| ... | @@ -30,5 +30,10 @@ | ... | @@ -30,5 +30,10 @@ |
| 30 | <packaging>bundle</packaging> | 30 | <packaging>bundle</packaging> |
| 31 | 31 | ||
| 32 | <description>ONOS OpenFlow protocol device provider</description> | 32 | <description>ONOS OpenFlow protocol device provider</description> |
| 33 | - | 33 | + <dependencies> |
| 34 | + <dependency> | ||
| 35 | + <groupId>org.osgi</groupId> | ||
| 36 | + <artifactId>org.osgi.compendium</artifactId> | ||
| 37 | + </dependency> | ||
| 38 | + </dependencies> | ||
| 34 | </project> | 39 | </project> | ... | ... |
| ... | @@ -19,12 +19,16 @@ import com.google.common.base.Strings; | ... | @@ -19,12 +19,16 @@ import com.google.common.base.Strings; |
| 19 | import com.google.common.collect.Lists; | 19 | import com.google.common.collect.Lists; |
| 20 | import com.google.common.collect.Maps; | 20 | import com.google.common.collect.Maps; |
| 21 | import com.google.common.collect.Sets; | 21 | import com.google.common.collect.Sets; |
| 22 | + | ||
| 22 | import org.apache.felix.scr.annotations.Activate; | 23 | import org.apache.felix.scr.annotations.Activate; |
| 23 | import org.apache.felix.scr.annotations.Component; | 24 | import org.apache.felix.scr.annotations.Component; |
| 24 | import org.apache.felix.scr.annotations.Deactivate; | 25 | import org.apache.felix.scr.annotations.Deactivate; |
| 26 | +import org.apache.felix.scr.annotations.Modified; | ||
| 27 | +import org.apache.felix.scr.annotations.Property; | ||
| 25 | import org.apache.felix.scr.annotations.Reference; | 28 | import org.apache.felix.scr.annotations.Reference; |
| 26 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 29 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 27 | import org.onlab.packet.ChassisId; | 30 | import org.onlab.packet.ChassisId; |
| 31 | +import org.onosproject.cfg.ComponentConfigService; | ||
| 28 | import org.onosproject.net.AnnotationKeys; | 32 | import org.onosproject.net.AnnotationKeys; |
| 29 | import org.onosproject.net.DefaultAnnotations; | 33 | import org.onosproject.net.DefaultAnnotations; |
| 30 | import org.onosproject.net.Device; | 34 | import org.onosproject.net.Device; |
| ... | @@ -52,6 +56,7 @@ import org.onosproject.openflow.controller.OpenFlowSwitch; | ... | @@ -52,6 +56,7 @@ import org.onosproject.openflow.controller.OpenFlowSwitch; |
| 52 | import org.onosproject.openflow.controller.OpenFlowSwitchListener; | 56 | import org.onosproject.openflow.controller.OpenFlowSwitchListener; |
| 53 | import org.onosproject.openflow.controller.PortDescPropertyType; | 57 | import org.onosproject.openflow.controller.PortDescPropertyType; |
| 54 | import org.onosproject.openflow.controller.RoleState; | 58 | import org.onosproject.openflow.controller.RoleState; |
| 59 | +import org.osgi.service.component.ComponentContext; | ||
| 55 | import org.projectfloodlight.openflow.protocol.OFFactory; | 60 | import org.projectfloodlight.openflow.protocol.OFFactory; |
| 56 | import org.projectfloodlight.openflow.protocol.OFMessage; | 61 | import org.projectfloodlight.openflow.protocol.OFMessage; |
| 57 | import org.projectfloodlight.openflow.protocol.OFPortConfig; | 62 | import org.projectfloodlight.openflow.protocol.OFPortConfig; |
| ... | @@ -73,10 +78,13 @@ import org.slf4j.Logger; | ... | @@ -73,10 +78,13 @@ import org.slf4j.Logger; |
| 73 | import java.util.ArrayList; | 78 | import java.util.ArrayList; |
| 74 | import java.util.Collection; | 79 | import java.util.Collection; |
| 75 | import java.util.Collections; | 80 | import java.util.Collections; |
| 81 | +import java.util.Dictionary; | ||
| 76 | import java.util.HashMap; | 82 | import java.util.HashMap; |
| 77 | import java.util.HashSet; | 83 | import java.util.HashSet; |
| 78 | import java.util.List; | 84 | import java.util.List; |
| 79 | 85 | ||
| 86 | +import static com.google.common.base.Strings.isNullOrEmpty; | ||
| 87 | +import static org.onlab.util.Tools.get; | ||
| 80 | import static org.onosproject.net.DeviceId.deviceId; | 88 | import static org.onosproject.net.DeviceId.deviceId; |
| 81 | import static org.onosproject.net.Port.Type.COPPER; | 89 | import static org.onosproject.net.Port.Type.COPPER; |
| 82 | import static org.onosproject.net.Port.Type.FIBER; | 90 | import static org.onosproject.net.Port.Type.FIBER; |
| ... | @@ -100,12 +108,18 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -100,12 +108,18 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 100 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 108 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 101 | protected OpenFlowController controller; | 109 | protected OpenFlowController controller; |
| 102 | 110 | ||
| 111 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 112 | + protected ComponentConfigService cfgService; | ||
| 113 | + | ||
| 103 | private DeviceProviderService providerService; | 114 | private DeviceProviderService providerService; |
| 104 | 115 | ||
| 105 | private final InternalDeviceProvider listener = new InternalDeviceProvider(); | 116 | private final InternalDeviceProvider listener = new InternalDeviceProvider(); |
| 106 | 117 | ||
| 107 | // TODO: We need to make the poll interval configurable. | 118 | // TODO: We need to make the poll interval configurable. |
| 108 | static final int POLL_INTERVAL = 5; | 119 | static final int POLL_INTERVAL = 5; |
| 120 | + @Property(name = "PortStatsPollFrequency", intValue = POLL_INTERVAL, | ||
| 121 | + label = "Frequency (in seconds) for polling switch Port statistics") | ||
| 122 | + private int portStatsPollFrequency = POLL_INTERVAL; | ||
| 109 | 123 | ||
| 110 | private HashMap<Dpid, PortStatsCollector> collectors = Maps.newHashMap(); | 124 | private HashMap<Dpid, PortStatsCollector> collectors = Maps.newHashMap(); |
| 111 | 125 | ||
| ... | @@ -117,7 +131,8 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -117,7 +131,8 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 117 | } | 131 | } |
| 118 | 132 | ||
| 119 | @Activate | 133 | @Activate |
| 120 | - public void activate() { | 134 | + public void activate(ComponentContext context) { |
| 135 | + cfgService.registerProperties(getClass()); | ||
| 121 | providerService = providerRegistry.register(this); | 136 | providerService = providerRegistry.register(this); |
| 122 | controller.addListener(listener); | 137 | controller.addListener(listener); |
| 123 | controller.addEventListener(listener); | 138 | controller.addEventListener(listener); |
| ... | @@ -130,7 +145,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -130,7 +145,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 130 | // disconnect to trigger switch-add later | 145 | // disconnect to trigger switch-add later |
| 131 | sw.disconnectSwitch(); | 146 | sw.disconnectSwitch(); |
| 132 | } | 147 | } |
| 133 | - PortStatsCollector psc = new PortStatsCollector(sw, POLL_INTERVAL); | 148 | + PortStatsCollector psc = new PortStatsCollector(sw, portStatsPollFrequency); |
| 134 | psc.start(); | 149 | psc.start(); |
| 135 | collectors.put(new Dpid(sw.getId()), psc); | 150 | collectors.put(new Dpid(sw.getId()), psc); |
| 136 | } | 151 | } |
| ... | @@ -138,7 +153,8 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -138,7 +153,8 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 138 | } | 153 | } |
| 139 | 154 | ||
| 140 | @Deactivate | 155 | @Deactivate |
| 141 | - public void deactivate() { | 156 | + public void deactivate(ComponentContext context) { |
| 157 | + cfgService.unregisterProperties(getClass(), false); | ||
| 142 | providerRegistry.unregister(this); | 158 | providerRegistry.unregister(this); |
| 143 | controller.removeListener(listener); | 159 | controller.removeListener(listener); |
| 144 | collectors.values().forEach(PortStatsCollector::stop); | 160 | collectors.values().forEach(PortStatsCollector::stop); |
| ... | @@ -146,6 +162,25 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -146,6 +162,25 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 146 | LOG.info("Stopped"); | 162 | LOG.info("Stopped"); |
| 147 | } | 163 | } |
| 148 | 164 | ||
| 165 | + @Modified | ||
| 166 | + public void modified(ComponentContext context) { | ||
| 167 | + Dictionary<?, ?> properties = context.getProperties(); | ||
| 168 | + int newPortStatsPollFrequency; | ||
| 169 | + try { | ||
| 170 | + String s = get(properties, "PortStatsPollFrequency"); | ||
| 171 | + newPortStatsPollFrequency = isNullOrEmpty(s) ? portStatsPollFrequency : Integer.parseInt(s.trim()); | ||
| 172 | + | ||
| 173 | + } catch (NumberFormatException | ClassCastException e) { | ||
| 174 | + newPortStatsPollFrequency = portStatsPollFrequency; | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + if (newPortStatsPollFrequency != portStatsPollFrequency) { | ||
| 178 | + portStatsPollFrequency = newPortStatsPollFrequency; | ||
| 179 | + collectors.values().forEach(psc -> psc.adjustPollInterval(portStatsPollFrequency)); | ||
| 180 | + } | ||
| 181 | + | ||
| 182 | + LOG.info("Settings: portStatsPollFrequency={}", portStatsPollFrequency); | ||
| 183 | + } | ||
| 149 | 184 | ||
| 150 | @Override | 185 | @Override |
| 151 | public boolean isReachable(DeviceId deviceId) { | 186 | public boolean isReachable(DeviceId deviceId) { |
| ... | @@ -275,7 +310,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -275,7 +310,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 275 | providerService.updatePorts(did, buildPortDescriptions(sw)); | 310 | providerService.updatePorts(did, buildPortDescriptions(sw)); |
| 276 | 311 | ||
| 277 | PortStatsCollector psc = | 312 | PortStatsCollector psc = |
| 278 | - new PortStatsCollector(controller.getSwitch(dpid), POLL_INTERVAL); | 313 | + new PortStatsCollector(controller.getSwitch(dpid), portStatsPollFrequency); |
| 279 | psc.start(); | 314 | psc.start(); |
| 280 | collectors.put(dpid, psc); | 315 | collectors.put(dpid, psc); |
| 281 | } | 316 | } | ... | ... |
| ... | @@ -41,7 +41,7 @@ public class PortStatsCollector implements TimerTask { | ... | @@ -41,7 +41,7 @@ public class PortStatsCollector implements TimerTask { |
| 41 | private final HashedWheelTimer timer = Timer.getTimer(); | 41 | private final HashedWheelTimer timer = Timer.getTimer(); |
| 42 | private final OpenFlowSwitch sw; | 42 | private final OpenFlowSwitch sw; |
| 43 | private final Logger log = getLogger(getClass()); | 43 | private final Logger log = getLogger(getClass()); |
| 44 | - private final int refreshInterval; | 44 | + private int refreshInterval; |
| 45 | private final AtomicLong xidAtomic = new AtomicLong(1); | 45 | private final AtomicLong xidAtomic = new AtomicLong(1); |
| 46 | 46 | ||
| 47 | private Timeout timeout; | 47 | private Timeout timeout; |
| ... | @@ -74,6 +74,13 @@ public class PortStatsCollector implements TimerTask { | ... | @@ -74,6 +74,13 @@ public class PortStatsCollector implements TimerTask { |
| 74 | } | 74 | } |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | + synchronized void adjustPollInterval(int pollInterval) { | ||
| 78 | + this.refreshInterval = pollInterval; | ||
| 79 | + // task.cancel(); | ||
| 80 | + // task = new InternalTimerTask(); | ||
| 81 | + // timer.scheduleAtFixedRate(task, pollInterval * SECONDS, pollInterval * 1000); | ||
| 82 | + } | ||
| 83 | + | ||
| 77 | private void sendPortStatistic() { | 84 | private void sendPortStatistic() { |
| 78 | if (sw.getRole() != RoleState.MASTER) { | 85 | if (sw.getRole() != RoleState.MASTER) { |
| 79 | return; | 86 | return; | ... | ... |
| ... | @@ -18,9 +18,11 @@ package org.onosproject.provider.of.device.impl; | ... | @@ -18,9 +18,11 @@ package org.onosproject.provider.of.device.impl; |
| 18 | import com.google.common.collect.HashMultimap; | 18 | import com.google.common.collect.HashMultimap; |
| 19 | import com.google.common.collect.Lists; | 19 | import com.google.common.collect.Lists; |
| 20 | import com.google.common.collect.Multimap; | 20 | import com.google.common.collect.Multimap; |
| 21 | + | ||
| 21 | import org.junit.After; | 22 | import org.junit.After; |
| 22 | import org.junit.Before; | 23 | import org.junit.Before; |
| 23 | import org.junit.Test; | 24 | import org.junit.Test; |
| 25 | +import org.onosproject.cfg.ComponentConfigAdapter; | ||
| 24 | import org.onosproject.net.DefaultDevice; | 26 | import org.onosproject.net.DefaultDevice; |
| 25 | import org.onosproject.net.Device; | 27 | import org.onosproject.net.Device; |
| 26 | import org.onosproject.net.DeviceId; | 28 | import org.onosproject.net.DeviceId; |
| ... | @@ -84,8 +86,9 @@ public class OpenFlowDeviceProviderTest { | ... | @@ -84,8 +86,9 @@ public class OpenFlowDeviceProviderTest { |
| 84 | public void startUp() { | 86 | public void startUp() { |
| 85 | provider.providerRegistry = registry; | 87 | provider.providerRegistry = registry; |
| 86 | provider.controller = controller; | 88 | provider.controller = controller; |
| 89 | + provider.cfgService = new ComponentConfigAdapter(); | ||
| 87 | controller.switchMap.put(DPID1, SW1); | 90 | controller.switchMap.put(DPID1, SW1); |
| 88 | - provider.activate(); | 91 | + provider.activate(null); |
| 89 | assertNotNull("provider should be registered", registry.provider); | 92 | assertNotNull("provider should be registered", registry.provider); |
| 90 | assertNotNull("listener should be registered", controller.listener); | 93 | assertNotNull("listener should be registered", controller.listener); |
| 91 | assertEquals("devices not added", 1, registry.connected.size()); | 94 | assertEquals("devices not added", 1, registry.connected.size()); |
| ... | @@ -94,7 +97,7 @@ public class OpenFlowDeviceProviderTest { | ... | @@ -94,7 +97,7 @@ public class OpenFlowDeviceProviderTest { |
| 94 | 97 | ||
| 95 | @After | 98 | @After |
| 96 | public void tearDown() { | 99 | public void tearDown() { |
| 97 | - provider.deactivate(); | 100 | + provider.deactivate(null); |
| 98 | assertNull("listener should be removed", controller.listener); | 101 | assertNull("listener should be removed", controller.listener); |
| 99 | provider.controller = null; | 102 | provider.controller = null; |
| 100 | provider.providerRegistry = null; | 103 | provider.providerRegistry = null; | ... | ... |
-
Please register or login to post a comment