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

Java tutorial

Introduction

Here is the source code for jp.primecloud.auto.process.ComponentProcess.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.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

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.InstanceStatus;
import jp.primecloud.auto.common.status.LoadBalancerStatus;
import jp.primecloud.auto.entity.crud.Component;
import jp.primecloud.auto.entity.crud.ComponentInstance;
import jp.primecloud.auto.entity.crud.ComponentType;
import jp.primecloud.auto.entity.crud.Farm;
import jp.primecloud.auto.entity.crud.Image;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.entity.crud.LoadBalancer;
import jp.primecloud.auto.entity.crud.PuppetInstance;
import jp.primecloud.auto.exception.MultiCauseException;
import jp.primecloud.auto.process.lb.LoadBalancerProcess;
import jp.primecloud.auto.process.puppet.PuppetComponentProcess;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.util.MessageUtils;

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

    protected PuppetComponentProcess puppetComponentProcess;

    protected PuppetComponentProcess[] extPuppetComponentProcesses;

    protected LoadBalancerProcess loadBalancerProcess;

    protected ExecutorService executorService;

    public void configure(Long farmNo) {
        Farm farm = farmDao.read(farmNo);
        if (BooleanUtils.isTrue(farm.getComponentProcessing())) {
            // ??????????
            if (log.isDebugEnabled()) {
                String message = MessageUtils.format("Component is being configured.(farmNo={0})", farmNo);
                log.debug(message);
            }
            return;
        }

        if (log.isInfoEnabled()) {
            log.info(MessageUtils.getMessage("IPROCESS-100011", farmNo));
        }

        // 
        farm.setComponentProcessing(true);
        farmDao.update(farm);

        try {
            // ???
            ComponentProcessContext context = createContext(farmNo);

            List<Component> components = null;
            if (!context.getRunningInstanceNos().isEmpty()) {
                // ???
                puppetComponentProcess.createNodeManifest(context);
                components = getComponents(farmNo);
            }

            // ?????
            if (!context.getRunningInstanceNos().isEmpty()) {
                for (int i = 0; i < components.size(); i++) {
                    Component component = components.get(i);

                    // ?
                    LoggingUtils.setComponentNo(component.getComponentNo());
                    LoggingUtils.setComponentName(component.getComponentName());

                    startPuppet(components.get(i), context);

                    // ???????
                    LoggingUtils.setComponentNo(null);
                    LoggingUtils.setComponentName(null);
                }
            }

            // ???
            if (!context.getTargetLoadBalancerNos().isEmpty()) {
                // 
                List<Callable<Void>> callables = new ArrayList<Callable<Void>>();
                final Map<String, Object> loggingContext = LoggingUtils.getContext();
                for (final Long loadBalancerNo : context.getTargetLoadBalancerNos()) {
                    Callable<Void> callable = new Callable<Void>() {
                        @Override
                        public Void call() throws Exception {
                            LoggingUtils.setContext(loggingContext);
                            try {
                                loadBalancerProcess.configure(loadBalancerNo);
                            } catch (Exception e) {
                                log.error(e.getMessage(), e);

                                // TODO: 

                                throw e;
                            } finally {
                                LoggingUtils.removeContext();
                            }
                            return null;
                        }
                    };
                    callables.add(callable);
                }

                try {
                    List<Future<Void>> futures = executorService.invokeAll(callables);

                    // ???
                    List<Throwable> throwables = new ArrayList<Throwable>();
                    for (Future<Void> future : futures) {
                        try {
                            future.get();
                        } catch (ExecutionException e) {
                            throwables.add(e.getCause());
                        } catch (InterruptedException ignore) {
                        }
                    }

                    // ??
                    if (throwables.size() > 0) {
                        throw new MultiCauseException(throwables.toArray(new Throwable[throwables.size()]));
                    }
                } catch (InterruptedException e) {
                }
            }

            // ?????
            if (!context.getRunningInstanceNos().isEmpty()) {
                for (int i = components.size() - 1; i >= 0; i--) {
                    Component component = components.get(i);

                    // ?
                    LoggingUtils.setComponentNo(component.getComponentNo());
                    LoggingUtils.setComponentName(component.getComponentName());

                    stopPuppet(components.get(i), context);

                    // ???????
                    LoggingUtils.setComponentNo(null);
                    LoggingUtils.setComponentName(null);
                }
            }
        } finally {
            // 
            farm = farmDao.read(farmNo);
            farm.setComponentProcessing(false);
            farmDao.update(farm);
        }

        if (log.isInfoEnabled()) {
            log.info(MessageUtils.getMessage("IPROCESS-100012", farmNo));
        }
    }

    protected ComponentProcessContext createContext(Long farmNo) {
        ComponentProcessContext context = new ComponentProcessContext();
        context.setFarmNo(farmNo);

        // ????
        List<Instance> instances = instanceDao.readByFarmNo(farmNo);
        List<Long> runningInstanceNos = new ArrayList<Long>();
        for (Instance instance : instances) {
            // ?????????
            if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.RUNNING) {
                continue;
            }

            // ????
            if (BooleanUtils.isTrue(instance.getLoadBalancer())) {
                continue;
            }

            // PuppetInstance????  ???OS?windows????
            PuppetInstance puppetInstance = puppetInstanceDao.read(instance.getInstanceNo());
            Image image = imageDao.read(instance.getImageNo());
            if (puppetInstance == null
                    && !StringUtils.startsWithIgnoreCase(image.getOs(), PCCConstant.OS_NAME_WIN)) {
                continue;
            }

            runningInstanceNos.add(instance.getInstanceNo());
        }
        context.setRunningInstanceNos(runningInstanceNos);

        // ?????
        List<ComponentInstance> componentInstances = componentInstanceDao.readInInstanceNos(runningInstanceNos);
        Map<Long, List<Long>> enableInstanceNoMap = new HashMap<Long, List<Long>>();
        Map<Long, List<Long>> disableInstanceNoMap = new HashMap<Long, List<Long>>();
        for (ComponentInstance componentInstance : componentInstances) {
            Map<Long, List<Long>> map;
            if (BooleanUtils.isTrue(componentInstance.getEnabled())) {
                map = enableInstanceNoMap;
            } else {
                map = disableInstanceNoMap;
            }

            List<Long> list = map.get(componentInstance.getComponentNo());
            if (list == null) {
                list = new ArrayList<Long>();
                map.put(componentInstance.getComponentNo(), list);
            }
            list.add(componentInstance.getInstanceNo());
        }
        context.setEnableInstanceNoMap(enableInstanceNoMap);
        context.setDisableInstanceNoMap(disableInstanceNoMap);

        // ????
        List<LoadBalancer> loadBalancers = loadBalancerDao.readByFarmNo(farmNo);
        List<Long> loadBalancerNos = new ArrayList<Long>();
        for (LoadBalancer loadBalancer : loadBalancers) {
            LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus());

            if (BooleanUtils.isTrue(loadBalancer.getEnabled())) {
                // ?????????
                if (status != LoadBalancerStatus.RUNNING) {
                    continue;
                }
            } else {
                // ????????????
                if (status != LoadBalancerStatus.RUNNING && status != LoadBalancerStatus.WARNING) {
                    continue;
                }
            }

            loadBalancerNos.add(loadBalancer.getLoadBalancerNo());
        }
        context.setTargetLoadBalancerNos(loadBalancerNos);

        return context;
    }

    protected List<Component> getComponents(Long farmNo) {
        // ????
        List<Component> components = componentDao.readByFarmNo(farmNo);

        // ???
        List<Component> tmpComponents = new ArrayList<Component>();
        for (Component component : components) {
            if (BooleanUtils.isTrue(component.getLoadBalancer())) {
                continue;
            }
            tmpComponents.add(component);
        }
        components = tmpComponents;

        // ???
        Comparator<Component> comparator = new Comparator<Component>() {
            @Override
            public int compare(Component o1, Component o2) {
                ComponentType c1 = componentTypeDao.read(o1.getComponentTypeNo());
                ComponentType c2 = componentTypeDao.read(o2.getComponentTypeNo());
                Integer runOrder1 = c1.getRunOrder();
                Integer runOrder2 = c2.getRunOrder();

                int ro1 = runOrder1 == null ? 0 : runOrder1.intValue();
                int ro2 = runOrder2 == null ? 0 : runOrder2.intValue();

                return ro1 - ro2;
            }
        };

        Collections.sort(components, comparator);

        return components;
    }

    protected void startPuppet(Component component, ComponentProcessContext context) {
        // ComponentTypeName?????????
        PuppetComponentProcess puppetComponentProcess = this.puppetComponentProcess;
        if (extPuppetComponentProcesses != null) {
            ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo());
            for (PuppetComponentProcess process : extPuppetComponentProcesses) {
                if (StringUtils.equals(componentType.getComponentTypeName(), process.getComponentTypeName())) {
                    puppetComponentProcess = process;
                    break;
                }
            }
        }

        puppetComponentProcess.startComponent(component.getComponentNo(), context);
    }

    protected void stopPuppet(Component component, ComponentProcessContext context) {
        // ComponentTypeName?????????
        PuppetComponentProcess puppetComponentProcess = this.puppetComponentProcess;
        if (extPuppetComponentProcesses != null) {
            ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo());
            for (PuppetComponentProcess process : extPuppetComponentProcesses) {
                if (StringUtils.equals(componentType.getComponentTypeName(), process.getComponentTypeName())) {
                    puppetComponentProcess = process;
                    break;
                }
            }
        }

        try {
            puppetComponentProcess.stopComponent(component.getComponentNo(), context);
        } catch (RuntimeException e) {
            log.warn(e.getMessage(), e);
        }
    }

    /**
     * puppetComponentProcess???
     *
     * @param puppetComponentProcess puppetComponentProcess
     */
    public void setPuppetComponentProcess(PuppetComponentProcess puppetComponentProcess) {
        this.puppetComponentProcess = puppetComponentProcess;
    }

    /**
     * extPuppetComponentProcesses???
     *
     * @param extPuppetComponentProcesses extPuppetComponentProcesses
     */
    public void setExtPuppetComponentProcesses(PuppetComponentProcess[] extPuppetComponentProcesses) {
        this.extPuppetComponentProcesses = extPuppetComponentProcesses;
    }

    /**
     * loadBalancerProcess???
     *
     * @param loadBalancerProcess loadBalancerProcess
     */
    public void setLoadBalancerProcess(LoadBalancerProcess loadBalancerProcess) {
        this.loadBalancerProcess = loadBalancerProcess;
    }

    /**
     * executorService???
     *
     * @param executorService executorService
     */
    public void setExecutorService(ExecutorService executorService) {
        this.executorService = executorService;
    }

}