Ayaka Koshibe

role assertion failure is returned to DeviceProvider

Change-Id: Ic5189327c85fa37b3bbfa07d0e285cabae363712
...@@ -233,6 +233,8 @@ public class DeviceManager ...@@ -233,6 +233,8 @@ public class DeviceManager
233 @Override 233 @Override
234 public void unableToAssertRole(DeviceId deviceId, MastershipRole role) { 234 public void unableToAssertRole(DeviceId deviceId, MastershipRole role) {
235 // FIXME: implement response to this notification 235 // FIXME: implement response to this notification
236 + log.warn("Falied to assert role [{}] onto Device {}",
237 + role, deviceId);
236 } 238 }
237 } 239 }
238 240
......
...@@ -11,7 +11,6 @@ import org.onlab.onos.net.DefaultDevice; ...@@ -11,7 +11,6 @@ import org.onlab.onos.net.DefaultDevice;
11 import org.onlab.onos.net.DefaultPort; 11 import org.onlab.onos.net.DefaultPort;
12 import org.onlab.onos.net.Device; 12 import org.onlab.onos.net.Device;
13 import org.onlab.onos.net.DeviceId; 13 import org.onlab.onos.net.DeviceId;
14 -import org.onlab.onos.net.MastershipRole;
15 import org.onlab.onos.net.Port; 14 import org.onlab.onos.net.Port;
16 import org.onlab.onos.net.PortNumber; 15 import org.onlab.onos.net.PortNumber;
17 import org.onlab.onos.net.device.DeviceDescription; 16 import org.onlab.onos.net.device.DeviceDescription;
...@@ -54,7 +53,6 @@ public class SimpleDeviceStore ...@@ -54,7 +53,6 @@ public class SimpleDeviceStore
54 public static final String DEVICE_NOT_FOUND = "Device with ID %s not found"; 53 public static final String DEVICE_NOT_FOUND = "Device with ID %s not found";
55 54
56 private final Map<DeviceId, DefaultDevice> devices = new ConcurrentHashMap<>(); 55 private final Map<DeviceId, DefaultDevice> devices = new ConcurrentHashMap<>();
57 - private final Map<DeviceId, MastershipRole> roles = new ConcurrentHashMap<>();
58 private final Set<DeviceId> availableDevices = new HashSet<>(); 56 private final Set<DeviceId> availableDevices = new HashSet<>();
59 private final Map<DeviceId, Map<PortNumber, Port>> devicePorts = new HashMap<>(); 57 private final Map<DeviceId, Map<PortNumber, Port>> devicePorts = new HashMap<>();
60 58
...@@ -257,7 +255,6 @@ public class SimpleDeviceStore ...@@ -257,7 +255,6 @@ public class SimpleDeviceStore
257 @Override 255 @Override
258 public DeviceEvent removeDevice(DeviceId deviceId) { 256 public DeviceEvent removeDevice(DeviceId deviceId) {
259 synchronized (this) { 257 synchronized (this) {
260 - roles.remove(deviceId);
261 Device device = devices.remove(deviceId); 258 Device device = devices.remove(deviceId);
262 return device == null ? null : 259 return device == null ? null :
263 new DeviceEvent(DEVICE_REMOVED, device, null); 260 new DeviceEvent(DEVICE_REMOVED, device, null);
......
...@@ -105,4 +105,11 @@ public interface OpenFlowSwitch { ...@@ -105,4 +105,11 @@ public interface OpenFlowSwitch {
105 */ 105 */
106 public void disconnectSwitch(); 106 public void disconnectSwitch();
107 107
108 + /**
109 + * Notifies the controller that role assertion has failed.
110 + *
111 + * @param role the failed role
112 + */
113 + void returnRoleAssertFailure(RoleState role);
114 +
108 } 115 }
......
...@@ -25,4 +25,12 @@ public interface OpenFlowSwitchListener { ...@@ -25,4 +25,12 @@ public interface OpenFlowSwitchListener {
25 * @param status the new state of the port. 25 * @param status the new state of the port.
26 */ 26 */
27 public void portChanged(Dpid dpid, OFPortStatus status); 27 public void portChanged(Dpid dpid, OFPortStatus status);
28 +
29 + /**
30 + * Notify that a role imposed on a switch failed to take hold.
31 + *
32 + * @param dpid the switch that failed role assertion
33 + * @param role the role imposed by the controller
34 + */
35 + public void roleAssertFailed(Dpid dpid, RoleState role);
28 } 36 }
......
...@@ -213,6 +213,11 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver { ...@@ -213,6 +213,11 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver {
213 } 213 }
214 214
215 @Override 215 @Override
216 + public void returnRoleAssertFailure(RoleState role) {
217 + this.agent.returnRoleAssertFailed(dpid, role);
218 + }
219 +
220 + @Override
216 public abstract void startDriverHandshake(); 221 public abstract void startDriverHandshake();
217 222
218 @Override 223 @Override
......
...@@ -2,6 +2,7 @@ package org.onlab.onos.openflow.controller.driver; ...@@ -2,6 +2,7 @@ package org.onlab.onos.openflow.controller.driver;
2 2
3 import org.onlab.onos.openflow.controller.Dpid; 3 import org.onlab.onos.openflow.controller.Dpid;
4 import org.onlab.onos.openflow.controller.OpenFlowSwitch; 4 import org.onlab.onos.openflow.controller.OpenFlowSwitch;
5 +import org.onlab.onos.openflow.controller.RoleState;
5 import org.projectfloodlight.openflow.protocol.OFMessage; 6 import org.projectfloodlight.openflow.protocol.OFMessage;
6 7
7 /** 8 /**
...@@ -74,4 +75,12 @@ public interface OpenFlowAgent { ...@@ -74,4 +75,12 @@ public interface OpenFlowAgent {
74 * @param m the message to process 75 * @param m the message to process
75 */ 76 */
76 public void processMessage(Dpid dpid, OFMessage m); 77 public void processMessage(Dpid dpid, OFMessage m);
78 +
79 + /**
80 + * Notifies the controller that role assertion has failed.
81 + *
82 + * @param dpid the switch that failed role assertion
83 + * @param role the failed role
84 + */
85 + public void returnRoleAssertFailed(Dpid dpid, RoleState role);
77 } 86 }
......
...@@ -313,6 +313,13 @@ public class OpenFlowControllerImpl implements OpenFlowController { ...@@ -313,6 +313,13 @@ public class OpenFlowControllerImpl implements OpenFlowController {
313 public void processMessage(Dpid dpid, OFMessage m) { 313 public void processMessage(Dpid dpid, OFMessage m) {
314 processPacket(dpid, m); 314 processPacket(dpid, m);
315 } 315 }
316 +
317 + @Override
318 + public void returnRoleAssertFailed(Dpid dpid, RoleState role) {
319 + for (OpenFlowSwitchListener l : ofSwitchListener) {
320 + l.roleAssertFailed(dpid, role);
321 + }
322 + }
316 } 323 }
317 324
318 private final class OFMessageHandler implements Runnable { 325 private final class OFMessageHandler implements Runnable {
......
...@@ -232,6 +232,8 @@ class RoleManager implements RoleHandler { ...@@ -232,6 +232,8 @@ class RoleManager implements RoleHandler {
232 } else { 232 } else {
233 return RoleRecvStatus.OTHER_EXPECTATION; 233 return RoleRecvStatus.OTHER_EXPECTATION;
234 } 234 }
235 + } else {
236 + sw.returnRoleAssertFailure(pendingRole);
235 } 237 }
236 238
237 // if xids match but role's don't, perhaps its a query (OF1.3) 239 // if xids match but role's don't, perhaps its a query (OF1.3)
......
...@@ -142,6 +142,26 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -142,6 +142,26 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
142 providerService.portStatusChanged(deviceId(uri(dpid)), portDescription); 142 providerService.portStatusChanged(deviceId(uri(dpid)), portDescription);
143 } 143 }
144 144
145 + @Override
146 + public void roleAssertFailed(Dpid dpid, RoleState role) {
147 + MastershipRole failed;
148 + switch (role) {
149 + case MASTER:
150 + failed = MastershipRole.MASTER;
151 + break;
152 + case EQUAL:
153 + failed = MastershipRole.STANDBY;
154 + break;
155 + case SLAVE:
156 + failed = MastershipRole.NONE;
157 + break;
158 + default:
159 + LOG.warn("unknown role {}", role);
160 + return;
161 + }
162 + providerService.unableToAssertRole(deviceId(uri(dpid)), failed);
163 + }
164 +
145 /** 165 /**
146 * Builds a list of port descriptions for a given list of ports. 166 * Builds a list of port descriptions for a given list of ports.
147 * 167 *
...@@ -169,6 +189,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -169,6 +189,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
169 !port.getConfig().contains(OFPortConfig.PORT_DOWN); 189 !port.getConfig().contains(OFPortConfig.PORT_DOWN);
170 return new DefaultPortDescription(portNo, enabled); 190 return new DefaultPortDescription(portNo, enabled);
171 } 191 }
192 +
172 } 193 }
173 194
174 } 195 }
......
...@@ -344,6 +344,10 @@ public class OpenFlowDeviceProviderTest { ...@@ -344,6 +344,10 @@ public class OpenFlowDeviceProviderTest {
344 public void disconnectSwitch() { 344 public void disconnectSwitch() {
345 } 345 }
346 346
347 + @Override
348 + public void returnRoleAssertFailure(RoleState role) {
349 + }
350 +
347 } 351 }
348 352
349 } 353 }
......
...@@ -23,6 +23,7 @@ import org.onlab.onos.openflow.controller.OpenFlowController; ...@@ -23,6 +23,7 @@ import org.onlab.onos.openflow.controller.OpenFlowController;
23 import org.onlab.onos.openflow.controller.OpenFlowEventListener; 23 import org.onlab.onos.openflow.controller.OpenFlowEventListener;
24 import org.onlab.onos.openflow.controller.OpenFlowSwitch; 24 import org.onlab.onos.openflow.controller.OpenFlowSwitch;
25 import org.onlab.onos.openflow.controller.OpenFlowSwitchListener; 25 import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
26 +import org.onlab.onos.openflow.controller.RoleState;
26 import org.projectfloodlight.openflow.protocol.OFFlowRemoved; 27 import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
27 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; 28 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
28 import org.projectfloodlight.openflow.protocol.OFFlowStatsReply; 29 import org.projectfloodlight.openflow.protocol.OFFlowStatsReply;
...@@ -162,6 +163,12 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -162,6 +163,12 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
162 163
163 } 164 }
164 165
166 + @Override
167 + public void roleAssertFailed(Dpid dpid, RoleState role) {
168 + // TODO Auto-generated method stub
169 +
170 + }
171 +
165 private synchronized void pushFlowMetrics(Dpid dpid, OFStatsReply stats) { 172 private synchronized void pushFlowMetrics(Dpid dpid, OFStatsReply stats) {
166 if (stats.getStatsType() != OFStatsType.FLOW) { 173 if (stats.getStatsType() != OFStatsType.FLOW) {
167 return; 174 return;
......
...@@ -22,6 +22,7 @@ import org.onlab.onos.openflow.controller.OpenFlowPacketContext; ...@@ -22,6 +22,7 @@ import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
22 import org.onlab.onos.openflow.controller.OpenFlowSwitch; 22 import org.onlab.onos.openflow.controller.OpenFlowSwitch;
23 import org.onlab.onos.openflow.controller.OpenFlowSwitchListener; 23 import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
24 import org.onlab.onos.openflow.controller.PacketListener; 24 import org.onlab.onos.openflow.controller.PacketListener;
25 +import org.onlab.onos.openflow.controller.RoleState;
25 import org.projectfloodlight.openflow.protocol.OFPortConfig; 26 import org.projectfloodlight.openflow.protocol.OFPortConfig;
26 import org.projectfloodlight.openflow.protocol.OFPortDesc; 27 import org.projectfloodlight.openflow.protocol.OFPortDesc;
27 import org.projectfloodlight.openflow.protocol.OFPortState; 28 import org.projectfloodlight.openflow.protocol.OFPortState;
...@@ -135,6 +136,11 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid ...@@ -135,6 +136,11 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid
135 136
136 } 137 }
137 138
139 + @Override
140 + public void roleAssertFailed(Dpid dpid, RoleState role) {
141 + // TODO Auto-generated method stub
142 + }
143 +
138 } 144 }
139 145
140 } 146 }
......
...@@ -394,6 +394,10 @@ public class OpenFlowPacketProviderTest { ...@@ -394,6 +394,10 @@ public class OpenFlowPacketProviderTest {
394 public void disconnectSwitch() { 394 public void disconnectSwitch() {
395 } 395 }
396 396
397 + @Override
398 + public void returnRoleAssertFailure(RoleState role) {
399 + }
400 +
397 } 401 }
398 402
399 } 403 }
......