/*
* 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.vmware;
import jp.primecloud.auto.entity.crud.Component;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.entity.crud.Platform;
import jp.primecloud.auto.entity.crud.VmwareDisk;
import jp.primecloud.auto.entity.crud.VmwareInstance;
import jp.primecloud.auto.process.ProcessLogger;
import jp.primecloud.auto.service.ServiceSupport;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import com.vmware.vim25.VirtualDeviceFileBackingInfo;
import com.vmware.vim25.VirtualDisk;
import com.vmware.vim25.mo.Datastore;
/**
* <p>
* TODO: クラスコメントを記述
* </p>
*
*/
public class VmwareDiskProcess extends ServiceSupport {
protected ProcessLogger processLogger;
/**
* TODO: メソッドコメントを記述
*
* @param vmwareProcessClient
* @param instanceNo
* @param diskNo
*/
public void attachDisk(VmwareProcessClient vmwareProcessClient, Long instanceNo, Long diskNo) {
VmwareDisk vmwareDisk = vmwareDiskDao.read(diskNo);
if (BooleanUtils.isTrue(vmwareDisk.getAttached())) {
// ディスクがアタッチ済みの場合はスキップ
return;
}
VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo);
//イベントログ出力
Component component = componentDao.read(vmwareDisk.getComponentNo());
Instance instance = instanceDao.read(instanceNo);
Platform platform = platformDao.read(vmwareProcessClient.getPlatformNo());
if (StringUtils.isEmpty(vmwareDisk.getFileName())) {
processLogger.debug(component, instance, "VmwareDiskCreate", new Object[] { platform.getPlatformName() });
} else {
processLogger.debug(component, instance, "VmwareDiskAttach", new Object[] { platform.getPlatformName(),
vmwareDisk.getFileName() });
}
// ディスクのアタッチ
VirtualDisk disk = vmwareProcessClient.attachDisk(vmwareInstance.getMachineName(), vmwareDisk.getScsiId(),
vmwareDisk.getSize(), vmwareDisk.getFileName());
// ディスク情報の取得
VirtualDeviceFileBackingInfo backingInfo = VirtualDeviceFileBackingInfo.class.cast(disk.getBacking());
Datastore datastore = new Datastore(vmwareProcessClient.getVmwareClient().getServiceInstance()
.getServerConnection(), backingInfo.getDatastore());
//イベントログ出力
if (StringUtils.isEmpty(vmwareDisk.getFileName())) {
processLogger.debug(component, instance, "VmwareDiskCreateFinish",
new Object[] { platform.getPlatformName(), backingInfo.getFileName(), vmwareDisk.getSize() });
} else {
processLogger.debug(component, instance, "VmwareDiskAttachFinish",
new Object[] { platform.getPlatformName(), vmwareDisk.getFileName(), vmwareDisk.getSize() });
}
// データベース更新
vmwareDisk = vmwareDiskDao.read(diskNo);
vmwareDisk.setAttached(true);
vmwareDisk.setDatastore(datastore.getName());
vmwareDisk.setFileName(backingInfo.getFileName());
vmwareDiskDao.update(vmwareDisk);
}
/**
* TODO: メソッドコメントを記述
*
* @param vmwareProcessClient
* @param instanceNo
* @param diskNo
*/
public void detachDisk(VmwareProcessClient vmwareProcessClient, Long instanceNo, Long diskNo) {
VmwareDisk vmwareDisk = vmwareDiskDao.read(diskNo);
if (BooleanUtils.isNotTrue(vmwareDisk.getAttached())) {
// ディスクがアタッチされていない場合はスキップ
return;
}
VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo);
//イベントログ出力
Component component = componentDao.read(vmwareDisk.getComponentNo());
Instance instance = instanceDao.read(instanceNo);
Platform platform = platformDao.read(vmwareProcessClient.getPlatformNo());
processLogger.debug(component, instance, "VmwareDiskDetach", new Object[] { platform.getPlatformName(),
vmwareDisk.getFileName() });
// ディスクをデタッチ
vmwareProcessClient.detachDisk(vmwareInstance.getMachineName(), vmwareDisk.getScsiId());
//イベントログ出力
processLogger.debug(component, instance, "VmwareDiskDetachFinish", new Object[] { platform.getPlatformName(),
vmwareDisk.getFileName() });
// データベース更新
vmwareDisk = vmwareDiskDao.read(diskNo);
vmwareDisk.setAttached(false);
vmwareDiskDao.update(vmwareDisk);
}
/**
* TODO: メソッドコメントを記述
*
* @param vmwareProcessClient
* @param diskNo
*/
public void deleteDisk(VmwareProcessClient vmwareProcessClient, Long diskNo) {
VmwareDisk vmwareDisk = vmwareDiskDao.read(diskNo);
//イベントログ出力
Component component = componentDao.read(vmwareDisk.getComponentNo());
Instance instance = instanceDao.read(vmwareDisk.getInstanceNo());
processLogger.debug(component, instance, "VmwareDiskDelete", new Object[] { vmwareDisk.getFileName() });
// ディスクファイルの削除
vmwareProcessClient.deleteDisk(vmwareDisk.getDatastore(), vmwareDisk.getFileName());
//イベントログ出力
processLogger.debug(component, instance, "VmwareDiskDeleteFinish", new Object[] { vmwareDisk.getFileName() });
// データベース更新
vmwareDisk = vmwareDiskDao.read(diskNo);
vmwareDisk.setDatastore(null);
vmwareDisk.setFileName(null);
vmwareDiskDao.update(vmwareDisk);
}
/**
* processLoggerを設定します。
*
* @param processLogger processLogger
*/
public void setProcessLogger(ProcessLogger processLogger) {
this.processLogger = processLogger;
}
}