jp.primecloud.auto.process.InstanceProcess.java Source code

Java tutorial

Introduction

Here is the source code for jp.primecloud.auto.process.InstanceProcess.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;

import java.util.List;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;

import jp.primecloud.auto.common.constant.PCCConstant;
import jp.primecloud.auto.common.log.LoggingUtils;
import jp.primecloud.auto.common.status.InstanceCoodinateStatus;
import jp.primecloud.auto.common.status.InstanceStatus;
import jp.primecloud.auto.entity.crud.AwsInstance;
import jp.primecloud.auto.entity.crud.Farm;
import jp.primecloud.auto.entity.crud.Image;
import jp.primecloud.auto.entity.crud.ImageAws;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.entity.crud.Platform;
import jp.primecloud.auto.exception.AutoException;
import jp.primecloud.auto.iaasgw.IaasGatewayFactory;
import jp.primecloud.auto.iaasgw.IaasGatewayWrapper;
import jp.primecloud.auto.log.EventLogger;
import jp.primecloud.auto.process.nifty.NiftyProcess;
import jp.primecloud.auto.process.puppet.PuppetNodeProcess;
import jp.primecloud.auto.process.vmware.VmwareProcess;
import jp.primecloud.auto.process.zabbix.ZabbixHostProcess;
import jp.primecloud.auto.puppet.PuppetClient;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.util.MessageUtils;

/**
 * <p>
 * ????
 * </p>
 *
 */
public class InstanceProcess extends ServiceSupport {

    protected IaasGatewayFactory iaasGatewayFactory;

    protected VmwareProcess vmwareProcess;

    protected NiftyProcess niftyProcess;

    protected PuppetNodeProcess puppetNodeProcess;

    protected ZabbixHostProcess zabbixHostProcess;

    protected DnsProcess dnsProcess;

    protected ProcessLogger processLogger;

    protected EventLogger eventLogger;

    protected PuppetClient puppetClient;

