summaryrefslogtreecommitdiffstats
path: root/clustercontroller-utils/src/main/java/com/yahoo/vespa/clustercontroller/utils/staterestapi/server/JsonReader.java
diff options
context:
space:
mode:
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.java43
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);
+ }
+ }
}
}