Java tutorial
/* * 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.ArrayList; 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.instance.EditInstanceResponse; import jp.primecloud.auto.common.component.Subnet; import jp.primecloud.auto.common.status.InstanceStatus; import jp.primecloud.auto.entity.crud.CloudstackInstance; 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.ImageOpenstack; import jp.primecloud.auto.entity.crud.ImageVcloud; import jp.primecloud.auto.entity.crud.Instance; 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.User; import jp.primecloud.auto.entity.crud.VcloudInstance; import jp.primecloud.auto.exception.AutoApplicationException; import jp.primecloud.auto.service.dto.AddressDto; import jp.primecloud.auto.service.dto.InstanceNetworkDto; import jp.primecloud.auto.service.dto.KeyPairDto; import jp.primecloud.auto.service.dto.SecurityGroupDto; import jp.primecloud.auto.service.dto.StorageTypeDto; import jp.primecloud.auto.service.dto.SubnetDto; import jp.primecloud.auto.service.dto.ZoneDto; import jp.primecloud.auto.util.MessageUtils; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; @Path("/EditInstance") public class EditInstance extends ApiSupport { /** * * ? * @param userName PCC?? * @param farmNo ? * @param instanceNo ? * @param instanceType * @param keyName ??(AWS??) * @param securityGroups (AWS??) * @param availabilityZone (AWS??) * @param ipAddress IP(AWS?VCloud??) * @param cidrBlock (?)(cidrBlock)(EC2+VPC??) * @param privateIp IP(EC2+VPC??) * @param comment * @param storageType (VCLOUD??) * * @return EditInstanceResponse */ @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public EditInstanceResponse editInstance(@QueryParam(PARAM_NAME_USER) String userName, @QueryParam(PARAM_NAME_FARM_NO) String farmNo, @QueryParam(PARAM_NAME_INSTANCE_NO) String instanceNo, @QueryParam(PARAM_NAME_INSTANCE_TYPE) String instanceType, @QueryParam(PARAM_NAME_KEY_NAME) String keyName, @QueryParam(PARAM_NAME_SECURITY_GROUPS) String securityGroups, @QueryParam(PARAM_NAME_AVAILABILITY_ZONE) String availabilityZone, @QueryParam(PARAM_NAME_IP_ADDRESS) String ipAddress, @QueryParam(PARAM_NAME_SUBNET) String cidrBlock, @QueryParam(PARAM_NAME_PRIVATE_IP) String privateIp, @QueryParam(PARAM_NAME_COMMENT) String comment, @QueryParam(PARAM_NAME_STORAGE_TYPE) String storageType) { EditInstanceResponse response = new EditInstanceResponse(); try { // ?? ApiValidate.validateUser(userName); // ? User user = userDao.readByUsername(userName); // FarmNo ApiValidate.validateFarmNo(farmNo); // InstanceNo ApiValidate.validateInstanceNo(instanceNo); //? Instance instance = instanceDao.read(Long.valueOf(instanceNo)); if (instance == null || BooleanUtils.isTrue(instance.getLoadBalancer())) { // ???? or ?? throw new AutoApplicationException("EAPI-100000", "Instance", PARAM_NAME_INSTANCE_NO, instanceNo); } // ?? InstanceStatus status = InstanceStatus.fromStatus(instance.getStatus()); if (InstanceStatus.STOPPED != status) { // ??? throw new AutoApplicationException("EAPI-100014", instanceNo); } // ???? if (instance.getFarmNo().equals(Long.valueOf(farmNo)) == false) { //????? throw new AutoApplicationException("EAPI-100022", "Instance", farmNo, PARAM_NAME_INSTANCE_NO, instanceNo); } //? Platform platform = platformDao.read(instance.getPlatformNo()); if (platform == null) { // ???? throw new AutoApplicationException("EAPI-100000", "Platform", PARAM_NAME_PLATFORM_NO, instance.getPlatformNo()); } // ? if (!PLATFORM_TYPE_AWS.equals(platform.getPlatformType()) && !PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType()) && !PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType()) && !PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType()) && !PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) { //?Aws?CloudStack?VCloud?OpenStack?Azure throw new AutoApplicationException("EAPI-100031", "EC2 or CloudStack or VCloud or OpenStack or Azure", instance.getInstanceNo(), instance.getPlatformNo()); } // ? Image image = imageDao.read(instance.getImageNo()); if (image == null || image.getPlatformNo().equals(instance.getPlatformNo()) == false) { // ???? throw new AutoApplicationException("EAPI-100000", "Image", PARAM_NAME_IMAGE_NO, instance.getImageNo()); } if (PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) { editAwsInstance(user.getUserNo(), instance, instanceType, keyName, securityGroups, cidrBlock, availabilityZone, ipAddress, privateIp, comment); } else if (PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) { editCloudstackInstance(user.getUserNo(), instance, instanceType, keyName, comment); } else if (PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) { editVcloudInstance(user.getUserNo(), instance, instanceType, storageType, keyName, comment); } else if (PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) { editOpenstackInstance(user.getUserNo(), instance, instanceType, keyName, securityGroups, availabilityZone, comment); } else if (PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) { editAzureInstance(user.getUserNo(), instance, instanceType, cidrBlock, availabilityZone, comment); } response.setSuccess(true); } catch (Throwable e) { String message = ""; if (StringUtils.isEmpty(e.getMessage())) { message = MessageUtils.getMessage("EAPI-000000"); } else { message = e.getMessage(); } log.error(message, e); response.setMessage(message); response.setSuccess(false); } return response; } private void editAwsInstance(Long userNo, Instance instance, String instanceType, String keyName, String securityGroups, String cidrBlock, String availabilityZone, String ipAddress, String privateIp, String comment) { PlatformAws platformAws = platformAwsDao.read(instance.getPlatformNo()); // InstanceType ApiValidate.validateInstanceType(instanceType, true); ImageAws imageAws = imageAwsDao.read(instance.getImageNo()); if (commaTextToList(imageAws.getInstanceTypes()).contains(instanceType) == false) { // ????????? throw new AutoApplicationException("EAPI-000011", imageAws.getImageNo(), instanceType); } // KeyName ApiValidate.validateKeyName(keyName); if (checkKeyName(userNo, instance.getPlatformNo(), keyName) == false) { // ????? throw new AutoApplicationException("EAPI-000012", instance.getPlatformNo(), keyName); } // SecurityGroups(AWS??) ApiValidate.validateSecurityGroups(securityGroups); if (checkSecurityGroups(userNo, instance.getPlatformNo(), platformAws.getVpcId(), securityGroups) == false) { //????? throw new AutoApplicationException("EAPI-100019", instance.getPlatformNo(), securityGroups); } // Subnet(VPC??) String subnetId = null; if (platformAws.getVpc()) { //? ApiValidate.validateSubnet(cidrBlock); SubnetDto subnetDto = getSubnet(userNo, instance.getPlatformNo(), platformAws.getVpcId(), cidrBlock); if (subnetDto == null) { //?????? throw new AutoApplicationException("EAPI-000017", instance.getPlatformNo(), cidrBlock); } subnetId = subnetDto.getSubnetId(); availabilityZone = subnetDto.getZoneid(); } else { subnetId = null; } //PrivateIpAddress(VPC??) if (platformAws.getVpc() && StringUtils.isNotEmpty(subnetId) && StringUtils.isNotEmpty(privateIp)) { //?? ApiValidate.validatePrivateIpAddress(privateIp); //??IP? if (checkPrivateIp(cidrBlock, privateIp) == false) { //???IP???? throw new AutoApplicationException("EAPI-000018", cidrBlock, privateIp); } } else { privateIp = null; } //AvailabilityZoneName if (platformAws.getVpc() == false) { //VPC????? //VPC??????????????? ApiValidate.validateAvailabilityZone(availabilityZone); if (StringUtils.isNotEmpty(availabilityZone) && checkAvailabilityZoneName(userNo, instance.getPlatformNo(), availabilityZone) == false) { // AvailabilityZoneName ????? throw new AutoApplicationException("EAPI-100017", instance.getPlatformNo(), availabilityZone); } } //IpAddress(ElasticIp) Long ipAddressNo = null; ApiValidate.validateIpAddress(ipAddress, false); if (StringUtils.isNotEmpty(ipAddress)) { ipAddressNo = getIpAddressNo(userNo, instance.getPlatformNo(), instance.getInstanceNo(), ipAddress); if (ipAddressNo == null) { // IPAddress?DB???? or IP????????? throw new AutoApplicationException("EAPI-100016", instance.getInstanceNo(), ipAddress); } } // Comment ApiValidate.validateComment(comment); // ? instanceService.updateAwsInstance(instance.getInstanceNo(), instance.getInstanceName(), comment, keyName, instanceType, securityGroups, availabilityZone, ipAddressNo, subnetId, privateIp); } private void editCloudstackInstance(Long userNo, Instance instance, String instanceType, String keyName, String comment) { CloudstackInstance cloudstackInstance = cloudstackInstanceDao.read(instance.getInstanceNo()); if (cloudstackInstance == null) { // CloudStackInstance???? throw new AutoApplicationException("EAPI-100000", "CloudStackInstance", PARAM_NAME_INSTANCE_NO, instance.getInstanceNo()); } // InstanceType ApiValidate.validateInstanceType(instanceType, true); ImageCloudstack imageCloudstack = imageCloudstackDao.read(instance.getImageNo()); if (commaTextToList(imageCloudstack.getInstanceTypes()).contains(instanceType) == false) { // ????????? throw new AutoApplicationException("EAPI-000011", imageCloudstack.getImageNo(), instanceType); } // KeyName if (StringUtils.isNotEmpty(keyName)) { if (checkKeyName(userNo, instance.getPlatformNo(), keyName) == false) { // ????? throw new AutoApplicationException("EAPI-000012", instance.getPlatformNo(), keyName); } } // Comment ApiValidate.validateComment(comment); //? instanceService.updateCloudstackInstance(instance.getInstanceNo(), instance.getInstanceName(), comment, keyName, instanceType, cloudstackInstance.getSecuritygroup(), cloudstackInstance.getZoneid(), null); } private void editVcloudInstance(Long userNo, Instance instance, String instanceType, String storageType, String keyName, String comment) { VcloudInstance vcloudInstance = vcloudInstanceDao.read(instance.getInstanceNo()); if (vcloudInstance == null) { // VcloudInstance???? throw new AutoApplicationException("EAPI-100000", "VcloudInstance", PARAM_NAME_INSTANCE_NO, instance.getInstanceNo()); } // InstanceType ApiValidate.validateInstanceType(instanceType, true); ImageVcloud imageVcloud = imageVcloudDao.read(instance.getImageNo()); if (commaTextToList(imageVcloud.getInstanceTypes()).contains(instanceType) == false) { // ????????? throw new AutoApplicationException("EAPI-000011", imageVcloud.getImageNo(), instanceType); } // StorageType Long storageTypeNo = null; ApiValidate.validateStrageType(storageType); storageTypeNo = checkStorageType(userNo, instance.getPlatformNo(), storageType); if (storageTypeNo == null) { // ????? throw new AutoApplicationException("EAPI-000022", instance.getPlatformNo(), storageType); } // KeyName Long keyNo = null; ApiValidate.validateKeyName(keyName); keyNo = checkVcloudKeyName(userNo, instance.getPlatformNo(), keyName); if (keyNo == null) { // ????? throw new AutoApplicationException("EAPI-000012", instance.getPlatformNo(), keyName); } // Comment ApiValidate.validateComment(comment); // TODO ??? List<InstanceNetworkDto> instanceNetworks = new ArrayList<InstanceNetworkDto>(); //? instanceService.updateVcloudInstance(instance.getInstanceNo(), instance.getInstanceName(), comment, storageTypeNo, keyNo, instanceType, instanceNetworks); } private void editOpenstackInstance(Long userNo, Instance instance, String instanceType, String keyName, String securityGroups, String availabilityZone, String comment) { // InstanceType ApiValidate.validateInstanceType(instanceType, true); ImageOpenstack imageOpenstack = imageOpenstackDao.read(instance.getImageNo()); if (commaTextToList(imageOpenstack.getInstanceTypes()).contains(instanceType) == false) { // ????????? throw new AutoApplicationException("EAPI-000011", imageOpenstack.getImageNo(), instanceType); } // KeyName ApiValidate.validateKeyName(keyName); if (checkKeyName(userNo, instance.getPlatformNo(), keyName) == false) { // ????? throw new AutoApplicationException("EAPI-000012", instance.getPlatformNo(), keyName); } // SecurityGroups ApiValidate.validateSecurityGroups(securityGroups); if (checkSecurityGroups(userNo, instance.getPlatformNo(), null, securityGroups) == false) { //????? throw new AutoApplicationException("EAPI-100019", instance.getPlatformNo(), securityGroups); } //AvailabilityZone ApiValidate.validateAvailabilityZone(availabilityZone); if (StringUtils.isNotEmpty(availabilityZone) && checkAvailabilityZoneName(userNo, instance.getPlatformNo(), availabilityZone) == false) { // AvailabilityZone ????? throw new AutoApplicationException("EAPI-100017", instance.getPlatformNo(), availabilityZone); } // Comment ApiValidate.validateComment(comment); // ? instanceService.updateOpenStackInstance(instance.getInstanceNo(), instance.getInstanceName(), comment, instanceType, availabilityZone, securityGroups, keyName); } private void editAzureInstance(Long userNo, Instance instance, String instanceType, String cidrBlock, String availabilitySet, String comment) { PlatformAzure platformAzure = platformAzureDao.read(instance.getPlatformNo()); // InstanceType ApiValidate.validateInstanceType(instanceType, true); ImageAzure imageAzure = imageAzureDao.read(instance.getImageNo()); if (commaTextToList(imageAzure.getInstanceTypes()).contains(instanceType) == false) { // ????????? throw new AutoApplicationException("EAPI-000011", imageAzure.getImageNo(), instanceType); } //AvailabilitySet ApiValidate.validateAvailabilityZone(availabilitySet); if (StringUtils.isNotEmpty(availabilitySet)) { String[] availabilitySets = platformAzure.getAvailabilitySets().split(","); boolean existFlg = false; for (int i = 0; i <= availabilitySets.length; i++) { if (availabilitySet.equals(availabilitySets[i])) { existFlg = true; } } if (!existFlg) { // AvailabilitySet ????? throw new AutoApplicationException("EAPI-100017", instance.getPlatformNo(), availabilitySet); } } // Subnet String subnetId = null; ApiValidate.validateSubnet(cidrBlock); SubnetDto subnetDto = getAzureSubnet(userNo, instance.getPlatformNo(), platformAzure.getNetworkName(), cidrBlock); if (subnetDto == null) { //?????? throw new AutoApplicationException("EAPI-000017", instance.getPlatformNo(), cidrBlock); } subnetId = subnetDto.getSubnetId(); // Comment ApiValidate.validateComment(comment); //? instanceService.updateAzureInstance(instance.getInstanceNo(), instance.getInstanceName(), comment, instanceType, availabilitySet, subnetId); } private Long checkStorageType(Long userNo, Long platformNo, String storageTypeName) { // ???????? List<StorageTypeDto> storageTypes = iaasDescribeService.getStorageTypes(userNo, platformNo); for (StorageTypeDto storageType : storageTypes) { if (StringUtils.equals(storageTypeName, storageType.getStorageTypeName())) { return storageType.getStorageTypeNo(); } } return null; } private boolean checkKeyName(Long userNo, Long platformNo, String keyName) { // ???????? //Aws or Eucalyptus or CloudStack List<KeyPairDto> keyPairs = iaasDescribeService.getKeyPairs(userNo, platformNo); for (KeyPairDto keyPair : keyPairs) { if (StringUtils.equals(keyName, keyPair.getKeyName())) { return true; } } return false; } private Long checkVcloudKeyName(Long userNo, Long platformNo, String keyName) { // ???????? //VCloud List<KeyPairDto> keyPairs = iaasDescribeService.getKeyPairs(userNo, platformNo); for (KeyPairDto keyPair : keyPairs) { if (StringUtils.equals(keyName, keyPair.getKeyName())) { return keyPair.getKeyNo(); } } return null; } private boolean checkSecurityGroups(Long userNo, Long platformNo, String vpcId, String securityGroups) { boolean isContain = false; if (StringUtils.isNotEmpty(securityGroups)) { List<String> groupNames = getSecurityGroupNames(userNo, platformNo, vpcId); for (String grouName : securityGroups.split(",")) { if (groupNames.contains(grouName.trim())) { isContain = true; } else { return false; } } } return isContain; } private List<String> getSecurityGroupNames(Long userNo, Long platformNo, String vpcId) { List<String> groupNames = new ArrayList<String>(); List<SecurityGroupDto> securityGroupDtos = iaasDescribeService.getSecurityGroups(userNo, platformNo, vpcId); for (SecurityGroupDto dto : securityGroupDtos) { groupNames.add(dto.getGroupName()); } return groupNames; } private Long getIpAddressNo(Long userNo, Long platformNo, Long instanceNo, String ipAddress) { Long ipAddressNo = null; List<AddressDto> addresses = iaasDescribeService.getAddresses(userNo, platformNo); for (AddressDto address : addresses) { if (StringUtils.equals(ipAddress, address.getPublicIp()) && (address.getInstanceNo() == null || instanceNo == address.getInstanceNo())) { ipAddressNo = address.getAddressNo(); break; } } return ipAddressNo; } private boolean checkAvailabilityZoneName(Long userNo, Long platformNo, String zoneName) { List<ZoneDto> zones = iaasDescribeService.getAvailabilityZones(userNo, platformNo); for (ZoneDto zone : zones) { if (StringUtils.equals(zoneName, zone.getZoneName())) { return true; } } return false; } private SubnetDto getSubnet(Long userNo, Long platformNo, String vpcId, String cidrBlock) { List<SubnetDto> subnets = iaasDescribeService.getSubnets(userNo, platformNo, vpcId); for (SubnetDto subnetDto : subnets) { if (subnetDto.getCidrBlock().equals(cidrBlock)) { return subnetDto; } } return null; } private SubnetDto getAzureSubnet(Long userNo, Long platformNo, String networkName, String cidrBlock) { List<SubnetDto> subnets = iaasDescribeService.getAzureSubnets(userNo, platformNo, networkName); for (SubnetDto subnetDto : subnets) { if (subnetDto.getCidrBlock().equals(cidrBlock)) { return subnetDto; } } return null; } private boolean checkPrivateIp(String cidrBlock, String privateIpAddress) { String[] splitCidr = cidrBlock.split("/"); Subnet subnet = new Subnet(splitCidr[0].trim(), Integer.parseInt(splitCidr[1].trim())); String subnetIp = splitCidr[0].trim(); //AWS(VPC)??3????IP??IP for (int i = 0; i < 3; i++) { subnetIp = Subnet.getNextAddress(subnetIp); subnet.addReservedIp(subnetIp); } return subnet.isScorp(privateIpAddress); } private static List<String> commaTextToList(String commaText) { List<String> list = new ArrayList<String>(); if (StringUtils.isNotEmpty(commaText)) { for (String splitStr : StringUtils.split(commaText, ",")) { list.add(splitStr.trim()); } } return list; } }