/*
* Copyright 2015 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.platform;
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.platform.DescribePlatformResponse;
import jp.primecloud.auto.api.response.platform.PlatformAwsResponse;
import jp.primecloud.auto.api.response.platform.PlatformAzureResponse;
import jp.primecloud.auto.api.response.platform.PlatformCloudstackResponse;
import jp.primecloud.auto.api.response.platform.PlatformNiftyResponse;
import jp.primecloud.auto.api.response.platform.PlatformOpenstackResponse;
import jp.primecloud.auto.api.response.platform.PlatformResponse;
import jp.primecloud.auto.api.response.platform.PlatformVcloudResponse;
import jp.primecloud.auto.api.response.platform.PlatformVmwareResponse;
import jp.primecloud.auto.entity.crud.AwsCertificate;
import jp.primecloud.auto.entity.crud.CloudstackCertificate;
import jp.primecloud.auto.entity.crud.Platform;
import jp.primecloud.auto.entity.crud.PlatformAws;
import jp.primecloud.auto.entity.crud.User;
import jp.primecloud.auto.entity.crud.VmwareKeyPair;
import jp.primecloud.auto.exception.AutoApplicationException;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
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>
* プラットフォーム情報取得
* </p>
*/
@Path("/DescribePlatform")
public class DescribePlatform extends ApiSupport {
@GET
@Produces(MediaType.APPLICATION_JSON)
public DescribePlatformResponse describePlatform(@QueryParam(PARAM_NAME_PLATFORM_NO) String platformNo) {
// 入力チェック
ApiValidate.validatePlatformNo(platformNo);
// ユーザ取得
User user = checkAndGetUser();
// プラットフォーム取得
Platform platform = platformDao.read(Long.parseLong(platformNo));
// プラットフォームが存在しない場合
if (platform == null) {
throw new AutoApplicationException("EAPI-100000", "Platform", PARAM_NAME_PLATFORM_NO, platformNo);
}
// プラットフォームを選択できない場合
if (BooleanUtils.isNotTrue(platform.getSelectable())) {
throw new AutoApplicationException("EAPI-000020", "Platform", PARAM_NAME_PLATFORM_NO, platformNo);
}
// プラットフォームを利用できない場合
if (!platformService.isUsablePlatform(user.getUserNo(), platform)) {
throw new AutoApplicationException("EAPI-000020", "Platform", PARAM_NAME_PLATFORM_NO, platformNo);
}
PlatformResponse platformResponse = new PlatformResponse(platform);
// AWS
if (PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) {
PlatformAwsResponse awsResponse = getAwsDetail(user.getUserNo(), platform.getPlatformNo());
platformResponse.setAws(awsResponse);
}
// VMware
else if (PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) {
PlatformVmwareResponse vmwareResponse = getVmwareDetail(user.getUserNo(), platform.getPlatformNo());
platformResponse.setVmware(vmwareResponse);
}
// Nifty
else if (PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) {
PlatformNiftyResponse niftyResponse = getNiftyDetail(user.getUserNo(), platform.getPlatformNo());
platformResponse.setNifty(niftyResponse);
}
// CloudStack
else if (PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) {
PlatformCloudstackResponse csResponse = getCloudstackDetail(user.getUserNo(), platform.getPlatformNo());
platformResponse.setCloudstack(csResponse);
}
// vCloud
else if (PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) {
PlatformVcloudResponse vcloudResponse = getVcloudDetail(user.getUserNo(), platform.getPlatformNo());
platformResponse.setVcloud(vcloudResponse);
}
// Azure
else if (PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) {
PlatformAzureResponse azureResponse = getAzureDetail(user.getUserNo(), platform.getPlatformNo());
platformResponse.setAzure(azureResponse);
}
// OpenStack
else if (PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) {
PlatformOpenstackResponse openstackResponse = getOpenstackDetail(user.getUserNo(), platform.getPlatformNo());
platformResponse.setOpenstack(openstackResponse);
}
DescribePlatformResponse response = new DescribePlatformResponse(platformResponse);
return response;
}
private PlatformAwsResponse getAwsDetail(Long userNo, Long platformNo) {
PlatformAwsResponse response = new PlatformAwsResponse();
PlatformAws aws = platformAwsDao.read(platformNo);
// キー名
List<KeyPairInfo> keyPairs = awsDescribeService.getKeyPairs(userNo, platformNo);
for (KeyPairInfo keyPair : keyPairs) {
response.getKeyNames().add(keyPair.getKeyName());
}
// セキュリティグループ
List<SecurityGroup> securityGroups = awsDescribeService.getSecurityGroups(userNo, platformNo);
for (SecurityGroup securityGroup : securityGroups) {
response.getSecurityGroups().add(securityGroup.getGroupName());
}
// デフォルトキーペア
AwsCertificate certificate = awsCertificateDao.read(userNo, platformNo);
response.setDefKeyPair(StringUtils.isEmpty(certificate.getDefKeypair()) ? null : certificate.getDefKeypair());
// サブネット
if (BooleanUtils.isTrue(aws.getVpc())) {
List<Subnet> subnets = awsDescribeService.getSubnets(userNo, platformNo);
for (Subnet subnet : subnets) {
response.getSubnets().add(subnet.getCidrBlock());
}
// デフォルトサブネット
if (StringUtils.isNotEmpty(certificate.getDefSubnet())) {
for (Subnet subnet : subnets) {
if (StringUtils.equals(subnet.getSubnetId(), certificate.getDefSubnet())) {
response.setDefSubnet(subnet.getCidrBlock());
}
}
}
// ELBのデフォルトサブネット
if (StringUtils.isNotEmpty(certificate.getDefLbSubnet())) {
for (Subnet subnet : subnets) {
if (StringUtils.equals(subnet.getSubnetId(), certificate.getDefLbSubnet())) {
response.setDefLbSubnet(subnet.getCidrBlock());
}
}
}
}
return response;
}
private PlatformCloudstackResponse getCloudstackDetail(Long userNo, Long platformNo) {
PlatformCloudstackResponse response = new PlatformCloudstackResponse();
//デフォルトキーペア
CloudstackCertificate certificate = cloudstackCertificateDao.read(userNo, platformNo);
response.setDefKeyPair(StringUtils.isEmpty(certificate.getDefKeypair()) ? null : certificate.getDefKeypair());
return response;
}
private PlatformVmwareResponse getVmwareDetail(Long userNo, Long platformNo) {
PlatformVmwareResponse response = new PlatformVmwareResponse();
// キー名
List<VmwareKeyPair> keyPairs = vmwareDescribeService.getKeyPairs(userNo, platformNo);
for (VmwareKeyPair keyPair : keyPairs) {
response.getKeyNames().add(keyPair.getKeyName());
}
// ComputeResource
List<ComputeResource> computeResources = vmwareDescribeService.getComputeResources(platformNo);
for (ComputeResource computeResource : computeResources) {
response.getComputeResources().add(computeResource.getName());
}
return response;
}
private PlatformNiftyResponse getNiftyDetail(Long userNo, Long platformNo) {
return new PlatformNiftyResponse();
}
private PlatformVcloudResponse getVcloudDetail(Long userNo, Long platformNo) {
return new PlatformVcloudResponse();
}
private PlatformOpenstackResponse getOpenstackDetail(Long userNo, Long platformNo) {
return new PlatformOpenstackResponse();
}
private PlatformAzureResponse getAzureDetail(Long userNo, Long platformNo) {
return new PlatformAzureResponse();
}
}