package org.ow2.choreos.ee.reconfiguration;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.ow2.choreos.services.datamodel.DeployableService;
import org.ow2.choreos.services.datamodel.DeployableServiceSpec;
import org.ow2.choreos.services.datamodel.ServiceInstance;
import org.ow2.choreos.services.datamodel.qos.DesiredQoS;
import org.ow2.choreos.services.datamodel.qos.ResponseTimeMetric;
public class ServicesRuleBuilder {
private static final String SERVICE_RULE_TEMPLATE = "rules/service_rule_template";
private Logger logger = Logger.getLogger("reconfLogger");
private static final String SERVICE_ID_PLACEHOLDER = "@{service_id}";
private static final String CHOR_ID_PLACEHOLDER = "@{chor_id}";
private static final String SERVICE_NODE = "@{service_node}";
private static final String ACCEPTABLE_PERCENTAGE_RESPONSE_TIME_PLACEHOLDER = "@{acceptable_precentage}";
private static final String MAX_RESPONSE_TIME_PLACEHOLDER = "@{max_response_time}";
private static final String MAX_CPU_USAGE_PLACEHOLDER = "@{max_cpu_usage}";
private static final String MIN_CPU_USAGE_PLACEHOLDER = "@{min_cpu_usage}";
public String assemblyRules(List<DeployableService> deployableServices, String chorID) {
StringBuffer fileContent = new StringBuffer();
for (DeployableService service : deployableServices) {
String assemblyServiceRule = assemblyServiceRule(service, chorID);
fileContent.append(assemblyServiceRule);
if (!assemblyServiceRule.isEmpty())
fileContent.append("\n\n");
}
return fileContent.toString();
}
private String assemblyServiceRule(DeployableService service, String chorID) {
StringBuffer serviceRuleTemplate = new StringBuffer();
try {
serviceRuleTemplate = serviceRuleTemplate.append(FileUtils.readFileToString(new File(getClass()
.getClassLoader().getResource(SERVICE_RULE_TEMPLATE).getFile())));
} catch (IOException e) {
logger.error("Could not open service rule template file");
return "";
}
DeployableServiceSpec spec = service.getSpec();
DesiredQoS serviceDesiredQoS = spec.getDesiredQoS();
if (serviceDesiredQoS == null)
return "";
ResponseTimeMetric responseTimeMetric = serviceDesiredQoS.getResponseTimeMetric();
if (responseTimeMetric == null)
return "";
StringBuffer serviceRule = new StringBuffer();
for (ServiceInstance instance : service.getInstances()) {
StringBuffer tmp = new StringBuffer(serviceRuleTemplate);
String instanceRule = tmp
.toString()
.replace(SERVICE_NODE, instance.getNode().getIp())
.replace(SERVICE_ID_PLACEHOLDER, instance.getInstanceId())
.replace(CHOR_ID_PLACEHOLDER, chorID)
.replace(ACCEPTABLE_PERCENTAGE_RESPONSE_TIME_PLACEHOLDER,
"" + responseTimeMetric.getAcceptablePercentage())
.replace(MAX_RESPONSE_TIME_PLACEHOLDER, "" + responseTimeMetric.getMaxDesiredResponseTime())
.replace(MAX_CPU_USAGE_PLACEHOLDER, "" + serviceDesiredQoS.getResourceLimits().getMaxCPUUsage())
.replace(MIN_CPU_USAGE_PLACEHOLDER, "" + serviceDesiredQoS.getResourceLimits().getMinCPUUsage());
serviceRule.append(instanceRule);
}
return serviceRule.toString();
}
}