/*
* 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.List;
import jp.primecloud.auto.common.status.InstanceCoodinateStatus;
import jp.primecloud.auto.common.status.InstanceStatus;
import jp.primecloud.auto.entity.crud.Farm;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.process.hook.ProcessHook;
import jp.primecloud.auto.process.puppet.PuppetNodesProcess;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.util.MessageUtils;
import org.apache.commons.lang.BooleanUtils;
/**
* <p>
* TODO: クラスコメントを記述
* </p>
*
*/
public class InstancesProcess extends ServiceSupport {
protected PuppetNodesProcess puppetNodesProcess;
protected ProcessLogger processLogger;
protected ProcessHook processHook;
public void start(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-100021", farmNo));
}
// フック処理の実行
processHook.execute("pre-start-instances", farm.getUserNo(), farm.getFarmNo());
// ステータス変更
farm.setComponentProcessing(true);
farmDao.update(farm);
//イベントログ出力
processLogger.debug(null, null, "InstanceCoordinate", null);
try {
// 協調処理対象のインスタンスを取得
List<Long> startInstanceNos = new ArrayList<Long>();
List<Instance> allInstances = instanceDao.readByFarmNo(farmNo);
for (Instance instance : allInstances) {
// 起動しているインスタンスのうち、有効なものと、無効でも既に協調されているものを開始対象とする
if (InstanceStatus.fromStatus(instance.getStatus()) == InstanceStatus.RUNNING) {
if (BooleanUtils.isTrue(instance.getEnabled())
|| InstanceCoodinateStatus.fromStatus(instance.getCoodinateStatus()) == InstanceCoodinateStatus.COODINATED) {
startInstanceNos.add(instance.getInstanceNo());
}
}
}
InstancesProcessContext context = new InstancesProcessContext();
context.setFarmNo(farmNo);
context.setStartInstanceNos(startInstanceNos);
// 協調処理を実行
puppetNodesProcess.configureNodes(context);
} finally {
// ステータス変更
farm = farmDao.read(farmNo);
farm.setComponentProcessing(false);
farmDao.update(farm);
}
//イベントログ出力
processLogger.debug(null, null, "InstanceCoordinateFinish", null);
// フック処理の実行
processHook.execute("post-start-instances", farm.getUserNo(), farm.getFarmNo());
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100022", farmNo));
}
}
public void stop(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-100021", farmNo));
}
// フック処理の実行
processHook.execute("pre-stop-instances", farm.getUserNo(), farm.getFarmNo());
// ステータス変更
farm.setComponentProcessing(true);
farmDao.update(farm);
//イベントログ出力
processLogger.debug(null, null, "InstanceCoordinate", null);
try {
// 協調処理対象のインスタンスを取得
List<Long> startInstanceNos = new ArrayList<Long>();
List<Long> stopInstanceNos = new ArrayList<Long>();
List<Instance> allInstances = instanceDao.readByFarmNo(farmNo);
for (Instance instance : allInstances) {
// 起動しているインスタンスのうち、有効なものを開始対象、無効で既に協調されているものを終了対象とする
if (InstanceStatus.fromStatus(instance.getStatus()) == InstanceStatus.RUNNING) {
if (BooleanUtils.isTrue(instance.getEnabled())) {
startInstanceNos.add(instance.getInstanceNo());
} else if (InstanceCoodinateStatus.fromStatus(instance.getCoodinateStatus()) == InstanceCoodinateStatus.COODINATED) {
stopInstanceNos.add(instance.getInstanceNo());
}
}
}
InstancesProcessContext context = new InstancesProcessContext();
context.setFarmNo(farmNo);
context.setStartInstanceNos(startInstanceNos);
context.setStopInstanceNos(stopInstanceNos);
// 協調処理を実行
puppetNodesProcess.configureNodes(context);
} finally {
// ステータス変更
farm = farmDao.read(farmNo);
farm.setComponentProcessing(false);
farmDao.update(farm);
}
//イベントログ出力
processLogger.debug(null, null, "InstanceCoordinateFinish", null);
// フック処理の実行
processHook.execute("post-stop-instances", farm.getUserNo(), farm.getFarmNo());
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100022", farmNo));
}
}
/**
* puppetNodesProcessを設定します。
*
* @param puppetNodesProcess puppetNodesProcess
*/
public void setPuppetNodesProcess(PuppetNodesProcess puppetNodesProcess) {
this.puppetNodesProcess = puppetNodesProcess;
}
/**
* processLoggerを設定します。
*
* @param processLogger processLogger
*/
public void setProcessLogger(ProcessLogger processLogger) {
this.processLogger = processLogger;
}
/**
* processHookを設定します。
*
* @param processHook processHook
*/
public void setProcessHook(ProcessHook processHook) {
this.processHook = processHook;
}
}