From 201dbb86e00ccd8e2961b938f93e31e195b282cd Mon Sep 17 00:00:00 2001 From: Ryan Izard <ryan.izard@bigswitch.com> Date: Mon, 11 Jul 2016 07:40:33 -0400 Subject: [PATCH] Fix HA role REST API and add flag to allow us to toggle the controller's behavior when a transition to STANDBY occurs. For now, since we don't have much logic in other modules to handle STANDBY roles, we'll shutdown, but in the future, we should give the ability to stay running and await the next transition to ACTIVE. --- .../core/internal/Controller.java | 14 ++++++++++- .../core/internal/RoleManager.java | 2 +- .../core/web/ControllerRoleResource.java | 24 ++++++++----------- .../resources/floodlightdefault.properties | 1 + 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java index f3403c35b..f8e8c2dce 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java +++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java @@ -134,6 +134,7 @@ public class Controller implements IFloodlightProviderService, IStorageSourceLis * based on parameters that are only available in init() */ private static RoleManager roleManager; + protected static boolean shutdownOnTransitionToStandby = false; /* Storage table names */ protected static final String CONTROLLER_TABLE_NAME = "controller_controller"; @@ -620,10 +621,21 @@ public class Controller implements IFloodlightProviderService, IStorageSourceLis } log.info("ControllerId set to {}", this.controllerId); + String shutdown = configParams.get("shutdownOnTransitionToStandby"); + if (!Strings.isNullOrEmpty(shutdown)) { + try { + shutdownOnTransitionToStandby = Boolean.parseBoolean(shutdown.trim()); + } catch (Exception e) { + log.error("Could not parse 'shutdownOnTransitionToStandby' of {}. Using default setting of {}", + shutdown, shutdownOnTransitionToStandby); + } + } + log.info("Shutdown when controller transitions to STANDBY HA role: {}", shutdownOnTransitionToStandby); + String decodeEth = configParams.get("deserializeEthPacketIns"); if (!Strings.isNullOrEmpty(decodeEth)) { try { - alwaysDecodeEth = Boolean.parseBoolean(decodeEth); + alwaysDecodeEth = Boolean.parseBoolean(decodeEth.trim()); } catch (Exception e) { log.error("Could not parse 'deserializeEthPacketIns' of {}. Using default setting of {}", decodeEth, alwaysDecodeEth); } diff --git a/src/main/java/net/floodlightcontroller/core/internal/RoleManager.java b/src/main/java/net/floodlightcontroller/core/internal/RoleManager.java index de73d0cf3..0e088d01f 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/RoleManager.java +++ b/src/main/java/net/floodlightcontroller/core/internal/RoleManager.java @@ -219,7 +219,7 @@ public class RoleManager { controller.setNotifiedRole(newRole); - if(newRole == HARole.STANDBY) { + if (newRole == HARole.STANDBY && Controller.shutdownOnTransitionToStandby) { String reason = String.format("Received role request to " + "transition from ACTIVE to STANDBY (reason: %s)", getRoleInfo().getRoleChangeDescription()); diff --git a/src/main/java/net/floodlightcontroller/core/web/ControllerRoleResource.java b/src/main/java/net/floodlightcontroller/core/web/ControllerRoleResource.java index 69c3723ae..cf7eed54b 100644 --- a/src/main/java/net/floodlightcontroller/core/web/ControllerRoleResource.java +++ b/src/main/java/net/floodlightcontroller/core/web/ControllerRoleResource.java @@ -16,11 +16,13 @@ package net.floodlightcontroller.core.web; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.restlet.resource.ServerResource; +import net.floodlightcontroller.core.HARole; import net.floodlightcontroller.core.IFloodlightProviderService; import net.floodlightcontroller.core.RoleInfo; @@ -30,17 +32,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.MappingJsonFactory; public class ControllerRoleResource extends ServerResource { protected static Logger log = LoggerFactory.getLogger(ControllerRoleResource.class); - private static final String STR_ACTIVE = "ACTIVE"; - private static final String STR_STANDBY = "STANDBY"; private static final String STR_ROLE = "role"; - private static final String STR_ROLE_CHANGE_DESC = "role-change-description"; - private static final String STR_ROLE_CHANGE_DATE_TIME = "role-change-date-time"; + private static final String STR_ROLE_CHANGE_DESC = "role_change_description"; + private static final String STR_ROLE_CHANGE_DATE_TIME = "role_change_date_time"; @Get("json") public Map<String, String> getRole() { @@ -68,12 +69,9 @@ public class ControllerRoleResource extends ServerResource { String role = null; String roleChangeDesc = null; - retValue.put("TBD", "Not yet implemented"); - return retValue; - /* try { try { - jp = f.createJsonParser(json); + jp = f.createParser(json); } catch (IOException e) { e.printStackTrace(); } @@ -106,16 +104,14 @@ public class ControllerRoleResource extends ServerResource { } } catch (IOException e) { e.printStackTrace(); - retValue.put("ERROR", "Caught IOException while parsing JSON POST request in role request."); + retValue.put("ERROR", "Caught exception while parsing controller role request. Supported roles: ACTIVE, STANDBY (or MASTER, SLAVE)"); } HARole harole = null; try { - harole = HARole.valueOfBackwardsCompatible(role); + harole = HARole.valueOfBackwardsCompatible(role.toUpperCase().trim()); } catch (IllegalArgumentException | NullPointerException e) { - // The role value in the REST call didn't match a valid - // role name, so just leave the role as null and handle - // the error below. + retValue.put("ERROR", "Caught exception while parsing controller role request. Supported roles: ACTIVE, STANDBY (or MASTER, SLAVE)"); } if (roleChangeDesc == null) { @@ -129,6 +125,6 @@ public class ControllerRoleResource extends ServerResource { retValue.put(STR_ROLE_CHANGE_DESC, ri.getRoleChangeDescription()); retValue.put(STR_ROLE_CHANGE_DATE_TIME, ri.getRoleChangeDateTime().toString()); - return retValue;*/ + return retValue; } } diff --git a/src/main/resources/floodlightdefault.properties b/src/main/resources/floodlightdefault.properties index 51ab0d18f..31a9dead4 100644 --- a/src/main/resources/floodlightdefault.properties +++ b/src/main/resources/floodlightdefault.properties @@ -37,6 +37,7 @@ net.floodlightcontroller.core.internal.FloodlightProvider.role=ACTIVE net.floodlightcontroller.core.internal.FloodlightProvider.controllerId=1 net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-history-size=10 net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-update-threshold=0.5 +net.floodlightcontroller.core.internal.FloodlightProvider.shutdownOnTransitionToStandby=true net.floodlightcontroller.core.internal.OFSwitchManager.openFlowPort=6653 net.floodlightcontroller.core.internal.OFSwitchManager.openFlowAddresses=0.0.0.0 net.floodlightcontroller.core.internal.OFSwitchManager.workerThreads=16 -- GitLab