Daniel Park

Fixed bug in OpenstackNode

- OVSDB client has changed to update br-int even if there's br-int already in device
- So OpenstackNode modified only the leader node to  performs node bootstrap

Change-Id: Ie01843ca8ab36ec61b58e80ce20c0c8c31ff8273
...@@ -26,6 +26,8 @@ import org.apache.felix.scr.annotations.Service; ...@@ -26,6 +26,8 @@ import org.apache.felix.scr.annotations.Service;
26 import org.onlab.util.ItemNotFoundException; 26 import org.onlab.util.ItemNotFoundException;
27 import org.onlab.util.KryoNamespace; 27 import org.onlab.util.KryoNamespace;
28 import org.onosproject.cluster.ClusterService; 28 import org.onosproject.cluster.ClusterService;
29 +import org.onosproject.cluster.LeadershipService;
30 +import org.onosproject.cluster.NodeId;
29 import org.onosproject.core.ApplicationId; 31 import org.onosproject.core.ApplicationId;
30 import org.onosproject.core.CoreService; 32 import org.onosproject.core.CoreService;
31 import org.onosproject.net.DefaultAnnotations; 33 import org.onosproject.net.DefaultAnnotations;
...@@ -60,6 +62,7 @@ import org.onosproject.store.service.Serializer; ...@@ -60,6 +62,7 @@ import org.onosproject.store.service.Serializer;
60 import org.onosproject.store.service.StorageService; 62 import org.onosproject.store.service.StorageService;
61 import org.slf4j.Logger; 63 import org.slf4j.Logger;
62 64
65 +import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
63 import static org.onlab.util.Tools.groupedThreads; 66 import static org.onlab.util.Tools.groupedThreads;
64 import static org.onosproject.net.Device.Type.SWITCH; 67 import static org.onosproject.net.Device.Type.SWITCH;
65 import static org.onosproject.net.behaviour.TunnelDescription.Type.VXLAN; 68 import static org.onosproject.net.behaviour.TunnelDescription.Type.VXLAN;
...@@ -69,7 +72,6 @@ import java.util.ArrayList; ...@@ -69,7 +72,6 @@ import java.util.ArrayList;
69 import java.util.List; 72 import java.util.List;
70 import java.util.Map; 73 import java.util.Map;
71 import java.util.concurrent.ExecutorService; 74 import java.util.concurrent.ExecutorService;
72 -import java.util.concurrent.Executors;
73 import java.util.stream.Collectors; 75 import java.util.stream.Collectors;
74 76
75 import static com.google.common.base.Preconditions.checkNotNull; 77 import static com.google.common.base.Preconditions.checkNotNull;
...@@ -82,7 +84,6 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -82,7 +84,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
82 @Service 84 @Service
83 public class OpenstackNodeManager implements OpenstackNodeService { 85 public class OpenstackNodeManager implements OpenstackNodeService {
84 protected final Logger log = getLogger(getClass()); 86 protected final Logger log = getLogger(getClass());
85 - private static final int NUM_THREADS = 1;
86 private static final KryoNamespace.Builder NODE_SERIALIZER = KryoNamespace.newBuilder() 87 private static final KryoNamespace.Builder NODE_SERIALIZER = KryoNamespace.newBuilder()
87 .register(KryoNamespaces.API) 88 .register(KryoNamespaces.API)
88 .register(OpenstackNode.class) 89 .register(OpenstackNode.class)
...@@ -127,6 +128,9 @@ public class OpenstackNodeManager implements OpenstackNodeService { ...@@ -127,6 +128,9 @@ public class OpenstackNodeManager implements OpenstackNodeService {
127 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 128 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
128 protected NetworkConfigRegistry configRegistry; 129 protected NetworkConfigRegistry configRegistry;
129 130
131 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
132 + protected LeadershipService leadershipService;
133 +
130 private final OvsdbHandler ovsdbHandler = new OvsdbHandler(); 134 private final OvsdbHandler ovsdbHandler = new OvsdbHandler();
131 private final BridgeHandler bridgeHandler = new BridgeHandler(); 135 private final BridgeHandler bridgeHandler = new BridgeHandler();
132 private final NetworkConfigListener configListener = new InternalConfigListener(); 136 private final NetworkConfigListener configListener = new InternalConfigListener();
...@@ -138,13 +142,15 @@ public class OpenstackNodeManager implements OpenstackNodeService { ...@@ -138,13 +142,15 @@ public class OpenstackNodeManager implements OpenstackNodeService {
138 } 142 }
139 }; 143 };
140 144
141 - private final ExecutorService eventExecutor = Executors 145 + private final ExecutorService eventExecutor =
142 - .newFixedThreadPool(NUM_THREADS, groupedThreads("onos/openstacknode", "event-handler")); 146 + newSingleThreadScheduledExecutor(groupedThreads("onos/openstacknode", "event-handler"));
147 +
143 148
144 private final DeviceListener deviceListener = new InternalDeviceListener(); 149 private final DeviceListener deviceListener = new InternalDeviceListener();
145 150
146 private ApplicationId appId; 151 private ApplicationId appId;
147 private ConsistentMap<OpenstackNode, NodeState> nodeStore; 152 private ConsistentMap<OpenstackNode, NodeState> nodeStore;
153 + private NodeId localNodeId;
148 154
149 private enum NodeState { 155 private enum NodeState {
150 156
...@@ -192,6 +198,9 @@ public class OpenstackNodeManager implements OpenstackNodeService { ...@@ -192,6 +198,9 @@ public class OpenstackNodeManager implements OpenstackNodeService {
192 @Activate 198 @Activate
193 protected void activate() { 199 protected void activate() {
194 appId = coreService.registerApplication(OPENSTACK_NODEMANAGER_ID); 200 appId = coreService.registerApplication(OPENSTACK_NODEMANAGER_ID);
201 + localNodeId = clusterService.getLocalNode().id();
202 + leadershipService.runForLeadership(appId.name());
203 +
195 nodeStore = storageService.<OpenstackNode, NodeState>consistentMapBuilder() 204 nodeStore = storageService.<OpenstackNode, NodeState>consistentMapBuilder()
196 .withSerializer(Serializer.using(NODE_SERIALIZER.build())) 205 .withSerializer(Serializer.using(NODE_SERIALIZER.build()))
197 .withName(OPENSTACK_NODESTORE) 206 .withName(OPENSTACK_NODESTORE)
...@@ -214,6 +223,7 @@ public class OpenstackNodeManager implements OpenstackNodeService { ...@@ -214,6 +223,7 @@ public class OpenstackNodeManager implements OpenstackNodeService {
214 223
215 configRegistry.unregisterConfigFactory(configFactory); 224 configRegistry.unregisterConfigFactory(configFactory);
216 configService.removeListener(configListener); 225 configService.removeListener(configListener);
226 + leadershipService.withdraw(appId.name());
217 227
218 log.info("Stopped"); 228 log.info("Stopped");
219 } 229 }
...@@ -223,8 +233,15 @@ public class OpenstackNodeManager implements OpenstackNodeService { ...@@ -223,8 +233,15 @@ public class OpenstackNodeManager implements OpenstackNodeService {
223 public void addNode(OpenstackNode node) { 233 public void addNode(OpenstackNode node) {
224 checkNotNull(node, "Node cannot be null"); 234 checkNotNull(node, "Node cannot be null");
225 235
226 - nodeStore.putIfAbsent(node, checkNodeState(node)); 236 + NodeId leaderNodeId = leadershipService.getLeader(appId.name());
237 + log.debug("Node init requested, localNodeId: {}, leaderNodeId: {}", localNodeId, leaderNodeId);
227 238
239 + //TODO: Fix any node can engage this operation.
240 + if (!localNodeId.equals(leaderNodeId)) {
241 + log.debug("Only the leaderNode can perform addNode operation");
242 + return;
243 + }
244 + nodeStore.putIfAbsent(node, checkNodeState(node));
228 NodeState state = checkNodeState(node); 245 NodeState state = checkNodeState(node);
229 state.process(this, node); 246 state.process(this, node);
230 } 247 }
...@@ -488,6 +505,13 @@ public class OpenstackNodeManager implements OpenstackNodeService { ...@@ -488,6 +505,13 @@ public class OpenstackNodeManager implements OpenstackNodeService {
488 505
489 @Override 506 @Override
490 public void event(DeviceEvent event) { 507 public void event(DeviceEvent event) {
508 + NodeId leaderNodeId = leadershipService.getLeader(appId.name());
509 +
510 + //TODO: Fix any node can engage this operation.
511 + if (!localNodeId.equals(leaderNodeId)) {
512 + log.debug("Only the leaderNode can process events");
513 + return;
514 + }
491 515
492 Device device = event.subject(); 516 Device device = event.subject();
493 ConnectionHandler<Device> handler = 517 ConnectionHandler<Device> handler =
......