/* * 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.api.instance; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import jp.primecloud.auto.api.ApiSupport; import jp.primecloud.auto.api.ApiValidate; import jp.primecloud.auto.api.response.address.AwsAddressResponse; import jp.primecloud.auto.api.response.instance.AwsInstanceResponse; import jp.primecloud.auto.api.response.instance.AzureInstanceResponse; import jp.primecloud.auto.api.response.instance.CloudstackInstanceResponse; import jp.primecloud.auto.api.response.instance.DescribeInstanceResponse; import jp.primecloud.auto.api.response.instance.InstanceResponse; import jp.primecloud.auto.api.response.instance.NiftyInstanceResponse; import jp.primecloud.auto.api.response.instance.OpenstackInstanceResponse; import jp.primecloud.auto.api.response.instance.VcloudInstanceNetworkResponse; import jp.primecloud.auto.api.response.instance.VcloudInstanceResponse; import jp.primecloud.auto.api.response.instance.VmwareInstanceResponse; import jp.primecloud.auto.entity.crud.AwsAddress; import jp.primecloud.auto.entity.crud.AwsInstance; import jp.primecloud.auto.entity.crud.AzureInstance; import jp.primecloud.auto.entity.crud.CloudstackInstance; import jp.primecloud.auto.entity.crud.Instance; import jp.primecloud.auto.entity.crud.NiftyInstance; import jp.primecloud.auto.entity.crud.NiftyKeyPair; import jp.primecloud.auto.entity.crud.OpenstackInstance; import jp.primecloud.auto.entity.crud.Platform; import jp.primecloud.auto.entity.crud.PlatformVcloudStorageType; import jp.primecloud.auto.entity.crud.User; import jp.primecloud.auto.entity.crud.VcloudInstance; import jp.primecloud.auto.entity.crud.VcloudInstanceNetwork; import jp.primecloud.auto.entity.crud.VmwareAddress; import jp.primecloud.auto.entity.crud.VmwareInstance; import jp.primecloud.auto.entity.crud.VmwareKeyPair; import jp.primecloud.auto.exception.AutoApplicationException; import jp.primecloud.auto.service.dto.KeyPairDto; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import com.amazonaws.services.ec2.model.Subnet; @Path("/DescribeInstance") public class DescribeInstance extends ApiSupport { /** * サーバ情報取得 * * @param instanceNo インスタンス番号 * @return DescribeInstanceResponse */ @GET @Produces(MediaType.APPLICATION_JSON) public DescribeInstanceResponse describeInstance(@QueryParam(PARAM_NAME_INSTANCE_NO) String instanceNo) { // 入力チェック // InstanceNo ApiValidate.validateInstanceNo(instanceNo); // サーバ情報取得 Instance instance = getInstance(Long.parseLong(instanceNo)); // 権限チェック User user = checkAndGetUser(instance); //プラットフォーム取得 Platform platform = platformDao.read(instance.getPlatformNo()); if (platform == null) { // プラットフォームが存在しない throw new AutoApplicationException("EAPI-100000", "Platform", PARAM_NAME_PLATFORM_NO, instance.getPlatformNo()); } //インスタンス情報設定 InstanceResponse instanceResponse = new InstanceResponse(instance); // TODO CLOUD BRANCHING if (PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) { //AWS AwsInstance awsInstance = awsInstanceDao.read(Long.parseLong(instanceNo)); if (awsInstance == null) { // AWSインスタンスが存在しない throw new AutoApplicationException("EAPI-100000", "AwsInstance", PARAM_NAME_INSTANCE_NO, instanceNo); } AwsInstanceResponse awsResponse = new AwsInstanceResponse(awsInstance); //SUBNET取得 if (StringUtils.isNotEmpty(awsInstance.getSubnetId())) { List<Subnet> subnets = awsDescribeService.getSubnets(user.getUserNo(), platform.getPlatformNo()); for (Subnet subnet : subnets) { if (StringUtils.equals(subnet.getSubnetId(), awsInstance.getSubnetId())) { awsResponse.setSubnet(subnet.getCidrBlock()); break; } } } // アドレス情報を取得 List<AwsAddress> awsAddresses = awsAddressDao.readByUserNo(user.getUserNo()); for (AwsAddress awsAddress : awsAddresses) { if (platform.getPlatformNo().equals(awsAddress.getPlatformNo()) && instance.getInstanceNo().equals(awsAddress.getInstanceNo())) { awsResponse.setAwsAddress(new AwsAddressResponse(awsAddress)); break; } } //AWSインスタンス情報設定 instanceResponse.setAws(awsResponse); } else if (PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) { //CloudStack CloudstackInstance cloudstackInstance = cloudstackInstanceDao.read(Long.parseLong(instanceNo)); if (cloudstackInstance == null) { // CloudStackインスタンスが存在しない throw new AutoApplicationException("EAPI-100000", "CloudstackInstance", PARAM_NAME_INSTANCE_NO, instanceNo); } //CloudStackインスタンス情報設定 instanceResponse.setCloudstack(new CloudstackInstanceResponse(cloudstackInstance)); } else if (PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) { //VMWare VmwareInstance vmwareInstance = vmwareInstanceDao.read(Long.parseLong(instanceNo)); if (vmwareInstance == null) { // VMWareインスタンスが存在しない throw new AutoApplicationException("EAPI-100000", "VmwareInstance", PARAM_NAME_INSTANCE_NO, instanceNo); } VmwareInstanceResponse vmResponse = new VmwareInstanceResponse(vmwareInstance); //VMWARE_ADDRESS取得 VmwareAddress vmwareAddress = vmwareAddressDao.readByInstanceNo(Long.parseLong(instanceNo)); if (vmwareAddress != null && BooleanUtils.isTrue(vmwareAddress.getEnabled())) { vmResponse.setIsStaticIp(true); vmResponse.setSubnetMask(vmwareAddress.getSubnetMask()); vmResponse.setDefaultGateway(vmwareAddress.getDefaultGateway()); } else { vmResponse.setIsStaticIp(false); } //VMWARE_KEYPAIR取得 List<VmwareKeyPair> keyPairs = vmwareDescribeService .getKeyPairs(user.getUserNo(), instance.getPlatformNo()); for (VmwareKeyPair keyPair : keyPairs) { if (keyPair.getKeyNo().equals(vmwareInstance.getKeyPairNo())) { vmResponse.setKeyName(keyPair.getKeyName()); break; } } //VMWareインスタンス情報設定 instanceResponse.setVmware(vmResponse); } else if (PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) { //Nifty NiftyInstance niftyInstance = niftyInstanceDao.read(Long.parseLong(instanceNo)); if (niftyInstance == null) { // /Niftyインスタンスが存在しない throw new AutoApplicationException("EAPI-100000", "NiftyInstance", PARAM_NAME_INSTANCE_NO, instanceNo); } NiftyInstanceResponse niftyResponse = new NiftyInstanceResponse(niftyInstance); //NIFTY_KEYPAIR取得 List<NiftyKeyPair> keyPairs = niftyDescribeService.getKeyPairs(user.getUserNo(), instance.getPlatformNo()); for (NiftyKeyPair keyPair : keyPairs) { if (keyPair.getKeyNo().equals(niftyInstance.getKeyPairNo())) { niftyResponse.setKeyName(keyPair.getKeyName()); break; } } //Niftyインスタンス情報設定 instanceResponse.setNifty(niftyResponse); } else if (PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) { //VCLOUD_INSTANCE VcloudInstance vcloudInstance = vcloudInstanceDao.read(Long.parseLong(instanceNo)); if (vcloudInstance == null) { // VMWareインスタンスが存在しない throw new AutoApplicationException("EAPI-100000", "VcloudInstance", PARAM_NAME_INSTANCE_NO, instanceNo); } VcloudInstanceResponse vcloudInstanceResponse = new VcloudInstanceResponse(vcloudInstance); //PLATFORM_VCLOUD_STORAGE_TYPE取得 List<PlatformVcloudStorageType> storageTypes = platformVcloudStorageTypeDao.readByPlatformNo(platform .getPlatformNo()); for (PlatformVcloudStorageType storageType : storageTypes) { if (storageType.getStorageTypeNo().equals(vcloudInstance.getStorageTypeNo())) { vcloudInstanceResponse.setStorageTypeName(storageType.getStorageTypeName()); break; } } //VCLOUD_KEYPAIR取得 List<KeyPairDto> keyPairs = iaasDescribeService.getKeyPairs(user.getUserNo(), instance.getPlatformNo()); for (KeyPairDto keyPair : keyPairs) { if (keyPair.getKeyNo().equals(vcloudInstance.getKeyPairNo())) { vcloudInstanceResponse.setKeyName(keyPair.getKeyName()); break; } } // VCloudNetwork取得 List<VcloudInstanceNetwork> vcloudInstanceNetworks = vcloudInstanceNetworkDao.readByInstanceNo(Long .parseLong(instanceNo)); for (VcloudInstanceNetwork vcloudInstanceNetwork : vcloudInstanceNetworks) { // VCloudNetwork情報設定 VcloudInstanceNetworkResponse vcloudInstanceNetworkResponse = new VcloudInstanceNetworkResponse( vcloudInstanceNetwork); // プライマリ判定設定 if (BooleanUtils.isTrue(vcloudInstanceNetwork.getIsPrimary())) { vcloudInstanceNetworkResponse.setIsPrimary(true); } else { vcloudInstanceNetworkResponse.setIsPrimary(false); } vcloudInstanceResponse.getVcloudNetwoks().add(vcloudInstanceNetworkResponse); } //VCloudインスタンス情報設定 instanceResponse.setVcloud(vcloudInstanceResponse); } else if (PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) { //OpenStack OpenstackInstance openstackInstance = openstackInstanceDao.read(Long.parseLong(instanceNo)); if (openstackInstance == null) { // OpenStackインスタンスが存在しない throw new AutoApplicationException("EAPI-100000", "OpenstackInstance", PARAM_NAME_INSTANCE_NO, instanceNo); } //OpenStackインスタンス情報設定 instanceResponse.setOpenstack(new OpenstackInstanceResponse(openstackInstance)); } else if (PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) { //Azure AzureInstance azureInstance = azureInstanceDao.read(Long.parseLong(instanceNo)); if (azureInstance == null) { // Azureインスタンスが存在しない throw new AutoApplicationException("EAPI-100000", "AzureInstance", PARAM_NAME_INSTANCE_NO, instanceNo); } //Azureインスタンス情報設定 instanceResponse.setAzure(new AzureInstanceResponse(azureInstance)); } DescribeInstanceResponse response = new DescribeInstanceResponse(instanceResponse); return response; } }