diff options
Diffstat (limited to 'clustercontroller-utils/src/main/java/com/yahoo/vespa/clustercontroller/utils/staterestapi/server/JsonReader.java')
-rw-r--r-- | clustercontroller-utils/src/main/java/com/yahoo/vespa/clustercontroller/utils/staterestapi/server/JsonReader.java | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/clustercontroller-utils/src/main/java/com/yahoo/vespa/clustercontroller/utils/staterestapi/server/JsonReader.java b/clustercontroller-utils/src/main/java/com/yahoo/vespa/clustercontroller/utils/staterestapi/server/JsonReader.java index 3d0856669f1..3c62d87098b 100644 --- a/clustercontroller-utils/src/main/java/com/yahoo/vespa/clustercontroller/utils/staterestapi/server/JsonReader.java +++ b/clustercontroller-utils/src/main/java/com/yahoo/vespa/clustercontroller/utils/staterestapi/server/JsonReader.java @@ -8,10 +8,16 @@ import com.yahoo.vespa.clustercontroller.utils.staterestapi.response.UnitState; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONObject; +import java.time.Duration; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; public class JsonReader { + public static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(30); + public static final Duration MAX_TIMEOUT = Duration.ofHours(1); + private static final long MICROS_IN_SECOND = TimeUnit.SECONDS.toMillis(1); private static class UnitStateImpl implements UnitState { private final String id; @@ -37,11 +43,16 @@ public class JsonReader { final Map<String, UnitState> stateMap; final SetUnitStateRequest.Condition condition; final SetUnitStateRequest.ResponseWait responseWait; - public SetRequestData(Map<String, UnitState> stateMap, SetUnitStateRequest.Condition condition, - SetUnitStateRequest.ResponseWait responseWait) { + final Optional<Duration> timeout; + + public SetRequestData(Map<String, UnitState> stateMap, + SetUnitStateRequest.Condition condition, + SetUnitStateRequest.ResponseWait responseWait, + Optional<Duration> timeout) { this.stateMap = stateMap; this.condition = condition; this.responseWait = responseWait; + this.timeout = timeout; } } @@ -98,7 +109,33 @@ public class JsonReader { } stateMap.put(type, new UnitStateImpl(code, reason)); } - return new SetRequestData(stateMap, condition, responseWait); + + final Optional<Duration> timeout = parseTimeout(request.getOption("timeout", null)); + + return new SetRequestData(stateMap, condition, responseWait, timeout); + } + + public static Optional<Duration> parseTimeout(String timeoutOption) throws InvalidContentException { + if (timeoutOption == null) { + return Optional.empty(); + } else { + float timeoutSeconds; + try { + timeoutSeconds = Float.parseFloat(timeoutOption); + } catch (NumberFormatException e) { + throw new InvalidContentException("value of timeout->" + timeoutOption + " is not a float"); + } + + if (timeoutSeconds <= 0.0) { + return Optional.of(Duration.ZERO); + } else if (timeoutSeconds <= MAX_TIMEOUT.getSeconds()) { + long micros = Math.round(timeoutSeconds * MICROS_IN_SECOND); + long nanoAdjustment = TimeUnit.MILLISECONDS.toNanos(micros % MICROS_IN_SECOND); + return Optional.of(Duration.ofSeconds(micros / MICROS_IN_SECOND, nanoAdjustment)); + } else { + throw new InvalidContentException("value of timeout->" + timeoutOption + " exceeds max timeout " + MAX_TIMEOUT); + } + } } } |