andrea
Committed by Gerrit Code Review

Simplified component config loader with preset method that sets the configuratio…

…n regardless of the component state

Change-Id: Ia2e987c3b6d15339396737dfa68c6973d714798c
...@@ -63,6 +63,16 @@ public interface ComponentConfigService { ...@@ -63,6 +63,16 @@ public interface ComponentConfigService {
63 void setProperty(String componentName, String name, String value); 63 void setProperty(String componentName, String name, String value);
64 64
65 /** 65 /**
66 + * Presets the value of the specified configuration property, regardless
67 + * of the component's state.
68 + *
69 + * @param componentName component name
70 + * @param name property name
71 + * @param value new property value
72 + */
73 + void preSetProperty(String componentName, String name, String value);
74 +
75 + /**
66 * Clears the value of the specified configuration property thus making 76 * Clears the value of the specified configuration property thus making
67 * the property take on its default value. 77 * the property take on its default value.
68 * 78 *
...@@ -72,3 +82,4 @@ public interface ComponentConfigService { ...@@ -72,3 +82,4 @@ public interface ComponentConfigService {
72 void unsetProperty(String componentName, String name); 82 void unsetProperty(String componentName, String name);
73 83
74 } 84 }
85 +
......
...@@ -50,6 +50,10 @@ public class ComponentConfigAdapter implements ComponentConfigService { ...@@ -50,6 +50,10 @@ public class ComponentConfigAdapter implements ComponentConfigService {
50 } 50 }
51 51
52 @Override 52 @Override
53 + public void preSetProperty(String componentName, String name, String value) {
54 + }
55 +
56 + @Override
53 public void unsetProperty(String componentName, String name) { 57 public void unsetProperty(String componentName, String name) {
54 58
55 } 59 }
......
...@@ -18,19 +18,14 @@ package org.onosproject.cfg.impl; ...@@ -18,19 +18,14 @@ package org.onosproject.cfg.impl;
18 18
19 import com.fasterxml.jackson.databind.ObjectMapper; 19 import com.fasterxml.jackson.databind.ObjectMapper;
20 import com.fasterxml.jackson.databind.node.ObjectNode; 20 import com.fasterxml.jackson.databind.node.ObjectNode;
21 -import com.google.common.collect.ImmutableSet;
22 -import com.google.common.collect.Sets;
23 import org.apache.felix.scr.annotations.Activate; 21 import org.apache.felix.scr.annotations.Activate;
24 import org.apache.felix.scr.annotations.Component; 22 import org.apache.felix.scr.annotations.Component;
25 import org.apache.felix.scr.annotations.Reference; 23 import org.apache.felix.scr.annotations.Reference;
26 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
27 -import org.onlab.util.SharedExecutors;
28 import org.onosproject.cfg.ComponentConfigService; 25 import org.onosproject.cfg.ComponentConfigService;
29 import org.slf4j.Logger; 26 import org.slf4j.Logger;
30 27
31 import java.io.File; 28 import java.io.File;
32 -import java.util.Set;
33 -import java.util.TimerTask;
34 29
35 import static org.slf4j.LoggerFactory.getLogger; 30 import static org.slf4j.LoggerFactory.getLogger;
36 31
...@@ -44,50 +39,31 @@ public class ComponentConfigLoader { ...@@ -44,50 +39,31 @@ public class ComponentConfigLoader {
44 private static final String CFG_JSON = "../config/component-cfg.json"; 39 private static final String CFG_JSON = "../config/component-cfg.json";
45 static File cfgFile = new File(CFG_JSON); 40 static File cfgFile = new File(CFG_JSON);
46 41
47 - protected int retryDelay = 5_000; // millis between retries
48 - protected int stopRetryTime = 60_000; // deadline in millis
49 -
50 private final Logger log = getLogger(getClass()); 42 private final Logger log = getLogger(getClass());
51 43
52 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 44 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
53 protected ComponentConfigService configService; 45 protected ComponentConfigService configService;
54 46
55 private ObjectNode root; 47 private ObjectNode root;
56 - private final Set<String> pendingComponents = Sets.newHashSet();
57 - private long initialTimestamp;
58 -
59 - // TimerTask object that calls the load configuration for each component
60 - // in the pending components set and cancels itself if the set is empty or
61 - // after a set period of time.
62 - protected final TimerTask loader = new TimerTask() {
63 -
64 - @Override
65 - public void run() {
66 - ImmutableSet.copyOf(pendingComponents)
67 - .forEach(k -> loadConfig(k, (ObjectNode) root.path(k)));
68 - if (pendingComponents.isEmpty()
69 - || System.currentTimeMillis() - initialTimestamp >= stopRetryTime) {
70 - this.cancel();
71 - }
72 - }
73 - };
74 48
75 @Activate 49 @Activate
76 protected void activate() { 50 protected void activate() {
77 - initialTimestamp = System.currentTimeMillis();
78 this.loadConfigs(); 51 this.loadConfigs();
79 log.info("Started"); 52 log.info("Started");
80 } 53 }
81 54
82 // Loads the configurations for each component from the file in 55 // Loads the configurations for each component from the file in
83 - // ../config/component-cfg.json, adds them to a set and schedules a task 56 + // ../config/component-cfg.json, using the preSetProperty method.
84 - // to try and load them.
85 private void loadConfigs() { 57 private void loadConfigs() {
86 try { 58 try {
87 if (cfgFile.exists()) { 59 if (cfgFile.exists()) {
88 root = (ObjectNode) new ObjectMapper().readTree(cfgFile); 60 root = (ObjectNode) new ObjectMapper().readTree(cfgFile);
89 - root.fieldNames().forEachRemaining(pendingComponents::add); 61 + root.fieldNames().
90 - SharedExecutors.getTimer().schedule(loader, 0, retryDelay); 62 + forEachRemaining(component -> root.path(component).fieldNames()
63 + .forEachRemaining(k -> configService
64 + .preSetProperty(component, k,
65 + root.path(component).path(k)
66 + .asText())));
91 log.info("Loaded initial component configuration from {}", cfgFile); 67 log.info("Loaded initial component configuration from {}", cfgFile);
92 } 68 }
93 } catch (Exception e) { 69 } catch (Exception e) {
...@@ -95,15 +71,4 @@ public class ComponentConfigLoader { ...@@ -95,15 +71,4 @@ public class ComponentConfigLoader {
95 cfgFile, e); 71 cfgFile, e);
96 } 72 }
97 } 73 }
98 -
99 - // Loads a configuration for a single component and removes it from the
100 - // components set.
101 - private void loadConfig(String component, ObjectNode config) {
102 - if (configService.getComponentNames().contains(component)) {
103 - config.fieldNames()
104 - .forEachRemaining(k -> configService.setProperty(component, k,
105 - config.path(k).asText()));
106 - pendingComponents.remove(component);
107 - }
108 - }
109 } 74 }
......
...@@ -172,6 +172,17 @@ public class ComponentConfigManager implements ComponentConfigService { ...@@ -172,6 +172,17 @@ public class ComponentConfigManager implements ComponentConfigService {
172 } 172 }
173 173
174 @Override 174 @Override
175 + public void preSetProperty(String componentName, String name, String value) {
176 +
177 + checkPermission(CONFIG_WRITE);
178 +
179 + checkNotNull(componentName, COMPONENT_NULL);
180 + checkNotNull(name, PROPERTY_NULL);
181 +
182 + store.setProperty(componentName, name, value);
183 + }
184 +
185 + @Override
175 public void unsetProperty(String componentName, String name) { 186 public void unsetProperty(String componentName, String name) {
176 checkPermission(CONFIG_WRITE); 187 checkPermission(CONFIG_WRITE);
177 188
......
...@@ -21,17 +21,17 @@ import com.google.common.io.Files; ...@@ -21,17 +21,17 @@ import com.google.common.io.Files;
21 import org.junit.Before; 21 import org.junit.Before;
22 import org.junit.Test; 22 import org.junit.Test;
23 import org.onosproject.cfg.ComponentConfigAdapter; 23 import org.onosproject.cfg.ComponentConfigAdapter;
24 +import org.slf4j.Logger;
24 25
25 import java.io.File; 26 import java.io.File;
26 import java.io.IOException; 27 import java.io.IOException;
27 -import java.lang.reflect.Field;
28 import java.util.Set; 28 import java.util.Set;
29 -import java.util.TimerTask;
30 29
31 import static com.google.common.io.ByteStreams.toByteArray; 30 import static com.google.common.io.ByteStreams.toByteArray;
32 import static com.google.common.io.Files.write; 31 import static com.google.common.io.Files.write;
33 -import static org.junit.Assert.*; 32 +import static org.junit.Assert.assertEquals;
34 -import static org.onlab.junit.TestTools.assertAfter; 33 +import static org.junit.Assert.assertNull;
34 +import static org.slf4j.LoggerFactory.getLogger;
35 35
36 /** 36 /**
37 * UnitTest for ComponentLoader. 37 * UnitTest for ComponentLoader.
...@@ -46,6 +46,8 @@ public class ComponentConfigLoaderTest { ...@@ -46,6 +46,8 @@ public class ComponentConfigLoaderTest {
46 46
47 private TestConfigService service; 47 private TestConfigService service;
48 48
49 + private final Logger log = getLogger(getClass());
50 +
49 /* 51 /*
50 * Method to SetUp the test environment with test file, a config loader a service, 52 * Method to SetUp the test environment with test file, a config loader a service,
51 * and assign it to the loader.configService for the test. 53 * and assign it to the loader.configService for the test.
...@@ -56,8 +58,6 @@ public class ComponentConfigLoaderTest { ...@@ -56,8 +58,6 @@ public class ComponentConfigLoaderTest {
56 loader = new ComponentConfigLoader(); 58 loader = new ComponentConfigLoader();
57 service = new TestConfigService(); 59 service = new TestConfigService();
58 loader.configService = service; 60 loader.configService = service;
59 - loader.retryDelay = 50;
60 - loader.stopRetryTime = 200;
61 } 61 }
62 62
63 /* 63 /*
...@@ -67,7 +67,7 @@ public class ComponentConfigLoaderTest { ...@@ -67,7 +67,7 @@ public class ComponentConfigLoaderTest {
67 public void basics() throws IOException { 67 public void basics() throws IOException {
68 stageTestResource("basic.json"); 68 stageTestResource("basic.json");
69 loader.activate(); 69 loader.activate();
70 - assertAfter(1_000, () -> assertEquals("incorrect component", FOO_COMPONENT, service.component)); 70 + assertEquals("incorrect component", FOO_COMPONENT, service.component);
71 } 71 }
72 72
73 /* 73 /*
...@@ -79,28 +79,7 @@ public class ComponentConfigLoaderTest { ...@@ -79,28 +79,7 @@ public class ComponentConfigLoaderTest {
79 public void badConfig() throws IOException { 79 public void badConfig() throws IOException {
80 stageTestResource("badConfig.json"); 80 stageTestResource("badConfig.json");
81 loader.activate(); 81 loader.activate();
82 - assertAfter(1_000, () -> assertNull("incorrect configuration", service.component)); 82 + assertNull("incorrect configuration", service.component);
83 -
84 - }
85 -
86 - /*
87 - * Tests that tasks stops itself after the stopRetryTime if the component was
88 - * not loaded.
89 - */
90 - @Test
91 - public void noComponentForConfig() throws IOException {
92 - stageTestResource("badComponent.json");
93 - loader.activate();
94 - assertAfter(loader.stopRetryTime + loader.retryDelay, () -> {
95 - try {
96 - Field state = TimerTask.class.getDeclaredField("state");
97 - state.setAccessible(true);
98 - assertEquals("incorrect component", state.getInt(loader.loader), 3);
99 - } catch (Exception e) {
100 - e.printStackTrace();
101 - fail();
102 - }
103 - });
104 83
105 } 84 }
106 85
...@@ -117,9 +96,9 @@ public class ComponentConfigLoaderTest { ...@@ -117,9 +96,9 @@ public class ComponentConfigLoaderTest {
117 */ 96 */
118 private class TestConfigService extends ComponentConfigAdapter { 97 private class TestConfigService extends ComponentConfigAdapter {
119 98
120 - private String component; 99 + protected String component;
121 - private String name; 100 + protected String name;
122 - private String value; 101 + protected String value;
123 102
124 @Override 103 @Override
125 public Set<String> getComponentNames() { 104 public Set<String> getComponentNames() {
...@@ -127,7 +106,17 @@ public class ComponentConfigLoaderTest { ...@@ -127,7 +106,17 @@ public class ComponentConfigLoaderTest {
127 } 106 }
128 107
129 @Override 108 @Override
109 + public void preSetProperty(String componentName, String name, String value) {
110 + log.info("preSet");
111 + this.component = componentName;
112 + this.name = name;
113 + this.value = value;
114 +
115 + }
116 +
117 + @Override
130 public void setProperty(String componentName, String name, String value) { 118 public void setProperty(String componentName, String name, String value) {
119 + log.info("Set");
131 this.component = componentName; 120 this.component = componentName;
132 this.name = name; 121 this.name = name;
133 this.value = value; 122 this.value = value;
......