/*
* 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.service.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import jp.primecloud.auto.common.component.PasswordGenerator;
import jp.primecloud.auto.common.constant.PCCConstant;
import jp.primecloud.auto.common.status.ComponentInstanceStatus;
import jp.primecloud.auto.common.status.InstanceCoodinateStatus;
import jp.primecloud.auto.common.status.InstanceStatus;
import jp.primecloud.auto.common.status.ZabbixInstanceStatus;
import jp.primecloud.auto.component.mysql.MySQLConstants;
import jp.primecloud.auto.config.Config;
import jp.primecloud.auto.entity.crud.AwsAddress;
import jp.primecloud.auto.entity.crud.AwsCertificate;
import jp.primecloud.auto.entity.crud.AwsInstance;
import jp.primecloud.auto.entity.crud.AwsVolume;
import jp.primecloud.auto.entity.crud.AzureCertificate;
import jp.primecloud.auto.entity.crud.AzureDisk;
import jp.primecloud.auto.entity.crud.AzureInstance;
import jp.primecloud.auto.entity.crud.CloudstackAddress;
import jp.primecloud.auto.entity.crud.CloudstackCertificate;
import jp.primecloud.auto.entity.crud.CloudstackInstance;
import jp.primecloud.auto.entity.crud.CloudstackVolume;
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.ImageAws;
import jp.primecloud.auto.entity.crud.ImageAzure;
import jp.primecloud.auto.entity.crud.ImageCloudstack;
import jp.primecloud.auto.entity.crud.ImageNifty;
import jp.primecloud.auto.entity.crud.ImageOpenstack;
import jp.primecloud.auto.entity.crud.ImageVcloud;
import jp.primecloud.auto.entity.crud.ImageVmware;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.entity.crud.InstanceConfig;
import jp.primecloud.auto.entity.crud.LoadBalancer;
import jp.primecloud.auto.entity.crud.NiftyInstance;
import jp.primecloud.auto.entity.crud.NiftyKeyPair;
import jp.primecloud.auto.entity.crud.NiftyVolume;
import jp.primecloud.auto.entity.crud.OpenstackCertificate;
import jp.primecloud.auto.entity.crud.OpenstackInstance;
import jp.primecloud.auto.entity.crud.OpenstackVolume;
import jp.primecloud.auto.entity.crud.Platform;
import jp.primecloud.auto.entity.crud.PlatformAws;
import jp.primecloud.auto.entity.crud.PlatformAzure;
import jp.primecloud.auto.entity.crud.PlatformCloudstack;
import jp.primecloud.auto.entity.crud.PlatformNifty;
import jp.primecloud.auto.entity.crud.PlatformOpenstack;
import jp.primecloud.auto.entity.crud.PlatformVcloud;
import jp.primecloud.auto.entity.crud.PlatformVcloudStorageType;
import jp.primecloud.auto.entity.crud.PlatformVmware;
import jp.primecloud.auto.entity.crud.PuppetInstance;
import jp.primecloud.auto.entity.crud.VcloudDisk;
import jp.primecloud.auto.entity.crud.VcloudInstance;
import jp.primecloud.auto.entity.crud.VcloudInstanceNetwork;
import jp.primecloud.auto.entity.crud.VcloudKeyPair;
import jp.primecloud.auto.entity.crud.VmwareAddress;
import jp.primecloud.auto.entity.crud.VmwareDisk;
import jp.primecloud.auto.entity.crud.VmwareInstance;
import jp.primecloud.auto.entity.crud.VmwareKeyPair;
import jp.primecloud.auto.entity.crud.ZabbixData;
import jp.primecloud.auto.entity.crud.ZabbixInstance;
import jp.primecloud.auto.exception.AutoApplicationException;
import jp.primecloud.auto.exception.AutoException;
import jp.primecloud.auto.iaasgw.IaasGatewayFactory;
import jp.primecloud.auto.iaasgw.IaasGatewayWrapper;
import jp.primecloud.auto.log.EventLogLevel;
import jp.primecloud.auto.log.EventLogger;
import jp.primecloud.auto.nifty.process.NiftyProcessClient;
import jp.primecloud.auto.nifty.process.NiftyProcessClientFactory;
import jp.primecloud.auto.process.aws.AwsInstanceProcess;
import jp.primecloud.auto.process.aws.AwsProcessClient;
import jp.primecloud.auto.process.aws.AwsProcessClientFactory;
import jp.primecloud.auto.process.aws.AwsVolumeProcess;
import jp.primecloud.auto.process.hook.ProcessHook;
import jp.primecloud.auto.process.nifty.NiftyVolumeProcess;
import jp.primecloud.auto.process.vmware.VmwareDiskProcess;
import jp.primecloud.auto.process.vmware.VmwareMachineProcess;
import jp.primecloud.auto.process.vmware.VmwareProcessClient;
import jp.primecloud.auto.process.vmware.VmwareProcessClientFactory;
import jp.primecloud.auto.process.zabbix.ZabbixHostProcess;
import jp.primecloud.auto.process.zabbix.ZabbixProcessClient;
import jp.primecloud.auto.process.zabbix.ZabbixProcessClientFactory;
import jp.primecloud.auto.service.AwsDescribeService;
import jp.primecloud.auto.service.IaasDescribeService;
import jp.primecloud.auto.service.InstanceService;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.service.VmwareDescribeService;
import jp.primecloud.auto.service.dto.ComponentInstanceDto;
import jp.primecloud.auto.service.dto.DataDiskDto;
import jp.primecloud.auto.service.dto.ImageDto;
import jp.primecloud.auto.service.dto.InstanceDto;
import jp.primecloud.auto.service.dto.InstanceNetworkDto;
import jp.primecloud.auto.service.dto.KeyPairDto;
import jp.primecloud.auto.service.dto.NetworkDto;
import jp.primecloud.auto.service.dto.PlatformDto;
import jp.primecloud.auto.service.dto.SecurityGroupDto;
import jp.primecloud.auto.service.dto.SubnetDto;
import jp.primecloud.auto.service.dto.VmwareAddressDto;
import jp.primecloud.auto.service.dto.ZoneDto;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import com.amazonaws.services.ec2.model.AvailabilityZone;
import com.amazonaws.services.ec2.model.KeyPairInfo;
import com.amazonaws.services.ec2.model.SecurityGroup;
import com.amazonaws.services.ec2.model.Subnet;
import com.vmware.vim25.mo.ComputeResource;
/**
* <p>
* InstanceServiceインターフェースの実装クラス
* </p>
*
*/
public class InstanceServiceImpl extends ServiceSupport implements InstanceService {
protected IaasGatewayFactory iaasGatewayFactory;
protected IaasDescribeService iaasDescribeService;
protected AwsDescribeService awsDescribeService;
protected AwsProcessClientFactory awsProcessClientFactory;
protected AwsInstanceProcess awsInstanceProcess;
protected AwsVolumeProcess awsVolumeProcess;
protected VmwareDescribeService vmwareDescribeService;
protected VmwareMachineProcess vmwareMachineProcess;
protected VmwareDiskProcess vmwareDiskProcess;
protected VmwareProcessClientFactory vmwareProcessClientFactory;
protected NiftyProcessClientFactory niftyProcessClientFactory;
protected ZabbixProcessClientFactory zabbixProcessClientFactory;
protected ZabbixHostProcess zabbixHostProcess;
protected PasswordGenerator passwordGenerator = new PasswordGenerator();
protected EventLogger eventLogger;
protected NiftyVolumeProcess niftyVolumeProcess;
protected ProcessHook processHook;
/**
* {@inheritDoc}
*/
@Override
public InstanceDto getInstance(Long instanceNo) {
// インスタンスを取得
Instance instance = instanceDao.read(instanceNo);
// ZabbixInstanceを取得
ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo);
// プラットフォーム取得
Platform platform = platformDao.read(instance.getPlatformNo());
// イメージ取得
Image image = imageDao.read(instance.getImageNo());
// インスタンスに関連付けられたコンポーネントを取得
Map<Long, List<ComponentInstance>> componentInstanceMap = new LinkedHashMap<Long, List<ComponentInstance>>();
componentInstanceMap.put(instanceNo, new ArrayList<ComponentInstance>());
List<ComponentInstance> tmpComponentInstances = componentInstanceDao.readByInstanceNo(instanceNo);
for (ComponentInstance componentInstance : tmpComponentInstances) {
// 関連付けが無効で停止している場合は除外
if (BooleanUtils.isNotTrue(componentInstance.getAssociate())) {
ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus());
if (status == ComponentInstanceStatus.STOPPED) {
continue;
}
}
componentInstanceMap.get(componentInstance.getInstanceNo()).add(componentInstance);
}
// コンポーネントを取得
Map<Long, Component> componentMap = new HashMap<Long, Component>();
Set<Long> componentNos = new HashSet<Long>();
for (ComponentInstance componentInstance : tmpComponentInstances) {
componentNos.add(componentInstance.getComponentNo());
}
List<Component> components = componentDao.readInComponentNos(componentNos);
for (Component component : components) {
componentMap.put(component.getComponentNo(), component);
}
// インスタンスに紐づく情報を取得
Farm farm = farmDao.read(instance.getFarmNo());
PlatformDto platformDto = new PlatformDto();
platformDto.setPlatform(platform);
ImageDto imageDto = new ImageDto();
imageDto.setImage(image);
AwsInstance awsInstance = null;
AwsAddress awsAddress = null;
List<AwsVolume> awsVolumes = null;
CloudstackInstance cloudstackInstance = null;
CloudstackAddress cloudstackAddress = null;
List<CloudstackVolume> cloudstackVolumes = null;
VmwareInstance vmwareInstance = null;
VmwareAddress vmwareAddress = null;
VmwareKeyPair vmwareKeyPair = null;
List<VmwareDisk> vmwareDisks = null;
NiftyInstance niftyInstance = null;
NiftyKeyPair niftyKeyPair = null;
VcloudInstance vcloudInstance = null;
List<VcloudDisk> vcloudDisks = null;
VcloudKeyPair vcloudKeyPair = null;
List<VcloudInstanceNetwork> vcloudInstanceNetworks = null;
PlatformVcloudStorageType platformVcloudStorageType = null;
AzureCertificate azureCertificate = null;
AzureInstance azureInstance = null;
List<AzureDisk> azureDisks = null;
// List<AzureNetwork> azureNetworks = null;
// List<AzureStorage> azureStorages = null;
OpenstackCertificate openstackCertificate = null;
OpenstackInstance openstackInstance = null;
// TODO CLOUD BRANCHING
if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
PlatformAws platformAws = platformAwsDao.read(platform.getPlatformNo());
ImageAws imageAws = imageAwsDao.read(instance.getImageNo());
platformDto.setPlatformAws(platformAws);
imageDto.setImageAws(imageAws);
// AWSインスタンスを取得
awsInstance = awsInstanceDao.read(instanceNo);
// AWSアドレスを取得
List<AwsAddress> awsAddresses = awsAddressDao.readByInstanceNo(instanceNo);
for (AwsAddress address : awsAddresses) {
awsAddress = address;
break;
}
// AWSボリュームを取得
awsVolumes = awsVolumeDao.readByInstanceNo(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) {
PlatformCloudstack platformCloudstack = platformCloudstackDao.read(platform.getPlatformNo());
ImageCloudstack imageCloudstack = imageCloudstackDao.read(instance.getImageNo());
platformDto.setPlatformCloudstack(platformCloudstack);
imageDto.setImageCloudstack(imageCloudstack);
// CloudStackインスタンスを取得
cloudstackInstance = cloudstackInstanceDao.read(instanceNo);
// CloudStackアドレスを取得
List<CloudstackAddress> cloudstackAddresses = cloudstackAddressDao.readByInstanceNo(instanceNo);
for (CloudstackAddress address : cloudstackAddresses) {
cloudstackAddress = address;
break;
}
// CloudStackボリュームを取得
cloudstackVolumes = cloudstackVolumeDao.readByInstanceNo(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
PlatformVmware platformVmware = platformVmwareDao.read(platform.getPlatformNo());
ImageVmware imageVmware = imageVmwareDao.read(instance.getImageNo());
platformDto.setPlatformVmware(platformVmware);
imageDto.setImageVmware(imageVmware);
// VMwareインスタンスを取得
vmwareInstance = vmwareInstanceDao.read(instanceNo);
// VMwareAddressを取得
vmwareAddress = vmwareAddressDao.readByInstanceNo(instanceNo);
// VMwareキーペアを取得
vmwareKeyPair = vmwareKeyPairDao.read(vmwareInstance.getKeyPairNo());
// VMwareディスクを取得
vmwareDisks = vmwareDiskDao.readByInstanceNo(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
PlatformNifty platformNiftie = platformNiftyDao.read(platform.getPlatformNo());
ImageNifty imageNiftie = imageNiftyDao.read(instance.getImageNo());
platformDto.setPlatformNifty(platformNiftie);
imageDto.setImageNifty(imageNiftie);
// Niftyインスタンスを取得
niftyInstance = niftyInstanceDao.read(instanceNo);
// Niftyキーペアを取得
niftyKeyPair = niftyKeyPairDao.read(niftyInstance.getKeyPairNo());
} else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
PlatformVcloud platformVcloud = platformVcloudDao.read(platform.getPlatformNo());
ImageVcloud imageVcloud = imageVcloudDao.read(instance.getImageNo());
platformDto.setPlatformVcloud(platformVcloud);
imageDto.setImageVcloud(imageVcloud);
// VCloudInstanceを取得
vcloudInstance = vcloudInstanceDao.read(instanceNo);
// VCloudDisksを取得
vcloudDisks = vcloudDiskDao.readByInstanceNo(instanceNo);
// VCloudKeyPairを取得
vcloudKeyPair = vcloudKeyPairDao.read(vcloudInstance.getKeyPairNo());
// VCloudInstanceNetworkを取得
vcloudInstanceNetworks = vcloudInstanceNetworkDao.readByInstanceNo(instanceNo);
Collections.sort(vcloudInstanceNetworks, Comparators.COMPARATOR_VCLOUD_INSTANCE_NETWORK);
// PlatformVCloudStrogeTypeを取得
platformVcloudStorageType = platformVcloudStorageTypeDao.read(vcloudInstance.getStorageTypeNo());
} else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) {
PlatformAzure platformAzure = platformAzureDao.read(platform.getPlatformNo());
ImageAzure imageAzure = imageAzureDao.read(instance.getImageNo());
platformDto.setPlatformAzure(platformAzure);
imageDto.setImageAzure(imageAzure);
// AzureInstanceを取得
azureInstance = azureInstanceDao.read(instanceNo);
// AzureDisksを取得
azureDisks = azureDiskDao.readByInstanceNo(instanceNo);
// Azure認証情報を取得
azureCertificate = azureCertificateDao.read(farm.getUserNo(), instance.getPlatformNo());
// AzureInstanceアドレスを取得
// vcloudKeyPair = vcloudKeyPairDao.read(vcloudInstance.getKeyPairNo());
// AzureStrogeを取得
// platformVcloudStorageType = platformVcloudStorageTypeDao.read(vcloudInstance.getStorageTypeNo());
} else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
PlatformOpenstack platformOpenstack = platformOpenstackDao.read(platform.getPlatformNo());
ImageOpenstack imageOpenstack = imageOpenstackDao.read(instance.getImageNo());
platformDto.setPlatformOpenstack(platformOpenstack);
imageDto.setImageOpenstack(imageOpenstack);
// OpenstackInstanceを取得
openstackInstance = openstackInstanceDao.read(instanceNo);
// Openstack認証情報を取得
openstackCertificate = openstackCertificateDao.read(farm.getUserNo(), instance.getPlatformNo());
}
List<InstanceConfig> instanceConfigs = instanceConfigDao.readByInstanceNo(instance.getInstanceNo());
List<ComponentInstanceDto> componentInstances = new ArrayList<ComponentInstanceDto>();
for (ComponentInstance componentInstance : componentInstanceMap.get(instance.getInstanceNo())) {
ComponentInstanceDto componentInstanceDto = new ComponentInstanceDto();
componentInstanceDto.setComponentInstance(componentInstance);
Component component = componentMap.get(componentInstance.getComponentNo());
String url;
Boolean showPublicIp = BooleanUtils.toBooleanObject(Config.getProperty("ui.showPublicIp"));
if (BooleanUtils.isTrue(showPublicIp)) {
//ui.showPublicIp = true の場合、URLにPublicIpを表示
url = createUrl(instance.getPublicIp(), component.getComponentTypeNo());
} else {
//ui.showPublicIp = false の場合、URLにPrivateIpを表示
url = createUrl(instance.getPrivateIp(), component.getComponentTypeNo());
}
componentInstanceDto.setUrl(url);
componentInstances.add(componentInstanceDto);
}
// 有効無効に応じてステータスを変更する(画面表示用)
InstanceStatus instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
if (BooleanUtils.isTrue(instance.getEnabled())) {
if (instanceStatus == InstanceStatus.STOPPED) {
instance.setStatus(InstanceStatus.STARTING.toString());
}
} else {
if (instanceStatus == InstanceStatus.RUNNING || instanceStatus == InstanceStatus.WARNING) {
instance.setStatus(InstanceStatus.STOPPING.toString());
}
}
// 画面表示用にステータスの変更
// サーバステータス 協調設定ステータス 変換後サーバステータス
// Running Coodinating Configuring
// Running Warning Warning
instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
InstanceCoodinateStatus insCoodiStatus = InstanceCoodinateStatus.fromStatus(instance.getCoodinateStatus());
// サーバステータス(Running)かつ協調設定ステータス(Coodinating)⇒「Configuring」
if (instanceStatus == InstanceStatus.RUNNING && insCoodiStatus == InstanceCoodinateStatus.COODINATING) {
instance.setStatus(InstanceStatus.CONFIGURING.toString());
// サーバステータス(Running)かつ協調設定ステータス(Warning)⇒「Warning」
} else if (instanceStatus == InstanceStatus.RUNNING && insCoodiStatus == InstanceCoodinateStatus.WARNING) {
instance.setStatus(InstanceStatus.WARNING.toString());
}
// インスタンスごとのコンポーネントのステータスを調整する(画面表示用)
instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
for (ComponentInstanceDto componentInstanceDto : componentInstances) {
ComponentInstance componentInstance = componentInstanceDto.getComponentInstance();
ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus());
if (BooleanUtils.isTrue(componentInstance.getEnabled())) {
if (status == ComponentInstanceStatus.STOPPED) {
if (instanceStatus == InstanceStatus.WARNING) {
// インスタンスがWaringであれば、コンポーネントもWarningとする
componentInstance.setStatus(ComponentInstanceStatus.WARNING.toString());
} else if (BooleanUtils.isTrue(farm.getScheduled())) {
componentInstance.setStatus(ComponentInstanceStatus.STARTING.toString());
}
}
} else {
if (status == ComponentInstanceStatus.RUNNING || status == ComponentInstanceStatus.WARNING) {
if (BooleanUtils.isTrue(farm.getScheduled())) {
// ファームが処理対象であれば、Stoppingにする
componentInstance.setStatus(ComponentInstanceStatus.STOPPING.toString());
}
}
}
}
// ソート
Collections.sort(componentInstances, Comparators.COMPARATOR_COMPONENT_INSTANCE_DTO);
//戻り値格納
// TODO CLOUD BRANCHING
InstanceDto dto = new InstanceDto();
dto.setInstance(instance);
dto.setZabbixInstance(zabbixInstance);
dto.setPlatform(platformDto);
dto.setImage(imageDto);
dto.setInstanceConfigs(instanceConfigs);
dto.setComponentInstances(componentInstances);
dto.setAwsInstance(awsInstance);
dto.setAwsAddress(awsAddress);
dto.setAwsVolumes(awsVolumes);
dto.setCloudstackInstance(cloudstackInstance);
dto.setCloudstackAddress(cloudstackAddress);
dto.setCloudstackVolumes(cloudstackVolumes);
dto.setVmwareInstance(vmwareInstance);
dto.setVmwareAddress(vmwareAddress);
dto.setVmwareKeyPair(vmwareKeyPair);
dto.setVmwareDisks(vmwareDisks);
dto.setNiftyInstance(niftyInstance);
dto.setNiftyKeyPair(niftyKeyPair);
dto.setVcloudInstance(vcloudInstance);
dto.setVcloudDisks(vcloudDisks);
dto.setVcloudKeyPair(vcloudKeyPair);
dto.setVcloudInstanceNetworks(vcloudInstanceNetworks);
dto.setPlatformVcloudStorageType(platformVcloudStorageType);
dto.setAzureCertificate(azureCertificate);
dto.setAzureInstance(azureInstance);
dto.setAzureDisks(azureDisks);
dto.setOpenstackInstance(openstackInstance);
dto.setOpenstackCertificate(openstackCertificate);
return dto;
}
/**
* {@inheritDoc}
*/
@Override
public List<InstanceDto> getInstances(Long farmNo) {
// インスタンスを取得
List<Instance> instances = new ArrayList<Instance>();
List<Instance> allInstances = instanceDao.readByFarmNo(farmNo);
for (Instance instance : allInstances) {
// ロードバランサインスタンスは除外する
if (BooleanUtils.isTrue(instance.getLoadBalancer())) {
continue;
}
instances.add(instance);
}
// コンポーネント番号のリスト
List<Long> instanceNos = new ArrayList<Long>();
for (Instance instance : instances) {
instanceNos.add(instance.getInstanceNo());
}
// ZabbixInstanceを取得
List<ZabbixInstance> zabbixInstances = zabbixInstanceDao.readInInstanceNos(instanceNos);
Map<Long, ZabbixInstance> zabbixInstanceMap = new LinkedHashMap<Long, ZabbixInstance>();
for (ZabbixInstance zabbixInstance : zabbixInstances) {
zabbixInstanceMap.put(zabbixInstance.getInstanceNo(), zabbixInstance);
}
// プラットフォーム取得
List<Platform> platforms = platformDao.readAll();
Map<Long, Platform> platformMap = new LinkedHashMap<Long, Platform>();
for (Platform platform : platforms) {
platformMap.put(platform.getPlatformNo(), platform);
}
// イメージ取得
List<Image> images = imageDao.readAll();
Map<Long, Image> imageMap = new LinkedHashMap<Long, Image>();
for (Image image : images) {
imageMap.put(image.getImageNo(), image);
}
// インスタンスに関連付けられたコンポーネントを取得
Map<Long, List<ComponentInstance>> componentInstanceMap = new LinkedHashMap<Long, List<ComponentInstance>>();
for (Long instanceNo : instanceNos) {
componentInstanceMap.put(instanceNo, new ArrayList<ComponentInstance>());
}
List<ComponentInstance> tmpComponentInstances = componentInstanceDao.readInInstanceNos(instanceNos);
for (ComponentInstance componentInstance : tmpComponentInstances) {
// 関連付けが無効で停止している場合は除外
if (BooleanUtils.isNotTrue(componentInstance.getAssociate())) {
ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus());
if (status == ComponentInstanceStatus.STOPPED) {
continue;
}
}
componentInstanceMap.get(componentInstance.getInstanceNo()).add(componentInstance);
}
// コンポーネントを取得
Map<Long, Component> componentMap = new HashMap<Long, Component>();
Set<Long> componentNos = new HashSet<Long>();
for (ComponentInstance componentInstance : tmpComponentInstances) {
componentNos.add(componentInstance.getComponentNo());
}
List<Component> components = componentDao.readInComponentNos(componentNos);
for (Component component : components) {
componentMap.put(component.getComponentNo(), component);
}
// TODO CLOUD BRANCHING
//★★★★★ AWS ★★★★★
// AWSプラットフォーム取得
List<PlatformAws> platformAwss = platformAwsDao.readAll();
Map<Long, PlatformAws> platformAwsMap = new LinkedHashMap<Long, PlatformAws>();
for (PlatformAws platformAws : platformAwss) {
platformAwsMap.put(platformAws.getPlatformNo(), platformAws);
}
// AWSイメージ取得
List<ImageAws> imageAwss = imageAwsDao.readAll();
Map<Long, ImageAws> imageAwsMap = new LinkedHashMap<Long, ImageAws>();
for (ImageAws imageAws : imageAwss) {
imageAwsMap.put(imageAws.getImageNo(), imageAws);
}
// AWSインスタンスを取得
List<AwsInstance> awsInstances = awsInstanceDao.readInInstanceNos(instanceNos);
Map<Long, AwsInstance> awsInstanceMap = new LinkedHashMap<Long, AwsInstance>();
for (AwsInstance awsInstance : awsInstances) {
awsInstanceMap.put(awsInstance.getInstanceNo(), awsInstance);
}
// AWSアドレスを取得
Farm farm = farmDao.read(farmNo);
List<AwsAddress> awsAddresses = awsAddressDao.readByUserNo(farm.getUserNo());
Map<Long, AwsAddress> awsAddressMap = new LinkedHashMap<Long, AwsAddress>();
for (AwsAddress awsAddress : awsAddresses) {
if (awsAddress.getInstanceNo() != null) {
awsAddressMap.put(awsAddress.getInstanceNo(), awsAddress);
}
}
// AWSボリュームを取得
List<AwsVolume> farmAwsVolumes = awsVolumeDao.readByFarmNo(farmNo);
Map<Long, List<AwsVolume>> awsVolumesMap = new LinkedHashMap<Long, List<AwsVolume>>();
for (AwsVolume awsVolume : farmAwsVolumes) {
Long instanceNo = awsVolume.getInstanceNo();
if (instanceNo != null) {
List<AwsVolume> awsVolumes = awsVolumesMap.get(instanceNo);
if (awsVolumes == null) {
awsVolumes = new ArrayList<AwsVolume>();
awsVolumesMap.put(instanceNo, awsVolumes);
}
awsVolumes.add(awsVolume);
}
}
//★★★★★ CloudStack ★★★★★
// CloudStackプラットフォーム取得
List<PlatformCloudstack> platformCloudstacks = platformCloudstackDao.readAll();
Map<Long, PlatformCloudstack> platformCloudstackMap = new LinkedHashMap<Long, PlatformCloudstack>();
for (PlatformCloudstack platformCloudstack : platformCloudstacks) {
platformCloudstackMap.put(platformCloudstack.getPlatformNo(), platformCloudstack);
}
// CloudStackイメージ取得
List<ImageCloudstack> imageCloudstacks = imageCloudstackDao.readAll();
Map<Long, ImageCloudstack> imageCloudstackMap = new LinkedHashMap<Long, ImageCloudstack>();
for (ImageCloudstack imageCloudstack : imageCloudstacks) {
imageCloudstackMap.put(imageCloudstack.getImageNo(), imageCloudstack);
}
// CloudStackインスタンスを取得
List<CloudstackInstance> cloudstackInstances = cloudstackInstanceDao.readInInstanceNos(instanceNos);
Map<Long, CloudstackInstance> cloudstackInstanceMap = new LinkedHashMap<Long, CloudstackInstance>();
for (CloudstackInstance cloudstackInstance : cloudstackInstances) {
cloudstackInstanceMap.put(cloudstackInstance.getInstanceNo(), cloudstackInstance);
}
// CloudStackアドレスを取得
List<CloudstackAddress> cloudstackAddresses = cloudstackAddressDao.readByAccount(farm.getUserNo());
Map<Long, CloudstackAddress> cloudstackAddressMap = new LinkedHashMap<Long, CloudstackAddress>();
for (CloudstackAddress cloudstackAddress : cloudstackAddresses) {
if (cloudstackAddress.getInstanceNo() != null) {
cloudstackAddressMap.put(cloudstackAddress.getInstanceNo(), cloudstackAddress);
}
}
// CloudStackボリュームを取得
List<CloudstackVolume> farmCloudstackVolumes = cloudstackVolumeDao.readByFarmNo(farmNo);
Map<Long, List<CloudstackVolume>> cloudstackVolumesMap = new LinkedHashMap<Long, List<CloudstackVolume>>();
for (CloudstackVolume cloudstackVolume : farmCloudstackVolumes) {
Long instanceNo = cloudstackVolume.getInstanceNo();
if (instanceNo != null) {
List<CloudstackVolume> cloudstackVolumes = cloudstackVolumesMap.get(instanceNo);
if (cloudstackVolumes == null) {
cloudstackVolumes = new ArrayList<CloudstackVolume>();
cloudstackVolumesMap.put(instanceNo, cloudstackVolumes);
}
cloudstackVolumes.add(cloudstackVolume);
}
}
//★★★★★ VMware ★★★★★
// VMWareプラットフォーム取得
List<PlatformVmware> platformVmwares = platformVmwareDao.readAll();
Map<Long, PlatformVmware> platformVmwareMap = new LinkedHashMap<Long, PlatformVmware>();
for (PlatformVmware platformVmware : platformVmwares) {
platformVmwareMap.put(platformVmware.getPlatformNo(), platformVmware);
}
// VMwareイメージ取得
List<ImageVmware> imageVmwares = imageVmwareDao.readAll();
Map<Long, ImageVmware> imageVmwareMap = new LinkedHashMap<Long, ImageVmware>();
for (ImageVmware imageVmware : imageVmwares) {
imageVmwareMap.put(imageVmware.getImageNo(), imageVmware);
}
// VMwareインスタンスを取得
List<VmwareInstance> vmwareInstances = vmwareInstanceDao.readInInstanceNos(instanceNos);
Map<Long, VmwareInstance> vmwareInstanceMap = new LinkedHashMap<Long, VmwareInstance>();
for (VmwareInstance vmwareInstance : vmwareInstances) {
vmwareInstanceMap.put(vmwareInstance.getInstanceNo(), vmwareInstance);
}
// VMwareAddressを取得
Map<Long, VmwareAddress> vmwareAddressMap = new LinkedHashMap<Long, VmwareAddress>();
List<VmwareAddress> vmwareAddresses = vmwareAddressDao.readByUserNo(farm.getUserNo());
for (VmwareAddress vmwareAddress : vmwareAddresses) {
if (vmwareAddress.getInstanceNo() != null) {
vmwareAddressMap.put(vmwareAddress.getInstanceNo(), vmwareAddress);
}
}
// VMwareキーペアを取得
Map<Long, VmwareKeyPair> vmwareKeyPairMap = new LinkedHashMap<Long, VmwareKeyPair>();
if (!vmwareInstanceMap.isEmpty()) {
List<VmwareKeyPair> vmwareKeyPairs = vmwareKeyPairDao.readByUserNo(farm.getUserNo());
for (VmwareKeyPair vmwareKeyPair : vmwareKeyPairs) {
vmwareKeyPairMap.put(vmwareKeyPair.getKeyNo(), vmwareKeyPair);
}
}
// VMwareディスクを取得
List<VmwareDisk> farmVmwareDisks = vmwareDiskDao.readByFarmNo(farmNo);
Map<Long, List<VmwareDisk>> vmwareDisksMap = new LinkedHashMap<Long, List<VmwareDisk>>();
for (VmwareDisk vmwareDisk : farmVmwareDisks) {
Long instanceNo = vmwareDisk.getInstanceNo();
if (instanceNo != null) {
List<VmwareDisk> vmwareDisks = vmwareDisksMap.get(instanceNo);
if (vmwareDisks == null) {
vmwareDisks = new ArrayList<VmwareDisk>();
vmwareDisksMap.put(instanceNo, vmwareDisks);
}
vmwareDisks.add(vmwareDisk);
}
}
//★★★★★ Nifty ★★★★★
// Niftyプラットフォーム取得
List<PlatformNifty> platformNifties = platformNiftyDao.readAll();
Map<Long, PlatformNifty> platformNiftyMap = new LinkedHashMap<Long, PlatformNifty>();
for (PlatformNifty platformNifty : platformNifties) {
platformNiftyMap.put(platformNifty.getPlatformNo(), platformNifty);
}
// Niftyイメージ取得
List<ImageNifty> imageNifties = imageNiftyDao.readAll();
Map<Long, ImageNifty> imageNiftyMap = new LinkedHashMap<Long, ImageNifty>();
for (ImageNifty imageNifty : imageNifties) {
imageNiftyMap.put(imageNifty.getImageNo(), imageNifty);
}
// Niftyインスタンスを取得
List<NiftyInstance> niftyInstances = niftyInstanceDao.readInInstanceNos(instanceNos);
Map<Long, NiftyInstance> niftyInstanceMap = new LinkedHashMap<Long, NiftyInstance>();
for (NiftyInstance niftyInstance : niftyInstances) {
niftyInstanceMap.put(niftyInstance.getInstanceNo(), niftyInstance);
}
// Niftyキーペアを取得
Map<Long, NiftyKeyPair> niftyKeyPairMap = new LinkedHashMap<Long, NiftyKeyPair>();
if (!niftyInstanceMap.isEmpty()) {
List<NiftyKeyPair> niftyKeyPairs = niftyKeyPairDao.readByUserNo(farm.getUserNo());
for (NiftyKeyPair niftyKeyPair : niftyKeyPairs) {
niftyKeyPairMap.put(niftyKeyPair.getKeyNo(), niftyKeyPair);
}
}
// Niftyボリュームを取得
List<NiftyVolume> farmNiftyVolumes = niftyVolumeDao.readByFarmNo(farmNo);
Map<Long, List<NiftyVolume>> niftyVolumesMap = new LinkedHashMap<Long, List<NiftyVolume>>();
for (NiftyVolume niftyVolume : farmNiftyVolumes) {
Long instanceNo = niftyVolume.getInstanceNo();
if (instanceNo != null) {
List<NiftyVolume> niftyVolumes = niftyVolumesMap.get(instanceNo);
if (niftyVolumes == null) {
niftyVolumes = new ArrayList<NiftyVolume>();
niftyVolumesMap.put(instanceNo, niftyVolumes);
}
niftyVolumes.add(niftyVolume);
}
}
//★★★★★ VCloud ★★★★★
// VCloudPlatform取得
List<PlatformVcloud> platformVclouds = platformVcloudDao.readAll();
Map<Long, PlatformVcloud> platformVcloudMap = new LinkedHashMap<Long, PlatformVcloud>();
for (PlatformVcloud platformVcloud : platformVclouds) {
platformVcloudMap.put(platformVcloud.getPlatformNo(), platformVcloud);
}
// VCloudImage取得
List<ImageVcloud> imageVclouds = imageVcloudDao.readAll();
Map<Long, ImageVcloud> imageVcloudMap = new LinkedHashMap<Long, ImageVcloud>();
for (ImageVcloud imageVcloud : imageVclouds) {
imageVcloudMap.put(imageVcloud.getImageNo(), imageVcloud);
}
// VCloudInstanceを取得
List<VcloudInstance> vcloudInstances = vcloudInstanceDao.readInInstanceNos(instanceNos);
Map<Long, VcloudInstance> vcloudInstanceMap = new LinkedHashMap<Long, VcloudInstance>();
for (VcloudInstance vcloudInstance : vcloudInstances) {
vcloudInstanceMap.put(vcloudInstance.getInstanceNo(), vcloudInstance);
}
// VCloudKeyPairを取得
Map<Long, VcloudKeyPair> vcloudKeyPairMap = new LinkedHashMap<Long, VcloudKeyPair>();
List<VcloudKeyPair> vcloudKeyPairs = vcloudKeyPairDao.readByUserNo(farm.getUserNo());
for (VcloudKeyPair vcloudKeyPair : vcloudKeyPairs) {
vcloudKeyPairMap.put(vcloudKeyPair.getKeyNo(), vcloudKeyPair);
}
// VCloudDiskを取得
List<VcloudDisk> farmVcloudDisks = vcloudDiskDao.readByFarmNo(farmNo);
Map<Long, List<VcloudDisk>> vcloudDiskMap = new LinkedHashMap<Long, List<VcloudDisk>>();
for (VcloudDisk vcloudDisk : farmVcloudDisks) {
Long instanceNo = vcloudDisk.getInstanceNo();
if (instanceNo != null) {
List<VcloudDisk> vcloudDisks = vcloudDiskMap.get(instanceNo);
if (vcloudDisks == null) {
vcloudDisks = new ArrayList<VcloudDisk>();
}
vcloudDisks.add(vcloudDisk);
vcloudDiskMap.put(instanceNo, vcloudDisks);
}
}
//VCloudNetworkを取得
List<VcloudInstanceNetwork> allVcloudInstanceNetworks = vcloudInstanceNetworkDao.readByFarmNo(farmNo);
Map<Long, List<VcloudInstanceNetwork>> vcloudInstanceNetworkMap = new LinkedHashMap<Long, List<VcloudInstanceNetwork>>();
for (VcloudInstanceNetwork vcloudInstanceNetwork : allVcloudInstanceNetworks) {
List<VcloudInstanceNetwork> instanceNetworks = vcloudInstanceNetworkMap.get(vcloudInstanceNetwork
.getInstanceNo());
if (instanceNetworks == null) {
instanceNetworks = new ArrayList<VcloudInstanceNetwork>();
}
instanceNetworks.add(vcloudInstanceNetwork);
vcloudInstanceNetworkMap.put(vcloudInstanceNetwork.getInstanceNo(), instanceNetworks);
}
//PlatformVcloudStorageTypeを取得
List<PlatformVcloudStorageType> platformVcloudStorageTypes = platformVcloudStorageTypeDao.readAll();
Map<Long, PlatformVcloudStorageType> platformVcloudStorageTypeMap = new LinkedHashMap<Long, PlatformVcloudStorageType>();
for (PlatformVcloudStorageType platformVcloudStorageType : platformVcloudStorageTypes) {
platformVcloudStorageTypeMap.put(platformVcloudStorageType.getStorageTypeNo(), platformVcloudStorageType);
}
//★★★★★ Azure ★★★★★
// Azureプラットフォーム取得
List<PlatformAzure> platformAzures = platformAzureDao.readAll();
Map<Long, PlatformAzure> platformAzureMap = new LinkedHashMap<Long, PlatformAzure>();
for (PlatformAzure platformAzure : platformAzures) {
platformAzureMap.put(platformAzure.getPlatformNo(), platformAzure);
}
// Azureイメージ取得
List<ImageAzure> imageAzures = imageAzureDao.readAll();
Map<Long, ImageAzure> imageAzureMap = new LinkedHashMap<Long, ImageAzure>();
for (ImageAzure imageAzure : imageAzures) {
imageAzureMap.put(imageAzure.getImageNo(), imageAzure);
}
// Azureインスタンスを取得
List<AzureInstance> azureInstances = azureInstanceDao.readInInstanceNos(instanceNos);
Map<Long, AzureInstance> azureInstanceMap = new LinkedHashMap<Long, AzureInstance>();
for (AzureInstance azureInstance : azureInstances) {
azureInstanceMap.put(azureInstance.getInstanceNo(), azureInstance);
}
// Azureサブネットを取得 プラットフォーム縛りにしないとだめな気がする
// List<AzureSubnet> azureAddresses = azureSubnetDao.readByAccount(farm.getUserNo());
// Map<Long, AzureSubnet> azureAddressMap = new LinkedHashMap<Long, AzureSubnet>();
// for (CloudstackAddress azureAddress : azureAddresses) {
// if (azureAddress.getInstanceNo() != null) {
// cloudstackAddressMap.put(azureAddress.getInstanceNo(), azureAddress);
// }
// }
// Azureボリュームを取得
List<AzureDisk> farmAzureDisks = azureDiskDao.readByFarmNo(farmNo);
Map<Long, List<AzureDisk>> azureDisksMap = new LinkedHashMap<Long, List<AzureDisk>>();
for (AzureDisk azureDisk : farmAzureDisks) {
Long instanceNo = azureDisk.getInstanceNo();
if (instanceNo != null) {
List<AzureDisk> azureDisks = azureDisksMap.get(instanceNo);
if (azureDisks == null) {
azureDisks = new ArrayList<AzureDisk>();
azureDisksMap.put(instanceNo, azureDisks);
}
azureDisks.add(azureDisk);
}
}
//★★★★★ OpenStack ★★★★★
// OpenStackプラットフォーム取得
List<PlatformOpenstack> platformOpenstacks = platformOpenstackDao.readAll();
Map<Long, PlatformOpenstack> platformOpenstackMap = new LinkedHashMap<Long, PlatformOpenstack>();
for (PlatformOpenstack platformOpenstack : platformOpenstacks) {
platformOpenstackMap.put(platformOpenstack.getPlatformNo(), platformOpenstack);
}
// OpenStackイメージ取得
List<ImageOpenstack> imageOpenstacks = imageOpenstackDao.readAll();
Map<Long, ImageOpenstack> imageOpenstackMap = new LinkedHashMap<Long, ImageOpenstack>();
for (ImageOpenstack imageOpenstack : imageOpenstacks) {
imageOpenstackMap.put(imageOpenstack.getImageNo(), imageOpenstack);
}
// OpenStackインスタンスを取得
List<OpenstackInstance> openstackInstances = openstackInstanceDao.readInInstanceNos(instanceNos);
Map<Long, OpenstackInstance> openstackInstanceMap = new LinkedHashMap<Long, OpenstackInstance>();
for (OpenstackInstance openstackInstance : openstackInstances) {
openstackInstanceMap.put(openstackInstance.getInstanceNo(), openstackInstance);
}
// インスタンスに紐づくコンポーネント情報を取得
List<InstanceDto> dtos = new ArrayList<InstanceDto>();
for (Instance instance : instances) {
ZabbixInstance zabbixInstance = zabbixInstanceMap.get(instance.getInstanceNo());
PlatformDto platformDto = new PlatformDto();
ImageDto imageDto = new ImageDto();
Platform platform = platformMap.get(instance.getPlatformNo());
platformDto.setPlatform(platform);
Image image = imageMap.get(instance.getImageNo());
imageDto.setImage(image);
// TODO CLOUD BRANCHING
if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
platformDto.setPlatformAws(platformAwsMap.get(instance.getPlatformNo()));
imageDto.setImageAws(imageAwsMap.get(instance.getImageNo()));
} else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) {
platformDto.setPlatformCloudstack(platformCloudstackMap.get(instance.getPlatformNo()));
imageDto.setImageCloudstack(imageCloudstackMap.get(instance.getImageNo()));
} else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
platformDto.setPlatformVmware(platformVmwareMap.get(instance.getPlatformNo()));
imageDto.setImageVmware(imageVmwareMap.get(instance.getImageNo()));
} else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
platformDto.setPlatformNifty(platformNiftyMap.get(instance.getPlatformNo()));
imageDto.setImageNifty(imageNiftyMap.get(instance.getImageNo()));
} else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
platformDto.setPlatformVcloud(platformVcloudMap.get(instance.getPlatformNo()));
imageDto.setImageVcloud(imageVcloudMap.get(instance.getImageNo()));
} else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) {
platformDto.setPlatformAzure(platformAzureMap.get(instance.getPlatformNo()));
imageDto.setImageAzure(imageAzureMap.get(instance.getImageNo()));
} else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
platformDto.setPlatformOpenstack(platformOpenstackMap.get(instance.getPlatformNo()));
imageDto.setImageOpenstack(imageOpenstackMap.get(instance.getImageNo()));
}
List<InstanceConfig> instanceConfigs = instanceConfigDao.readByInstanceNo(instance.getInstanceNo());
List<ComponentInstanceDto> componentInstances = new ArrayList<ComponentInstanceDto>();
for (ComponentInstance componentInstance : componentInstanceMap.get(instance.getInstanceNo())) {
ComponentInstanceDto componentInstanceDto = new ComponentInstanceDto();
componentInstanceDto.setComponentInstance(componentInstance);
Component component = componentMap.get(componentInstance.getComponentNo());
String url;
Boolean showPublicIp = BooleanUtils.toBooleanObject(Config.getProperty("ui.showPublicIp"));
if (BooleanUtils.isTrue(showPublicIp)) {
//ui.showPublicIp = true の場合、URLにPublicIpを表示
url = createUrl(instance.getPublicIp(), component.getComponentTypeNo());
} else {
//ui.showPublicIp = false の場合、URLにPrivateIpを表示
url = createUrl(instance.getPrivateIp(), component.getComponentTypeNo());
}
componentInstanceDto.setUrl(url);
componentInstances.add(componentInstanceDto);
}
// 有効無効に応じてステータスを変更する(画面表示用)
InstanceStatus instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
if (BooleanUtils.isTrue(instance.getEnabled())) {
if (instanceStatus == InstanceStatus.STOPPED) {
instance.setStatus(InstanceStatus.STARTING.toString());
}
} else {
if (instanceStatus == InstanceStatus.RUNNING || instanceStatus == InstanceStatus.WARNING) {
instance.setStatus(InstanceStatus.STOPPING.toString());
}
}
// 画面表示用にステータスの変更
// サーバステータス 協調設定ステータス 変換後サーバステータス
// Running Coodinating Configuring
// Running Warning Warning
instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
InstanceCoodinateStatus insCoodiStatus = InstanceCoodinateStatus.fromStatus(instance.getCoodinateStatus());
// サーバステータス(Running)かつ協調設定ステータス(Coodinating)⇒「Configuring」
if (instanceStatus == InstanceStatus.RUNNING && insCoodiStatus == InstanceCoodinateStatus.COODINATING) {
instance.setStatus(InstanceStatus.CONFIGURING.toString());
// サーバステータス(Running)かつ協調設定ステータス(Warning)⇒「Warning」
} else if (instanceStatus == InstanceStatus.RUNNING && insCoodiStatus == InstanceCoodinateStatus.WARNING) {
instance.setStatus(InstanceStatus.WARNING.toString());
}
// インスタンスごとのコンポーネントのステータスを調整する(画面表示用)
instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
for (ComponentInstanceDto componentInstanceDto : componentInstances) {
ComponentInstance componentInstance = componentInstanceDto.getComponentInstance();
ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus());
if (BooleanUtils.isTrue(componentInstance.getEnabled())) {
if (status == ComponentInstanceStatus.STOPPED) {
if (instanceStatus == InstanceStatus.WARNING) {
// インスタンスがWaringであれば、コンポーネントもWarningとする
componentInstance.setStatus(ComponentInstanceStatus.WARNING.toString());
} else if (BooleanUtils.isTrue(farm.getScheduled())) {
componentInstance.setStatus(ComponentInstanceStatus.STARTING.toString());
}
}
} else {
if (status == ComponentInstanceStatus.RUNNING || status == ComponentInstanceStatus.WARNING) {
if (BooleanUtils.isTrue(farm.getScheduled())) {
// ファームが処理対象であれば、Stoppingにする
componentInstance.setStatus(ComponentInstanceStatus.STOPPING.toString());
}
}
}
}
AwsInstance awsInstance = awsInstanceMap.get(instance.getInstanceNo());
AwsAddress awsAddress = awsAddressMap.get(instance.getInstanceNo());
List<AwsVolume> awsVolumes = awsVolumesMap.get(instance.getInstanceNo());
CloudstackInstance cloudstackInstance = cloudstackInstanceMap.get(instance.getInstanceNo());
CloudstackAddress cloudstackAddress = cloudstackAddressMap.get(instance.getInstanceNo());
List<CloudstackVolume> cloudstackVolumes = cloudstackVolumesMap.get(instance.getInstanceNo());
VmwareInstance vmwareInstance = vmwareInstanceMap.get(instance.getInstanceNo());
VmwareAddress vmwareAddress = vmwareAddressMap.get(instance.getInstanceNo());
VmwareKeyPair vmwareKeyPair = null;
if (vmwareInstance != null) {
vmwareKeyPair = vmwareKeyPairMap.get(vmwareInstance.getKeyPairNo());
}
List<VmwareDisk> vmwareDisks = vmwareDisksMap.get(instance.getInstanceNo());
NiftyInstance niftyInstance = niftyInstanceMap.get(instance.getInstanceNo());
NiftyKeyPair niftyKeyPair = null;
if (niftyInstance != null) {
niftyKeyPair = niftyKeyPairMap.get(niftyInstance.getKeyPairNo());
}
List<NiftyVolume> niftyVolumes = niftyVolumesMap.get(instance.getInstanceNo());
VcloudInstance vcloudInstance = vcloudInstanceMap.get(instance.getInstanceNo());
VcloudKeyPair vcloudKeyPair = null;
if (vcloudInstance != null) {
vcloudKeyPair = vcloudKeyPairMap.get(vcloudInstance.getKeyPairNo());
}
List<VcloudDisk> vcloudDisks = vcloudDiskMap.get(instance.getInstanceNo());
List<VcloudInstanceNetwork> vcloudInstanceNetworks = vcloudInstanceNetworkMap.get(instance.getInstanceNo());
if (vcloudInstanceNetworks != null) {
Collections.sort(vcloudInstanceNetworks, Comparators.COMPARATOR_VCLOUD_INSTANCE_NETWORK);
}
PlatformVcloudStorageType platformVcloudStorageType = null;
if (vcloudInstance != null) {
platformVcloudStorageType = platformVcloudStorageTypeMap.get(vcloudInstance.getStorageTypeNo());
}
AzureInstance azureInstance = azureInstanceMap.get(instance.getInstanceNo());
List<AzureDisk> azureDisks = azureDisksMap.get(instance.getInstanceNo());
OpenstackInstance openstackInstance = openstackInstanceMap.get(instance.getInstanceNo());
// ソート
Collections.sort(componentInstances, Comparators.COMPARATOR_COMPONENT_INSTANCE_DTO);
InstanceDto dto = new InstanceDto();
dto.setInstance(instance);
dto.setZabbixInstance(zabbixInstance);
dto.setPlatform(platformDto);
dto.setImage(imageDto);
dto.setInstanceConfigs(instanceConfigs);
dto.setComponentInstances(componentInstances);
dto.setAwsInstance(awsInstance);
dto.setAwsAddress(awsAddress);
dto.setAwsVolumes(awsVolumes);
dto.setCloudstackInstance(cloudstackInstance);
dto.setCloudstackAddress(cloudstackAddress);
dto.setCloudstackVolumes(cloudstackVolumes);
dto.setVmwareInstance(vmwareInstance);
dto.setVmwareAddress(vmwareAddress);
dto.setVmwareKeyPair(vmwareKeyPair);
dto.setVmwareDisks(vmwareDisks);
dto.setNiftyInstance(niftyInstance);
dto.setNiftyKeyPair(niftyKeyPair);
dto.setNiftyVolumes(niftyVolumes);
dto.setVcloudInstance(vcloudInstance);
dto.setVcloudKeyPair(vcloudKeyPair);
dto.setVcloudDisks(vcloudDisks);
dto.setVcloudInstanceNetworks(vcloudInstanceNetworks);
dto.setPlatformVcloudStorageType(platformVcloudStorageType);
dto.setAzureInstance(azureInstance);
dto.setAzureDisks(azureDisks);
dto.setOpenstackInstance(openstackInstance);
dtos.add(dto);
}
// ソート
Collections.sort(dtos, Comparators.COMPARATOR_INSTANCE_DTO);
return dtos;
}
protected Long createInstance(Long farmNo, String instanceName, Long platformNo, String comment, Long imageNo) {
// 引数チェック
if (farmNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "farmNo");
}
if (instanceName == null || instanceName.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "instanceName");
}
if (platformNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "platformNo");
}
if (imageNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "imageNo");
}
// 形式チェック
if (!Pattern.matches("^[0-9a-z]|[0-9a-z][0-9a-z-]*[0-9a-z]$", instanceName)) {
throw new AutoApplicationException("ECOMMON-000012", "instanceName");
}
// イメージ番号のチェック
Image image = imageDao.read(imageNo);
Platform platform = platformDao.read(platformNo);
if (platformNo.equals(image.getPlatformNo()) == false) {
throw new AutoApplicationException("ESERVICE-000405", imageNo, platform.getPlatformName());
}
// TODO: 長さチェック
// インスタンス名の一意チェック
Instance checkInstance = instanceDao.readByFarmNoAndInstanceName(farmNo, instanceName);
if (checkInstance != null) {
// 同名のインスタンスが存在する場合
throw new AutoApplicationException("ESERVICE-000401", instanceName);
}
// ロードバランサ名のチェック
LoadBalancer checkLoadBalancer = loadBalancerDao.readByFarmNoAndLoadBalancerName(farmNo, instanceName);
if (checkLoadBalancer != null) {
// 同名のロードバランサが存在する場合
throw new AutoApplicationException("ESERVICE-000417", instanceName);
}
// ファームの存在チェック
Farm farm = farmDao.read(farmNo);
if (farm == null) {
throw new AutoApplicationException("ESERVICE-000406", farmNo);
}
// fqdnの長さチェック
String fqdn = instanceName + "." + farm.getDomainName();
if (fqdn.length() > 63) {
throw new AutoApplicationException("ESERVICE-000418", fqdn);
}
// TODO: 整合性チェック
// VMwareプラットフォームでのWindowsの場合、VMwareプラットフォーム全体の中に同名のWindowsがいないことのチェック
// TODO: OS種別の判定方法を見直す
if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())
&& StringUtils.startsWithIgnoreCase(image.getOs(), PCCConstant.OS_NAME_WIN)) {
List<Instance> allInstances = instanceDao.readAll();
for (Instance instance2 : allInstances) {
if (StringUtils.equals(instanceName, instance2.getInstanceName())) {
Platform platform2 = platformDao.read(instance2.getPlatformNo());
if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform2.getPlatformType())) {
Image image2 = imageDao.read(instance2.getImageNo());
if (StringUtils.startsWithIgnoreCase(image2.getOs(), PCCConstant.OS_NAME_WIN)) {
// VMwareプラットフォーム上に同名のWindowsがいる場合
throw new AutoApplicationException("ESERVICE-000419", instanceName);
}
}
}
}
}
// インスタンスコードの作成
String instanceCode = passwordGenerator.generate(20);
// インスタンスの作成
Instance instance = new Instance();
instance.setFarmNo(farmNo);
instance.setInstanceName(instanceName);
instance.setPlatformNo(platformNo);
instance.setImageNo(imageNo);
instance.setEnabled(false);
instance.setComment(comment);
instance.setFqdn(fqdn);
instance.setInstanceCode(instanceCode);
instance.setStatus(InstanceStatus.STOPPED.toString());
instanceDao.create(instance);
// TODO: OS種別の判定方法を見直す
if (!StringUtils.startsWithIgnoreCase(image.getOs(), PCCConstant.OS_NAME_WIN)
|| (StringUtils.startsWithIgnoreCase(image.getOs(), PCCConstant.OS_NAME_WIN) && PCCConstant.PLATFORM_TYPE_VMWARE
.equals(platform.getPlatformType()))
|| (StringUtils.startsWithIgnoreCase(image.getOs(), PCCConstant.OS_NAME_WIN) && PCCConstant.PLATFORM_TYPE_AZURE
.equals(platform.getPlatformType()))
|| (StringUtils.startsWithIgnoreCase(image.getOs(), PCCConstant.OS_NAME_WIN) && PCCConstant.PLATFORM_TYPE_OPENSTACK
.equals(platform.getPlatformType()))) {
if (BooleanUtils.isNotTrue(image.getPuppetDisabled())) {
// Puppetインスタンスの作成
PuppetInstance puppetInstance = new PuppetInstance();
puppetInstance.setInstanceNo(instance.getInstanceNo());
puppetInstanceDao.create(puppetInstance);
}
}
Boolean useZabbix = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useZabbix"));
if (BooleanUtils.isTrue(useZabbix)) {
if (BooleanUtils.isNotTrue(image.getZabbixDisabled())) {
// Zabbixインスタンスの作成
ZabbixInstance zabbixInstance = new ZabbixInstance();
zabbixInstance.setInstanceNo(instance.getInstanceNo());
zabbixInstanceDao.create(zabbixInstance);
}
}
return instance.getInstanceNo();
}
/**
* {@inheritDoc}
*/
@Override
public Long createIaasInstance(Long farmNo, String instanceName, Long platformNo, String comment, Long imageNo,
String instanceType) {
// インスタンスの作成
Long instanceNo = createInstance(farmNo, instanceName, platformNo, comment, imageNo);
// プラットフォームのチェック
Platform platform = platformDao.read(platformNo);
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())) {
throw new AutoApplicationException("ESERVICE-000404", instanceName);
}
//ファームの取得
Farm farm = farmDao.read(farmNo);
// TODO CLOUD BRANCHING
if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
PlatformAws platformAws = platformAwsDao.read(platformNo);
ImageAws imageAws = imageAwsDao.read(imageNo);
makeAwsData(farm, instanceNo, instanceType, platformAws, imageAws);
} else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) {
PlatformCloudstack platformCloudstack = platformCloudstackDao.read(platformNo);
makeCloudStackData(farm, instanceNo, instanceType, platformCloudstack);
} else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
PlatformVcloud platformVcloud = platformVcloudDao.read(platformNo);
makeVcloudData(farm, instanceNo, instanceName, instanceType, platformVcloud);
} else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) {
PlatformAzure platformAzure = platformAzureDao.read(platformNo);
makeAzureData(farm, instanceNo, instanceType, platformAzure);
} else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
PlatformOpenstack platformOpenstack = platformOpenstackDao.read(platformNo);
makeOpenstackData(farm, instanceNo, instanceType, platformOpenstack);
}
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farmNo, farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceCreate", instanceType, platformNo, new Object[] { platform.getPlatformName() });
// フック処理の実行
processHook.execute("post-create-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
return instanceNo;
}
private void makeAwsData(Farm farm, Long instanceNo, String instanceType, PlatformAws platformAws, ImageAws imageAws) {
// 引数チェック
String[] instanceTypes = imageAws.getInstanceTypes().split(",");
if (!ArrayUtils.contains(instanceTypes, instanceType)) {
throw new AutoApplicationException("ECOMMON-000001", "instanceType");
}
// AWSインスタンスの作成
AwsInstance awsInstance = new AwsInstance();
awsInstance.setInstanceNo(instanceNo);
awsInstance.setInstanceType(instanceType);
//KeyName
AwsCertificate awsCertificate = awsCertificateDao.read(farm.getUserNo(), platformAws.getPlatformNo());
//キーペアの取得
List<KeyPairInfo> keyPairs = awsDescribeService.getKeyPairs(farm.getUserNo(), platformAws.getPlatformNo());
String keyName = null;
// AWS認証情報に設定されているデフォルトキーペアを設定
for (KeyPairInfo keyPair : keyPairs) {
if (StringUtils.equals(awsCertificate.getDefKeypair(), keyPair.getKeyName())) {
keyName = keyPair.getKeyName();
break;
}
}
if (keyName == null && keyPairs.size() > 0) {
//デフォルトキーペアが存在しない場合は1件目
keyName = keyPairs.get(0).getKeyName();
}
awsInstance.setKeyName(keyName);
if (platformAws.getEuca() == false && platformAws.getVpc()) {
// VPCの場合
// SubnetId & AvailabilityZone
List<Subnet> subnets = awsDescribeService.getSubnets(farm.getUserNo(), platformAws.getPlatformNo());
Subnet subnet = null;
for (Subnet subnet2 : subnets) {
//デフォルトサブネットを設定
if (StringUtils.equals(awsCertificate.getDefSubnet(), subnet2.getSubnetId())) {
subnet = subnet2;
break;
}
}
// デフォルトサブネットが指定されていない場合、1つ目のサブネットを設定する
if (subnet == null && subnets.size() > 0) {
subnet = subnets.get(0);
}
if (subnet != null) {
awsInstance.setSubnetId(subnet.getSubnetId());
awsInstance.setAvailabilityZone(subnet.getAvailabilityZone());
}
} else {
// VPCでない場合
// AvailabilityZone
String zoneName = platformAws.getAvailabilityZone();
if (StringUtils.isEmpty(zoneName) && platformAws.getEuca()) {
// デフォルトのゾーン名が指定されておらず、Eucalyptusの場合のみAPIでゾーン名を取得する
List<AvailabilityZone> availabilityZones = awsDescribeService.getAvailabilityZones(farm.getUserNo(),
platformAws.getPlatformNo());
zoneName = availabilityZones.get(0).getZoneName();
}
awsInstance.setAvailabilityZone(zoneName);
}
// SecurityGroup
String groupName = null;
List<SecurityGroup> securityGroups = awsDescribeService.getSecurityGroups(farm.getUserNo(),
platformAws.getPlatformNo());
groupName = setSecurityGroupAws(securityGroups, "aws.defaultSecurityGroup");
awsInstance.setSecurityGroups(groupName);
// RootSize
if (imageAws.getRootSize() != null) {
awsInstance.setRootSize(imageAws.getRootSize());
}
awsInstanceDao.create(awsInstance);
}
/**
* セキュリティグループ設定
*
* 3つのパターンで作成するインスタンスのデフォルトのセキュリティグループを設定します。
*
* 1.第二引数のconfigKeyで取得した値がセキュリティグループ一覧に存在した場合に
* そのセキュリティグループ名を設定する。
* 2.第二引数のconfigKeyが設定されておらず(または設定されている値が一覧に無い)、
* かつ"default"がセキュリティグループ一覧に存在する場合は"default"を設定する。
* 3.上記1、2の条件を満たすセキュリティグループが存在しない場合は、取得した
* セキュリティグループ一覧の1件目を設定する。
*
* @param securityGroups 利用クラウド環境から取得したセキュリティグループ一覧
* @param configKey config.propertiesの設定キー名
* @return
*/
protected String setSecurityGroupAws(List<SecurityGroup> securityGroups, String configKey) {
String groupName = null;
String defaultSecurityGroup = StringUtils.defaultIfEmpty(Config.getProperty(configKey), "default");
// 1のパターン
if (!defaultSecurityGroup.equals("default")) {
for (SecurityGroup securityGroup : securityGroups) {
if (defaultSecurityGroup.equals(securityGroup.getGroupName())) {
groupName = securityGroup.getGroupName();
break;
}
}
}
// 2のパターン("groupName == null"は設定値が一覧に無い)
if (groupName == null) {
for (SecurityGroup securityGroup : securityGroups) {
if ("default".equals(securityGroup.getGroupName())) {
groupName = securityGroup.getGroupName();
break;
}
}
}
// 3のパターン
if (groupName == null && securityGroups.size() > 0) {
groupName = securityGroups.get(0).getGroupName();
}
return groupName;
}
/**
* セキュリティグループ設定
*
* 3つのパターンで作成するインスタンスのデフォルトのセキュリティグループを設定します。
*
* 1.第二引数のconfigKeyで取得した値がセキュリティグループ一覧に存在した場合に
* そのセキュリティグループ名を設定する。
* 2.第二引数のconfigKeyが設定されておらず(または設定されている値が一覧に無い)、
* かつ"default"がセキュリティグループ一覧に存在する場合は"default"を設定する。
* 3.上記1、2の条件を満たすセキュリティグループが存在しない場合は、取得した
* セキュリティグループ一覧の1件目を設定する。
*
* @param securityGroups 利用クラウド環境から取得したセキュリティグループ一覧
* @param configKey config.propertiesの設定キー名
* @return
*/
protected String setSecurityGroup(List<SecurityGroupDto> securityGroups, String configKey) {
String groupName = null;
String defaultSecurityGroup = StringUtils.defaultIfEmpty(Config.getProperty(configKey), "default");
// 1のパターン
if (!defaultSecurityGroup.equals("default")) {
for (SecurityGroupDto securityGroup : securityGroups) {
if (defaultSecurityGroup.equals(securityGroup.getGroupName())) {
groupName = securityGroup.getGroupName();
break;
}
}
}
// 2のパターン("groupName == null"は設定値が一覧に無い)
if (groupName == null) {
for (SecurityGroupDto securityGroup : securityGroups) {
if ("default".equals(securityGroup.getGroupName())) {
groupName = securityGroup.getGroupName();
break;
}
}
}
// 3のパターン
if (groupName == null && securityGroups.size() > 0) {
groupName = securityGroups.get(0).getGroupName();
}
return groupName;
}
private void makeCloudStackData(Farm farm, Long instanceNo, String instanceType,
PlatformCloudstack platformCloudstack) {
// AWSインスタンスの作成
CloudstackInstance cloudstackInstance = new CloudstackInstance();
cloudstackInstance.setInstanceNo(instanceNo);
cloudstackInstance.setInstanceType(instanceType);
//KeyName
//Cloudstack認証情報の取得
CloudstackCertificate cloudstackCertificate = cloudstackCertificateDao.read(farm.getUserNo(),
platformCloudstack.getPlatformNo());
//キーペアの取得
List<KeyPairDto> keyPairInfos = iaasDescribeService.getKeyPairs(farm.getUserNo(),
platformCloudstack.getPlatformNo());
String keyName = null;
// CLOUDSTACK認証情報に設定されているデフォルトキーペアを設定
for (KeyPairDto keyPairDto : keyPairInfos) {
if (StringUtils.equals(cloudstackCertificate.getDefKeypair(), keyPairDto.getKeyName())) {
keyName = keyPairDto.getKeyName();
break;
}
}
if (keyName == null && keyPairInfos.size() > 0) {
//デフォルトキーペアが存在しない場合は1件目
keyName = keyPairInfos.get(0).getKeyName();
}
cloudstackInstance.setKeyName(keyName);
//TODO ZONEID, NETWORKID, SECURITYGROUP はどうやって手に入れるか @@今はプロパティからを想定しておく
String zoneId = platformCloudstack.getZoneId();
String[] networks = platformCloudstack.getNetworkId().split(",");
String netId = networks[0];
cloudstackInstance.setZoneid(zoneId);
cloudstackInstance.setNetworkid(netId);
String groupName = null;
List<SecurityGroupDto> securityGroups = iaasDescribeService.getSecurityGroups(farm.getUserNo(),
platformCloudstack.getPlatformNo(), null);
groupName = setSecurityGroup(securityGroups, "cloudStack.defaultSecurityGroup");
cloudstackInstance.setSecuritygroup(groupName);
cloudstackInstanceDao.create(cloudstackInstance);
}
private void makeVcloudData(Farm farm, Long instanceNo, String instanceName, String instanceType,
PlatformVcloud platformVcloud) {
// VCloudインスタンスの作成
VcloudInstance vcloudInstance = new VcloudInstance();
vcloudInstance.setInstanceNo(instanceNo);
//VM名
//サーバ起動後に名称を設定するので、ここではNULLを設定
//(VCloud上にインスタンスが作成されているかどうか判定する為)
vcloudInstance.setVmName(null);
//キーペア
//キーペアはユーザ名のキーペアをデフォルトとして設定
List<VcloudKeyPair> vcloudKeyPairs = vcloudKeyPairDao.readByUserNoAndPlatformNo(farm.getUserNo(),
platformVcloud.getPlatformNo());
Long keyPairNo = vcloudKeyPairs.get(0).getKeyNo();
vcloudInstance.setKeyPairNo(keyPairNo);
//ストレージタイプ
List<PlatformVcloudStorageType> storageTypes = platformVcloudStorageTypeDao.readByPlatformNo(platformVcloud
.getPlatformNo());
Collections.sort(storageTypes, Comparators.COMPARATOR_PLATFORM_VCLOUD_STORAGE_TYPE);
vcloudInstance.setStorageTypeNo(storageTypes.get(0).getStorageTypeNo());
//インスタンスタイプ
vcloudInstance.setInstanceType(instanceType);
//VCLOUD_INSTANCE作成
vcloudInstanceDao.create(vcloudInstance);
//ネットワーク
//プライマリは必ずしもPCCネットワークでは無いが、
//IaasGateWay処理で一律、PCCネットワークを先頭に設定する為、
//VCLOUD_INSTANCE_NETWORKもPCCネットワークを先頭に設定する。
Boolean showPublicIp = BooleanUtils.toBooleanObject(Config.getProperty("ui.showPublicIp"));
List<NetworkDto> networkDtos = iaasDescribeService
.getNetworks(farm.getUserNo(), platformVcloud.getPlatformNo());
for (int i = 0; i < networkDtos.size(); i++) {
NetworkDto networkDto = networkDtos.get(i);
//PCCネットワークと デフォルトネットワークを初期設定とする
//インデックスはサーバ起動時にIaasGateWay側で設定されるのでNULLを設定
//IPアドレスはサーバ編集時またはサーバ起動時にIaasGateWay側で設定されるのでNULLを設定
//PCCネットワークとデフォルトネットワークの設定値が同じ場合は1件だけ追加する
if (networkDto.isPcc()
|| (!networkDto.isPcc() && StringUtils.equals(networkDto.getNetworkName(),
platformVcloud.getDefNetwork()))) {
VcloudInstanceNetwork vcloudInstanceNetwork = new VcloudInstanceNetwork();
vcloudInstanceNetwork.setPlatformNo(platformVcloud.getPlatformNo());
vcloudInstanceNetwork.setInstanceNo(instanceNo);
vcloudInstanceNetwork.setFarmNo(farm.getFarmNo());
vcloudInstanceNetwork.setNetworkName(networkDto.getNetworkName());
vcloudInstanceNetwork.setNetworkIndex(null);
vcloudInstanceNetwork.setIpMode("POOL");
vcloudInstanceNetwork.setIpAddress(null);
//config.propertiesの「showPublicIp」= true → PCCネットワークがプライマリ
//config.propertiesの「showPublicIp」= false → デフォルトネットワーク(業務ネットワーク)がプライマリ
if (networkDto.isPcc()) {
vcloudInstanceNetwork.setIsPrimary(BooleanUtils.isTrue(showPublicIp));
} else if (StringUtils.equals(networkDto.getNetworkName(), platformVcloud.getDefNetwork())) {
vcloudInstanceNetwork.setIsPrimary(BooleanUtils.isNotTrue(showPublicIp));
}
//VCLOUD_INSTANCE_NETWORK作成
vcloudInstanceNetworkDao.create(vcloudInstanceNetwork);
}
}
}
private void makeAzureData(Farm farm, Long instanceNo, String instanceType, PlatformAzure platformAzure) {
// Azureインスタンスの作成
AzureInstance azureInstance = new AzureInstance();
azureInstance.setInstanceNo(instanceNo);
// AFFINITY_GROUP_NAME
String affinityGroupName = platformAzure.getAffinityGroupName();
azureInstance.setAffinityGroupName(affinityGroupName);
// CLOUD_SERVICE_NAME
String cloudServiceName = platformAzure.getCloudServiceName();
azureInstance.setCloudServiceName(cloudServiceName);
// STORAGE_ACCOUNT_NAME
String storageAccountName = platformAzure.getStorageAccountName();
azureInstance.setStorageAccountName(storageAccountName);
// NETWORK_NAME
String networkName = platformAzure.getNetworkName();
azureInstance.setNetworkName(networkName);
// INSTANCE_TYPE
azureInstance.setInstanceType(instanceType);
// SUBNET_ID
String subnetId = null;
// AzureCertificate情報取得
AzureCertificate azureCertificate = azureCertificateDao.read(farm.getUserNo(), platformAzure.getPlatformNo());
// SubnetId
List<SubnetDto> subnets = iaasDescribeService.getAzureSubnets(farm.getUserNo(), platformAzure.getPlatformNo(),
platformAzure.getNetworkName());
SubnetDto subnet = null;
for (SubnetDto subnetDto : subnets) {
// デフォルトサブネットを設定
if (StringUtils.equals(azureCertificate.getDefaultSubnetId(), subnetDto.getSubnetId())) {
// サブネットが一致するものを設定
subnet = subnetDto;
break;
}
}
if (subnet == null && subnets.size() > 0) {
//デフォルトサブネットが存在しない場合は1件目
subnet = subnets.get(0);
}
if (subnet != null) {
subnetId = subnet.getSubnetId();
azureInstance.setSubnetId(subnetId);
}
// 可用性セット
// DBに初期設定がある場合、1件目のデータを設定する
if (StringUtils.isNotEmpty(platformAzure.getAvailabilitySets())) {
String[] availabilitySets = StringUtils.split(platformAzure.getAvailabilitySets(), ",");
azureInstance.setAvailabilitySet(availabilitySets[0].trim());
}
azureInstanceDao.create(azureInstance);
}
private void makeOpenstackData(Farm farm, Long instanceNo, String instanceType, PlatformOpenstack platformOpenstack) {
// Openstackインスタンスの作成
OpenstackInstance openstackInstance = new OpenstackInstance();
//INSTANCE_NO
openstackInstance.setInstanceNo(instanceNo);
//KEY_NAME
OpenstackCertificate openstackCertificate = openstackCertificateDao.read(farm.getUserNo(),
platformOpenstack.getPlatformNo());
openstackInstance.setKeyName(openstackCertificate.getDefKeypair());
//INSTANCE_TYPE
openstackInstance.setInstanceType(instanceType);
//SECURITY_GROUPS
String groupName = null;
List<SecurityGroupDto> securityGroups = iaasDescribeService.getSecurityGroups(farm.getUserNo(),
platformOpenstack.getPlatformNo(), null);
groupName = setSecurityGroup(securityGroups, "openStack.defaultSecurityGroup");
openstackInstance.setSecurityGroups(groupName);
//AVAILABILITY_ZONE
String zoneName = platformOpenstack.getAvailabilityZone();
if (StringUtils.isEmpty(zoneName)) {
// デフォルトのゾーン名が指定されていない場合
List<ZoneDto> availabilityZones = iaasDescribeService.getAvailabilityZones(farm.getUserNo(),
platformOpenstack.getPlatformNo());
zoneName = availabilityZones.get(0).getZoneName();
}
openstackInstance.setAvailabilityZone(zoneName);
//NETWORK_ID
String[] networks = platformOpenstack.getNetworkId().split(",");
String netId = networks[0];
openstackInstance.setNetworkId(netId);
openstackInstanceDao.create(openstackInstance);
}
/**
* {@inheritDoc}
*/
@Override
public Long createVmwareInstance(Long farmNo, String instanceName, Long platformNo, String comment, Long imageNo,
String instanceType) {
// インスタンスの作成
Long instanceNo = createInstance(farmNo, instanceName, platformNo, comment, imageNo);
// 引数チェック
if (instanceType == null || instanceType.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "instanceType");
}
// プラットフォームのチェック
Platform platform = platformDao.read(platformNo);
if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000408", instanceName);
}
PlatformVmware platformVmware = platformVmwareDao.read(platformNo);
// VMwareインスタンスの作成
VmwareInstance vmwareInstance = new VmwareInstance();
vmwareInstance.setInstanceNo(instanceNo);
// 仮想マシン名
Farm farm = farmDao.read(farmNo);
String machineName = farm.getFarmName() + "_" + instanceName;
vmwareInstance.setMachineName(machineName);
// InstanceType
vmwareInstance.setInstanceType(instanceType);
// クラスタ、ホスト
String computeResource = platformVmware.getComputeResource();
if (StringUtils.isEmpty(computeResource)) {
List<ComputeResource> computeResources = vmwareDescribeService.getComputeResources(platformNo);
computeResource = computeResources.get(0).getName();
}
vmwareInstance.setComputeResource(computeResource);
// リソースプール
// TODO: リソースプールの選択をどうする?
String resourcePool = null;
vmwareInstance.setResourcePool(resourcePool);
// データストア(この時点ではデータストアを決めない)
String datastore = null;
vmwareInstance.setDatastore(datastore);
// キーペア
List<VmwareKeyPair> vmwareKeyPairs = vmwareKeyPairDao.readByUserNoAndPlatformNo(farm.getUserNo(), platformNo);
Long keyPairNo = vmwareKeyPairs.get(0).getKeyNo();
vmwareInstance.setKeyPairNo(keyPairNo);
// RootSize
ImageVmware imageVmware = imageVmwareDao.read(imageNo);
if (imageVmware.getRootSize() != null) {
vmwareInstance.setRootSize(imageVmware.getRootSize());
}
vmwareInstanceDao.create(vmwareInstance);
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farmNo, farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceCreate", instanceType, platformNo, new Object[] { platform.getPlatformName() });
// フック処理の実行
processHook.execute("post-create-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
return instanceNo;
}
/**
* {@inheritDoc}
*/
@Override
public Long createNiftyInstance(Long farmNo, String instanceName, Long platformNo, String comment, Long imageNo,
String instanceType) {
// インスタンスの作成
Long instanceNo = createInstance(farmNo, instanceName, platformNo, comment, imageNo);
// 引数チェック
if (instanceType == null || instanceType.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "instanceType");
}
// プラットフォームのチェック
Platform platform = platformDao.read(platformNo);
if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000410", instanceName);
}
// Niftyインスタンスの作成
NiftyInstance niftyInstance = new NiftyInstance();
niftyInstance.setInstanceNo(instanceNo);
niftyInstance.setInstanceType(instanceType);
Farm farm = farmDao.read(farmNo);
List<NiftyKeyPair> niftyKeyPairs = niftyKeyPairDao.readByUserNoAndPlatformNo(farm.getUserNo(), platformNo);
niftyInstance.setKeyPairNo(niftyKeyPairs.get(0).getKeyNo());
niftyInstanceDao.create(niftyInstance);
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farmNo, farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceCreate", instanceType, platformNo, new Object[] { platform.getPlatformName() });
// フック処理の実行
processHook.execute("post-create-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
return instanceNo;
}
protected void updateInstance(Long instanceNo, String instanceName, String comment) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
if (instanceName == null || instanceName.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "instanceName");
}
// 形式チェック
if (!Pattern.matches("^[0-9a-z]|[0-9a-z][0-9a-z-]*[0-9a-z]$", instanceName)) {
throw new AutoApplicationException("ECOMMON-000012", "instanceName");
}
// TODO: 長さチェック
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
// インスタンスが存在しない場合
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// インスタンスが停止状態でない場合
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!StringUtils.equals(instance.getInstanceName(), instanceName)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
// インスタンス名を変更する場合
if (!StringUtils.equals(instance.getInstanceName(), instanceName)) {
// インスタンス名の一意チェック
Instance checkInstance = instanceDao.readByFarmNoAndInstanceName(instance.getFarmNo(), instanceName);
if (checkInstance != null && !instanceNo.equals(checkInstance.getInstanceNo())) {
// 同名のインスタンスが存在する場合
throw new AutoApplicationException("ESERVICE-000401", instanceName);
}
// ロードバランサ名のチェック
LoadBalancer checkLoadBalancer = loadBalancerDao.readByFarmNoAndLoadBalancerName(instance.getFarmNo(),
instanceName);
if (checkLoadBalancer != null) {
// 同名のロードバランサが存在する場合
throw new AutoApplicationException("ESERVICE-000417", instanceName);
}
}
// フック処理の実行
Farm farm = farmDao.read(instance.getFarmNo());
processHook.execute("pre-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
// インスタンスの更新
instance.setInstanceName(instanceName);
instance.setComment(comment);
instance.setFqdn(instanceName + "." + farm.getDomainName());
instanceDao.update(instance);
}
/**
* {@inheritDoc}
*/
@Override
public void updateAwsInstance(Long instanceNo, String instanceName, String comment, String keyName,
String instanceType, String securityGroupName, String availabilityZoneName, Long addressNo,
String subnetId, Integer rootSize, String privateIpAddress) {
// インスタンスの更新
updateInstance(instanceNo, instanceName, comment);
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
if (keyName == null || keyName.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "keyName");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// プラットフォームのチェック
Platform platform = platformDao.read(instance.getPlatformNo());
if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000404", instance.getInstanceName());
}
//ファーム取得
Farm farm = farmDao.read(instance.getFarmNo());
// インスタンスが停止状態でない場合
AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!StringUtils.equals(awsInstance.getKeyName(), keyName)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!StringUtils.equals(awsInstance.getInstanceType(), instanceType)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (StringUtils.isEmpty(awsInstance.getSecurityGroups()) ? StringUtils.isNotEmpty(securityGroupName)
: !StringUtils.equals(awsInstance.getSecurityGroups(), securityGroupName)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (StringUtils.isEmpty(awsInstance.getAvailabilityZone()) ? StringUtils.isNotEmpty(availabilityZoneName)
: !StringUtils.equals(awsInstance.getAvailabilityZone(), availabilityZoneName)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (StringUtils.isEmpty(awsInstance.getSubnetId()) ? StringUtils.isNotEmpty(subnetId) : !StringUtils
.equals(awsInstance.getSubnetId(), subnetId)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (awsInstance.getRootSize() == null ? rootSize != null : !awsInstance.getRootSize().equals(rootSize)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (StringUtils.isEmpty(awsInstance.getPrivateIpAddress()) ? StringUtils.isNotEmpty(privateIpAddress)
: !StringUtils.equals(awsInstance.getPrivateIpAddress(), privateIpAddress)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
// インスタンスタイプのチェック
ImageAws imageAws = imageAwsDao.read(instance.getImageNo());
String[] instanceTypes = imageAws.getInstanceTypes().split(",");
if (!ArrayUtils.contains(instanceTypes, instanceType)) {
throw new AutoApplicationException("ECOMMON-000001", "instanceType");
}
// セキュリティグループのチェック
if (StringUtils.isEmpty(awsInstance.getSubnetId()) && StringUtils.isEmpty(securityGroupName)) {
throw new AutoApplicationException("ECOMMON-000003", "securityGroupName");
}
// ゾーンのチェック
PlatformAws platformAws = platformAwsDao.read(instance.getPlatformNo());
if (platformAws.getEuca() == false && platformAws.getVpc()) {
if (StringUtils.equals(awsInstance.getSubnetId(), subnetId) == false) {
//VPCの場合、サブネットでゾーンが決まるのでサブネットで判断する
if (awsVolumeDao.countByInstanceNo(instanceNo) > 0) {
// EBS作成後はサブネット(ゾーン)を変更できない
throw new AutoApplicationException("ESERVICE-000421");
}
}
} else {
if (StringUtils.isEmpty(awsInstance.getAvailabilityZone()) ? StringUtils.isNotEmpty(availabilityZoneName)
: !StringUtils.equals(awsInstance.getAvailabilityZone(), availabilityZoneName)) {
if (awsVolumeDao.countByInstanceNo(instanceNo) > 0) {
// EBS作成後はゾーンを変更できない
throw new AutoApplicationException("ESERVICE-000412");
}
}
}
//サブネットのチェック
if (StringUtils.isNotEmpty(subnetId) && StringUtils.isNotEmpty(privateIpAddress)) {
//AWS_INSTANCEのsubnet重複チェック
List<Instance> instances = instanceDao.readByFarmNo(farm.getFarmNo());
List<Long> instanceNos = new ArrayList<Long>();
for (Instance tmpInstance : instances) {
if (instanceNo.equals(tmpInstance.getInstanceNo()) == false) {
instanceNos.add(tmpInstance.getInstanceNo());
}
}
List<AwsInstance> awsInstances = awsInstanceDao.readInInstanceNos(instanceNos);
for (AwsInstance tmpAwsInstance : awsInstances) {
if (subnetId.equals(tmpAwsInstance.getSubnetId())
&& privateIpAddress.equals(tmpAwsInstance.getPrivateIpAddress())) {
//同じsubnetIdで同じprivateIpAddressの別のAWS_INSTANCEが存在する場合
throw new AutoApplicationException("ESERVICE-000420", privateIpAddress);
}
}
}
// ルートサイズのチェック
if (rootSize != null) {
if (BooleanUtils.isNotTrue(imageAws.getEbsImage())) {
Image image = imageDao.read(instance.getImageNo());
throw new AutoApplicationException("ESERVICE-000430", image.getImageName());
}
if (imageAws.getRootSize() == null) {
Image image = imageDao.read(instance.getImageNo());
throw new AutoApplicationException("ESERVICE-000431", image.getImageName());
}
if (StringUtils.isNotEmpty(awsInstance.getInstanceId()) && !rootSize.equals(awsInstance.getRootSize())) {
throw new AutoApplicationException("ESERVICE-000432", instance.getInstanceName());
}
if (StringUtils.isEmpty(awsInstance.getInstanceId())) {
int maxRootSize = NumberUtils.toInt(Config.getProperty("aws.maxRootSize"), 1024);
if (rootSize.intValue() < imageAws.getRootSize() || rootSize.intValue() > maxRootSize) {
throw new AutoApplicationException("ESERVICE-000433", imageAws.getRootSize(), maxRootSize);
}
}
}
// AWSアドレスのチェック
AwsAddress awsAddress = null;
if (addressNo != null) {
// AWSアドレスの存在チェック
awsAddress = awsAddressDao.read(addressNo);
if (awsAddress == null) {
throw new AutoApplicationException("ESERVICE-000415", addressNo);
}
// 他インスタンスに割り当てられていないかどうかのチェック
if (awsAddress.getInstanceNo() != null && !instanceNo.equals(awsAddress.getInstanceNo())) {
// 他のインスタンスに割り当てられている場合
throw new AutoApplicationException("ESERVICE-000416", awsAddress.getPublicIp());
}
}
// AWSインスタンスの更新
awsInstance.setKeyName(keyName);
awsInstance.setInstanceType(instanceType);
awsInstance.setSecurityGroups(securityGroupName);
awsInstance.setAvailabilityZone(availabilityZoneName);
awsInstance.setSubnetId(subnetId);
if (rootSize != null && StringUtils.isEmpty(awsInstance.getInstanceId())) {
awsInstance.setRootSize(rootSize);
}
awsInstance.setPrivateIpAddress(privateIpAddress);
awsInstanceDao.update(awsInstance);
// 他のAWSアドレスが割り当てられている場合、割り当てを外す
List<AwsAddress> awsAddresses = awsAddressDao.readByInstanceNo(instanceNo);
for (AwsAddress address : awsAddresses) {
if (address.getAddressNo().equals(addressNo)) {
continue;
}
address.setInstanceNo(null);
awsAddressDao.update(address);
}
// AWSアドレスをインスタンスに割り当てる
if (addressNo != null && !instanceNo.equals(awsAddress.getInstanceNo())) {
awsAddress.setInstanceNo(instanceNo);
awsAddressDao.update(awsAddress);
}
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceUpdate", instanceType, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void updateCloudstackInstance(Long instanceNo, String instanceName, String comment, String keyName,
String instanceType, String securityGroupName, String zoneid, Long addressNo) {
// インスタンスの更新
updateInstance(instanceNo, instanceName, comment);
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// プラットフォームのチェック
Platform platform = platformDao.read(instance.getPlatformNo());
if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000404", instance.getInstanceName());
}
// インスタンスが停止状態でない場合
CloudstackInstance cloudstackInstance = cloudstackInstanceDao.read(instanceNo);
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!StringUtils.equals(cloudstackInstance.getKeyName(), keyName)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!StringUtils.equals(cloudstackInstance.getInstanceType(), instanceType)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (StringUtils.isEmpty(cloudstackInstance.getSecuritygroup()) ? StringUtils.isNotEmpty(securityGroupName)
: !StringUtils.equals(cloudstackInstance.getSecuritygroup(), securityGroupName)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (StringUtils.isEmpty(cloudstackInstance.getZoneid()) ? StringUtils.isNotEmpty(zoneid) : !StringUtils
.equals(cloudstackInstance.getZoneid(), zoneid)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
// ゾーンのチェック
if (StringUtils.isEmpty(cloudstackInstance.getZoneid()) ? StringUtils.isNotEmpty(zoneid) : !StringUtils.equals(
cloudstackInstance.getZoneid(), zoneid)) {
if (cloudstackVolumeDao.countByInstanceNo(instanceNo) > 0) {
// EBS作成後はゾーンを変更できない
throw new AutoApplicationException("ESERVICE-000412", instance.getInstanceName());
}
}
//アドレスのチェック
CloudstackAddress cloudstackAddress = null;
if (addressNo != null) {
// アドレスの存在チェック
cloudstackAddress = cloudstackAddressDao.read(addressNo);
if (cloudstackAddress == null) {
throw new AutoApplicationException("ESERVICE-000415", addressNo);
}
// 他インスタンスに割り当てられていないかどうかのチェック
if (cloudstackAddress.getInstanceNo() != null && !instanceNo.equals(cloudstackAddress.getInstanceNo())) {
// 他のインスタンスに割り当てられている場合
throw new AutoApplicationException("ESERVICE-000416", cloudstackAddress.getIpaddress());
}
}
// インスタンスの更新
cloudstackInstance.setKeyName(keyName);
cloudstackInstance.setInstanceType(instanceType);
cloudstackInstance.setSecuritygroup(securityGroupName);
cloudstackInstance.setZoneid(zoneid);
cloudstackInstanceDao.update(cloudstackInstance);
// 他のアドレスが割り当てられている場合、割り当てを外す
List<CloudstackAddress> cloudstackAddresses = cloudstackAddressDao.readByInstanceNo(instanceNo);
for (CloudstackAddress address : cloudstackAddresses) {
if (address.getAddressNo().equals(addressNo)) {
continue;
}
address.setInstanceNo(null);
cloudstackAddressDao.update(address);
}
// アドレスをインスタンスに割り当てる
if (addressNo != null && !instanceNo.equals(cloudstackAddress.getInstanceNo())) {
cloudstackAddress.setInstanceNo(instanceNo);
cloudstackAddressDao.update(cloudstackAddress);
}
// イベントログ出力
Farm farm = farmDao.read(instance.getFarmNo());
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceUpdate", instanceType, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void updateVcloudInstance(Long instanceNo, String instanceName, String comment, Long storageTypeNo,
Long keyPairNo, String instanceType, List<InstanceNetworkDto> instanceNetworkDtos) {
// インスタンスの更新
updateInstance(instanceNo, instanceName, comment);
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// プラットフォームのチェック
Platform platform = platformDao.read(instance.getPlatformNo());
if (!PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
throw new AutoApplicationException("ESERVICE-000428", instance.getInstanceName());
}
// インスタンスが停止状態でない場合
VcloudInstance vcloudInstance = vcloudInstanceDao.read(instanceNo);
List<VcloudInstanceNetwork> vcloudInstanceNetworks = vcloudInstanceNetworkDao.readByInstanceNo(instanceNo);
Map<Long, VcloudInstanceNetwork> vcloudInstanceNetworkMap = new LinkedHashMap<Long, VcloudInstanceNetwork>();
for (VcloudInstanceNetwork vcloudInstanceNetwork : vcloudInstanceNetworks) {
vcloudInstanceNetworkMap.put(vcloudInstanceNetwork.getNetworkNo(), vcloudInstanceNetwork);
}
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!vcloudInstance.getStorageTypeNo().equals(storageTypeNo)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!vcloudInstance.getKeyPairNo().equals(keyPairNo)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!StringUtils.equals(vcloudInstance.getInstanceType(), instanceType)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
for (InstanceNetworkDto instanceNetworkDto : instanceNetworkDtos) {
if (instanceNetworkDto.isNew()) {
//新規追加されている場合
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
} else if (instanceNetworkDto.isDelete()) {
//削除されている場合
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
} else {
VcloudInstanceNetwork oldVcloudInstanceNetwork = vcloudInstanceNetworkMap.get(instanceNetworkDto
.getNetworkNo());
if (!StringUtils.equals(oldVcloudInstanceNetwork.getIpMode(), instanceNetworkDto.getIpMode())
|| !StringUtils.equals(oldVcloudInstanceNetwork.getIpAddress(),
instanceNetworkDto.getIpAddress())) {
//編集されている場合
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
}
}
Farm farm = farmDao.read(instance.getFarmNo());
// VCloudインスタンスの更新
vcloudInstance.setStorageTypeNo(storageTypeNo);
vcloudInstance.setKeyPairNo(keyPairNo);
vcloudInstance.setInstanceType(instanceType);
vcloudInstanceDao.update(vcloudInstance);
//VCloudInstanceNetworkの更新
for (InstanceNetworkDto instanceNetworkDto : instanceNetworkDtos) {
if (instanceNetworkDto.isNew()) {
//新規追加
VcloudInstanceNetwork vcloudInstanceNetwork = new VcloudInstanceNetwork();
vcloudInstanceNetwork.setNetworkName(instanceNetworkDto.getNetworkName());
// サーバ起動時のIaasGateWay処理でインデックスが決定するので、ここではNULLを設定
vcloudInstanceNetwork.setNetworkIndex(null);
vcloudInstanceNetwork.setPlatformNo(platform.getPlatformNo());
vcloudInstanceNetwork.setFarmNo(instance.getFarmNo());
vcloudInstanceNetwork.setInstanceNo(instanceNo);
vcloudInstanceNetwork.setIpMode(instanceNetworkDto.getIpMode());
vcloudInstanceNetwork.setIpAddress(instanceNetworkDto.getIpAddress());
vcloudInstanceNetwork.setIsPrimary(instanceNetworkDto.isPrimary());
vcloudInstanceNetworkDao.create(vcloudInstanceNetwork);
} else if (instanceNetworkDto.isDelete()) {
//削除
VcloudInstanceNetwork vcloudInstanceNetwork = vcloudInstanceNetworkMap.get(instanceNetworkDto
.getNetworkNo());
vcloudInstanceNetworkDao.delete(vcloudInstanceNetwork);
} else {
//更新
VcloudInstanceNetwork vcloudInstanceNetwork = vcloudInstanceNetworkMap.get(instanceNetworkDto
.getNetworkNo());
vcloudInstanceNetwork.setIpMode(instanceNetworkDto.getIpMode());
vcloudInstanceNetwork.setIpAddress(instanceNetworkDto.getIpAddress());
vcloudInstanceNetwork.setIsPrimary(instanceNetworkDto.isPrimary());
vcloudInstanceNetworkDao.update(vcloudInstanceNetwork);
}
}
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceUpdate", instanceType, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void updateAzureInstance(Long instanceNo, String instanceName, String comment, String instanceType,
String availabilitySet, String subnetId) {
// インスタンスの更新
updateInstance(instanceNo, instanceName, comment);
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// プラットフォームのチェック
Platform platform = platformDao.read(instance.getPlatformNo());
if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000404", instance.getInstanceName());
}
//ファーム取得
Farm farm = farmDao.read(instance.getFarmNo());
// インスタンスが停止状態でない場合
AzureInstance azureInstance = azureInstanceDao.read(instanceNo);
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!StringUtils.equals(azureInstance.getInstanceType(), instanceType)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!StringUtils.equals(azureInstance.getAvailabilitySet(), availabilitySet)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!StringUtils.equals(azureInstance.getSubnetId(), subnetId)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
// Azureインスタンスの更新
azureInstance.setInstanceType(instanceType);
azureInstance.setAvailabilitySet(availabilitySet);
azureInstance.setSubnetId(subnetId);
azureInstanceDao.update(azureInstance);
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceUpdate", instanceType, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void updateOpenStackInstance(Long instanceNo, String instanceName, String comment, String instanceType,
String availabilityZoneName, String securityGroupName, String keyName) {
// インスタンスの更新
updateInstance(instanceNo, instanceName, comment);
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// プラットフォームのチェック
Platform platform = platformDao.read(instance.getPlatformNo());
if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000404", instance.getInstanceName());
}
//ファーム取得
Farm farm = farmDao.read(instance.getFarmNo());
// インスタンスが停止状態でない場合
OpenstackInstance openstackInstance = openstackInstanceDao.read(instanceNo);
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!StringUtils.equals(openstackInstance.getInstanceType(), instanceType)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
// Openstackインスタンスの更新
openstackInstance.setInstanceType(instanceType);
openstackInstance.setAvailabilityZone(availabilityZoneName);
openstackInstance.setKeyName(keyName);
openstackInstance.setSecurityGroups(securityGroupName);
openstackInstanceDao.update(openstackInstance);
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceUpdate", instanceType, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public Long createDataDisk(Long instanceNo, DataDiskDto dataDiskDto) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
//ステータスチェック
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED
&& InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.RUNNING) {
//インスタンスが停止済み or 起動済み状態で無い場合
throw new AutoApplicationException("ESERVICE-000429", instance.getInstanceName());
}
//新規追加
VcloudDisk vcloudDisk = new VcloudDisk();
vcloudDisk.setFarmNo(instance.getFarmNo());
vcloudDisk.setPlatformNo(instance.getPlatformNo());
vcloudDisk.setComponentNo(null);
vcloudDisk.setInstanceNo(instanceNo);
vcloudDisk.setSize(dataDiskDto.getDiskSize());
//UNIT NOはIaasGateWayでディスクをアタッチした後に動的に決定するので、NULLで登録
vcloudDisk.setUnitNo(null);
vcloudDisk.setAttached(false);
vcloudDisk.setDataDisk(true);
vcloudDiskDao.create(vcloudDisk);
return vcloudDisk.getDiskNo();
}
/**
* {@inheritDoc}
*/
@Override
public void updateDataDisk(Long instanceNo, DataDiskDto dataDiskDto) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
//ステータスチェック
VcloudDisk vcloudDisk = vcloudDiskDao.read(dataDiskDto.getDiskNo());
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED
&& InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.RUNNING) {
//インスタンスが停止済み or 起動済み状態で無い場合
if (!vcloudDisk.getSize().equals(dataDiskDto.getDiskSize())) {
//ディスクサイズが変更された場合
throw new AutoApplicationException("ESERVICE-000429", instance.getInstanceName());
}
}
//更新
vcloudDisk.setSize(dataDiskDto.getDiskSize());
vcloudDiskDao.update(vcloudDisk);
}
/**
* {@inheritDoc}
*/
@Override
public void attachDataDisk(Long instanceNo, Long diskNo) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
//ステータスチェック
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED
&& InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.RUNNING) {
//インスタンスが停止済み or 起動済み状態で無い場合
throw new AutoApplicationException("ESERVICE-000429", instance.getInstanceName());
}
//IaasGateWay処理
VcloudDisk vcloudDisk = vcloudDiskDao.read(diskNo);
VcloudInstance vcloudInstance = vcloudInstanceDao.read(instanceNo);
if (StringUtils.isNotEmpty(vcloudInstance.getVmName())) {
//VCloud上にインスタンスが存在する場合のみ、ディスクのアタッチ処理を行う
Farm farm = farmDao.read(instance.getFarmNo());
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
instance.getPlatformNo());
//IaasGateWay処理
gateway.startVolume(instanceNo, vcloudDisk.getDiskNo());
}
}
/**
* {@inheritDoc}
*/
@Override
public void detachDataDisk(Long instanceNo, Long diskNo) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
//ステータスチェック
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED
&& InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.RUNNING) {
//インスタンスが停止済み or 起動済み状態で無い場合
throw new AutoApplicationException("ESERVICE-000429", instance.getInstanceName());
}
//IaasGateWay処理
VcloudDisk vcloudDisk = vcloudDiskDao.read(diskNo);
if (BooleanUtils.isTrue(vcloudDisk.getAttached())) {
//アタッチされているディスクのみ、ディスクのデタッチ処理を行う
Farm farm = farmDao.read(instance.getFarmNo());
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
instance.getPlatformNo());
// ディスクの削除
// ※VCloudの引数はDiskNo
gateway.deleteVolume(String.valueOf(vcloudDisk.getDiskNo()));
}
//削除
vcloudDiskDao.delete(vcloudDisk);
}
/**
* {@inheritDoc}
*/
@Override
public void updateVmwareInstance(Long instanceNo, String instanceName, String comment, String instanceType,
String computeResource, String resourcePool, Long keyPairNo, Integer rootSize) {
updateVmwareInstance(instanceNo, instanceName, comment, instanceType, computeResource, resourcePool, keyPairNo,
rootSize, null);
}
/**
* {@inheritDoc}
*/
@Override
public void updateVmwareInstance(Long instanceNo, String instanceName, String comment, String instanceType,
String computeResource, String resourcePool, Long keyPairNo, Integer rootSize,
VmwareAddressDto vmwareAddressDto) {
// インスタンスの更新
updateInstance(instanceNo, instanceName, comment);
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
if (instanceType == null || instanceType.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "instanceType");
}
if (computeResource == null || computeResource.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "computeResource");
}
if (keyPairNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "keyPairNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// プラットフォームのチェック
Platform platform = platformDao.read(instance.getPlatformNo());
if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000408", instance.getInstanceName());
}
// インスタンスが停止状態でない場合
VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo);
VmwareAddress vmwareAddress = vmwareAddressDao.readByInstanceNo(instanceNo);
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!StringUtils.equals(vmwareInstance.getInstanceType(), instanceType)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!StringUtils.equals(vmwareInstance.getComputeResource(), computeResource)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (StringUtils.isEmpty(vmwareInstance.getResourcePool()) ? StringUtils.isNotEmpty(resourcePool)
: !StringUtils.equals(vmwareInstance.getResourcePool(), resourcePool)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (!keyPairNo.equals(vmwareInstance.getKeyPairNo())) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (vmwareInstance.getRootSize() == null ? rootSize != null : !vmwareInstance.getRootSize()
.equals(rootSize)) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
if (vmwareAddress == null || BooleanUtils.isNotTrue(vmwareAddress.getEnabled())) {
if (vmwareAddressDto != null) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
} else {
if (vmwareAddressDto == null) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
} else if (!StringUtils.equals(vmwareAddress.getIpAddress(), vmwareAddressDto.getIpAddress())
|| !StringUtils.equals(vmwareAddress.getSubnetMask(), vmwareAddressDto.getSubnetMask())
|| !StringUtils.equals(vmwareAddress.getDefaultGateway(), vmwareAddressDto.getDefaultGateway())) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
}
// ルートサイズのチェック
if (rootSize != null) {
ImageVmware imageVmware = imageVmwareDao.read(instance.getImageNo());
if (imageVmware.getRootSize() == null) {
Image image = imageDao.read(instance.getImageNo());
throw new AutoApplicationException("ESERVICE-000431", image.getImageName());
}
if (StringUtils.isNotEmpty(vmwareInstance.getDatastore()) && !rootSize.equals(vmwareInstance.getRootSize())) {
throw new AutoApplicationException("ESERVICE-000432", instance.getInstanceName());
}
if (StringUtils.isEmpty(vmwareInstance.getDatastore())) {
int maxRootSize = NumberUtils.toInt(Config.getProperty("vmware.maxRootSize"), 1024);
if (rootSize.intValue() < imageVmware.getRootSize() || rootSize.intValue() > maxRootSize) {
throw new AutoApplicationException("ESERVICE-000433", imageVmware.getRootSize(), maxRootSize);
}
}
}
// VMwareインスタンスの更新
vmwareInstance.setInstanceType(instanceType);
vmwareInstance.setComputeResource(computeResource);
vmwareInstance.setResourcePool(resourcePool);
vmwareInstance.setKeyPairNo(keyPairNo);
if (rootSize != null && StringUtils.isEmpty(vmwareInstance.getDatastore())) {
vmwareInstance.setRootSize(rootSize);
}
vmwareInstanceDao.update(vmwareInstance);
Farm farm = farmDao.read(instance.getFarmNo());
// VmwareAddressの更新
if (vmwareAddress == null) {
if (vmwareAddressDto != null) {
vmwareAddress = new VmwareAddress();
vmwareAddress.setPlatformNo(instance.getPlatformNo());
vmwareAddress.setIpAddress(vmwareAddressDto.getIpAddress());
vmwareAddress.setSubnetMask(vmwareAddressDto.getSubnetMask());
vmwareAddress.setDefaultGateway(vmwareAddressDto.getDefaultGateway());
vmwareAddress.setUserNo(farm.getUserNo());
vmwareAddress.setInstanceNo(instanceNo);
vmwareAddress.setEnabled(true);
vmwareAddress.setAssociated(false);
vmwareAddressDao.create(vmwareAddress);
}
} else {
if (vmwareAddressDto == null) {
vmwareAddress.setEnabled(false);
} else {
boolean change = false;
if (!StringUtils.equals(vmwareAddress.getIpAddress(), vmwareAddressDto.getIpAddress())
|| !StringUtils.equals(vmwareAddress.getSubnetMask(), vmwareAddressDto.getSubnetMask())
|| !StringUtils.equals(vmwareAddress.getDefaultGateway(), vmwareAddressDto.getDefaultGateway())) {
change = true;
}
vmwareAddress.setIpAddress(vmwareAddressDto.getIpAddress());
vmwareAddress.setSubnetMask(vmwareAddressDto.getSubnetMask());
vmwareAddress.setDefaultGateway(vmwareAddressDto.getDefaultGateway());
vmwareAddress.setEnabled(true);
if (change) {
vmwareAddress.setAssociated(false);
}
}
vmwareAddressDao.update(vmwareAddress);
}
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceUpdate", instanceType, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void updateNiftyInstance(Long instanceNo, String instanceName, String comment, String instanceType,
Long keyPairNo) {
// インスタンスの更新
updateInstance(instanceNo, instanceName, comment);
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
if (instanceType == null || instanceType.length() == 0) {
throw new AutoApplicationException("ECOMMON-000003", "instanceType");
}
if (keyPairNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "keyPairNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// プラットフォームのチェック
Platform platform = platformDao.read(instance.getPlatformNo());
if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType()) == false) {
throw new AutoApplicationException("ESERVICE-000410", instance.getInstanceName());
}
// インスタンスが停止状態でない場合
NiftyInstance niftyInstance = niftyInstanceDao.read(instanceNo);
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// 停止状態でないと変更できないものを変更していないかチェック
if (!StringUtils.equals(niftyInstance.getInstanceType(), instanceType)
|| !keyPairNo.equals(niftyInstance.getKeyPairNo())) {
throw new AutoApplicationException("ESERVICE-000407", instance.getInstanceName());
}
}
// インスタンスが作成前であることのチェック
if (StringUtils.isNotEmpty(niftyInstance.getInstanceId())) {
// インスタンスが作成前でない場合
if (!niftyInstance.getKeyPairNo().equals(keyPairNo)) {
// キーペアを変更しようとした場合
throw new AutoApplicationException("ESERVICE-000411", instance.getInstanceName());
}
}
// Niftyインスタンスの更新
niftyInstance.setInstanceType(instanceType);
niftyInstance.setKeyPairNo(keyPairNo);
niftyInstanceDao.update(niftyInstance);
// イベントログ出力
Farm farm = farmDao.read(instance.getFarmNo());
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo, instanceName,
"InstanceUpdate", instanceType, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-update-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void deleteInstance(Long instanceNo) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
// インスタンスが存在しない場合
return;
}
// インスタンスが停止しているかどうかのチェック
if (InstanceStatus.fromStatus(instance.getStatus()) != InstanceStatus.STOPPED) {
// インスタンスが停止状態でない場合
throw new AutoApplicationException("ESERVICE-000402", instance.getInstanceName());
}
// MySQLのMasterでないことのチェック
List<InstanceConfig> instanceConfigs = instanceConfigDao.readByInstanceNo(instanceNo);
for (InstanceConfig instanceConfig : instanceConfigs) {
if (MySQLConstants.CONFIG_NAME_MASTER_INSTANCE_NO.equals(instanceConfig.getConfigName())) {
if (StringUtils.isEmpty(instanceConfig.getConfigValue())) {
// MySQLのMasterの場合
throw new AutoApplicationException("ESERVICE-000413", instance.getInstanceName());
}
}
}
// フック処理の実行
Farm farm = farmDao.read(instance.getFarmNo());
processHook.execute("pre-delete-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
// Zabbixインスタンスの削除処理
ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo);
if (zabbixInstance != null) {
if (StringUtils.isNotEmpty(zabbixInstance.getHostid())) {
try {
// Zabbixに登録済みの場合、登録を解除する
ZabbixProcessClient client = zabbixProcessClientFactory.createZabbixProcessClient();
client.deleteHost(zabbixInstance.getHostid());
//イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "ZabbixUnregist", null, instance.getPlatformNo(), new Object[] {
instance.getFqdn(), zabbixInstance.getHostid() });
} catch (RuntimeException ignore) {
// 登録解除に失敗した場合、警告ログを出してエラーを握りつぶす
log.warn(ignore.getMessage());
}
}
zabbixInstanceDao.delete(zabbixInstance);
}
// ZabbixDataの削除処理
ZabbixData zabbixData = zabbixDataDao.read(instanceNo);
if (zabbixData != null) {
zabbixDataDao.delete(zabbixData);
}
// Puppetインスタンスの削除処理
puppetInstanceDao.deleteByInstanceNo(instanceNo);
// Puppetレポートの削除処理
// TODO: OSのファイルシステムに権限がないため削除できない
//reportLoader.deleteReportFiles(instance.getFqdn());
Platform platform = platformDao.read(instance.getPlatformNo());
// TODO CLOUD BRANCHING
if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
// AWS関連
deleteAwsInstance(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) {
// Cloudstack関連
deleteCloudstackInstance(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
// VMware関連
deleteVmwareInstance(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
// Nifty関連
deleteNiftyInstance(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
// VCloud関連
deleteVcloudInstance(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) {
// Azure関連
deleteAzureInstance(instanceNo);
} else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
// OpenStack関連
deleteOpenStackInstance(instanceNo);
}
// コンポーネントとインスタンスの関連の削除処理
componentInstanceDao.deleteByInstanceNo(instanceNo);
// ロードバランサとインスタンスの関連の削除処理
loadBalancerInstanceDao.deleteByInstanceNo(instanceNo);
// インスタンス設定の削除処理
instanceConfigDao.deleteByInstanceNo(instanceNo);
// インスタンスの削除処理
instanceDao.delete(instance);
// イベントログ出力
eventLogger.log(EventLogLevel.INFO, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "InstanceDelete", null, instance.getPlatformNo(), null);
// フック処理の実行
processHook.execute("post-delete-instance", farm.getUserNo(), farm.getFarmNo(), instanceNo);
}
protected void deleteCloudstackInstance(Long instanceNo) {
// アドレスの関連を解除
List<CloudstackAddress> cloudstackAddresses = cloudstackAddressDao.readByInstanceNo(instanceNo);
for (CloudstackAddress cloudstackAddress : cloudstackAddresses) {
cloudstackAddress.setInstanceNo(null);
cloudstackAddressDao.update(cloudstackAddress);
}
// ボリュームの削除
// TODO: ボリューム自体の削除処理を別で行うようにする
List<CloudstackVolume> cloudstackVolumes = cloudstackVolumeDao.readByInstanceNo(instanceNo);
Instance instance = instanceDao.read(instanceNo);
Farm farm = farmDao.read(instance.getFarmNo());
CloudstackInstance cloudstackInstance = cloudstackInstanceDao.read(instanceNo);
for (CloudstackVolume cloudstackVolume : cloudstackVolumes) {
if (StringUtils.isEmpty(cloudstackVolume.getVolumeId())) {
continue;
}
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
cloudstackVolume.getPlatformNo());
//イベントログ出力
Platform platform = platformDao.read(cloudstackVolume.getPlatformNo());
Component component = componentDao.read(cloudstackVolume.getComponentNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(),
farm.getFarmName(),
cloudstackVolume.getComponentNo(),
//component.getComponentName(), instanceNo, instance.getInstanceName(), "AwsEbsDelete", new Object[] {
component.getComponentName(), instanceNo, instance.getInstanceName(), "CloudStackVolumeDelete",
cloudstackInstance.getInstanceType(), instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), cloudstackVolume.getVolumeId() });
try {
// ボリュームの削除
gateway.deleteVolume(cloudstackVolume.getVolumeId());
//awsProcessClient.waitDeleteVolume(volumeId); // TODO: EC2ではDeleteVolumeに時間がかかるため、Waitしない
//イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(),
farm.getFarmName(),
cloudstackVolume.getComponentNo(),
//component.getComponentName(), instanceNo, instance.getInstanceName(), "AwsEbsDeleteFinish",
component.getComponentName(), instanceNo, instance.getInstanceName(),
"CloudStackVolumeDeleteFinish", cloudstackInstance.getInstanceType(), instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), cloudstackVolume.getVolumeId() });
} catch (AutoException ignore) {
// ボリュームが存在しない場合などに備えて例外を握りつぶす
}
}
cloudstackVolumeDao.deleteByInstanceNo(instanceNo);
// インスタンスの削除処理
if (StringUtils.isNotEmpty(cloudstackInstance.getInstanceId())) {
// インスタンス自体の削除処理を別で行うようにする
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
instance.getPlatformNo());
// イベントログ出力
Platform platform = platformDao.read(instance.getPlatformNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "CloudStackInstanceDelete", cloudstackInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), cloudstackInstance.getInstanceId() });
try {
// インスタンスの削除
gateway.terminateInstance(cloudstackInstance.getInstanceId());
} catch (AutoException ignore) {
// インスタンスが存在しない場合などに備えて例外を握りつぶす
}
// イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "CloudStackInstanceDeleteFinish", cloudstackInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), cloudstackInstance.getInstanceId() });
}
cloudstackInstanceDao.deleteByInstanceNo(instanceNo);
}
protected void deleteAwsInstance(Long instanceNo) {
// アドレスの関連を解除
List<AwsAddress> awsAddresses = awsAddressDao.readByInstanceNo(instanceNo);
for (AwsAddress awsAddress : awsAddresses) {
awsAddress.setInstanceNo(null);
awsAddressDao.update(awsAddress);
}
// AWSボリュームの削除
// TODO: ボリューム自体の削除処理を別で行うようにする
List<AwsVolume> awsVolumes = awsVolumeDao.readByInstanceNo(instanceNo);
Instance instance = instanceDao.read(instanceNo);
Farm farm = farmDao.read(instance.getFarmNo());
AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
for (AwsVolume awsVolume : awsVolumes) {
if (StringUtils.isEmpty(awsVolume.getVolumeId())) {
continue;
}
AwsProcessClient awsProcessClient = awsProcessClientFactory.createAwsProcessClient(farm.getUserNo(),
awsVolume.getPlatformNo());
awsProcessClient.setDescribeInterval(5);
try {
// ボリュームのデタッチ
awsVolumeProcess.stopVolume(awsProcessClient, instanceNo, awsVolume.getVolumeNo());
// ボリュームの削除
awsVolumeProcess.deleteVolume(awsProcessClient, instanceNo, awsVolume.getVolumeNo());
//awsVolumeProcess.waitDeleteVolume(awsProcessClient, instanceNo, awsVolume.getVolumeNo());
} catch (AutoException ignore) {
// ボリュームが存在しない場合などに備えて例外を握りつぶす
}
}
awsVolumeDao.deleteByInstanceNo(instanceNo);
// AWSインスタンスの削除処理
ImageAws imageAws = imageAwsDao.read(instance.getImageNo());
if (imageAws.getEbsImage() && StringUtils.isNotEmpty(awsInstance.getInstanceId())) {
// TODO: インスタンス自体の削除処理を別で行うようにする
AwsProcessClient awsProcessClient = awsProcessClientFactory.createAwsProcessClient(farm.getUserNo(),
instance.getPlatformNo());
try {
// インスタンスの削除
awsInstanceProcess.terminate(awsProcessClient, instanceNo);
//awsInstanceProcess.waitTerminate(awsProcessClient, instanceNo);
} catch (AutoException ignore) {
// インスタンスが存在しない場合などに備えて例外を握りつぶす
}
}
awsInstanceDao.deleteByInstanceNo(instanceNo);
}
protected void deleteVmwareInstance(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
// アドレスの関連を解除
VmwareAddress vmwareAddress = vmwareAddressDao.readByInstanceNo(instanceNo);
if (vmwareAddress != null) {
vmwareAddressDao.delete(vmwareAddress);
}
VmwareProcessClient vmwareProcessClient = vmwareProcessClientFactory.createVmwareProcessClient(instance
.getPlatformNo());
try {
// ディスクの削除
// TODO: 削除処理を別で行うようにする
List<VmwareDisk> vmwareDisks = vmwareDiskDao.readByInstanceNo(instanceNo);
for (VmwareDisk vmwareDisk : vmwareDisks) {
if (StringUtils.isEmpty(vmwareDisk.getFileName())) {
continue;
}
try {
// ディスクの削除
vmwareDiskProcess.deleteDisk(vmwareProcessClient, vmwareDisk.getDiskNo());
} catch (AutoException ignore) {
// ディスクが存在しない場合などに備えて握りつぶす
}
}
vmwareDiskDao.deleteByInstanceNo(instanceNo);
// 仮想マシンの削除
// TODO: 削除処理を別で行うようにする
try {
vmwareMachineProcess.destroy(vmwareProcessClient, instanceNo);
} catch (RuntimeException ignore) {
// TODO: 例外処理
// 仮想マシンが存在しない場合などに備えて例外を握りつぶす
}
} finally {
vmwareProcessClient.getVmwareClient().logout();
}
// VMwareインスタンスの削除処理
vmwareInstanceDao.deleteByInstanceNo(instanceNo);
}
protected void deleteNiftyInstance(Long instanceNo) {
// Niftyボリュームの削除処理
// TODO: ボリューム自体の削除処理を別で行うようにする
List<NiftyVolume> niftyVolumes = niftyVolumeDao.readByInstanceNo(instanceNo);
Instance instance = instanceDao.read(instanceNo);
Farm farm = farmDao.read(instance.getFarmNo());
NiftyInstance niftyInstance = niftyInstanceDao.read(instanceNo);
for (NiftyVolume niftyVolume : niftyVolumes) {
if (StringUtils.isEmpty(niftyVolume.getVolumeId())) {
continue;
}
try {
// NiftyProcessClientの作成
String clientType;
clientType = PCCConstant.NIFTYCLIENT_TYPE_DISK;
NiftyProcessClient niftyProcessClient = niftyProcessClientFactory.createNiftyProcessClient(
farm.getUserNo(), niftyVolume.getPlatformNo(), clientType);
// デタッチ処理
niftyVolumeProcess.stopVolume(niftyProcessClient, instanceNo, niftyVolume.getVolumeNo());
//イベントログ出力
Platform platform = platformDao.read(niftyProcessClient.getPlatformNo());
Component component = componentDao.read(niftyVolume.getComponentNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(),
niftyVolume.getComponentNo(), component.getComponentName(), instanceNo,
instance.getInstanceName(), "NiftyDiskDelete", niftyInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), niftyVolume.getVolumeId() });
// ボリュームの削除
niftyProcessClient.deleteVolume(niftyVolume.getVolumeId());
//イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(),
niftyVolume.getComponentNo(), component.getComponentName(), instanceNo,
instance.getInstanceName(), "NiftyDiskDeleteFinish", niftyInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), niftyVolume.getVolumeId() });
} catch (AutoException ignore) {
// ボリュームが存在しない場合などに備えて例外を握りつぶす
}
}
niftyVolumeDao.deleteByInstanceNo(instanceNo);
// Niftyインスタンスの削除処理
// TODO: 削除処理を別で行うようにする
if (niftyInstance != null && StringUtils.isNotEmpty(niftyInstance.getInstanceId())) {
String clientType;
clientType = PCCConstant.NIFTYCLIENT_TYPE_SERVER;
NiftyProcessClient niftyProcessClient = niftyProcessClientFactory.createNiftyProcessClient(
farm.getUserNo(), instance.getPlatformNo(), clientType);
try {
niftyProcessClient.terminateInstance(niftyInstance.getInstanceId());
} catch (RuntimeException ignore) {
// TODO: 例外処理
// インスタンスが存在しない場合などに備えて例外を握りつぶす
}
}
niftyInstanceDao.deleteByInstanceNo(instanceNo);
}
protected void deleteVcloudInstance(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
VcloudInstance vcloudInstance = vcloudInstanceDao.read(instanceNo);
// ネットワーク関連を解除
List<VcloudInstanceNetwork> vcloudInstanceNetworks = vcloudInstanceNetworkDao.readByInstanceNo(instanceNo);
for (VcloudInstanceNetwork vcloudInstanceNetwork : vcloudInstanceNetworks) {
vcloudInstanceNetworkDao.delete(vcloudInstanceNetwork);
}
Farm farm = farmDao.read(instance.getFarmNo());
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), instance.getPlatformNo());
// ディスクの削除
List<VcloudDisk> vcloudDisks = vcloudDiskDao.readByInstanceNo(instanceNo);
for (VcloudDisk vcloudDisk : vcloudDisks) {
if (StringUtils.isEmpty(vcloudDisk.getDiskId())) {
continue;
}
try {
// ディスクの削除
// ※VCloudの引数はDiskNo
gateway.deleteVolume(String.valueOf(vcloudDisk.getDiskNo()));
} catch (AutoException ignore) {
// ディスクが存在しない場合などに備えて握りつぶす
}
}
vcloudDiskDao.deleteByInstanceNo(instanceNo);
// 仮想マシンの削除
try {
//VCloudInstanceに「Id」カラムが存在しない為、「VM_NAME」を引数にする
gateway.terminateInstance(vcloudInstance.getVmName());
} catch (RuntimeException ignore) {
// 仮想マシンが存在しない場合などに備えて例外を握りつぶす
}
// VCloudインスタンスの削除処理
vcloudInstanceDao.deleteByInstanceNo(instanceNo);
}
protected void deleteAzureInstance(Long instanceNo) {
// ボリュームの削除
// TODO: ボリューム自体の削除処理を別で行うようにする
List<AzureDisk> azureDisks = azureDiskDao.readByInstanceNo(instanceNo);
Instance instance = instanceDao.read(instanceNo);
Farm farm = farmDao.read(instance.getFarmNo());
AzureInstance azureInstance = azureInstanceDao.read(instanceNo);
for (AzureDisk azureDisk : azureDisks) {
if (StringUtils.isEmpty(azureDisk.getDiskName())) {
continue;
}
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
azureDisk.getPlatformNo());
//イベントログ出力
Platform platform = platformDao.read(azureDisk.getPlatformNo());
Component component = componentDao.read(azureDisk.getComponentNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), azureDisk.getComponentNo(),
component.getComponentName(), instanceNo, instance.getInstanceName(), "AzureDiskDelete",
azureInstance.getInstanceType(), instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), azureDisk.getDiskName() });
try {
// ボリュームの削除
gateway.deleteVolume(azureDisk.getDiskNo().toString());
//イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), azureDisk.getComponentNo(),
component.getComponentName(), instanceNo, instance.getInstanceName(), "AzureDiskDeleteFinish",
azureInstance.getInstanceType(), instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), azureDisk.getDiskName() });
} catch (AutoException ignore) {
// ボリュームが存在しない場合などに備えて例外を握りつぶす
}
}
azureDiskDao.deleteByInstanceNo(instanceNo);
// インスタンスの削除処理
if (StringUtils.isNotEmpty(azureInstance.getInstanceName())) {
// インスタンス自体の削除処理を別で行うようにする
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
instance.getPlatformNo());
// イベントログ出力
Platform platform = platformDao.read(instance.getPlatformNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "AzureInstanceDelete", azureInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), azureInstance.getInstanceName() });
try {
// インスタンスの削除
gateway.terminateInstance(azureInstance.getInstanceNo().toString());
} catch (AutoException ignore) {
// インスタンスが存在しない場合などに備えて例外を握りつぶす
}
// イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "AzureInstanceDeleteFinish", azureInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), azureInstance.getInstanceName() });
}
azureInstanceDao.deleteByInstanceNo(instanceNo);
}
protected void deleteOpenStackInstance(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
Farm farm = farmDao.read(instance.getFarmNo());
OpenstackInstance openstackInstance = openstackInstanceDao.read(instanceNo);
// ボリュームの削除
// TODO: ボリューム自体の削除処理を別で行うようにする
List<OpenstackVolume> openstackVolumes = openstackVolumeDao.readByInstanceNo(instanceNo);
for (OpenstackVolume openstackVolume : openstackVolumes) {
if (StringUtils.isEmpty(openstackVolume.getVolumeId())) {
continue;
}
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
openstackVolume.getPlatformNo());
//イベントログ出力
Platform platform = platformDao.read(openstackVolume.getPlatformNo());
Component component = componentDao.read(openstackVolume.getComponentNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(),
openstackVolume.getComponentNo(), component.getComponentName(), instanceNo,
instance.getInstanceName(), "OpenstackVolumeDelete", openstackInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), openstackVolume.getVolumeId() });
try {
// ボリュームの削除
gateway.deleteVolume(openstackVolume.getVolumeId());
//イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(),
openstackVolume.getComponentNo(), component.getComponentName(), instanceNo,
instance.getInstanceName(), "OpenstackVolumeDeleteFinish", openstackInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), openstackVolume.getVolumeId() });
} catch (AutoException ignore) {
// ボリュームが存在しない場合などに備えて例外を握りつぶす
}
}
openstackVolumeDao.deleteByInstanceNo(instanceNo);
// インスタンスの削除処理
if (StringUtils.isNotEmpty(openstackInstance.getInstanceId())) {
// インスタンス自体の削除処理を別で行うようにする
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
instance.getPlatformNo());
// イベントログ出力
// α実装のため、"m1.tiny"で固定
Platform platform = platformDao.read(instance.getPlatformNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "OpenStackInstanceDelete", openstackInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), openstackInstance.getInstanceId() });
try {
// インスタンスの削除
gateway.terminateInstance(openstackInstance.getInstanceNo().toString());
} catch (AutoException ignore) {
// インスタンスが存在しない場合などに備えて例外を握りつぶす
}
// イベントログ出力
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "OpenStackInstanceDeleteFinish", openstackInstance.getInstanceType(),
instance.getPlatformNo(),
new Object[] { platform.getPlatformName(), openstackInstance.getInstanceId() });
}
openstackInstanceDao.deleteByInstanceNo(instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void associateComponents(Long instanceNo, List<Long> componentNos) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
if (componentNos == null) {
throw new AutoApplicationException("ECOMMON-000003", "componentNos");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// コンポーネント番号の重複を除去
List<Long> tmpComponentNos = new ArrayList<Long>();
for (Long componentNo : componentNos) {
if (!tmpComponentNos.contains(componentNo)) {
tmpComponentNos.add(componentNo);
}
}
componentNos = tmpComponentNos;
// コンポーネントの存在チェック
List<Component> components = componentDao.readInComponentNos(componentNos);
if (componentNos.size() != components.size()) {
for (Component component : components) {
componentNos.remove(component.getComponentNo());
}
if (componentNos.size() > 0) {
throw new AutoApplicationException("ESERVICE-000409", componentNos.iterator().next());
}
}
// MySQLのMasterでないことのチェック
List<InstanceConfig> instanceConfigs = instanceConfigDao.readByInstanceNo(instanceNo);
for (InstanceConfig instanceConfig : instanceConfigs) {
if (MySQLConstants.CONFIG_NAME_MASTER_INSTANCE_NO.equals(instanceConfig.getConfigName())) {
if (StringUtils.isEmpty(instanceConfig.getConfigValue())
&& !componentNos.contains(instanceConfig.getComponentNo())) {
// MySQLのMasterで関連付けを外そうとした場合
throw new AutoApplicationException("ESERVICE-000414", instance.getInstanceName());
}
}
}
// コンポーネントとインスタンスの関連を更新
List<Component> allComponents = componentDao.readByFarmNo(instance.getFarmNo());
List<ComponentInstance> componentInstances = componentInstanceDao.readByInstanceNo(instanceNo);
for (Component component : allComponents) {
// コンポーネントに紐づく関連付けを取得
ComponentInstance componentInstance = null;
for (ComponentInstance tmpComponentInstance : componentInstances) {
if (component.getComponentNo().equals(tmpComponentInstance.getComponentNo())) {
componentInstance = tmpComponentInstance;
break;
}
}
if (componentNos.contains(component.getComponentNo())) {
// インスタンスに関連付けるコンポーネントの場合
if (componentInstance == null) {
// 関連付けレコードがない場合、レコードを作成する
componentInstance = new ComponentInstance();
componentInstance.setComponentNo(component.getComponentNo());
componentInstance.setInstanceNo(instanceNo);
componentInstance.setAssociate(true);
componentInstance.setEnabled(false);
componentInstance.setStatus(ComponentInstanceStatus.STOPPED.toString());
componentInstanceDao.create(componentInstance);
} else {
// 関連付けレコードがある場合、関連付けを有効化する
if (BooleanUtils.isNotTrue(componentInstance.getAssociate())) {
componentInstance.setAssociate(true);
componentInstanceDao.update(componentInstance);
}
}
} else {
// インスタンスに関連付けないコンポーネントの場合
if (componentInstance != null) {
// 関連付けレコードがある場合
ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus());
if (status == ComponentInstanceStatus.STOPPED) {
// Zabbixのテンプレートを削除する
if (zabbixInstanceDao.countByInstanceNo(componentInstance.getInstanceNo()) > 0) {
zabbixHostProcess.removeTemplate(componentInstance.getInstanceNo(),
componentInstance.getComponentNo());
}
/******************************************************************
* 停止時ディスクデタッチを行わないクラウドに対する特殊ロジック
* ※現在はVCLOUD(USiZE)のみがこのタイプ
******************************************************************/
List<VcloudDisk> vdisks = vcloudDiskDao.readByInstanceNo(instance.getInstanceNo());
for (VcloudDisk disk : vdisks) {
if (component.getComponentNo().equals(disk.getComponentNo())) {
//componentNoの一致するディスクが存在していれば削除する
Farm farm = farmDao.read(instance.getFarmNo());
IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(),
instance.getPlatformNo());
try {
gateway.deleteVolume(String.valueOf(disk.getDiskNo()));
} catch (AutoException ignore) {
// ディスクが存在しない場合などに備えて握りつぶす
}
//データも削除
vcloudDiskDao.delete(disk);
}
}
// コンポーネントが停止している場合、関連付けを削除する
componentInstanceDao.delete(componentInstance);
} else {
// 関連付けを無効化する
if (BooleanUtils.isTrue(componentInstance.getAssociate())) {
componentInstance.setAssociate(false);
componentInstanceDao.update(componentInstance);
}
}
}
}
}
for (Component component : components) {
ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo());
// MySQLコンポーネントの場合、Master/Slaveを設定する
if (MySQLConstants.COMPONENT_TYPE_NAME.equals(componentType.getComponentTypeName())) {
InstanceConfig instanceConfig = instanceConfigDao.readByInstanceNoAndComponentNoAndConfigName(
instanceNo, component.getComponentNo(), MySQLConstants.CONFIG_NAME_MASTER_INSTANCE_NO);
if (instanceConfig == null) {
// Masterのインスタンスを取得
Long masterInstanceNo = null;
List<InstanceConfig> configs = instanceConfigDao.readByComponentNo(component.getComponentNo());
for (InstanceConfig config : configs) {
if (MySQLConstants.CONFIG_NAME_MASTER_INSTANCE_NO.equals(config.getConfigName())) {
if (StringUtils.isEmpty(config.getConfigValue())) {
masterInstanceNo = config.getInstanceNo();
break;
}
}
}
// Masterのインスタンスが存在しない場合はMaster、存在する場合はSlaveにする
instanceConfig = new InstanceConfig();
instanceConfig.setInstanceNo(instanceNo);
instanceConfig.setComponentNo(component.getComponentNo());
instanceConfig.setConfigName(MySQLConstants.CONFIG_NAME_MASTER_INSTANCE_NO);
if (masterInstanceNo == null) {
instanceConfig.setConfigValue(null);
} else {
instanceConfig.setConfigValue(masterInstanceNo.toString());
}
instanceConfigDao.create(instanceConfig);
}
}
}
// イベントログ出力
StringBuilder names = new StringBuilder();
for (Component component : components) {
names.append(component.getComponentName()).append(",");
}
if (names.length() > 0) {
names.deleteCharAt(names.length() - 1);
}
Farm farm = farmDao.read(instance.getFarmNo());
eventLogger.log(EventLogLevel.DEBUG, farm.getFarmNo(), farm.getFarmName(), null, null, instanceNo,
instance.getInstanceName(), "InstanceAssociateComponent", null, instance.getPlatformNo(),
new Object[] { names.toString() });
}
/**
* {@inheritDoc}
*/
@Override
public List<PlatformDto> getPlatforms(Long userNo) {
// プラットフォームを取得
List<PlatformDto> dtos = new ArrayList<PlatformDto>();
List<Platform> platforms = platformDao.readAll();
List<ComponentType> componentTypes = componentTypeDao.readAll();
List<Image> images = imageDao.readAll();
for (Platform platform : platforms) {
PlatformAws platformAws = null;
PlatformVmware platformVmware = null;
PlatformNifty platformNifty = null;
PlatformCloudstack platformCloudstack = null;
PlatformVcloud platformVcloud = null;
PlatformAzure platformAzure = null;
PlatformOpenstack platformOpenstack = null;
// TODO CLOUD BRANCHING
if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
// AWSの認証情報がない場合はスキップ
if (awsCertificateDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
platformAws = platformAwsDao.read(platform.getPlatformNo());
} else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
// キーペアがない場合はスキップ
// TODO: 権限を別途持つ
if (vmwareKeyPairDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
platformVmware = platformVmwareDao.read(platform.getPlatformNo());
} else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
// 認証情報とキーペアがない場合はスキップ
// TODO: 権限を別途持つ
if (niftyCertificateDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
if (niftyKeyPairDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
platformNifty = platformNiftyDao.read(platform.getPlatformNo());
} else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) {
// 認証情報とキーペアがない場合はスキップ
// TODO: 権限を別途持つ
if (cloudstackCertificateDao.countByAccountAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
platformCloudstack = platformCloudstackDao.read(platform.getPlatformNo());
} else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
// 認証情報とキーペアがない場合はスキップ
if (vcloudCertificateDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
if (vcloudKeyPairDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
platformVcloud = platformVcloudDao.read(platform.getPlatformNo());
} else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) {
// 認証情報とキーペアがない場合はスキップ
if (azureCertificateDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
platformAzure = platformAzureDao.read(platform.getPlatformNo());
} else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
// 認証情報とキーペアがない場合はスキップ
if (openstackCertificateDao.countByUserNoAndPlatformNo(userNo, platform.getPlatformNo()) == 0) {
continue;
}
platformOpenstack = platformOpenstackDao.read(platform.getPlatformNo());
}
List<ImageDto> imageDtos = getImages(platform, images, componentTypes);
PlatformDto dto = new PlatformDto();
dto.setPlatform(platform);
dto.setPlatformAws(platformAws);
dto.setPlatformVmware(platformVmware);
dto.setPlatformNifty(platformNifty);
dto.setPlatformCloudstack(platformCloudstack);
dto.setPlatformVcloud(platformVcloud);
dto.setPlatformAzure(platformAzure);
dto.setPlatformOpenstack(platformOpenstack);
dto.setImages(imageDtos);
dtos.add(dto);
}
return dtos;
}
protected List<ImageDto> getImages(Platform platform, List<Image> images, List<ComponentType> allComponentTypes) {
// イメージを取得
List<ImageDto> imageDtos = new ArrayList<ImageDto>();
for (Image image : images) {
// プラットフォームが異なる場合はスキップ
if (platform.getPlatformNo().equals(image.getPlatformNo()) == false) {
continue;
}
ImageAws imageAws = null;
ImageCloudstack imageCloudstack = null;
ImageVmware imageVmware = null;
ImageNifty imageNifty = null;
ImageVcloud imageVcloud = null;
ImageAzure imageAzure = null;
ImageOpenstack imageOpenstack = null;
// TODO CLOUD BRANCHING
if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
imageAws = imageAwsDao.read(image.getImageNo());
} else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) {
imageCloudstack = imageCloudstackDao.read(image.getImageNo());
} else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
imageVmware = imageVmwareDao.read(image.getImageNo());
} else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
imageNifty = imageNiftyDao.read(image.getImageNo());
} else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
imageVcloud = imageVcloudDao.read(image.getImageNo());
} else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) {
imageAzure = imageAzureDao.read(image.getImageNo());
} else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
imageOpenstack = imageOpenstackDao.read(image.getImageNo());
}
// イメージに対応したコンポーネントタイプを取得
String[] componentTypeNos = StringUtils.split(image.getComponentTypeNos(), ",");
List<ComponentType> componentTypes = new ArrayList<ComponentType>();
for (String componentTypeNo : componentTypeNos) {
long no = Long.valueOf(componentTypeNo.trim());
for (ComponentType componentType : allComponentTypes) {
if (no == componentType.getComponentTypeNo().longValue()) {
componentTypes.add(componentType);
}
}
}
ImageDto imageDto = new ImageDto();
imageDto.setImage(image);
imageDto.setImageAws(imageAws);
imageDto.setImageCloudstack(imageCloudstack);
imageDto.setImageVmware(imageVmware);
imageDto.setImageNifty(imageNifty);
imageDto.setImageVcloud(imageVcloud);
imageDto.setImageAzure(imageAzure);
imageDto.setImageOpenstack(imageOpenstack);
imageDto.setComponentTypes(componentTypes);
imageDtos.add(imageDto);
}
return imageDtos;
}
protected String createUrl(String ipAddress, Long componentTypeNo) {
ComponentType componentType = componentTypeDao.read(componentTypeNo);
String url = componentType.getAddressUrl();
url = url.replaceAll("%d", ipAddress);
return url;
}
/**
* {@inheritDoc}
*/
@Override
public void enableZabbixMonitoring(Long instanceNo) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
// インスタンスが存在しない場合
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// ZABBIX_INSTANCEの存在チェック
ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo);
if (zabbixInstance == null) {
// インスタンスが存在しない場合
throw new AutoApplicationException("ESERVICE-000422", instanceNo);
}
// Zabbix使用フラグ(config.properties、zabbix.useZabbix)のチェック
Boolean useZabbix = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useZabbix"));
if (BooleanUtils.isNotTrue(useZabbix)) {
// Zabbix使用フラグが「true」以外
throw new AutoApplicationException("ESERVICE-000423", instanceNo);
}
// サーバOSステータスのチェック
InstanceStatus instanceStatus = getInstanceStatus(instance);
if (instanceStatus != InstanceStatus.RUNNING) {
// サーバOSステータスが「RUNNING」以外
throw new AutoApplicationException("ESERVICE-000424", instance.getInstanceName());
}
// Zabbixステータスのチェック
ZabbixInstanceStatus zabbixInstanceStatus = ZabbixInstanceStatus.fromStatus(zabbixInstance.getStatus());
if (zabbixInstanceStatus != ZabbixInstanceStatus.UN_MONITORING) {
// Zabbixの監視ステータスが「UN_MONITORING」以外
throw new AutoApplicationException("ESERVICE-000425", instance.getInstanceName());
}
// Zabbix有効化
zabbixHostProcess.startHost(instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public void disableZabbixMonitoring(Long instanceNo) {
// 引数チェック
if (instanceNo == null) {
throw new AutoApplicationException("ECOMMON-000003", "instanceNo");
}
// インスタンスの存在チェック
Instance instance = instanceDao.read(instanceNo);
if (instance == null) {
// インスタンスが存在しない場合
throw new AutoApplicationException("ESERVICE-000403", instanceNo);
}
// ZABBIX_INSTANCEの存在チェック
ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo);
if (zabbixInstance == null) {
// インスタンスが存在しない場合
throw new AutoApplicationException("ESERVICE-000422", instanceNo);
}
// Zabbix使用フラグ(config.properties、zabbix.useZabbix)のチェック
Boolean useZabbix = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useZabbix"));
if (BooleanUtils.isNotTrue(useZabbix)) {
// Zabbix使用フラグが「true」以外
throw new AutoApplicationException("ESERVICE-000423", instanceNo);
}
// サーバOSステータスのチェック
InstanceStatus instanceStatus = getInstanceStatus(instance);
if (instanceStatus != InstanceStatus.RUNNING) {
// サーバOSステータスが「RUNNING」以外
throw new AutoApplicationException("ESERVICE-000426", instance.getInstanceName());
}
// Zabbixステータスのチェック
ZabbixInstanceStatus zabbixInstanceStatus = ZabbixInstanceStatus.fromStatus(zabbixInstance.getStatus());
if (zabbixInstanceStatus != ZabbixInstanceStatus.MONITORING) {
// Zabbixの監視ステータスが「MONITORING」以外
throw new AutoApplicationException("ESERVICE-000427", instance.getInstanceName());
}
// Zabbix無効化
zabbixHostProcess.stopHost(instanceNo);
}
/**
* {@inheritDoc}
*/
@Override
public InstanceStatus getInstanceStatus(Instance instance) {
// 有効無効に応じてステータスを変更する(画面表示用)
InstanceStatus instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
if (BooleanUtils.isTrue(instance.getEnabled())) {
if (instanceStatus == InstanceStatus.STOPPED) {
instance.setStatus(InstanceStatus.STARTING.toString());
}
} else {
if (instanceStatus == InstanceStatus.RUNNING || instanceStatus == InstanceStatus.WARNING) {
instance.setStatus(InstanceStatus.STOPPING.toString());
}
}
// 画面表示用にステータスの変更
// サーバステータス 協調設定ステータス 変換後サーバステータス
// Running Coodinating Configuring
// Running Warning Warning
instanceStatus = InstanceStatus.fromStatus(instance.getStatus());
InstanceCoodinateStatus insCoodiStatus = InstanceCoodinateStatus.fromStatus(instance.getCoodinateStatus());
// サーバステータス(Running)かつ協調設定ステータス(Coodinating)⇒「Configuring」
if (instanceStatus == InstanceStatus.RUNNING && insCoodiStatus == InstanceCoodinateStatus.COODINATING) {
instance.setStatus(InstanceStatus.CONFIGURING.toString());
// サーバステータス(Running)かつ協調設定ステータス(Warning)⇒「Warning」
} else if (instanceStatus == InstanceStatus.RUNNING && insCoodiStatus == InstanceCoodinateStatus.WARNING) {
instance.setStatus(InstanceStatus.WARNING.toString());
}
return InstanceStatus.fromStatus(instance.getStatus());
}
public void setIaasGatewayFactory(IaasGatewayFactory iaasGatewayFactory) {
this.iaasGatewayFactory = iaasGatewayFactory;
}
public void setIaasDescribeService(IaasDescribeService iaasDescribeService) {
this.iaasDescribeService = iaasDescribeService;
}
public void setAwsDescribeService(AwsDescribeService awsDescribeService) {
this.awsDescribeService = awsDescribeService;
}
public void setAwsProcessClientFactory(AwsProcessClientFactory awsProcessClientFactory) {
this.awsProcessClientFactory = awsProcessClientFactory;
}
public void setAwsInstanceProcess(AwsInstanceProcess awsInstanceProcess) {
this.awsInstanceProcess = awsInstanceProcess;
}
public void setAwsVolumeProcess(AwsVolumeProcess awsVolumeProcess) {
this.awsVolumeProcess = awsVolumeProcess;
}
/**
* vmwareDescribeServiceを設定します。
*
* @param vmwareDescribeService vmwareDescribeService
*/
public void setVmwareDescribeService(VmwareDescribeService vmwareDescribeService) {
this.vmwareDescribeService = vmwareDescribeService;
}
/**
* vmwareMachineProcessを設定します。
*
* @param vmwareMachineProcess vmwareMachineProcess
*/
public void setVmwareMachineProcess(VmwareMachineProcess vmwareMachineProcess) {
this.vmwareMachineProcess = vmwareMachineProcess;
}
/**
* vmwareDiskProcessを設定します。
*
* @param vmwareDiskProcess vmwareDiskProcess
*/
public void setVmwareDiskProcess(VmwareDiskProcess vmwareDiskProcess) {
this.vmwareDiskProcess = vmwareDiskProcess;
}
/**
* vmwareProcessClientFactoryを設定します。
*
* @param vmwareProcessClientFactory vmwareProcessClientFactory
*/
public void setVmwareProcessClientFactory(VmwareProcessClientFactory vmwareProcessClientFactory) {
this.vmwareProcessClientFactory = vmwareProcessClientFactory;
}
/**
* niftyProcessClientFactoryを設定します。
*
* @param niftyProcessClientFactory niftyProcessClientFactory
*/
public void setNiftyProcessClientFactory(NiftyProcessClientFactory niftyProcessClientFactory) {
this.niftyProcessClientFactory = niftyProcessClientFactory;
}
/**
* zabbixProcessClientFactoryを設定します。
*
* @param zabbixProcessClientFactory zabbixProcessClientFactory
*/
public void setZabbixProcessClientFactory(ZabbixProcessClientFactory zabbixProcessClientFactory) {
this.zabbixProcessClientFactory = zabbixProcessClientFactory;
}
/**
* zabbixHostProcessを設定します。
*
* @param zabbixHostProcess zabbixHostProcess
*/
public void setZabbixHostProcess(ZabbixHostProcess zabbixHostProcess) {
this.zabbixHostProcess = zabbixHostProcess;
}
/**
* eventLoggerを設定します。
*
* @param eventLogger eventLogger
*/
public void setEventLogger(EventLogger eventLogger) {
this.eventLogger = eventLogger;
}
/**
* niftyVolumeProcessを設定します。
* @param niftyVolumeProcess niftyVolumeProcess
*/
public void setNiftyVolumeProcess(NiftyVolumeProcess niftyVolumeProcess) {
this.niftyVolumeProcess = niftyVolumeProcess;
}
/**
* processHookを設定します。
*
* @param processHook processHook
*/
public void setProcessHook(ProcessHook processHook) {
this.processHook = processHook;
}
}