package org.openstack.atlas.jobs; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openstack.atlas.adapter.LoadBalancerEndpointConfiguration; import org.openstack.atlas.adapter.service.ReverseProxyLoadBalancerAdapter; import org.openstack.atlas.adapter.service.ReverseProxyLoadBalancerStmAdapter; import org.openstack.atlas.service.domain.entities.Cluster; import org.openstack.atlas.service.domain.entities.Host; import org.openstack.atlas.service.domain.entities.JobName; import org.openstack.atlas.service.domain.events.entities.Alert; import org.openstack.atlas.service.domain.repository.HostRepository; import org.openstack.atlas.service.domain.services.helpers.AlertHelper; import org.openstack.atlas.service.domain.services.helpers.AlertType; import org.openstack.atlas.util.crypto.CryptoUtil; import org.openstack.atlas.util.crypto.exception.DecryptException; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.net.MalformedURLException; import java.util.List; @Component public class HostEndpointPollerJob extends AbstractJob { private final Log LOG = LogFactory.getLog(HostEndpointPollerJob.class); @Autowired private ReverseProxyLoadBalancerAdapter reverseProxyLoadBalancerAdapter; @Autowired private ReverseProxyLoadBalancerStmAdapter reverseProxyLoadBalancerStmAdapter; @Autowired private HostRepository hostRepository; @Override public Log getLogger() { return LOG; } @Override public JobName getJobName() { return JobName.HOST_ENDPOINT_POLLER; } @Override public void setup(JobExecutionContext jobExecutionContext) throws JobExecutionException { } //TODO: refactor to use the async service... @Override public void run() throws Exception { try { boolean endpointWorks; boolean restEndpointWorks; List<Host> hosts = hostRepository.getAll(); for (Host host : hosts) { endpointWorks = reverseProxyLoadBalancerAdapter.isEndPointWorking(getConfigHost(host)); if (endpointWorks) { host.setSoapEndpointActive(Boolean.TRUE); LOG.info("Host: " + host.getId() + " is active"); } else { host.setSoapEndpointActive(Boolean.FALSE); LOG.info("Host: " + host.getId() + " is inactive"); } //TODO: Uncomment when using REST interface, important!!!! // restEndpointWorks = reverseProxyLoadBalancerStmAdapter.isEndPointWorking(getConfigHost(host)); // if (restEndpointWorks) { // host.setRestEndpointActive(Boolean.TRUE); // LOG.info("Host: " + host.getId() + " Rest Endpoint is active"); // } else { // host.setRestEndpointActive(Boolean.FALSE); // LOG.info("Host: " + host.getId() + " Rest Endpoint is inactive"); // } LOG.info("Host: " + host.getId() + " is being updated in the database."); hostRepository.update(host); LOG.info("Finished updating host: " + host.getId() + " in the database."); } } catch (Exception e) { Alert alert = AlertHelper.createAlert(null, null, e, AlertType.API_FAILURE.name(), "HostEndpointPoller Failure, check Alerts for more information... "); alertRepository.save(alert); throw e; } } @Override public void cleanup() { } //TODO: refactor to use service/null adapter public LoadBalancerEndpointConfiguration getConfigHost(Host host) throws DecryptException, MalformedURLException { Cluster cluster = host.getCluster(); List<String> failoverHostNames = hostRepository.getFailoverHostNames(cluster.getId()); List<Host> failoverHosts = hostRepository.getFailoverHosts(cluster.getId()); return new LoadBalancerEndpointConfiguration(host, cluster.getUsername(), CryptoUtil.decrypt(cluster.getPassword()), host, failoverHostNames, failoverHosts); } }