/* * 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.governance.sla.client; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import eu.cloud4soa.api.datamodel.core.ApplicationInstance; import eu.cloud4soa.api.datamodel.core.PaaSInstance; import eu.cloud4soa.api.datamodel.governance.Breach; import eu.cloud4soa.api.datamodel.governance.GuaranteeTerm; import eu.cloud4soa.api.datamodel.governance.SlaPolicy; import eu.cloud4soa.api.datamodel.governance.SLAViolation; import eu.cloud4soa.api.datamodel.governance.ServiceDescriptionTerm; import eu.cloud4soa.api.datamodel.governance.SlaContract; import eu.cloud4soa.api.datamodel.governance.SlaContractValidity; import eu.cloud4soa.api.datamodel.governance.SlaTemplate; import eu.cloud4soa.api.datamodel.governance.SlaTemplate.ServiceGuaranteeType; import eu.cloud4soa.api.repository.SLAsRepository; import eu.cloud4soa.relational.datamodel.SLAContract; import eu.cloud4soa.relational.persistence.BreachRepository; import eu.cloud4soa.relational.persistence.SLAContractRepository; import eu.cloud4soa.relational.persistence.SLATemplateRepository; import eu.cloud4soa.relational.persistence.SLAViolationRepository; /** * * @author vincenzo */ @Transactional public class SLAModule implements eu.cloud4soa.api.governance.SLAModule{ final Logger logger = LoggerFactory.getLogger(SLAModule.class); private SLAsRepository sLAsRepository; @Autowired private SLATemplateRepository sla_template_repository; @Autowired private SLAContractRepository sla_contract_repository; @Autowired private SLAViolationRepository sla_violation_repository; @Autowired private BreachRepository breach_repository; /** * @param slasRepository the slasRepository to set */ public void setSLAsRepository(SLAsRepository sLAsRepository) { this.sLAsRepository = sLAsRepository; } @Override public SlaTemplate startNegotiation(ApplicationInstance applicationInstance, PaaSInstance paaSInstance) { SlaTemplate ret = new SlaTemplate(applicationInstance, paaSInstance); ret.setId(storeSLATemplate(ret)); return ret; } @Override public SlaContractValidity checkContractValidity(ApplicationInstance applicationInstance, PaaSInstance paaSInstance) { logger.error("UnsupportedOperationException("+"Not supported yet."+")"); // throw new UnsupportedOperationException("Not supported yet."); logger.debug("getApplicationSemanticModel()"); //build ApplicationInstance from ApplicationSemanticModel + applicationInstance eu.cloud4soa.api.datamodel.governance.ApplicationInstance governanceApplicationInstance = new eu.cloud4soa.api.datamodel.governance.ApplicationInstance() {}; //build PaaSInstance from PaaSSemanticModel + paaSInstance eu.cloud4soa.api.datamodel.governance.PaaSInstance governancePaaSInstance = new eu.cloud4soa.api.datamodel.governance.PaaSInstance() {}; logger.debug("call SLAsRepository.getSlaContract(governanceApplicationInstance, governancePaaSInstance)"); if(sLAsRepository==null) System.out.println ("slasRepository==null"); SlaContract slaContract = sLAsRepository.getSlaContract(governanceApplicationInstance, governancePaaSInstance); logger.debug("obtained SlaContract: "+slaContract); //create validity informations SlaContractValidity slaContractValidity = new eu.cloud4soa.governance.datamodel.sla.SlaContractValidity(); logger.debug("created SlaContractValidity: "+ slaContractValidity); logger.debug("return SlaContractValidity "+slaContractValidity); return slaContractValidity; } /*method exposed only for the DEMO*/ //changing the signature for now, will complete the implementation later @Override public SlaTemplate getSLATemplate(String templateId, ApplicationInstance applicationInstance, PaaSInstance paaSInstance) { return new SlaTemplate(applicationInstance, paaSInstance); } @Override public SlaContract getSLAContract(String sla_contract_id) { SlaContract ret_contract = null; SLAContract contract; List <SLAContract> contract_list = sla_contract_repository.retrieveAll(Long.valueOf(sla_contract_id)); ArrayList <GuaranteeTerm> guarantee_term_list; ArrayList <ServiceDescriptionTerm> service_description_term_list; ArrayList <SlaPolicy> penalty_list; if (contract_list.size() == 1) { ret_contract = new SlaContract(); contract = contract_list.get(0); guarantee_term_list = new ArrayList<GuaranteeTerm>(); service_description_term_list = new ArrayList<ServiceDescriptionTerm>(); penalty_list = new ArrayList<SlaPolicy>(); for (eu.cloud4soa.relational.datamodel.GuaranteeTerm term : contract.getGuaranteeTerms()) { if (term == null) { continue; } guarantee_term_list.add(new GuaranteeTerm(term.getGuaranteeTermName(), term.getServiceScopeServiceName(), term.getKpiName(), term.getCustomServiceLevel(), term.getPenaltyAssessmentInterval(), term.getPenaltyValueUnit(), term.getPenaltyValueExpression(), term.getRewardAssessmentInterval(), term.getRewardValueUnit(), term.getRewardValueExpression())); } for (eu.cloud4soa.relational.datamodel.ServiceDescriptionTerm term : contract.getServiceDescriptionTerms()) { if (term == null) { continue; } service_description_term_list.add(new ServiceDescriptionTerm( term.getServiceDescriptionTermName(), term.getServiceDescriptionServiceName(), term.getApplicationName(), term.getApplicationVersion(), term.getApplicationDescription())); } for (eu.cloud4soa.relational.datamodel.SLAPolicy penalty : contract.getSlaPolicies()) { penalty_list.add(new SlaPolicy( penalty.getId(), penalty.getMetric_name().toString(), penalty.getTime_interval(), penalty.getBreach(), penalty.getValue_expr())); } ret_contract.setAgreementInitiator(contract.getAgreementInitiator()); ret_contract.setAgreementResponder(contract.getAgreementResponder()); ret_contract.setExpirationTime(contract.getExpirationTime().toString()); /*FORMAT!!!!!*/ ret_contract.setGuaranteeTerms(guarantee_term_list); ret_contract.setServiceDescriptionTerms(service_description_term_list); ret_contract.setServiceProvider(contract.getServiceProvider()); ret_contract.setContractId(contract.getId()); ret_contract.setTemplateName(contract.getTemplateName()); } return ret_contract; } private Long storeSLATemplate (SlaTemplate template) { eu.cloud4soa.relational.datamodel.SLATemplate persisted_template = toPersistedSLATemplate(template); sla_template_repository.store(persisted_template); return persisted_template.getId(); } private eu.cloud4soa.relational.datamodel.SLATemplate toPersistedSLATemplate (SlaTemplate template) { SimpleDateFormat format = new SimpleDateFormat(template.getDateFormat()); /* * We create the classes to do the conversion * between the SOA POJO to the Hibernate one */ eu.cloud4soa.relational.datamodel.GuaranteeTerm persisted_g_term; eu.cloud4soa.relational.datamodel.ServiceDescriptionTerm persisted_sd_term ; List <eu.cloud4soa.relational.datamodel.GuaranteeTerm> persisted_g_terms = new ArrayList <eu.cloud4soa.relational.datamodel.GuaranteeTerm>(); List <eu.cloud4soa.relational.datamodel.ServiceDescriptionTerm> persisted_sd_terms = new ArrayList <eu.cloud4soa.relational.datamodel.ServiceDescriptionTerm>(); eu.cloud4soa.relational.datamodel.SLATemplate persisted_template = new eu.cloud4soa.relational.datamodel.SLATemplate(); /* * We do the conversion between POJOS */ for (GuaranteeTerm term : template.getGuaranteeTerms()) { persisted_g_term = new eu.cloud4soa.relational.datamodel.GuaranteeTerm(); persisted_g_term.setCustomServiceLevel(term.getCustomServiceLevel()); persisted_g_term.setGuaranteeTermName(term.getGuaranteeTermName()); persisted_g_term.setKpiName(term.getKpiName()); persisted_g_term.setPenaltyAssessmentInterval(term.getPenaltyAssessmentInterval()); persisted_g_term.setPenaltyValueExpression(term.getPenaltyValueExpression()); persisted_g_term.setPenaltyValueUnit(term.getPenaltyValueUnit()); persisted_g_term.setRewardAssessmentInterval(term.getRewardAssessmentInterval()); persisted_g_term.setRewardValueExpression(term.getRewardValueExpression()); persisted_g_term.setRewardValueUnit(term.getRewardValueUnit()); persisted_g_term.setServiceScopeServiceName(term.getServiceScopeServiceName()); persisted_g_terms.add(persisted_g_term); } for (ServiceDescriptionTerm term : template.getServiceDescriptionTerms()) { persisted_sd_term = new eu.cloud4soa.relational.datamodel.ServiceDescriptionTerm(); persisted_sd_term.setApplicationDescription(term.getApplicationDescription()); persisted_sd_term.setApplicationName(term.getApplicationName()); persisted_sd_term.setApplicationVersion(term.getApplicationVersion()); persisted_sd_term.setServiceDescriptionServiceName(term.getServiceDescriptionServiceName()); persisted_sd_term.setServiceDescriptionTermName(term.getServiceDescriptionTermName()); persisted_sd_terms.add(persisted_sd_term); } persisted_template.setAgreementInitiator(template.getAgreementInitiator()); persisted_template.setAgreementResponder(template.getAgreementResponder()); persisted_template.setGuaranteeTerms(persisted_g_terms); persisted_template.setServiceDescriptionTerms(persisted_sd_terms); persisted_template.setTemplateName(template.getTemplateName()); try { persisted_template.setExpirationTime(new Date(format.parse(template.getExpirationTime()).getTime())); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return persisted_template; } @Override public List<SLAViolation> getSlaViolations (String user_id, Date start, Date end) { List <eu.cloud4soa.relational.datamodel.SLAViolation> violations; List <SLAViolation> ret = new ArrayList<SLAViolation>(); SLAViolation violation; violations = sla_violation_repository.retrieveAllForUserAndTime(user_id, start, end); for (eu.cloud4soa.relational.datamodel.SLAViolation viol : violations) { violation = new SLAViolation(); violation.setId(viol.getId()); violation.setSla_enforcement_job_id(viol.getSLAEnforcementJobId()); violation.setApplication_instance_uri_id(viol.getApplicationInstanceUriId()); violation.setDate_and_time(viol.getDateAndTime()); violation.setMetric_name(viol.getMetricName()); violation.setExpected_value(viol.getExpectedValue()); violation.setActual_value(viol.getActualValue()); ret.add(violation); } return ret; } @Override public List<Breach> getBreaches (String user_id, Date start, Date end) { List <eu.cloud4soa.relational.datamodel.Breach> breaches; List <Breach> ret = new ArrayList<Breach>(); Breach breach; breaches = breach_repository.retrieveAllInRange(user_id, start, end); for (eu.cloud4soa.relational.datamodel.Breach b : breaches) { breach = new Breach(); breach.setId(b.getId()); breach.setTimestamp(b.getTimestamp()); breach.setMetric_name(ServiceGuaranteeType.valueOf(b.getMetric_name())); breach.setValue_expr(b.getValue()); } return ret; } }