/* * Copyright 2013 Cloud4SOA, www.cloud4soa.eu * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package eu.cloud4soa.api.datamodel.governance; import java.text.Format; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import eu.cloud4soa.api.datamodel.core.ApplicationInstance; import eu.cloud4soa.api.datamodel.core.PaaSInstance; import eu.cloud4soa.api.datamodel.core.qos.CPULoadInstance; import eu.cloud4soa.api.datamodel.core.qos.CloudResponseTimeInstance; import eu.cloud4soa.api.datamodel.core.qos.ContainerResponseTimeInstance; import eu.cloud4soa.api.datamodel.core.qos.LatencyInstance; import eu.cloud4soa.api.datamodel.core.qos.MemoryLoadInstance; import eu.cloud4soa.api.datamodel.core.qos.ServiceQualityInstance; import eu.cloud4soa.api.datamodel.core.qos.UptimeInstance; import eu.cloud4soa.api.datamodel.governance.SlaPolicy.SlaPenaltyType; import eu.cloud4soa.api.datamodel.semantic.app.Application; import eu.cloud4soa.api.datamodel.semantic.ea.Latency; import eu.cloud4soa.api.datamodel.semantic.ea.Technology_Service_Quality; import eu.cloud4soa.api.datamodel.semantic.ea.Uptime; import eu.cloud4soa.api.datamodel.semantic.paas.PaaSOffering; import eu.cloud4soa.api.datamodel.semantic.user.Developer; import eu.cloud4soa.api.governance.monitoring.IMonitoringMetric.MetricKey; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlRootElement() @XmlType(name = "slatemplate", namespace = "eu.cloud4soa.api.datamodel.governance") public class SlaTemplate { static public enum ServiceGuaranteeType { CPU_Load, Memory_Load, CloudResponseTime, ContainerResponseTime, UNRECOGNIZED, LATENCY, responseTime, statusCode; // public ServiceGuaranteeType from(String label) { // // return valueOf(label.toUpperCase().replace(" ", "_")); // } } private final String DATEFORMAT = "dd-MMMM-yyyy"; //TODO : Creating all fields as Strings for now /** * SLA Context info */ private Long id; private String agreementInitiator; private String agreementResponder; private String serviceProvider; private String expirationTime; private String templateName; /** * ServiceDescriptionTerms */ private List<ServiceDescriptionTerm> serviceDescriptionTerms = new ArrayList<ServiceDescriptionTerm>(); /** * GuaranteeTerms */ private List<GuaranteeTerm> guaranteeTerms = new ArrayList<GuaranteeTerm>(); public SlaTemplate() { } /** * Constructs an SLAContract instance from a given XML filename * @param filename */ public SlaTemplate(ApplicationInstance applicationInstance, PaaSInstance paasInstance) { Application application = applicationInstance.getApplication(); Developer developer = application.getOwner(); agreementInitiator = developer.getFirstName() + " " + developer.getFamilyname(); agreementResponder = paasInstance.getProviderTitle(); serviceProvider = agreementResponder; expirationTime = getOneYearFromNow(); //templateId = UUID.randomUUID().toString(); templateName = " SLA between " + agreementInitiator + " and " + agreementResponder; // not sure which are the correct attributes to get from ApplicationInstance for these fields, settign to application description for now String applicationName = application.getdescription(); String serviceName = application.getdescription(); ServiceDescriptionTerm serviceDescriptionTerm = new ServiceDescriptionTerm("ServiceTerm1", serviceName, applicationName, application.getVersion(), application.getdescription()); serviceDescriptionTerms.add(serviceDescriptionTerm); createGuranteeTerms(applicationInstance, paasInstance, serviceName); } private void createGuranteeTerms(ApplicationInstance applicationInstance, PaaSInstance paasInstance, String serviceName) { String latencyValue = null; boolean paasHasLatencyQoS = false; String uptimeValue = null; boolean paasHasUptimeQoS = false; PaaSOffering offering; HashMap<MetricKey, String> metricValues = new HashMap<MetricKey, String>(); // first check if paasInstance has Qos parameters List<Technology_Service_Quality> qtsqs = paasInstance.getPaaSOffering().getProvidesServiceQuality(); for (int i = 0; i < qtsqs.size(); i++) { Technology_Service_Quality serviceQuality = qtsqs.get(i); if(serviceQuality instanceof Latency) { latencyValue = new LatencyInstance((Latency)serviceQuality).getMaxValueMs().toString(); paasHasLatencyQoS = true; } if(serviceQuality instanceof Uptime) { uptimeValue = new UptimeInstance((Uptime)serviceQuality).getHasPercentage().toString(); paasHasUptimeQoS = true; } } // then check if applicationInstance has Qos parameters List<ServiceQualityInstance> applicationSWqualities = applicationInstance.getServiceQualities(); for (int i = 0; i < applicationSWqualities.size(); i++) { ServiceQualityInstance swAppQuality = applicationSWqualities.get(i); if (swAppQuality instanceof CloudResponseTimeInstance) { if (((CloudResponseTimeInstance)swAppQuality).getMaxValueMs() != null) { metricValues.put(MetricKey.CloudResponseTime, ((CloudResponseTimeInstance)swAppQuality).getMaxValueMs().toString()); } } else if (swAppQuality instanceof ContainerResponseTimeInstance) { if (((ContainerResponseTimeInstance)swAppQuality).getMaxValueMs() != null) { metricValues.put(MetricKey.ContainerResponseTime, ((ContainerResponseTimeInstance)swAppQuality).getMaxValueMs().toString()); } } else if (swAppQuality instanceof CPULoadInstance) { if (((CPULoadInstance)swAppQuality).getHasPercentage() != null) { metricValues.put(MetricKey.CPU_Load, ((CPULoadInstance)swAppQuality).getHasPercentage().toString()); } } else if (swAppQuality instanceof LatencyInstance) { if (((LatencyInstance)swAppQuality).getMaxValueMs() != null) { metricValues.put(MetricKey.responseTime, ((LatencyInstance)swAppQuality).getMaxValueMs().toString()); } } else if (swAppQuality instanceof MemoryLoadInstance) { if (((MemoryLoadInstance)swAppQuality).getMaxValueMB() != null) { metricValues.put(MetricKey.Memory_Load, ((MemoryLoadInstance)swAppQuality).getMaxValueMB().toString()); } } else if (swAppQuality instanceof UptimeInstance) { if (((UptimeInstance)swAppQuality).getHasPercentage() != null) { metricValues.put(MetricKey.statusCode, ((UptimeInstance)swAppQuality).getHasPercentage().toString()); } } } if (latencyValue == null || latencyValue.equals("")) latencyValue = "200"; if (uptimeValue == null || uptimeValue.equals("")) uptimeValue = "99,9"; GuaranteeTerm guaranteeTerm; offering = paasInstance.getPaaSOffering(); for (MetricKey metric : MetricKey.values()) { guaranteeTerm = new GuaranteeTerm (metric.name().toUpperCase()+"_GUARANTEE", serviceName, metric.name(), metricValues.get(metric), "", "", "", "","", ""); guaranteeTerms.add(guaranteeTerm); } } private String getOneYearFromNow() { Calendar date = Calendar.getInstance(); date.setTime(new Date()); date.add(Calendar.YEAR, 1); Format f = new SimpleDateFormat(DATEFORMAT); return f.format(date.getTime()); } public String getAgreementInitiator() { return agreementInitiator; } public String getAgreementResponder() { return agreementResponder; } public String getServiceProvider() { return serviceProvider; } public String getExpirationTime() { return expirationTime; } public Long getId() { return id; } public String getTemplateName() { return templateName; } public void setAgreementInitiator(String agreementInitiator) { this.agreementInitiator = agreementInitiator; } public void setAgreementResponder(String agreementResponder) { this.agreementResponder = agreementResponder; } public void setExpirationTime(String expirationTime) { this.expirationTime = expirationTime; } public void setServiceProvider(String serviceProvider) { this.serviceProvider = serviceProvider; } public void setId(Long Id) { this.id = Id; } public void setTemplateName(String templateName) { this.templateName = templateName; } public void setServiceDescriptionTerms(List <ServiceDescriptionTerm> serviceDescriptionTerms) { this.serviceDescriptionTerms = serviceDescriptionTerms; } public List <ServiceDescriptionTerm> getServiceDescriptionTerms() { return serviceDescriptionTerms; } public void setGuaranteeTerms(List <GuaranteeTerm> guaranteeTerms) { this.guaranteeTerms = guaranteeTerms; } public List <GuaranteeTerm> getGuaranteeTerms() { return guaranteeTerms; } public String getDateFormat() { return DATEFORMAT; } }