Andreas Papazois
Committed by Gerrit Code Review

[GEANT] Property netconfReplyTimeout added in Settings.

Change-Id: I60399c5cc9a00857f275fa8016520b2d909e9912
...@@ -45,6 +45,19 @@ ...@@ -45,6 +45,19 @@
45 <artifactId>ganymed-ssh2</artifactId> 45 <artifactId>ganymed-ssh2</artifactId>
46 <version>262</version> 46 <version>262</version>
47 </dependency> 47 </dependency>
48 + <dependency>
49 + <groupId>org.onosproject</groupId>
50 + <artifactId>onos-api</artifactId>
51 + <classifier>tests</classifier>
52 + <scope>test</scope>
53 + </dependency>
54 + <dependency>
55 + <groupId>org.onosproject</groupId>
56 + <artifactId>onlab-osgi</artifactId>
57 + <version>${project.version}</version>
58 + <classifier>tests</classifier>
59 + <scope>test</scope>
60 + </dependency>
48 </dependencies> 61 </dependencies>
49 62
50 <build> 63 <build>
......
...@@ -19,10 +19,13 @@ package org.onosproject.netconf.ctl; ...@@ -19,10 +19,13 @@ package org.onosproject.netconf.ctl;
19 import org.apache.felix.scr.annotations.Activate; 19 import org.apache.felix.scr.annotations.Activate;
20 import org.apache.felix.scr.annotations.Component; 20 import org.apache.felix.scr.annotations.Component;
21 import org.apache.felix.scr.annotations.Deactivate; 21 import org.apache.felix.scr.annotations.Deactivate;
22 +import org.apache.felix.scr.annotations.Modified;
23 +import org.apache.felix.scr.annotations.Property;
22 import org.apache.felix.scr.annotations.Reference; 24 import org.apache.felix.scr.annotations.Reference;
23 import org.apache.felix.scr.annotations.ReferenceCardinality; 25 import org.apache.felix.scr.annotations.ReferenceCardinality;
24 import org.apache.felix.scr.annotations.Service; 26 import org.apache.felix.scr.annotations.Service;
25 import org.onlab.packet.IpAddress; 27 import org.onlab.packet.IpAddress;
28 +import org.onosproject.cfg.ComponentConfigService;
26 import org.onosproject.net.Device; 29 import org.onosproject.net.Device;
27 import org.onosproject.net.DeviceId; 30 import org.onosproject.net.DeviceId;
28 import org.onosproject.net.device.DeviceService; 31 import org.onosproject.net.device.DeviceService;
...@@ -42,17 +45,30 @@ import org.slf4j.Logger; ...@@ -42,17 +45,30 @@ import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory; 45 import org.slf4j.LoggerFactory;
43 46
44 import java.util.Arrays; 47 import java.util.Arrays;
48 +import java.util.Dictionary;
45 import java.util.Map; 49 import java.util.Map;
46 import java.util.Set; 50 import java.util.Set;
47 import java.util.concurrent.ConcurrentHashMap; 51 import java.util.concurrent.ConcurrentHashMap;
48 import java.util.concurrent.CopyOnWriteArraySet; 52 import java.util.concurrent.CopyOnWriteArraySet;
49 53
54 +import static com.google.common.base.Strings.isNullOrEmpty;
55 +import static org.onlab.util.Tools.get;
56 +
50 /** 57 /**
51 * The implementation of NetconfController. 58 * The implementation of NetconfController.
52 */ 59 */
53 @Component(immediate = true) 60 @Component(immediate = true)
54 @Service 61 @Service
55 public class NetconfControllerImpl implements NetconfController { 62 public class NetconfControllerImpl implements NetconfController {
63 + private static final String PROP_NETCONF_REPLY_TIMEOUT = "netconfReplyTimeout";
64 + private static final int DEFAULT_REPLY_TIMEOUT_SECONDS = 5;
65 + @Property(name = PROP_NETCONF_REPLY_TIMEOUT, intValue = DEFAULT_REPLY_TIMEOUT_SECONDS,
66 + label = "Time (in seconds) waiting for a NetConf reply")
67 + protected static int netconfReplyTimeout = DEFAULT_REPLY_TIMEOUT_SECONDS;
68 +
69 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
70 + protected ComponentConfigService cfgService;
71 +
56 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 72 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
57 protected DeviceService deviceService; 73 protected DeviceService deviceService;
58 74
...@@ -71,15 +87,42 @@ public class NetconfControllerImpl implements NetconfController { ...@@ -71,15 +87,42 @@ public class NetconfControllerImpl implements NetconfController {
71 87
72 @Activate 88 @Activate
73 public void activate(ComponentContext context) { 89 public void activate(ComponentContext context) {
90 + cfgService.registerProperties(getClass());
91 + modified(context);
74 log.info("Started"); 92 log.info("Started");
75 } 93 }
76 94
77 @Deactivate 95 @Deactivate
78 public void deactivate() { 96 public void deactivate() {
97 + cfgService.unregisterProperties(getClass(), false);
79 netconfDeviceMap.clear(); 98 netconfDeviceMap.clear();
80 log.info("Stopped"); 99 log.info("Stopped");
81 } 100 }
82 101
102 + @Modified
103 + public void modified(ComponentContext context) {
104 + if (context == null) {
105 + netconfReplyTimeout = DEFAULT_REPLY_TIMEOUT_SECONDS;
106 + log.info("No component configuration");
107 + return;
108 + }
109 +
110 + Dictionary<?, ?> properties = context.getProperties();
111 +
112 + int newNetconfReplyTimeout;
113 + try {
114 + String s = get(properties, PROP_NETCONF_REPLY_TIMEOUT);
115 + newNetconfReplyTimeout = isNullOrEmpty(s) ?
116 + netconfReplyTimeout : Integer.parseInt(s.trim());
117 + } catch (NumberFormatException e) {
118 + log.warn("Component configuration had invalid value", e);
119 + return;
120 + }
121 +
122 + netconfReplyTimeout = newNetconfReplyTimeout;
123 + log.info("Settings: {} = {}", PROP_NETCONF_REPLY_TIMEOUT, netconfReplyTimeout);
124 + }
125 +
83 @Override 126 @Override
84 public void addDeviceListener(NetconfDeviceListener listener) { 127 public void addDeviceListener(NetconfDeviceListener listener) {
85 if (!netconfDeviceListeners.contains(listener)) { 128 if (!netconfDeviceListeners.contains(listener)) {
......
...@@ -55,7 +55,6 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -55,7 +55,6 @@ public class NetconfSessionImpl implements NetconfSession {
55 private static final String MESSAGE_ID_STRING = "message-id"; 55 private static final String MESSAGE_ID_STRING = "message-id";
56 private static final String HELLO = "<hello"; 56 private static final String HELLO = "<hello";
57 private static final String NEW_LINE = "\n"; 57 private static final String NEW_LINE = "\n";
58 - private static final int FUTURE_REPLY_TIMEOUT = 5000;
59 private static final String ERROR = "ERROR "; 58 private static final String ERROR = "ERROR ";
60 private static final String END_OF_RPC_OPEN_TAG = "\">"; 59 private static final String END_OF_RPC_OPEN_TAG = "\">";
61 private static final String EQUAL = "="; 60 private static final String EQUAL = "=";
...@@ -196,9 +195,10 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -196,9 +195,10 @@ public class NetconfSessionImpl implements NetconfSession {
196 request = formatXmlHeader(request); 195 request = formatXmlHeader(request);
197 CompletableFuture<String> futureReply = request(request); 196 CompletableFuture<String> futureReply = request(request);
198 messageIdInteger.incrementAndGet(); 197 messageIdInteger.incrementAndGet();
198 + int replyTimeout = NetconfControllerImpl.netconfReplyTimeout;
199 String rp; 199 String rp;
200 try { 200 try {
201 - rp = futureReply.get(FUTURE_REPLY_TIMEOUT, TimeUnit.MILLISECONDS); 201 + rp = futureReply.get(replyTimeout, TimeUnit.SECONDS);
202 } catch (InterruptedException | ExecutionException | TimeoutException e) { 202 } catch (InterruptedException | ExecutionException | TimeoutException e) {
203 throw new NetconfException("No matching reply for request " + request, e); 203 throw new NetconfException("No matching reply for request " + request, e);
204 } 204 }
......
...@@ -20,7 +20,10 @@ import org.easymock.EasyMock; ...@@ -20,7 +20,10 @@ import org.easymock.EasyMock;
20 import org.junit.After; 20 import org.junit.After;
21 import org.junit.Before; 21 import org.junit.Before;
22 import org.junit.Test; 22 import org.junit.Test;
23 +import org.onlab.osgi.ComponentContextAdapter;
23 import org.onlab.packet.IpAddress; 24 import org.onlab.packet.IpAddress;
25 +import org.onosproject.cfg.ComponentConfigAdapter;
26 +import org.onosproject.cfg.ComponentConfigService;
24 import org.onosproject.net.DeviceId; 27 import org.onosproject.net.DeviceId;
25 import org.onosproject.net.device.DeviceService; 28 import org.onosproject.net.device.DeviceService;
26 import org.onosproject.net.key.DeviceKeyService; 29 import org.onosproject.net.key.DeviceKeyService;
...@@ -32,8 +35,11 @@ import org.onosproject.netconf.NetconfDeviceOutputEvent; ...@@ -32,8 +35,11 @@ import org.onosproject.netconf.NetconfDeviceOutputEvent;
32 import org.onosproject.netconf.NetconfDeviceOutputEventListener; 35 import org.onosproject.netconf.NetconfDeviceOutputEventListener;
33 import org.onosproject.netconf.NetconfException; 36 import org.onosproject.netconf.NetconfException;
34 import org.onosproject.netconf.NetconfSession; 37 import org.onosproject.netconf.NetconfSession;
38 +import org.osgi.service.component.ComponentContext;
35 39
36 import java.lang.reflect.Field; 40 import java.lang.reflect.Field;
41 +import java.util.Dictionary;
42 +import java.util.Enumeration;
37 import java.util.HashSet; 43 import java.util.HashSet;
38 import java.util.Map; 44 import java.util.Map;
39 import java.util.Optional; 45 import java.util.Optional;
...@@ -79,14 +85,17 @@ public class NetconfControllerImplTest { ...@@ -79,14 +85,17 @@ public class NetconfControllerImplTest {
79 private static final int BAD_DEVICE_PORT = 13; 85 private static final int BAD_DEVICE_PORT = 13;
80 private static final int IPV6_DEVICE_PORT = 14; 86 private static final int IPV6_DEVICE_PORT = 14;
81 87
88 + private static ComponentConfigService cfgService = new ComponentConfigAdapter();
82 private static DeviceService deviceService = new NetconfDeviceServiceMock(); 89 private static DeviceService deviceService = new NetconfDeviceServiceMock();
83 private static DeviceKeyService deviceKeyService = new NetconfDeviceKeyServiceMock(); 90 private static DeviceKeyService deviceKeyService = new NetconfDeviceKeyServiceMock();
84 91
92 + private final ComponentContext context = new MockComponentContext();
85 93
86 @Before 94 @Before
87 public void setUp() throws Exception { 95 public void setUp() throws Exception {
88 ctrl = new NetconfControllerImpl(); 96 ctrl = new NetconfControllerImpl();
89 ctrl.deviceFactory = new TestNetconfDeviceFactory(); 97 ctrl.deviceFactory = new TestNetconfDeviceFactory();
98 + ctrl.cfgService = cfgService;
90 ctrl.deviceService = deviceService; 99 ctrl.deviceService = deviceService;
91 ctrl.deviceKeyService = deviceKeyService; 100 ctrl.deviceKeyService = deviceKeyService;
92 101
...@@ -125,6 +134,30 @@ public class NetconfControllerImplTest { ...@@ -125,6 +134,30 @@ public class NetconfControllerImplTest {
125 } 134 }
126 135
127 /** 136 /**
137 + * Test initialization of component configuration.
138 + */
139 + @Test
140 + public void testActivate() {
141 + assertEquals("Incorrect NetConf session timeout, should be default",
142 + 5, ctrl.netconfReplyTimeout);
143 + ctrl.activate(null);
144 + assertEquals("Incorrect NetConf session timeout, should be default",
145 + 5, ctrl.netconfReplyTimeout);
146 + }
147 +
148 + /**
149 + * Test modification of component configuration.
150 + */
151 + @Test
152 + public void testModified() {
153 + assertEquals("Incorrect NetConf session timeout, should be default",
154 + 5, ctrl.netconfReplyTimeout);
155 + ctrl.modified(context);
156 + assertEquals("Incorrect NetConf session timeout",
157 + 1, ctrl.netconfReplyTimeout);
158 + }
159 +
160 + /**
128 * Test to add DeviceListeners, 161 * Test to add DeviceListeners,
129 * and also to check whether the netconfDeviceListeners set is 162 * and also to check whether the netconfDeviceListeners set is
130 * updating or not which was present in NetconfControllerImpl class. 163 * updating or not which was present in NetconfControllerImpl class.
...@@ -323,4 +356,52 @@ public class NetconfControllerImplTest { ...@@ -323,4 +356,52 @@ public class NetconfControllerImplTest {
323 } 356 }
324 357
325 } 358 }
359 +
360 + private class MockComponentContext extends ComponentContextAdapter {
361 + @Override
362 + public Dictionary getProperties() {
363 + return new MockDictionary();
364 + }
365 + }
366 +
367 + private class MockDictionary extends Dictionary {
368 +
369 + @Override
370 + public int size() {
371 + return 0;
372 + }
373 +
374 + @Override
375 + public boolean isEmpty() {
376 + return false;
377 + }
378 +
379 + @Override
380 + public Enumeration keys() {
381 + return null;
382 + }
383 +
384 + @Override
385 + public Enumeration elements() {
386 + return null;
387 + }
388 +
389 + @Override
390 + public Object get(Object key) {
391 + if (key.equals("netconfReplyTimeout")) {
392 + return "1";
393 + }
394 + return null;
395 + }
396 +
397 + @Override
398 + public Object put(Object key, Object value) {
399 + return null;
400 + }
401 +
402 + @Override
403 + public Object remove(Object key) {
404 + return null;
405 + }
406 + }
326 } 407 }
......