diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java b/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java index e9dcbbfbeb0..c1d075e2768 100644 --- a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java +++ b/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java @@ -7,4 +7,5 @@ import com.cloud.utils.db.GenericDao; public interface Site2SiteVpnGatewayDao extends GenericDao { Site2SiteVpnGatewayVO findByIpAddrId(long id); + List listByVpcId(long vpcId); } diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java b/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java index feab33a992f..4963d827ec9 100644 --- a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java +++ b/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java @@ -6,21 +6,35 @@ import javax.ejb.Local; import org.apache.log4j.Logger; +import com.cloud.network.IPAddressVO; import com.cloud.network.Site2SiteVpnGatewayVO; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.Inject; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.JoinBuilder.JoinType; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @Local(value={Site2SiteVpnGatewayDao.class}) public class Site2SiteVpnGatewayDaoImpl extends GenericDaoBase implements Site2SiteVpnGatewayDao { + protected final IPAddressDaoImpl _addrDao = ComponentLocator.inject(IPAddressDaoImpl.class); + private static final Logger s_logger = Logger.getLogger(Site2SiteVpnGatewayDaoImpl.class); private final SearchBuilder AllFieldsSearch; + private final SearchBuilder VpcSearch; + private final SearchBuilder AddrSearch; protected Site2SiteVpnGatewayDaoImpl() { AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("addrId", AllFieldsSearch.entity().getAddrId(), SearchCriteria.Op.EQ); AllFieldsSearch.done(); + + VpcSearch = createSearchBuilder(); + AddrSearch = _addrDao.createSearchBuilder(); + AddrSearch.and("vpcId", AddrSearch.entity().getVpcId(), SearchCriteria.Op.EQ); + VpcSearch.join("addrSearch", AddrSearch, AddrSearch.entity().getId(), VpcSearch.entity().getAddrId(), JoinType.INNER); + VpcSearch.done(); } @Override @@ -29,4 +43,11 @@ public class Site2SiteVpnGatewayDaoImpl extends GenericDaoBase listByVpcId(long vpcId) { + SearchCriteria sc = VpcSearch.create(); + sc.setJoinParameters("addrSearch", "vpcId", vpcId); + return listBy(sc); + } } diff --git a/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java b/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java index 0104d09c27a..56934e91981 100644 --- a/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java @@ -80,12 +80,17 @@ public class Site2SiteVpnManagerImpl implements Site2SiteVpnService, Manager { public Site2SiteVpnGateway createVpnGateway(CreateVpnGatewayCmd cmd) { Long ipId = cmd.getPublicIpId(); IpAddress ip = _networkMgr.getIp(ipId); + Long vpcId = ip.getVpcId(); if (ip.getVpcId() == null) { throw new InvalidParameterValueException("The VPN gateway cannot create with ip not belong to VPC"); } if (_vpnGatewayDao.findByIpAddrId(ipId) != null) { throw new InvalidParameterValueException("The VPN gateway with ip ID " + ipId + " already existed!"); } + List gws = _vpnGatewayDao.listByVpcId(vpcId); + if (gws != null && gws.size() != 0) { + throw new InvalidParameterValueException("The VPN gateway of VPC " + vpcId + " already existed!"); + } Site2SiteVpnGatewayVO gw = new Site2SiteVpnGatewayVO(ipId); _vpnGatewayDao.persist(gw); return gw;