/*************************************************************************
* Copyright 2013-2014 Eucalyptus Systems, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
* Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta
* CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need
* additional information or have any questions.
************************************************************************/
package com.eucalyptus.cloudformation.template;
import com.eucalyptus.cloudformation.CloudFormationException;
import com.eucalyptus.cloudformation.ValidationErrorException;
import com.fasterxml.jackson.databind.JsonNode;
import java.time.Duration;
import java.time.format.DateTimeParseException;
import java.util.concurrent.TimeUnit;
/**
* Created by ethomas on 4/1/16.
*/
public class CreationPolicy {
public static class ResourceSignal {
private int count = 1;
private long timeout = TimeUnit.MINUTES.toSeconds(5);
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public long getTimeout() {
return timeout;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
}
public ResourceSignal resourceSignal;
public ResourceSignal getResourceSignal() {
return resourceSignal;
}
public void setResourceSignal(ResourceSignal resourceSignal) {
this.resourceSignal = resourceSignal;
}
public static CreationPolicy parse(String creationPolicyJson) throws CloudFormationException {
if (creationPolicyJson == null) return null;
CreationPolicy creationPolicy = new CreationPolicy();
JsonNode creationPolicyJsonNode = JsonHelper.getJsonNodeFromString(creationPolicyJson);
if (!creationPolicyJsonNode.isObject()) {
throw new ValidationErrorException("CreationPolicy is not a JSON object");
}
JsonNode resourceSignalJsonNode = JsonHelper.checkObject(creationPolicyJsonNode,"ResourceSignal");
if (resourceSignalJsonNode != null) {
String countStr = JsonHelper.getString(resourceSignalJsonNode, "Count"); // TODO: consider getInt() method
String timeoutStr = JsonHelper.getString(resourceSignalJsonNode, "Timeout");
ResourceSignal resourceSignal = new ResourceSignal();
creationPolicy.setResourceSignal(resourceSignal);
if (countStr != null) {
try {
int count = Integer.parseInt(countStr);
resourceSignal.setCount(count);
} catch (NumberFormatException ex) {
throw new ValidationErrorException("Encountered non numeric value for property Count");
}
}
if (timeoutStr != null) {
try {
long timeout = Duration.parse(timeoutStr).getSeconds();
resourceSignal.setTimeout(timeout);
} catch (DateTimeParseException ex) {
throw new ValidationErrorException("Timeout must be an ISO-8601 compliant duration");
}
}
}
return creationPolicy;
}
}