jp.primecloud.auto.process.lb.LoadBalancerProcess.java Source code

Java tutorial

Introduction

Here is the source code for jp.primecloud.auto.process.lb.LoadBalancerProcess.java

Source

/*
 * 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.lb;

import java.util.List;

import org.apache.commons.lang.BooleanUtils;

import jp.primecloud.auto.common.component.DnsStrategy;
import jp.primecloud.auto.common.constant.PCCConstant;
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.LoadBalancer;
import jp.primecloud.auto.entity.crud.LoadBalancerInstance;
import jp.primecloud.auto.entity.crud.LoadBalancerListener;
import jp.primecloud.auto.exception.AutoException;
import jp.primecloud.auto.iaasgw.IaasGatewayFactory;
import jp.primecloud.auto.log.EventLogger;
import jp.primecloud.auto.process.ProcessLogger;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.util.MessageUtils;

/**
 * <p>
 * TODO: 
 * </p>
 *
 */
public class LoadBalancerProcess extends ServiceSupport {

    protected ComponentLoadBalancerProcess componentLoadBalancerProcess;

    protected ElasticLoadBalancerProcess elasticLoadBalancerProcess;

    protected IaasGatewayFactory iaasGatewayFactory;

    protected ProcessLogger processLogger;

    protected EventLogger eventLogger;

    protected DnsStrategy dnsStrategy;

    public void start(Long loadBalancerNo) {
        LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo);
        if (loadBalancer == null) {
            // ?????
            throw new AutoException("EPROCESS-000010", loadBalancerNo);
        }

        if (BooleanUtils.isNotTrue(loadBalancer.getEnabled())) {
            // ??????
            return;
        }

        LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus());
        if (status != LoadBalancerStatus.STOPPED && status != LoadBalancerStatus.RUNNING) {
            // ??????????
            if (log.isDebugEnabled()) {
                log.debug(MessageUtils.format("LoadBalancer {1} status is {2}.(loadBalancerNo={0})", loadBalancerNo,
                        loadBalancer.getLoadBalancerName(), status));
            }
            return;
        }

        if (log.isInfoEnabled()) {
            log.info(
                    MessageUtils.getMessage("IPROCESS-200001", loadBalancerNo, loadBalancer.getLoadBalancerName()));
        }

        // ?
        if (status == LoadBalancerStatus.RUNNING) {
            status = LoadBalancerStatus.CONFIGURING;
        } else {
            status = LoadBalancerStatus.STARTING;
        }
        loadBalancer.setStatus(status.toString());
        loadBalancerDao.update(loadBalancer);

        // 
        if (status == LoadBalancerStatus.STARTING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerStart",
                    new Object[] { loadBalancer.getLoadBalancerName() });
        } else if (status == LoadBalancerStatus.CONFIGURING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerReload",
                    new Object[] { loadBalancer.getLoadBalancerName() });
        }

        try {
            // ??
            startLoadBalancer(loadBalancer);

        } catch (RuntimeException e) {
            loadBalancer = loadBalancerDao.read(loadBalancerNo);
            status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus());

            // 
            if (status == LoadBalancerStatus.STARTING) {
                processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerStartFail",
                        new Object[] { loadBalancer.getLoadBalancerName() });
            } else if (status == LoadBalancerStatus.CONFIGURING) {
                processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerReloadFail",
                        new Object[] { loadBalancer.getLoadBalancerName() });
            }

            // ?
            loadBalancer = loadBalancerDao.read(loadBalancerNo);
            loadBalancer.setStatus(LoadBalancerStatus.WARNING.toString());
            loadBalancerDao.update(loadBalancer);

            throw e;
        }

        loadBalancer = loadBalancerDao.read(loadBalancerNo);
        status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus());

        // 
        if (status == LoadBalancerStatus.STARTING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerStartFinish",
                    new Object[] { loadBalancer.getLoadBalancerName() });
        } else if (status == LoadBalancerStatus.CONFIGURING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerReloadFinish",
                    new Object[] { loadBalancer.getLoadBalancerName() });
        }

        // ?
        loadBalancer = loadBalancerDao.read(loadBalancerNo);
        loadBalancer.setStatus(LoadBalancerStatus.RUNNING.toString());
        loadBalancerDao.update(loadBalancer);

        if (log.isInfoEnabled()) {
            log.info(
                    MessageUtils.getMessage("IPROCESS-200002", loadBalancerNo, loadBalancer.getLoadBalancerName()));
        }
    }

    public void stop(Long loadBalancerNo) {
        LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo);
        if (loadBalancer == null) {
            // ?????
            throw new AutoException("EPROCESS-000010", loadBalancerNo);
        }

        if (BooleanUtils.isTrue(loadBalancer.getEnabled())) {
            // ?????
            return;
        }

        LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus());
        if (status != LoadBalancerStatus.STOPPED && status != LoadBalancerStatus.RUNNING
                && status != LoadBalancerStatus.WARNING) {
            // ??????????
            if (log.isDebugEnabled()) {
                log.debug(MessageUtils.format("LoadBalancer {1} status is {2}.(loadBalancerNo={0})", loadBalancerNo,
                        loadBalancer.getLoadBalancerName(), status));
            }
            return;
        }

        if (log.isInfoEnabled()) {
            log.info(
                    MessageUtils.getMessage("IPROCESS-200003", loadBalancerNo, loadBalancer.getLoadBalancerName()));
        }

        // ?
        loadBalancer.setStatus(LoadBalancerStatus.STOPPING.toString());
        loadBalancerDao.update(loadBalancer);

        // 
        processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerStop",
                new Object[] { loadBalancer.getLoadBalancerName() });

        try {
            // ??
            stopLoadBalancer(loadBalancer);

        } catch (RuntimeException e) {
            log.warn(e.getMessage());
        }

        // 
        processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerStopFinish",
                new Object[] { loadBalancer.getLoadBalancerName() });

        // ?
        loadBalancer = loadBalancerDao.read(loadBalancerNo);
        loadBalancer.setStatus(LoadBalancerStatus.STOPPED.toString());
        loadBalancerDao.update(loadBalancer);

        // ??
        List<LoadBalancerListener> listeners = loadBalancerListenerDao.readByLoadBalancerNo(loadBalancerNo);
        for (LoadBalancerListener listener : listeners) {
            LoadBalancerListenerStatus status2 = LoadBalancerListenerStatus.fromStatus(listener.getStatus());
            if (status2 != LoadBalancerListenerStatus.STOPPED) {
                listener.setStatus(LoadBalancerListenerStatus.STOPPED.toString());
                loadBalancerListenerDao.update(listener);
            }
        }

        List<LoadBalancerInstance> lbInstances = loadBalancerInstanceDao.readByLoadBalancerNo(loadBalancerNo);
        for (LoadBalancerInstance lbInstance : lbInstances) {
            LoadBalancerInstanceStatus status2 = LoadBalancerInstanceStatus.fromStatus(lbInstance.getStatus());
            if (status2 != LoadBalancerInstanceStatus.STOPPED) {
                lbInstance.setStatus(LoadBalancerInstanceStatus.STOPPED.toString());
                loadBalancerInstanceDao.update(lbInstance);
            }
        }

        if (log.isInfoEnabled()) {
            log.info(
                    MessageUtils.getMessage("IPROCESS-200004", loadBalancerNo, loadBalancer.getLoadBalancerName()));
        }
    }

    public void configure(Long loadBalancerNo) {
        LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo);
        if (loadBalancer == null) {
            // ?????
            throw new AutoException("EPROCESS-000010", loadBalancerNo);
        }

        if (log.isInfoEnabled()) {
            log.info(
                    MessageUtils.getMessage("IPROCESS-200011", loadBalancerNo, loadBalancer.getLoadBalancerName()));
        }

        LoadBalancerStatus initStatus = LoadBalancerStatus.fromStatus(loadBalancer.getStatus());

        // ?
        if (BooleanUtils.isTrue(loadBalancer.getConfigure())) {
            loadBalancer.setStatus(LoadBalancerStatus.CONFIGURING.toString());
            loadBalancerDao.update(loadBalancer);
        }

        // 
        if (BooleanUtils.isTrue(loadBalancer.getConfigure())) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerConfig",
                    new Object[] { loadBalancer.getLoadBalancerName() });
        }

        try {
            // ??
            configureLoadBalancer(loadBalancer);

        } catch (RuntimeException e) {
            // 
            if (BooleanUtils.isTrue(loadBalancer.getConfigure())) {
                processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerConfigFail",
                        new Object[] { loadBalancer.getLoadBalancerName() });
            }

            // ?
            if (BooleanUtils.isTrue(loadBalancer.getConfigure())) {
                loadBalancer = loadBalancerDao.read(loadBalancerNo);
                loadBalancer.setStatus(initStatus.toString());
                loadBalancer.setConfigure(false);
                loadBalancerDao.update(loadBalancer);
            }

            // ?????
            if (BooleanUtils.isNotTrue(loadBalancer.getEnabled())) {
                log.warn(e.getMessage());
                return;
            }

            throw e;
        }

        // 
        if (BooleanUtils.isTrue(loadBalancer.getConfigure())) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, null, "LoadBalancerConfigFinish",
                    new Object[] { loadBalancer.getLoadBalancerName() });
        }

        // ?
        if (BooleanUtils.isTrue(loadBalancer.getConfigure())) {
            loadBalancer = loadBalancerDao.read(loadBalancerNo);
            loadBalancer.setStatus(initStatus.toString());
            loadBalancer.setConfigure(false);
            loadBalancerDao.update(loadBalancer);
        }

        if (log.isInfoEnabled()) {
            log.info(
                    MessageUtils.getMessage("IPROCESS-200012", loadBalancerNo, loadBalancer.getLoadBalancerName()));
        }
    }

    protected void startLoadBalancer(LoadBalancer loadBalancer) {
        String type = loadBalancer.getType();
        if (PCCConstant.LOAD_BALANCER_ULTRAMONKEY.equals(type)) {
            componentLoadBalancerProcess.start(loadBalancer.getLoadBalancerNo());
        } else if (PCCConstant.LOAD_BALANCER_ELB.equals(type)
                || PCCConstant.LOAD_BALANCER_CLOUDSTACK.equals(type)) {
            elasticLoadBalancerProcess.start(loadBalancer.getLoadBalancerNo());
        }
    }

    protected void stopLoadBalancer(LoadBalancer loadBalancer) {
        String type = loadBalancer.getType();
        if (PCCConstant.LOAD_BALANCER_ULTRAMONKEY.equals(type)) {
            componentLoadBalancerProcess.stop(loadBalancer.getLoadBalancerNo());
        } else if (PCCConstant.LOAD_BALANCER_ELB.equals(type)
                || PCCConstant.LOAD_BALANCER_CLOUDSTACK.equals(type)) {
            elasticLoadBalancerProcess.stop(loadBalancer.getLoadBalancerNo());
        }
    }

    protected void configureLoadBalancer(LoadBalancer loadBalancer) {
        String type = loadBalancer.getType();
        if (PCCConstant.LOAD_BALANCER_ULTRAMONKEY.equals(type)) {
            componentLoadBalancerProcess.configure(loadBalancer.getLoadBalancerNo());
        } else if (PCCConstant.LOAD_BALANCER_ELB.equals(type)
                || PCCConstant.LOAD_BALANCER_CLOUDSTACK.equals(type)) {
            elasticLoadBalancerProcess.configure(loadBalancer.getLoadBalancerNo());
        }
    }

    /**
     * dnsStrategy???
     *
     * @param dnsStrategy dnsStrategy
     */
    public void setDnsStrategy(DnsStrategy dnsStrategy) {
        this.dnsStrategy = dnsStrategy;
    }

    /**
     * componentLoadBalancerProcess???
     *
     * @param componentLoadBalancerProcess componentLoadBalancerProcess
     */
    public void setComponentLoadBalancerProcess(ComponentLoadBalancerProcess componentLoadBalancerProcess) {
        this.componentLoadBalancerProcess = componentLoadBalancerProcess;
    }

    /**
     * elasticLoadBalancerProcess???
     *
     * @param ElasticLoadBalancerProcess elasticLoadBalancerProcess
     */
    public void setElasticLoadBalancerProcess(ElasticLoadBalancerProcess elasticLoadBalancerProcess) {
        this.elasticLoadBalancerProcess = elasticLoadBalancerProcess;
    }

    /**
     * iaasGatewayFactory???
     *
     * @param iaasGatewayFactory iaasGatewayFactory
     */
    public void setIaasGatewayFactory(IaasGatewayFactory iaasGatewayFactory) {
        this.iaasGatewayFactory = iaasGatewayFactory;
    }

    /**
     * eventLogger???
     *
     * @param eventLogger eventLogger
     */
    public void setEventLogger(EventLogger eventLogger) {
        this.eventLogger = eventLogger;
    }

    /**
     * processLogger???
     *
     * @param processLogger processLogger
     */
    public void setProcessLogger(ProcessLogger processLogger) {
        this.processLogger = processLogger;
    }

}