CS-15456: Prohibit creating more than one VPN gateway of VPC

This commit is contained in:
Sheng Yang 2012-07-05 15:43:46 -07:00
parent 21cdd08948
commit a0a5e25e32
3 changed files with 27 additions and 0 deletions

View File

@ -7,4 +7,5 @@ import com.cloud.utils.db.GenericDao;
public interface Site2SiteVpnGatewayDao extends GenericDao<Site2SiteVpnGatewayVO, Long> {
Site2SiteVpnGatewayVO findByIpAddrId(long id);
List<Site2SiteVpnGatewayVO> listByVpcId(long vpcId);
}

View File

@ -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<Site2SiteVpnGatewayVO, Long> implements Site2SiteVpnGatewayDao {
protected final IPAddressDaoImpl _addrDao = ComponentLocator.inject(IPAddressDaoImpl.class);
private static final Logger s_logger = Logger.getLogger(Site2SiteVpnGatewayDaoImpl.class);
private final SearchBuilder<Site2SiteVpnGatewayVO> AllFieldsSearch;
private final SearchBuilder<Site2SiteVpnGatewayVO> VpcSearch;
private final SearchBuilder<IPAddressVO> 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<Site2SiteVpnGatew
sc.setParameters("addrId", id);
return findOneBy(sc);
}
@Override
public List<Site2SiteVpnGatewayVO> listByVpcId(long vpcId) {
SearchCriteria<Site2SiteVpnGatewayVO> sc = VpcSearch.create();
sc.setJoinParameters("addrSearch", "vpcId", vpcId);
return listBy(sc);
}
}

View File

@ -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<Site2SiteVpnGatewayVO> 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;