vertical feedback path for Role replies
Change-Id: I31bdb85f90901ec79147adeea0df8ceae00ed1dc
Showing
15 changed files
with
105 additions
and
57 deletions
... | @@ -61,12 +61,12 @@ public interface DeviceProviderService extends ProviderService<DeviceProvider> { | ... | @@ -61,12 +61,12 @@ public interface DeviceProviderService extends ProviderService<DeviceProvider> { |
61 | void portStatusChanged(DeviceId deviceId, PortDescription portDescription); | 61 | void portStatusChanged(DeviceId deviceId, PortDescription portDescription); |
62 | 62 | ||
63 | /** | 63 | /** |
64 | - * Notifies the core about the providers inability to assert the specified | 64 | + * Notifies the core about the result of a RoleRequest sent to a device. |
65 | - * mastership role on the device. | ||
66 | * | 65 | * |
67 | * @param deviceId identity of the device | 66 | * @param deviceId identity of the device |
68 | - * @param role mastership role that was asserted but failed | 67 | + * @param requested mastership role that was requested by the node |
68 | + * @param replied mastership role the switch accepted | ||
69 | */ | 69 | */ |
70 | - void unableToAssertRole(DeviceId deviceId, MastershipRole role); | 70 | + void receivedRoleReply(DeviceId deviceId, MastershipRole requested, MastershipRole response); |
71 | 71 | ||
72 | } | 72 | } | ... | ... |
... | @@ -367,17 +367,49 @@ public class DeviceManager | ... | @@ -367,17 +367,49 @@ public class DeviceManager |
367 | } | 367 | } |
368 | 368 | ||
369 | @Override | 369 | @Override |
370 | - public void unableToAssertRole(DeviceId deviceId, MastershipRole role) { | 370 | + public void receivedRoleReply( |
371 | + DeviceId deviceId, MastershipRole requested, MastershipRole response) { | ||
372 | + // Several things can happen here: | ||
373 | + // 1. request and response match | ||
374 | + // 2. request and response don't match | ||
375 | + // 3. MastershipRole and requested match (and 1 or 2 are true) | ||
376 | + // 4. MastershipRole and requested don't match (and 1 or 2 are true) | ||
377 | + // | ||
378 | + // 2, 4, and 3 with case 2 are failure modes. | ||
379 | + | ||
371 | // FIXME: implement response to this notification | 380 | // FIXME: implement response to this notification |
372 | - log.warn("Failed to assert role [{}] onto Device {}", role, | 381 | + |
373 | - deviceId); | 382 | + log.info("got reply to a role request for {}: asked for {}, and got {}", |
374 | - if (role == MastershipRole.MASTER) { | 383 | + deviceId, requested, response); |
384 | + | ||
385 | + if (requested == null && response == null) { | ||
386 | + // something was off with DeviceProvider, maybe check channel too? | ||
387 | + log.warn("Failed to assert role [{}] onto Device {}", requested, deviceId); | ||
388 | + mastershipService.relinquishMastership(deviceId); | ||
389 | + return; | ||
390 | + } | ||
391 | + | ||
392 | + if (requested.equals(response)) { | ||
393 | + if (requested.equals(mastershipService.getLocalRole(deviceId))) { | ||
394 | + | ||
395 | + return; | ||
396 | + } else { | ||
397 | + return; | ||
398 | + // FIXME roleManager got the device to comply, but doesn't agree with | ||
399 | + // the store; use the store's view, then try to reassert. | ||
400 | + } | ||
401 | + } else { | ||
402 | + // we didn't get back what we asked for. Reelect someone else. | ||
403 | + log.warn("Failed to assert role [{}] onto Device {}", response, deviceId); | ||
404 | + if (response == MastershipRole.MASTER) { | ||
375 | mastershipService.relinquishMastership(deviceId); | 405 | mastershipService.relinquishMastership(deviceId); |
376 | // TODO: Shouldn't we be triggering event? | 406 | // TODO: Shouldn't we be triggering event? |
377 | //final Device device = getDevice(deviceId); | 407 | //final Device device = getDevice(deviceId); |
378 | //post(new DeviceEvent(DEVICE_MASTERSHIP_CHANGED, device)); | 408 | //post(new DeviceEvent(DEVICE_MASTERSHIP_CHANGED, device)); |
379 | } | 409 | } |
380 | } | 410 | } |
411 | + | ||
412 | + } | ||
381 | } | 413 | } |
382 | 414 | ||
383 | // Posts the specified event to the local event dispatcher. | 415 | // Posts the specified event to the local event dispatcher. | ... | ... |
... | @@ -121,11 +121,12 @@ public interface OpenFlowSwitch { | ... | @@ -121,11 +121,12 @@ public interface OpenFlowSwitch { |
121 | public void disconnectSwitch(); | 121 | public void disconnectSwitch(); |
122 | 122 | ||
123 | /** | 123 | /** |
124 | - * Notifies the controller that role assertion has failed. | 124 | + * Notifies the controller that the device has responded to a set-role request. |
125 | * | 125 | * |
126 | - * @param role the failed role | 126 | + * @param requested the role requested by the controller |
127 | + * @param response the role set at the device | ||
127 | */ | 128 | */ |
128 | - public void returnRoleAssertFailure(RoleState role); | 129 | + public void returnRoleReply(RoleState requested, RoleState reponse); |
129 | 130 | ||
130 | /** | 131 | /** |
131 | * Indicates if this switch is optical. | 132 | * Indicates if this switch is optical. | ... | ... |
... | @@ -53,5 +53,5 @@ public interface OpenFlowSwitchListener { | ... | @@ -53,5 +53,5 @@ public interface OpenFlowSwitchListener { |
53 | * @param dpid the switch that failed role assertion | 53 | * @param dpid the switch that failed role assertion |
54 | * @param role the role imposed by the controller | 54 | * @param role the role imposed by the controller |
55 | */ | 55 | */ |
56 | - public void roleAssertFailed(Dpid dpid, RoleState role); | 56 | + public void receivedRoleReply(Dpid dpid, RoleState requested, RoleState response); |
57 | } | 57 | } | ... | ... |
... | @@ -217,8 +217,8 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver { | ... | @@ -217,8 +217,8 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver { |
217 | } | 217 | } |
218 | 218 | ||
219 | @Override | 219 | @Override |
220 | - public void returnRoleAssertFailure(RoleState role) { | 220 | + public void returnRoleReply(RoleState requested, RoleState response) { |
221 | - this.agent.returnRoleAssertFailed(dpid, role); | 221 | + this.agent.returnRoleReply(dpid, requested, response); |
222 | } | 222 | } |
223 | 223 | ||
224 | @Override | 224 | @Override |
... | @@ -300,6 +300,7 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver { | ... | @@ -300,6 +300,7 @@ public abstract class AbstractOpenFlowSwitch implements OpenFlowSwitchDriver { |
300 | this.transitionToEqualSwitch(); | 300 | this.transitionToEqualSwitch(); |
301 | } | 301 | } |
302 | } else { | 302 | } else { |
303 | + log.warn(">>> mismatch with expected role - got {} - Disconnecting", r); | ||
303 | this.disconnectSwitch(); | 304 | this.disconnectSwitch(); |
304 | } | 305 | } |
305 | } | 306 | } | ... | ... |
... | @@ -97,5 +97,5 @@ public interface OpenFlowAgent { | ... | @@ -97,5 +97,5 @@ public interface OpenFlowAgent { |
97 | * @param dpid the switch that failed role assertion | 97 | * @param dpid the switch that failed role assertion |
98 | * @param role the failed role | 98 | * @param role the failed role |
99 | */ | 99 | */ |
100 | - public void returnRoleAssertFailed(Dpid dpid, RoleState role); | 100 | + public void returnRoleReply(Dpid dpid, RoleState requested, RoleState response); |
101 | } | 101 | } | ... | ... |
... | @@ -374,9 +374,9 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -374,9 +374,9 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
374 | } | 374 | } |
375 | 375 | ||
376 | @Override | 376 | @Override |
377 | - public void returnRoleAssertFailed(Dpid dpid, RoleState role) { | 377 | + public void returnRoleReply(Dpid dpid, RoleState requested, RoleState response) { |
378 | for (OpenFlowSwitchListener l : ofSwitchListener) { | 378 | for (OpenFlowSwitchListener l : ofSwitchListener) { |
379 | - l.roleAssertFailed(dpid, role); | 379 | + l.receivedRoleReply(dpid, requested, response); |
380 | } | 380 | } |
381 | } | 381 | } |
382 | } | 382 | } | ... | ... |
... | @@ -224,8 +224,8 @@ class RoleManager implements RoleHandler { | ... | @@ -224,8 +224,8 @@ class RoleManager implements RoleHandler { |
224 | } | 224 | } |
225 | 225 | ||
226 | int xid = (int) rri.getXid(); | 226 | int xid = (int) rri.getXid(); |
227 | - RoleState role = rri.getRole(); | 227 | + RoleState receivedRole = rri.getRole(); |
228 | - // XXX S should check generation id meaningfully and other cases of expectations | 228 | + // XXX Should check generation id meaningfully and other cases of expectations |
229 | 229 | ||
230 | if (pendingXid != xid) { | 230 | if (pendingXid != xid) { |
231 | log.debug("Received older role reply from " + | 231 | log.debug("Received older role reply from " + |
... | @@ -236,10 +236,12 @@ class RoleManager implements RoleHandler { | ... | @@ -236,10 +236,12 @@ class RoleManager implements RoleHandler { |
236 | return RoleRecvStatus.OLD_REPLY; | 236 | return RoleRecvStatus.OLD_REPLY; |
237 | } | 237 | } |
238 | 238 | ||
239 | - if (pendingRole == role) { | 239 | + sw.returnRoleReply(pendingRole, receivedRole); |
240 | + | ||
241 | + if (pendingRole == receivedRole) { | ||
240 | log.debug("Received role reply message from {} that matched " | 242 | log.debug("Received role reply message from {} that matched " |
241 | + "expected role-reply {} with expectations {}", | 243 | + "expected role-reply {} with expectations {}", |
242 | - new Object[] {sw.getStringId(), role, expectation}); | 244 | + new Object[] {sw.getStringId(), receivedRole, expectation}); |
243 | 245 | ||
244 | if (expectation == RoleRecvStatus.MATCHED_CURRENT_ROLE || | 246 | if (expectation == RoleRecvStatus.MATCHED_CURRENT_ROLE || |
245 | expectation == RoleRecvStatus.MATCHED_SET_ROLE) { | 247 | expectation == RoleRecvStatus.MATCHED_SET_ROLE) { |
... | @@ -247,8 +249,6 @@ class RoleManager implements RoleHandler { | ... | @@ -247,8 +249,6 @@ class RoleManager implements RoleHandler { |
247 | } else { | 249 | } else { |
248 | return RoleRecvStatus.OTHER_EXPECTATION; | 250 | return RoleRecvStatus.OTHER_EXPECTATION; |
249 | } | 251 | } |
250 | - } else { | ||
251 | - sw.returnRoleAssertFailure(pendingRole); | ||
252 | } | 252 | } |
253 | 253 | ||
254 | // if xids match but role's don't, perhaps its a query (OF1.3) | 254 | // if xids match but role's don't, perhaps its a query (OF1.3) | ... | ... |
... | @@ -175,11 +175,6 @@ public class RoleManagerTest { | ... | @@ -175,11 +175,6 @@ public class RoleManagerTest { |
175 | } | 175 | } |
176 | 176 | ||
177 | @Override | 177 | @Override |
178 | - public void returnRoleAssertFailure(RoleState role) { | ||
179 | - failed = role; | ||
180 | - } | ||
181 | - | ||
182 | - @Override | ||
183 | public boolean isOptical() { | 178 | public boolean isOptical() { |
184 | return false; | 179 | return false; |
185 | } | 180 | } |
... | @@ -300,5 +295,10 @@ public class RoleManagerTest { | ... | @@ -300,5 +295,10 @@ public class RoleManagerTest { |
300 | public void write(List<OFMessage> msgs) { | 295 | public void write(List<OFMessage> msgs) { |
301 | } | 296 | } |
302 | 297 | ||
298 | + @Override | ||
299 | + public void returnRoleReply(RoleState requested, RoleState response) { | ||
300 | + failed = requested; | ||
301 | + } | ||
302 | + | ||
303 | } | 303 | } |
304 | } | 304 | } | ... | ... |
... | @@ -226,23 +226,31 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -226,23 +226,31 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
226 | } | 226 | } |
227 | 227 | ||
228 | @Override | 228 | @Override |
229 | - public void roleAssertFailed(Dpid dpid, RoleState role) { | 229 | + public void receivedRoleReply(Dpid dpid, RoleState requested, RoleState response) { |
230 | - MastershipRole failed; | 230 | + MastershipRole request = roleOf(requested); |
231 | - switch (role) { | 231 | + MastershipRole reply = roleOf(response); |
232 | + | ||
233 | + providerService.receivedRoleReply(deviceId(uri(dpid)), request, reply); | ||
234 | + } | ||
235 | + | ||
236 | + /** | ||
237 | + * Translates a RoleState to the corresponding MastershipRole. | ||
238 | + * | ||
239 | + * @param response | ||
240 | + * @return a MastershipRole | ||
241 | + */ | ||
242 | + private MastershipRole roleOf(RoleState response) { | ||
243 | + switch (response) { | ||
232 | case MASTER: | 244 | case MASTER: |
233 | - failed = MastershipRole.MASTER; | 245 | + return MastershipRole.MASTER; |
234 | - break; | ||
235 | case EQUAL: | 246 | case EQUAL: |
236 | - failed = MastershipRole.STANDBY; | 247 | + return MastershipRole.STANDBY; |
237 | - break; | ||
238 | case SLAVE: | 248 | case SLAVE: |
239 | - failed = MastershipRole.NONE; | 249 | + return MastershipRole.NONE; |
240 | - break; | ||
241 | default: | 250 | default: |
242 | - LOG.warn("unknown role {}", role); | 251 | + LOG.warn("unknown role {}", response); |
243 | - return; | 252 | + return null; |
244 | } | 253 | } |
245 | - providerService.unableToAssertRole(deviceId(uri(dpid)), failed); | ||
246 | } | 254 | } |
247 | 255 | ||
248 | /** | 256 | /** | ... | ... |
... | @@ -136,12 +136,13 @@ public class OpenFlowDeviceProviderTest { | ... | @@ -136,12 +136,13 @@ public class OpenFlowDeviceProviderTest { |
136 | } | 136 | } |
137 | 137 | ||
138 | @Test | 138 | @Test |
139 | - public void roleAssertFailed() { | 139 | + public void receivedRoleReply() { |
140 | - controller.listener.roleAssertFailed(DPID1, RoleState.MASTER); | 140 | + // check translation capabilities |
141 | + controller.listener.receivedRoleReply(DPID1, RoleState.MASTER, RoleState.MASTER); | ||
141 | assertEquals("wrong role reported", DPID1, registry.roles.get(MASTER)); | 142 | assertEquals("wrong role reported", DPID1, registry.roles.get(MASTER)); |
142 | - controller.listener.roleAssertFailed(DPID1, RoleState.EQUAL); | 143 | + controller.listener.receivedRoleReply(DPID1, RoleState.EQUAL, RoleState.MASTER); |
143 | assertEquals("wrong role reported", DPID1, registry.roles.get(STANDBY)); | 144 | assertEquals("wrong role reported", DPID1, registry.roles.get(STANDBY)); |
144 | - controller.listener.roleAssertFailed(DPID1, RoleState.SLAVE); | 145 | + controller.listener.receivedRoleReply(DPID1, RoleState.SLAVE, RoleState.MASTER); |
145 | assertEquals("wrong role reported", DPID1, registry.roles.get(NONE)); | 146 | assertEquals("wrong role reported", DPID1, registry.roles.get(NONE)); |
146 | } | 147 | } |
147 | 148 | ||
... | @@ -210,8 +211,9 @@ public class OpenFlowDeviceProviderTest { | ... | @@ -210,8 +211,9 @@ public class OpenFlowDeviceProviderTest { |
210 | } | 211 | } |
211 | 212 | ||
212 | @Override | 213 | @Override |
213 | - public void unableToAssertRole(DeviceId deviceId, MastershipRole role) { | 214 | + public void receivedRoleReply(DeviceId deviceId, |
214 | - roles.put(role, Dpid.dpid(deviceId.uri())); | 215 | + MastershipRole requested, MastershipRole response) { |
216 | + roles.put(requested, Dpid.dpid(deviceId.uri())); | ||
215 | } | 217 | } |
216 | 218 | ||
217 | } | 219 | } |
... | @@ -372,12 +374,12 @@ public class OpenFlowDeviceProviderTest { | ... | @@ -372,12 +374,12 @@ public class OpenFlowDeviceProviderTest { |
372 | } | 374 | } |
373 | 375 | ||
374 | @Override | 376 | @Override |
375 | - public void returnRoleAssertFailure(RoleState role) { | 377 | + public boolean isOptical() { |
378 | + return false; | ||
376 | } | 379 | } |
377 | 380 | ||
378 | @Override | 381 | @Override |
379 | - public boolean isOptical() { | 382 | + public void returnRoleReply(RoleState requested, RoleState reponse) { |
380 | - return false; | ||
381 | } | 383 | } |
382 | 384 | ||
383 | } | 385 | } | ... | ... |
providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
... | @@ -302,7 +302,10 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -302,7 +302,10 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
302 | } | 302 | } |
303 | 303 | ||
304 | @Override | 304 | @Override |
305 | - public void roleAssertFailed(Dpid dpid, RoleState role) {} | 305 | + public void receivedRoleReply(Dpid dpid, RoleState requested, |
306 | + RoleState response) { | ||
307 | + // Do nothing here for now. | ||
308 | + } | ||
306 | 309 | ||
307 | private synchronized void pushFlowMetrics(Dpid dpid, OFStatsReply stats) { | 310 | private synchronized void pushFlowMetrics(Dpid dpid, OFStatsReply stats) { |
308 | if (stats.getStatsType() != OFStatsType.FLOW) { | 311 | if (stats.getStatsType() != OFStatsType.FLOW) { | ... | ... |
providers/openflow/link/src/main/java/org/onlab/onos/provider/of/link/impl/OpenFlowLinkProvider.java
... | @@ -160,7 +160,8 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid | ... | @@ -160,7 +160,8 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid |
160 | } | 160 | } |
161 | 161 | ||
162 | @Override | 162 | @Override |
163 | - public void roleAssertFailed(Dpid dpid, RoleState role) { | 163 | + public void receivedRoleReply(Dpid dpid, RoleState requested, |
164 | + RoleState response) { | ||
164 | // do nothing for this. | 165 | // do nothing for this. |
165 | } | 166 | } |
166 | 167 | ... | ... |
... | @@ -479,12 +479,12 @@ public class OpenFlowLinkProviderTest { | ... | @@ -479,12 +479,12 @@ public class OpenFlowLinkProviderTest { |
479 | } | 479 | } |
480 | 480 | ||
481 | @Override | 481 | @Override |
482 | - public void returnRoleAssertFailure(RoleState role) { | 482 | + public boolean isOptical() { |
483 | + return false; | ||
483 | } | 484 | } |
484 | 485 | ||
485 | @Override | 486 | @Override |
486 | - public boolean isOptical() { | 487 | + public void returnRoleReply(RoleState requested, RoleState reponse) { |
487 | - return false; | ||
488 | } | 488 | } |
489 | 489 | ||
490 | } | 490 | } | ... | ... |
... | @@ -410,12 +410,12 @@ public class OpenFlowPacketProviderTest { | ... | @@ -410,12 +410,12 @@ public class OpenFlowPacketProviderTest { |
410 | } | 410 | } |
411 | 411 | ||
412 | @Override | 412 | @Override |
413 | - public void returnRoleAssertFailure(RoleState role) { | 413 | + public boolean isOptical() { |
414 | + return false; | ||
414 | } | 415 | } |
415 | 416 | ||
416 | @Override | 417 | @Override |
417 | - public boolean isOptical() { | 418 | + public void returnRoleReply(RoleState requested, RoleState reponse) { |
418 | - return false; | ||
419 | } | 419 | } |
420 | 420 | ||
421 | } | 421 | } | ... | ... |
-
Please register or login to post a comment