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.lb; 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.lb.EditLoadBalancerResponse; import jp.primecloud.auto.common.constant.PCCConstant; import jp.primecloud.auto.common.status.LoadBalancerStatus; import jp.primecloud.auto.entity.crud.AwsLoadBalancer; import jp.primecloud.auto.entity.crud.CloudstackLoadBalancer; import jp.primecloud.auto.entity.crud.LoadBalancer; import jp.primecloud.auto.entity.crud.PlatformAws; import jp.primecloud.auto.entity.crud.User; import jp.primecloud.auto.exception.AutoApplicationException; import jp.primecloud.auto.exception.AutoException; import jp.primecloud.auto.service.dto.SecurityGroupDto; import jp.primecloud.auto.service.dto.SubnetDto; import jp.primecloud.auto.util.MessageUtils; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; @Path("/EditLoadBalancer") public class EditLoadBalancer extends ApiSupport { /** * * ? * * @param farmNo ? * @param loadBalancerNo ?? * @param componentNo ??? * @param securityGroups (?) * @param cidrBlock ?(cidrBlock??) * @param comment * * @return EditLoadBalancerResponse */ @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public EditLoadBalancerResponse editLoadBalancer(@QueryParam(PARAM_NAME_USER) String userName, @QueryParam(PARAM_NAME_FARM_NO) String farmNo, @QueryParam(PARAM_NAME_LOAD_BALANCER_NO) String loadBalancerNo, @QueryParam(PARAM_NAME_COMPONENT_NO) String componentNo, @QueryParam(PARAM_NAME_SECURITY_GROUPS) String securityGroups, @QueryParam(PARAM_NAME_SUBNET) String cidrBlock, @QueryParam(PARAM_NAME_COMMENT) String comment, @QueryParam(PARAM_NAME_IS_INTERNAL) String isInternal) { EditLoadBalancerResponse response = new EditLoadBalancerResponse(); try { // ? // Key(??) ApiValidate.validateUser(userName); // ? User user = userDao.readByUsername(userName); if (user == null) { // ???? throw new AutoApplicationException("EAPI-100000", "User", "UserName", userName); } // FarmNo ApiValidate.validateFarmNo(farmNo); // LoadBalancerNo ApiValidate.validateLoadBalancerNo(loadBalancerNo); LoadBalancer loadBalancer = loadBalancerDao.read(Long.parseLong(loadBalancerNo)); if (loadBalancer == null) { // ????? throw new AutoApplicationException("EAPI-100000", "LoadBalancer", PARAM_NAME_LOAD_BALANCER_NO, loadBalancerNo); } if (BooleanUtils.isFalse(loadBalancer.getFarmNo().equals(Long.parseLong(farmNo)))) { //?????? throw new AutoApplicationException("EAPI-100022", "LoadBalancer", farmNo, PARAM_NAME_LOAD_BALANCER_NO, loadBalancerNo); } // ComponentNo ApiValidate.validateComponentNo(componentNo); //vpcId? PlatformAws platformAws = null; String vpcId = null; if (LB_TYPE_ELB.equals(loadBalancer.getType())) { platformAws = platformAwsDao.read(loadBalancer.getPlatformNo()); if (platformAws.getVpc() && StringUtils.isNotEmpty(platformAws.getVpcId())) { vpcId = platformAws.getVpcId(); } } //SecurityGroups if (LB_TYPE_ELB.equals(loadBalancer.getType()) && platformAws.getVpc()) { //ELB+VPC?? ApiValidate.validateSecurityGroups(securityGroups); if (checkSecurityGroups(user.getUserNo(), loadBalancer.getPlatformNo(), vpcId, securityGroups) == false) { //????? throw new AutoApplicationException("EAPI-100019", loadBalancer.getPlatformNo(), securityGroups); } } //Subnet String subnetId = null; String availabilityZone = null; if (LB_TYPE_ELB.equals(loadBalancer.getType()) && platformAws.getVpc()) { //ELB+VPC?? ApiValidate.validateSubnet(cidrBlock); List<String> cidrBlocks = commaTextToList(cidrBlock); List<SubnetDto> subnetDtos = getSubnet(user.getUserNo(), loadBalancer.getPlatformNo(), vpcId, cidrBlocks); if (subnetDtos.size() != cidrBlocks.size()) { //?????? throw new AutoApplicationException("EAPI-000017", loadBalancer.getPlatformNo(), cidrBlock); } StringBuffer subnetBuffer = new StringBuffer(); StringBuffer zoneBuffer = new StringBuffer(); List<String> zones = new ArrayList<String>(); for (SubnetDto subnetDto : subnetDtos) { if (zones.contains(subnetDto.getZoneid())) { //????????? throw new AutoApplicationException("EAPI-100032", cidrBlock); } zones.add(subnetDto.getZoneid()); subnetBuffer.append( subnetBuffer.length() > 0 ? "," + subnetDto.getSubnetId() : subnetDto.getSubnetId()); zoneBuffer .append(zoneBuffer.length() > 0 ? "," + subnetDto.getZoneid() : subnetDto.getZoneid()); } subnetId = subnetBuffer.toString(); availabilityZone = zoneBuffer.toString(); } // Comment ApiValidate.validateComment(comment); // isInternal boolean internal = false; if (LB_TYPE_ELB.equals(loadBalancer.getType()) && platformAws.getVpc()) { if (isInternal != null) { ApiValidate.validateIsStaticIp(isInternal); internal = Boolean.parseBoolean(isInternal); } else { AwsLoadBalancer awsLoadBalancer = awsLoadBalancerDao.read(Long.parseLong(loadBalancerNo)); internal = awsLoadBalancer.getInternal(); } } else { if (isInternal != null) { // ELB ?? ?VPC?????? throw new AutoApplicationException("EAPI-100040", loadBalancerNo); } } CloudstackLoadBalancer cloudstackLoadBalancer = null; if (PCCConstant.LOAD_BALANCER_CLOUDSTACK.equals(loadBalancer.getType())) { cloudstackLoadBalancer = cloudstackLoadBalancerDao.read(Long.parseLong(loadBalancerNo)); } LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getStatus()); if (LoadBalancerStatus.WARNING == status) { // ? ? Warning throw new AutoApplicationException("EAPI-100025", loadBalancerNo); } // ? if (LB_TYPE_ELB.equals(loadBalancer.getType())) { //EBS(Elastic Load Balance) //TODO loadBalancerService.updateAwsLoadBalancer(Long.parseLong(loadBalancerNo), loadBalancer.getLoadBalancerName(), comment, Long.parseLong(componentNo), subnetId, securityGroups, availabilityZone, internal); } else if (LB_TYPE_ULTRA_MONKEY.equals(loadBalancer.getType())) { //UltraMonkey loadBalancerService.updateUltraMonkeyLoadBalancer(Long.parseLong(loadBalancerNo), loadBalancer.getLoadBalancerName(), comment, Long.parseLong(componentNo)); } else if (LB_TYPE_CLOUDSTACK.equals(loadBalancer.getType())) { //CloudStack loadBalancerService.updateCloudstackLoadBalancer(Long.parseLong(loadBalancerNo), loadBalancer.getLoadBalancerName(), comment, Long.parseLong(componentNo), cloudstackLoadBalancer.getAlgorithm(), cloudstackLoadBalancer.getPublicport(), cloudstackLoadBalancer.getPrivateport()); } response.setSuccess(true); } catch (Throwable e) { String message = ""; if (e instanceof AutoException || e instanceof AutoApplicationException) { message = e.getMessage(); } else { message = MessageUtils.getMessage("EAPI-000000"); } log.error(message, e); response.setMessage(message); response.setSuccess(false); } return response; } /** * * ??? * * @param userNo ? * @param platformNo ? * @param vpcId vpcId * @param cidrBlocks cidrBlock? * @return List<SubnetDto> cidrBlock??????? */ private List<SubnetDto> getSubnet(Long userNo, Long platformNo, String vpcId, List<String> cidrBlocks) { List<SubnetDto> subnetDtos = new ArrayList<SubnetDto>(); if (cidrBlocks.size() > 0) { List<SubnetDto> tmpSubnetDtos = iaasDescribeService.getSubnets(userNo, platformNo, vpcId); for (SubnetDto subnetDto : tmpSubnetDtos) { if (cidrBlocks.contains(subnetDto.getCidrBlock())) { subnetDtos.add(subnetDto); } } } return subnetDtos; } /** * * ???????? * * @param userNo ? * @param platformNo ? * @param vpcId vpcId * @param securityGroups (?) * @return true:??false:??? */ 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; } /** * * SecurityGroupName??? * * @param userNo ? * @param platformNo ? * @param vpcId vpcId(vpc???NULL) * @return SecurityGroupName? */ 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; } /** * * ???? * * @param instanceTypesText ?(??) * @return (??)? */ 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; } }