Java tutorial
/* * Copyright 2014 by SCSK Corporation. * * This file is part of PrimeCloud Controller(TM). * * PrimeCloud Controller(TM) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * PrimeCloud Controller(TM) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PrimeCloud Controller(TM). If not, see <http://www.gnu.org/licenses/>. */ package jp.primecloud.auto.process; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import jp.primecloud.auto.common.log.LoggingUtils; import jp.primecloud.auto.common.status.ComponentInstanceStatus; import jp.primecloud.auto.common.status.InstanceCoodinateStatus; import jp.primecloud.auto.common.status.InstanceStatus; import jp.primecloud.auto.common.status.LoadBalancerInstanceStatus; import jp.primecloud.auto.common.status.LoadBalancerListenerStatus; import jp.primecloud.auto.common.status.LoadBalancerStatus; import jp.primecloud.auto.entity.crud.ComponentInstance; import jp.primecloud.auto.entity.crud.Farm; import jp.primecloud.auto.entity.crud.Instance; import jp.primecloud.auto.entity.crud.LoadBalancer; import jp.primecloud.auto.entity.crud.LoadBalancerInstance; import jp.primecloud.auto.entity.crud.LoadBalancerListener; import jp.primecloud.auto.entity.crud.User; import jp.primecloud.auto.exception.MultiCauseException; import jp.primecloud.auto.log.EventLogger; import jp.primecloud.auto.service.ServiceSupport; import org.apache.commons.lang.BooleanUtils; import jp.primecloud.auto.process.lb.LoadBalancerProcess; /** * <p> * TODO: * </p> * */ public class ProcessManager extends ServiceSupport { protected InstanceProcess instanceProcess; protected ComponentProcess componentProcess; protected InstancesProcess instancesProcess; protected LoadBalancerProcess loadBalancerProcess; protected ExecutorService executorService; protected EventLogger eventLogger; public void process() { // ??? List<Farm> farms = new ArrayList<Farm>(); List<Farm> allFarms = farmDao.readAll(); for (Farm farm : allFarms) { if (BooleanUtils.isTrue(farm.getScheduled())) { farms.add(farm); } } List<Long> farmNos = new ArrayList<Long>(); for (Farm farm : farms) { farmNos.add(farm.getFarmNo()); } log.debug("farmNos: " + farmNos); if (farms.isEmpty()) { return; } for (Farm farm : farms) { // TODO: ?????? processFarm(farm); } } protected void processFarm(Farm farm) { // ???? boolean next = processStartInstance(farm); boolean next2 = processStartLoadBalancer(farm); if (!next || !next2) { return; } // ??? next = processStartInstances(farm); if (!next) { return; } // ???? next = processConfigureComponent(farm); if (!next) { return; } // ???? next = processStopInstances(farm); if (!next) { return; } // ????? next = processStopInstance(farm); next2 = processStopLoadBalancer(farm); if (!next || !next2) { return; } // ??? unscheduled(farm.getFarmNo()); } protected void unscheduled(Long farmNo) { Farm farm = farmDao.read(farmNo); if (BooleanUtils.isTrue(farm.getScheduled())) { farm.setScheduled(false); farmDao.update(farm); } } protected boolean processStartInstance(final Farm farm) { // ?? List<Instance> instances = new ArrayList<Instance>(); List<Instance> allInstances = instanceDao.readByFarmNo(farm.getFarmNo()); for (Instance instance : allInstances) { // ?? if (BooleanUtils.isTrue(instance.getLoadBalancer())) { continue; } if (BooleanUtils.isTrue(instance.getEnabled())) { instances.add(instance); } } // ???? if (instances.isEmpty()) { return true; } // ?? boolean processing = false; List<Long> targetInstanceNos = new ArrayList<Long>(); for (Instance instance : instances) { InstanceStatus status = InstanceStatus.fromStatus(instance.getStatus()); if (status != InstanceStatus.RUNNING && status != InstanceStatus.WARNING) { processing = true; if (status == InstanceStatus.STOPPED) { targetInstanceNos.add(instance.getInstanceNo()); } } } // ????? if (!targetInstanceNos.isEmpty()) { final User user = userDao.read(farm.getUserNo()); for (final Long instanceNo : targetInstanceNos) { Runnable runnable = new Runnable() { @Override public void run() { LoggingUtils.setUserNo(user.getMasterUser()); LoggingUtils.setUserName(user.getUsername()); LoggingUtils.setFarmNo(farm.getFarmNo()); LoggingUtils.setFarmName(farm.getFarmName()); LoggingUtils.setLoginUserNo(user.getUserNo()); try { instanceProcess.start(instanceNo); } catch (MultiCauseException ignore) { } catch (Throwable e) { log.error(e.getMessage(), e); // eventLogger.error("SystemError", new Object[] { e.getMessage() }); } finally { LoggingUtils.removeContext(); } } }; executorService.execute(runnable); } } // ????? if (processing) { return false; } return true; } protected boolean processStartInstances(final Farm farm) { // ?????? if (BooleanUtils.isTrue(farm.getComponentProcessing())) { return false; } // ?????????????????????? boolean coodinated = true; List<Instance> allInstances = instanceDao.readByFarmNo(farm.getFarmNo()); for (Instance instance : allInstances) { if (InstanceStatus.fromStatus(instance.getStatus()) == InstanceStatus.RUNNING) { if (BooleanUtils.isTrue(instance.getEnabled())) { if (InstanceCoodinateStatus .fromStatus(instance.getCoodinateStatus()) == InstanceCoodinateStatus.UN_COODINATED) { coodinated = false; break; } } } } // ???????????? if (!coodinated) { final User user = userDao.read(farm.getUserNo()); Runnable runnable = new Runnable() { @Override public void run() { LoggingUtils.setUserNo(user.getMasterUser()); LoggingUtils.setUserName(user.getUsername()); LoggingUtils.setFarmNo(farm.getFarmNo()); LoggingUtils.setFarmName(farm.getFarmName()); LoggingUtils.setLoginUserNo(user.getUserNo()); try { instancesProcess.start(farm.getFarmNo()); } catch (MultiCauseException ignore) { } catch (Throwable e) { log.error(e.getMessage(), e); // eventLogger.error("SystemError", new Object[] { e.getMessage() }); } finally { LoggingUtils.removeContext(); } } }; executorService.execute(runnable); } return coodinated; } protected boolean processConfigureComponent(final Farm farm) { // ?????? if (BooleanUtils.isTrue(farm.getComponentProcessing())) { return false; } boolean configured = true; // ?Instance?ComponentInstnace?? List<Instance> instances = instanceDao.readByFarmNo(farm.getFarmNo()); List<Long> instanceNos = new ArrayList<Long>(); for (Instance instance : instances) { // ?? if (BooleanUtils.isTrue(instance.getLoadBalancer())) { continue; } if (InstanceStatus.fromStatus(instance.getStatus()) == InstanceStatus.RUNNING) { instanceNos.add(instance.getInstanceNo()); } } List<ComponentInstance> componentInstances = componentInstanceDao.readInInstanceNos(instanceNos); // ComponentInstance???????? for (ComponentInstance componentInstance : componentInstances) { ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus()); if (BooleanUtils.isTrue(componentInstance.getEnabled())) { if (status == ComponentInstanceStatus.WARNING) { // ????????? unscheduled(farm.getFarmNo()); return false; } else if (status != ComponentInstanceStatus.RUNNING) { configured = false; } } else { if (status != ComponentInstanceStatus.STOPPED) { configured = false; } } } // ??? List<LoadBalancer> loadBalancers = null; List<LoadBalancerListener> listeners = null; List<LoadBalancerInstance> lbInstances = null; Map<Long, LoadBalancer> loadBalancerMap = null; Map<Long, Instance> instanceMap = null; if (configured) { loadBalancers = loadBalancerDao.readByFarmNo(farm.getFarmNo()); loadBalancerMap = new HashMap<Long, LoadBalancer>(); for (LoadBalancer loadBalancer : loadBalancers) { loadBalancerMap.put(loadBalancer.getLoadBalancerNo(), loadBalancer); } listeners = loadBalancerListenerDao.readInLoadBalancerNos(loadBalancerMap.keySet()); lbInstances = loadBalancerInstanceDao.readInLoadBalancerNos(loadBalancerMap.keySet()); instanceMap = new HashMap<Long, Instance>(); for (Instance instance : instances) { instanceMap.put(instance.getInstanceNo(), instance); } } // ???????? if (configured) { for (LoadBalancerListener listener : listeners) { LoadBalancer loadBalancer = loadBalancerMap.get(listener.getLoadBalancerNo()); LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus()); LoadBalancerListenerStatus status2 = LoadBalancerListenerStatus.fromStatus(listener.getStatus()); if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { if (status == LoadBalancerStatus.RUNNING) { // ????? if (BooleanUtils.isTrue(listener.getEnabled())) { if (status2 == LoadBalancerListenerStatus.WARNING) { // ??????? unscheduled(farm.getFarmNo()); return false; } else if (status2 != LoadBalancerListenerStatus.RUNNING) { configured = false; } } else { if (status2 != LoadBalancerListenerStatus.STOPPED) { configured = false; } } } } else { if (status == LoadBalancerStatus.RUNNING || status == LoadBalancerStatus.WARNING) { // ???????? if (status2 != LoadBalancerListenerStatus.STOPPED) { configured = false; } } } } } // ???????? if (configured) { for (LoadBalancerInstance lbInstance : lbInstances) { LoadBalancer loadBalancer = loadBalancerMap.get(lbInstance.getLoadBalancerNo()); LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus()); LoadBalancerInstanceStatus status2 = LoadBalancerInstanceStatus.fromStatus(lbInstance.getStatus()); Instance instance = instanceMap.get(lbInstance.getInstanceNo()); InstanceStatus instanceStatus = InstanceStatus.fromStatus(instance.getStatus()); // ??????? if (instanceStatus == InstanceStatus.RUNNING) { if (BooleanUtils.isTrue(loadBalancer.getEnabled()) && BooleanUtils.isTrue(instance.getEnabled())) { if (status == LoadBalancerStatus.RUNNING) { // ????????? if (BooleanUtils.isTrue(lbInstance.getEnabled())) { if (status2 == LoadBalancerInstanceStatus.WARNING) { // ???????? unscheduled(farm.getFarmNo()); return false; } else if (status2 != LoadBalancerInstanceStatus.RUNNING) { configured = false; } } else { if (status2 != LoadBalancerInstanceStatus.STOPPED) { configured = false; } } } } else { if (status == LoadBalancerStatus.RUNNING || status == LoadBalancerStatus.WARNING) { // ?????????????? if (status2 != LoadBalancerInstanceStatus.STOPPED) { configured = false; } } } } } } // ????????? if (configured) { for (ComponentInstance componentInstance : componentInstances) { if (BooleanUtils.isTrue(componentInstance.getConfigure())) { configured = false; break; } } } // ???????? if (configured) { for (LoadBalancer loadBalancer : loadBalancers) { if (BooleanUtils.isTrue(loadBalancer.getConfigure())) { LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus()); if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { if (status == LoadBalancerStatus.RUNNING) { configured = false; break; } } else { if (status == LoadBalancerStatus.RUNNING || status == LoadBalancerStatus.WARNING) { configured = false; break; } } } } } // ???????? if (configured) { for (LoadBalancerListener listener : listeners) { if (BooleanUtils.isTrue(listener.getConfigure())) { LoadBalancer loadBalancer = loadBalancerMap.get(listener.getLoadBalancerNo()); LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus()); if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { if (status == LoadBalancerStatus.RUNNING) { configured = false; break; } } else { if (status == LoadBalancerStatus.RUNNING || status == LoadBalancerStatus.WARNING) { configured = false; break; } } } } } // ?????????? if (!configured) { final User user = userDao.read(farm.getUserNo()); Runnable runnable = new Runnable() { @Override public void run() { LoggingUtils.setUserNo(user.getMasterUser()); LoggingUtils.setUserName(user.getUsername()); LoggingUtils.setFarmNo(farm.getFarmNo()); LoggingUtils.setFarmName(farm.getFarmName()); LoggingUtils.setLoginUserNo(user.getUserNo()); try { componentProcess.configure(farm.getFarmNo()); } catch (MultiCauseException ignore) { } catch (Throwable e) { log.error(e.getMessage(), e); // eventLogger.error("SystemError", new Object[] { e.getMessage() }); } finally { LoggingUtils.removeContext(); } } }; executorService.execute(runnable); } return configured; } protected boolean processStopInstances(final Farm farm) { // ?????? if (BooleanUtils.isTrue(farm.getComponentProcessing())) { return false; } // ???????????????????? boolean coodinated = false; List<Instance> allInstances = instanceDao.readByFarmNo(farm.getFarmNo()); for (Instance instance : allInstances) { if (InstanceStatus.fromStatus(instance.getStatus()) == InstanceStatus.RUNNING) { if (BooleanUtils.isNotTrue(instance.getEnabled())) { if (InstanceCoodinateStatus .fromStatus(instance.getCoodinateStatus()) == InstanceCoodinateStatus.COODINATED) { coodinated = true; break; } } } } // ??????????????? if (coodinated) { final User user = userDao.read(farm.getUserNo()); Runnable runnable = new Runnable() { @Override public void run() { LoggingUtils.setUserNo(user.getMasterUser()); LoggingUtils.setUserName(user.getUsername()); LoggingUtils.setFarmNo(farm.getFarmNo()); LoggingUtils.setFarmName(farm.getFarmName()); LoggingUtils.setLoginUserNo(user.getUserNo()); try { instancesProcess.stop(farm.getFarmNo()); } catch (MultiCauseException ignore) { } catch (Throwable e) { log.error(e.getMessage(), e); // eventLogger.error("SystemError", new Object[] { e.getMessage() }); } finally { LoggingUtils.removeContext(); } } }; executorService.execute(runnable); } return !coodinated; } protected boolean processStopInstance(final Farm farm) { // ?? List<Instance> instances = new ArrayList<Instance>(); List<Instance> allInstances = instanceDao.readByFarmNo(farm.getFarmNo()); for (Instance instance : allInstances) { // ?? if (BooleanUtils.isTrue(instance.getLoadBalancer())) { continue; } if (BooleanUtils.isNotTrue(instance.getEnabled())) { instances.add(instance); } } // ???? if (instances.isEmpty()) { return true; } // ?? boolean processing = false; List<Long> targetInstanceNos = new ArrayList<Long>(); for (Instance instance : instances) { InstanceStatus status = InstanceStatus.fromStatus(instance.getStatus()); if (status != InstanceStatus.STOPPED) { processing = true; if (status == InstanceStatus.RUNNING || status == InstanceStatus.WARNING) { targetInstanceNos.add(instance.getInstanceNo()); } } } // ????? if (!targetInstanceNos.isEmpty()) { final User user = userDao.read(farm.getUserNo()); for (final Long instanceNo : targetInstanceNos) { Runnable runnable = new Runnable() { @Override public void run() { LoggingUtils.setUserNo(user.getMasterUser()); LoggingUtils.setUserName(user.getUsername()); LoggingUtils.setFarmNo(farm.getFarmNo()); LoggingUtils.setFarmName(farm.getFarmName()); LoggingUtils.setLoginUserNo(user.getUserNo()); try { log.debug("instanceProcess.stop(instanceNo):" + String.valueOf(instanceNo)); instanceProcess.stop(instanceNo); } catch (MultiCauseException ignore) { } catch (Throwable e) { log.error(e.getMessage(), e); // eventLogger.error("SystemError", new Object[] { e.getMessage() }); } finally { LoggingUtils.removeContext(); } } }; executorService.execute(runnable); } } // ????? if (processing) { return false; } return true; } protected boolean processStartLoadBalancer(final Farm farm) { // ??? List<LoadBalancer> loadBalancers = new ArrayList<LoadBalancer>(); List<LoadBalancer> allLoadBalancers = loadBalancerDao.readByFarmNo(farm.getFarmNo()); for (LoadBalancer loadBalancer : allLoadBalancers) { if (BooleanUtils.isTrue(loadBalancer.getEnabled())) { loadBalancers.add(loadBalancer); } } // ?????? if (loadBalancers.isEmpty()) { return true; } // ??? boolean processing = false; List<Long> targetLoadBalancerNos = new ArrayList<Long>(); for (LoadBalancer loadBalancer : loadBalancers) { LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus()); if (status != LoadBalancerStatus.RUNNING && status != LoadBalancerStatus.WARNING) { processing = true; if (status == LoadBalancerStatus.STOPPED) { targetLoadBalancerNos.add(loadBalancer.getLoadBalancerNo()); } } } // ?????? if (!targetLoadBalancerNos.isEmpty()) { final User user = userDao.read(farm.getUserNo()); for (final Long loadBalancerNo : targetLoadBalancerNos) { Runnable runnable = new Runnable() { @Override public void run() { LoggingUtils.setUserNo(user.getMasterUser()); LoggingUtils.setUserName(user.getUsername()); LoggingUtils.setFarmNo(farm.getFarmNo()); LoggingUtils.setFarmName(farm.getFarmName()); LoggingUtils.setLoginUserNo(user.getUserNo()); try { loadBalancerProcess.start(loadBalancerNo); } catch (MultiCauseException ignore) { } catch (Throwable e) { log.error(e.getMessage(), e); // eventLogger.error("SystemError", new Object[] { e.getMessage() }); } finally { LoggingUtils.removeContext(); } } }; executorService.execute(runnable); } } // ?????? if (processing) { return false; } return true; } protected boolean processStopLoadBalancer(final Farm farm) { // ??? List<LoadBalancer> loadBalancers = new ArrayList<LoadBalancer>(); List<LoadBalancer> allLoadBalancers = loadBalancerDao.readByFarmNo(farm.getFarmNo()); for (LoadBalancer loadBalancer : allLoadBalancers) { if (BooleanUtils.isNotTrue(loadBalancer.getEnabled())) { loadBalancers.add(loadBalancer); } } // ????? if (loadBalancers.isEmpty()) { return true; } // ??? boolean processing = false; List<Long> targetLoadBalancerNos = new ArrayList<Long>(); for (LoadBalancer loadBalancer : loadBalancers) { LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus()); if (status != LoadBalancerStatus.STOPPED) { processing = true; if (status == LoadBalancerStatus.RUNNING || status == LoadBalancerStatus.WARNING) { targetLoadBalancerNos.add(loadBalancer.getLoadBalancerNo()); } } } // ?????? if (!targetLoadBalancerNos.isEmpty()) { final User user = userDao.read(farm.getUserNo()); for (final Long loadBalancerNo : targetLoadBalancerNos) { Runnable runnable = new Runnable() { @Override public void run() { LoggingUtils.setUserNo(user.getMasterUser()); LoggingUtils.setUserName(user.getUsername()); LoggingUtils.setFarmNo(farm.getFarmNo()); LoggingUtils.setFarmName(farm.getFarmName()); LoggingUtils.setLoginUserNo(user.getUserNo()); try { loadBalancerProcess.stop(loadBalancerNo); } catch (MultiCauseException ignore) { } catch (Throwable e) { log.error(e.getMessage(), e); // eventLogger.error("SystemError", new Object[] { e.getMessage() }); } finally { LoggingUtils.removeContext(); } } }; executorService.execute(runnable); } } // ????? if (processing) { return false; } return true; } /** * instanceProcess??? * * @param instanceProcess instanceProcess */ public void setInstanceProcess(InstanceProcess instanceProcess) { this.instanceProcess = instanceProcess; } /** * componentProcess??? * * @param componentProcess componentProcess */ public void setComponentProcess(ComponentProcess componentProcess) { this.componentProcess = componentProcess; } /** * instancesProcess??? * * @param instancesProcess instancesProcess */ public void setInstancesProcess(InstancesProcess instancesProcess) { this.instancesProcess = instancesProcess; } /** * loadBalancerProcess??? * * @param loadBalancerProcess loadBalancerProcess */ public void setLoadBalancerProcess(LoadBalancerProcess loadBalancerProcess) { this.loadBalancerProcess = loadBalancerProcess; } /** * executorService??? * * @param executorService executorService */ public void setExecutorService(ExecutorService executorService) { this.executorService = executorService; } /** * eventLogger??? * * @param eventLogger eventLogger */ public void setEventLogger(EventLogger eventLogger) { this.eventLogger = eventLogger; } }