package com.telefonica.euro_iaas.placement.core; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.drools.agent.KnowledgeAgent; import org.drools.command.Command; import org.drools.command.CommandFactory; import org.drools.runtime.ExecutionResults; import org.drools.runtime.StatelessKnowledgeSession; import org.drools.runtime.rule.QueryResults; import org.drools.runtime.rule.QueryResultsRow; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.telefonica.euro_iaas.placement.dao.CloudProviderDao; import com.telefonica.euro_iaas.placement.exception.EntityNotFoundException; import com.telefonica.euro_iaas.placement.model.application.ServiceApplication; import com.telefonica.euro_iaas.placement.model.application.VDC; import com.telefonica.euro_iaas.placement.model.application.VEERequired; import com.telefonica.euro_iaas.placement.model.provider.CloudProvider; import com.telefonica.euro_iaas.placement.model.provider.VEE; /** * @author jpuente * */ @Service public class ProviderService { private static final Logger LOGGER = LoggerFactory.getLogger(ProviderService.class .getName()); @Autowired private CloudProviderDao cloudProviderDao; @Autowired private KnowledgeAgent kAgent; /** * */ public ProviderService() { super(); } @Transactional public List<CloudProvider> getAllowedCloudProviders(VDC vdc) throws EntityNotFoundException { List<CloudProvider> listProviders = new Vector<CloudProvider>(); // Create session, insert cloud providers and vdc. Run all and Query. StatelessKnowledgeSession ksession = kAgent.newStatelessKnowledgeSession(); //KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase(); //KnowledgeBuilder kbuilder = KnowledgeBuilderFactory // .newKnowledgeBuilder(); //kbuilder.add(ResourceFactory.newClassPathResource("changeset.xml", // getClass()), ResourceType.CHANGE_SET); // Check the builder for errors //if (kbuilder.hasErrors()) { // System.out.println(kbuilder.getErrors().toString()); // throw new RuntimeException("Unable to compile rules"); //} //Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages(); //kBase.addKnowledgePackages(pkgs); //StatelessKnowledgeSession ksession = kBase // .newStatelessKnowledgeSession(); List<Command> cmds = new ArrayList<Command>(); cmds.addAll(getCloudProvidersCommands()); cmds.addAll(getVDCCommands(vdc)); cmds.add(CommandFactory.newSetGlobal("LOGGER", LOGGER)); cmds.add(CommandFactory.newFireAllRules()); cmds.add(CommandFactory.newQuery("allowedProviders", "Get Allowed Cloud Providers")); ExecutionResults results = ksession.execute(CommandFactory .newBatchExecution(cmds)); for (String id : results.getIdentifiers()) { LOGGER.info("results id: " + id); } QueryResults qr = (QueryResults) results.getValue("allowedProviders"); LOGGER.info("QueryResults" + qr); for (Iterator<?> it = qr.iterator(); it.hasNext();) { QueryResultsRow qResult = (QueryResultsRow) it.next(); CloudProvider cp = (CloudProvider) qResult.get("$cp"); listProviders.add(cp); } if (listProviders.size() == 0) throw new EntityNotFoundException(); else return listProviders; } @Transactional public CloudProvider getBestCloudProvider(VDC vdc) throws EntityNotFoundException { // Create session, insert cloud providers and vdc. Run all and Query. StatelessKnowledgeSession ksession = kAgent .newStatelessKnowledgeSession(); List<Command> cmds = new ArrayList<Command>(); cmds.addAll(getCloudProvidersCommands()); cmds.addAll(getVDCCommands(vdc)); cmds.add(CommandFactory.newSetGlobal("LOGGER", LOGGER)); cmds.add(CommandFactory.newFireAllRules()); cmds.add(CommandFactory.newQuery("bestProvider", "Get Best Cloud Provider")); ExecutionResults results = ksession.execute(CommandFactory .newBatchExecution(cmds)); QueryResults qr = (QueryResults) results.getValue("bestProvider"); for (Iterator<?> it = qr.iterator(); it.hasNext();) { QueryResultsRow qResult = (QueryResultsRow) it.next(); CloudProvider cp = (CloudProvider) qResult.get("$cp"); return cp; } throw new EntityNotFoundException(); } private Collection<Command> getCloudProvidersCommands() { List<Command> cmds = new ArrayList<Command>(); List<CloudProvider> listCloudProviders = cloudProviderDao.findAll(); for (CloudProvider cp : listCloudProviders) { LOGGER.info("new cloud provider" + cp); cmds.add(CommandFactory.newInsert(cp)); for (VEE vee : cp.getVees()) { cmds.add(CommandFactory.newInsert(vee)); } } return cmds; } private Collection<Command> getVDCCommands(VDC vdc) { List<Command> cmds = new ArrayList<Command>(); cmds.add(CommandFactory.newInsert(vdc)); for (ServiceApplication sa : vdc.getServiceApplications()) { cmds.add(CommandFactory.newInsert(sa)); for (VEERequired vee : sa.getVeesRequired()) { cmds.add(CommandFactory.newInsert(vee)); } } return cmds; } /** * @return the cloudProviderDao */ public CloudProviderDao getCloudProviderDao() { return cloudProviderDao; } /** * @param cloudProviderDao the cloudProviderDao to set */ public void setCloudProviderDao(CloudProviderDao cloudProviderDao) { this.cloudProviderDao = cloudProviderDao; } /** * @return the kAgent */ public KnowledgeAgent getkAgent() { return kAgent; } /** * @param kAgent the kAgent to set */ public void setkAgent(KnowledgeAgent kAgent) { this.kAgent = kAgent; } }