    public void start(Long instanceNo) {
        Instance instance = instanceDao.read(instanceNo);
        if (instance == null) {
            // ????
            throw new AutoException("EPROCESS-000002", instanceNo);
        }

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

        //??
        Farm farm = farmDao.read(instance.getFarmNo());

        // ?
        LoggingUtils.setInstanceNo(instanceNo);
        LoggingUtils.setInstanceName(instance.getInstanceName());
        LoggingUtils.setInstanceType(processLogger.getInstanceType(instanceNo));
        LoggingUtils.setPlatformNo(instance.getPlatformNo());

        InstanceStatus status = InstanceStatus.fromStatus(instance.getStatus());
        if (status != InstanceStatus.STOPPED && status != InstanceStatus.RUNNING) {
            // ??????????
            if (log.isDebugEnabled()) {
                log.debug(MessageUtils.format("Instance {1} status is {2}.(instanceNo={0})", instanceNo,
                        instance.getInstanceName(), status));
            }
            return;
        }

        if (log.isInfoEnabled()) {
            log.info(MessageUtils.getMessage("IPROCESS-100001", instanceNo, instance.getInstanceName()));
        }

        // ???
        if (status == InstanceStatus.RUNNING) {
            status = InstanceStatus.CONFIGURING;
        } else {
            status = InstanceStatus.STARTING;
        }
        instance.setStatus(status.toString());
        instanceDao.update(instance);

        // 
        if (status == InstanceStatus.STARTING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceStart", null);
        } else if (status == InstanceStatus.CONFIGURING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceReload", null);
        }

        Platform platform = platformDao.read(instance.getPlatformNo());
        Image image = imageDao.read(instance.getImageNo());
        try {

            //?? AWS????
            if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
                AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
                // ???EBS?ID????
                ImageAws imageAws = imageAwsDao.read(image.getImageNo());
                if (!imageAws.getEbsImage() || StringUtils.isEmpty(awsInstance.getInstanceId())) {
                    // ID????Puppet??
                    if (StringUtils.isEmpty(awsInstance.getInstanceId())) {
                        clearPuppetCa(instanceNo);
                    }
                    // EBS?ID???
                } else {
                    // ?????Puppet??
                    if (StringUtils.equals(awsInstance.getStatus(), "stopped")) {
                        clearPuppetCa(instanceNo);
                    }
                }
            }

            // ?
            // TODO CLOUD BRANCHING
            if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
                //IaasGateway
                IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
                        instance.getPlatformNo());
                gateway.startInstance(instanceNo);
            } else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
                //**********************************TODO IaasGateway?????

                // VMware??
                vmwareProcess.start(instanceNo);
            } else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
                //**********************************TODO IaasGateway?????
                // Nifty??
                niftyProcess.start(instanceNo);
            }

            //? AWS or CloudStack or VCloud or Azure????
            // TODO CLOUD BRANCHING
            if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
                // DNS???
                dnsProcess.startDns(platform, instanceNo);
            }

            // ???
            instance = instanceDao.read(instanceNo);
            instanceDao.update(instance);

            // ??
            if (puppetInstanceDao.countByInstanceNo(instanceNo) > 0) {
                puppetNodeProcess.startNode(instanceNo);
            }

            // ???
            instance = instanceDao.read(instanceNo);
            instanceDao.update(instance);

            // ?
            if (zabbixInstanceDao.countByInstanceNo(instanceNo) > 0) {
                zabbixHostProcess.startHost(instanceNo);
            }

        } catch (RuntimeException e) {
            instance = instanceDao.read(instanceNo);
            status = InstanceStatus.fromStatus(instance.getStatus());

            // 
            if (status == InstanceStatus.STARTING) {
                processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceStartFail", null);
            } else if (status == InstanceStatus.CONFIGURING) {
                processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceReloadFail", null);
            }

            // ?
            instance.setStatus(InstanceStatus.WARNING.toString());
            instanceDao.update(instance);

            throw e;
        }

        instance = instanceDao.read(instanceNo);
        status = InstanceStatus.fromStatus(instance.getStatus());

        // 
        if (status == InstanceStatus.STARTING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceStartFinish", null);
        } else if (status == InstanceStatus.CONFIGURING) {
            processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceReloadFinish", null);
        }

        // ???
        instance.setStatus(InstanceStatus.RUNNING.toString());
        instanceDao.update(instance);

        if (log.isInfoEnabled()) {
            log.info(MessageUtils.getMessage("IPROCESS-100002", instanceNo, instance.getInstanceName()));
        }
    }

    public void stop(Long instanceNo) {
        Instance instance = instanceDao.read(instanceNo);
        if (instance == null) {
            // ????
            throw new AutoException("EPROCESS-000002", instanceNo);
        }

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

        //??
        Farm farm = farmDao.read(instance.getFarmNo());

        // ?
        LoggingUtils.setInstanceNo(instanceNo);
        LoggingUtils.setInstanceName(instance.getInstanceName());
        LoggingUtils.setInstanceType(processLogger.getInstanceType(instanceNo));
        LoggingUtils.setPlatformNo(instance.getPlatformNo());

        InstanceStatus status = InstanceStatus.fromStatus(instance.getStatus());
        if (status != InstanceStatus.STOPPED && status != InstanceStatus.RUNNING
                && status != InstanceStatus.WARNING) {
            // ??????????
            if (log.isDebugEnabled()) {
                log.debug(MessageUtils.format("Instance {1} status is {2}.(instanceNo={0})", instanceNo,
                        instance.getInstanceName(), status));
            }
            return;
        }

        if (log.isInfoEnabled()) {
            log.info(MessageUtils.getMessage("IPROCESS-100003", instanceNo, instance.getInstanceName()));
        }

        // ???
        instance.setStatus(InstanceStatus.STOPPING.toString());
        instanceDao.update(instance);

        // 
        processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceStop", null);

        try {
            // ?
            if (zabbixInstanceDao.countByInstanceNo(instanceNo) > 0) {
                zabbixHostProcess.stopHost(instanceNo);
            }
        } catch (RuntimeException e) {
            log.warn(e.getMessage());
        }

        // ???
        instance = instanceDao.read(instanceNo);
        instanceDao.update(instance);

        try {
            // ?
            if (puppetInstanceDao.countByInstanceNo(instanceNo) > 0) {
                puppetNodeProcess.stopNode(instanceNo);
            }
        } catch (RuntimeException e) {
            log.warn(e.getMessage());
        }

        // ???
        instance = instanceDao.read(instanceNo);
        instanceDao.update(instance);
        Platform platform = platformDao.read(instance.getPlatformNo());

        try {

            //?? AWS or Cloudstack or VCloud????
            // TODO CLOUD BRANCHING
            if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
                // DNS???
                dnsProcess.stopDns(platform, instanceNo);
            }

            // ??
            // TODO CLOUD BRANCHING
            if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())
                    || PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
                // IaasGateway
                IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
                        instance.getPlatformNo());
                gateway.stopInstance(instanceNo);

            } else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
                //**********************************TODO IaasGateway?????
                // VMware??
                vmwareProcess.stop(instanceNo);
            } else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
                //**********************************TODO IaasGateway?????
                // Nifty??
                niftyProcess.stop(instanceNo);
            }

        } catch (RuntimeException e) {
            instance = instanceDao.read(instanceNo);
            status = InstanceStatus.fromStatus(instance.getStatus());

            // 
            if (status == InstanceStatus.STOPPING) {
                processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceStopFail", null);
            } else if (status == InstanceStatus.CONFIGURING) {
                processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceReloadFail", null);
            }

            // ?
            instance.setStatus(InstanceStatus.WARNING.toString());
            instance.setEnabled(true);
            instanceDao.update(instance);

            throw e;
        }

        // 
        processLogger.writeLogSupport(ProcessLogger.LOG_INFO, null, instance, "InstanceStopFinish", null);

        // ???
        instance = instanceDao.read(instanceNo);
        instance.setStatus(InstanceStatus.STOPPED.toString());
        //??Warning????????Warning??????????????
        if (InstanceCoodinateStatus.fromStatus(instance.getCoodinateStatus()) == InstanceCoodinateStatus.WARNING) {
            instance.setCoodinateStatus(InstanceCoodinateStatus.UN_COODINATED.toString());
        }
        instanceDao.update(instance);

        if (log.isInfoEnabled()) {
            log.info(MessageUtils.getMessage("IPROCESS-100004", instanceNo, instance.getInstanceName()));
        }
    }

    protected void clearPuppetCa(Long instanceNo) {
        List<String> clients = puppetClient.listClients();

        Instance instance = instanceDao.read(instanceNo);
        String fqdn = instance.getFqdn();

        if (clients.contains(fqdn)) {
            puppetClient.clearCa(fqdn);
        }
    }

    public void setPuppetClient(PuppetClient puppetClient) {
        this.puppetClient = puppetClient;
    }

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

    /**
     * vmwareProcess???
     *
     * @param vmwareProcess vmwareProcess
     */
    public void setVmwareProcess(VmwareProcess vmwareProcess) {
        this.vmwareProcess = vmwareProcess;
    }

    /**
     * niftyProcess???
     *
     * @param niftyProcess niftyProcess
     */
    public void setNiftyProcess(NiftyProcess niftyProcess) {
        this.niftyProcess = niftyProcess;
    }

    /**
     * puppetNodeProcess???
     *
     * @param puppetNodeProcess puppetNodeProcess
     */
    public void setPuppetNodeProcess(PuppetNodeProcess puppetNodeProcess) {
        this.puppetNodeProcess = puppetNodeProcess;
    }

    /**
     * zabbixHostProcess???
     *
     * @param zabbixHostProcess zabbixHostProcess
     */
    public void setZabbixHostProcess(ZabbixHostProcess zabbixHostProcess) {
        this.zabbixHostProcess = zabbixHostProcess;
    }

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

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

    /**
     * dnsProcess???
     *
     * @param dnsProcess dnsProcess
     */
    public void setDnsProcess(DnsProcess dnsProcess) {
        this.dnsProcess = dnsProcess;
    }

}