/** * This test ensures that the switch accurately determined if another master * exists in the cluster by examining the controller connections it has. */ @Test public void testHasAnotherMaster() { URI cokeUri = URIUtil.createURI("1.2.3.4", 6653); InetSocketAddress address = (InetSocketAddress) sw.getConnection(OFAuxId.MAIN).getLocalInetAddress(); URI pepsiUri = URIUtil.createURI(address.getHostName(), address.getPort()); updateControllerConnections(sw, OFControllerRole.ROLE_SLAVE, OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED, cokeUri.toString(), OFControllerRole.ROLE_MASTER, OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED, pepsiUri.toString()); // From the perspective of pepsi, the cluster currently does NOT have another master controller assertFalse(sw.hasAnotherMaster()); // Switch the controller connections so that pepsi is no longer master updateControllerConnections(sw, OFControllerRole.ROLE_MASTER, OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED, cokeUri.toString(), OFControllerRole.ROLE_SLAVE, OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED, pepsiUri.toString()); // From the perspective of pepsi, the cluster currently has another master controller assertTrue(sw.hasAnotherMaster()); }
@Override public boolean hasAnotherMaster() { //TODO: refactor get connection to not throw illegal arg exceptions IOFConnection mainCxn = this.getConnection(OFAuxId.MAIN); if(mainCxn != null) { // Determine the local URI InetSocketAddress address = (InetSocketAddress) mainCxn.getLocalInetAddress(); URI localURI = URIUtil.createURI(address.getHostName(), address.getPort()); for(Entry<URI,Map<OFAuxId, OFBsnControllerConnection>> entry : this.controllerConnections.entrySet()) { // Don't check our own controller connections URI uri = entry.getKey(); if(!localURI.equals(uri)){ // We only care for the MAIN connection Map<OFAuxId, OFBsnControllerConnection> cxns = this.controllerConnections.get(uri); OFBsnControllerConnection controllerCxn = cxns.get(OFAuxId.MAIN); if(controllerCxn != null) { // If the controller id disconnected or not master we know it is not connected if(controllerCxn.getState() == OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED && controllerCxn.getRole() == OFControllerRole.ROLE_MASTER){ return true; } } else { log.warn("Unable to find controller connection with aux id " + "MAIN for switch {} on controller with URI {}.", this, uri); } } } } return false; }
/** * Helper to load controller connection messages into a switch for testing. * @param sw the switch to insert the message on * @param role the role for the controller connection message * @param state the state for the controller connection message * @param uri the URI for the controller connection message */ public void updateControllerConnections(IOFSwitchBackend sw, OFControllerRole role1, OFBsnControllerConnectionState state1, String uri1 , OFControllerRole role2, OFBsnControllerConnectionState state2, String uri2) { OFBsnControllerConnection connection1 = factory.buildBsnControllerConnection() .setAuxiliaryId(OFAuxId.MAIN) .setRole(role1) .setState(state1) .setUri(uri1) .build(); OFBsnControllerConnection connection2 = factory.buildBsnControllerConnection() .setAuxiliaryId(OFAuxId.MAIN) .setRole(role2) .setState(state2) .setUri(uri2) .build(); List<OFBsnControllerConnection> connections = new ArrayList<OFBsnControllerConnection>(); connections.add(connection1); connections.add(connection2); OFBsnControllerConnectionsReply reply = factory.buildBsnControllerConnectionsReply() .setConnections(connections) .build(); sw.updateControllerConnections(reply); }
public static OFBsnControllerConnectionState readFrom(ChannelBuffer bb) throws OFParseError { try { return ofWireValue(bb.readByte()); } catch (IllegalArgumentException e) { throw new OFParseError(e); } }
public static OFBsnControllerConnectionState ofWireValue(byte val) { switch(val) { case BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED_VAL: return OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED; case BSN_CONTROLLER_CONNECTION_STATE_CONNECTED_VAL: return OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED; default: throw new IllegalArgumentException("Illegal wire value for type OFBsnControllerConnectionState in version 1.3: " + val); } }
public static byte toWireValue(OFBsnControllerConnectionState e) { switch(e) { case BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED: return BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED_VAL; case BSN_CONTROLLER_CONNECTION_STATE_CONNECTED: return BSN_CONTROLLER_CONNECTION_STATE_CONNECTED_VAL; default: throw new IllegalArgumentException("Illegal enum value for type OFBsnControllerConnectionState in version 1.3: " + e); } }
public static OFBsnControllerConnectionState ofWireValue(byte val) { switch(val) { case BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED_VAL: return OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED; case BSN_CONTROLLER_CONNECTION_STATE_CONNECTED_VAL: return OFBsnControllerConnectionState.BSN_CONTROLLER_CONNECTION_STATE_CONNECTED; default: throw new IllegalArgumentException("Illegal wire value for type OFBsnControllerConnectionState in version 1.4: " + val); } }
public static byte toWireValue(OFBsnControllerConnectionState e) { switch(e) { case BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED: return BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED_VAL; case BSN_CONTROLLER_CONNECTION_STATE_CONNECTED: return BSN_CONTROLLER_CONNECTION_STATE_CONNECTED_VAL; default: throw new IllegalArgumentException("Illegal enum value for type OFBsnControllerConnectionState in version 1.4: " + e); } }
public static OFBsnControllerConnectionState readFrom(ByteBuf bb) throws OFParseError { try { return ofWireValue(bb.readByte()); } catch (IllegalArgumentException e) { throw new OFParseError(e); } }