Victor Silva
Committed by Gerrit Code Review

MastershipManager: make "useRegionForBalanceRoles" a property

useRegionForBalance roles has been available for a while but
seems to only be accessed directly (it's a public field). It'd
be useful to be able to change that using the CLI.

Change-Id: If8c6dfbb300513e4d8dc0ba3d0d8f6ce9eac036a
...@@ -23,10 +23,14 @@ import com.google.common.util.concurrent.Futures; ...@@ -23,10 +23,14 @@ import com.google.common.util.concurrent.Futures;
23 import org.apache.felix.scr.annotations.Activate; 23 import org.apache.felix.scr.annotations.Activate;
24 import org.apache.felix.scr.annotations.Component; 24 import org.apache.felix.scr.annotations.Component;
25 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;
26 import org.apache.felix.scr.annotations.Reference; 28 import org.apache.felix.scr.annotations.Reference;
27 import org.apache.felix.scr.annotations.ReferenceCardinality; 29 import org.apache.felix.scr.annotations.ReferenceCardinality;
28 import org.apache.felix.scr.annotations.Service; 30 import org.apache.felix.scr.annotations.Service;
29 import org.onlab.metrics.MetricsService; 31 import org.onlab.metrics.MetricsService;
32 +import org.onosproject.cfg.ComponentConfigService;
33 +import org.onosproject.cfg.ConfigProperty;
30 import org.onosproject.cluster.ClusterService; 34 import org.onosproject.cluster.ClusterService;
31 import org.onosproject.cluster.ControllerNode; 35 import org.onosproject.cluster.ControllerNode;
32 import org.onosproject.cluster.NodeId; 36 import org.onosproject.cluster.NodeId;
...@@ -97,12 +101,22 @@ public class MastershipManager ...@@ -97,12 +101,22 @@ public class MastershipManager
97 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 101 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
98 protected RegionService regionService; 102 protected RegionService regionService;
99 103
104 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
105 + protected ComponentConfigService cfgService;
106 +
100 private NodeId localNodeId; 107 private NodeId localNodeId;
101 private Timer requestRoleTimer; 108 private Timer requestRoleTimer;
109 +
110 + static final boolean DEFAULT_USE_REGION_FOR_BALANCE_ROLES = false;
111 + @Property(name = "useRegionForBalanceRoles", boolValue = DEFAULT_USE_REGION_FOR_BALANCE_ROLES,
112 + label = "Use Regions for balancing roles")
102 public boolean useRegionForBalanceRoles; 113 public boolean useRegionForBalanceRoles;
103 114
104 @Activate 115 @Activate
105 public void activate() { 116 public void activate() {
117 + cfgService.registerProperties(getClass());
118 + modified();
119 +
106 requestRoleTimer = createTimer("Mastership", "requestRole", "responseTime"); 120 requestRoleTimer = createTimer("Mastership", "requestRole", "responseTime");
107 localNodeId = clusterService.getLocalNode().id(); 121 localNodeId = clusterService.getLocalNode().id();
108 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry); 122 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
...@@ -110,11 +124,22 @@ public class MastershipManager ...@@ -110,11 +124,22 @@ public class MastershipManager
110 log.info("Started"); 124 log.info("Started");
111 } 125 }
112 126
127 + @Modified
128 + public void modified() {
129 + Set<ConfigProperty> configProperties = cfgService.getProperties(getClass().getCanonicalName());
130 + for (ConfigProperty property : configProperties) {
131 + if (property.name().equals("useRegionForBalanceRoles")) {
132 + useRegionForBalanceRoles = property.asBoolean();
133 + }
134 + }
135 + }
136 +
113 @Deactivate 137 @Deactivate
114 public void deactivate() { 138 public void deactivate() {
115 eventDispatcher.removeSink(MastershipEvent.class); 139 eventDispatcher.removeSink(MastershipEvent.class);
116 store.unsetDelegate(delegate); 140 store.unsetDelegate(delegate);
117 log.info("Stopped"); 141 log.info("Stopped");
142 + cfgService.unregisterProperties(getClass(), false);
118 } 143 }
119 144
120 @Override 145 @Override
......
...@@ -21,11 +21,13 @@ import java.util.function.Consumer; ...@@ -21,11 +21,13 @@ import java.util.function.Consumer;
21 21
22 import com.google.common.collect.ImmutableList; 22 import com.google.common.collect.ImmutableList;
23 import com.google.common.collect.ImmutableSet; 23 import com.google.common.collect.ImmutableSet;
24 +import org.easymock.EasyMock;
24 import org.junit.After; 25 import org.junit.After;
25 import org.junit.Before; 26 import org.junit.Before;
26 import org.junit.Test; 27 import org.junit.Test;
27 import org.onlab.junit.TestUtils; 28 import org.onlab.junit.TestUtils;
28 import org.onlab.packet.IpAddress; 29 import org.onlab.packet.IpAddress;
30 +import org.onosproject.cfg.ComponentConfigService;
29 import org.onosproject.cluster.ClusterService; 31 import org.onosproject.cluster.ClusterService;
30 import org.onosproject.cluster.ControllerNode; 32 import org.onosproject.cluster.ControllerNode;
31 import org.onosproject.cluster.DefaultControllerNode; 33 import org.onosproject.cluster.DefaultControllerNode;
...@@ -47,6 +49,10 @@ import org.onosproject.store.trivial.SimpleMastershipStore; ...@@ -47,6 +49,10 @@ import org.onosproject.store.trivial.SimpleMastershipStore;
47 import com.google.common.collect.Sets; 49 import com.google.common.collect.Sets;
48 import com.google.common.util.concurrent.Futures; 50 import com.google.common.util.concurrent.Futures;
49 51
52 +import static org.easymock.EasyMock.anyObject;
53 +import static org.easymock.EasyMock.expect;
54 +import static org.easymock.EasyMock.expectLastCall;
55 +import static org.easymock.EasyMock.replay;
50 import static org.junit.Assert.*; 56 import static org.junit.Assert.*;
51 import static org.onosproject.net.MastershipRole.MASTER; 57 import static org.onosproject.net.MastershipRole.MASTER;
52 import static org.onosproject.net.MastershipRole.NONE; 58 import static org.onosproject.net.MastershipRole.NONE;
...@@ -106,6 +112,18 @@ public class MastershipManagerTest { ...@@ -106,6 +112,18 @@ public class MastershipManagerTest {
106 TestUtils.setField(regionManager, "store", regionStore); 112 TestUtils.setField(regionManager, "store", regionStore);
107 regionManager.activate(); 113 regionManager.activate();
108 mgr.regionService = regionManager; 114 mgr.regionService = regionManager;
115 +
116 + ComponentConfigService mockConfigService =
117 + EasyMock.createMock(ComponentConfigService.class);
118 + expect(mockConfigService.getProperties(anyObject())).andReturn(ImmutableSet.of());
119 + mockConfigService.registerProperties(mgr.getClass());
120 + expectLastCall();
121 + mockConfigService.unregisterProperties(mgr.getClass(), false);
122 + expectLastCall();
123 + expect(mockConfigService.getProperties(anyObject())).andReturn(ImmutableSet.of());
124 + mgr.cfgService = mockConfigService;
125 + replay(mockConfigService);
126 +
109 mgr.activate(); 127 mgr.activate();
110 } 128 }
111 129
......