Merge pull request #1007 from ustcweizhou/dedicated-ip-for-domain

[4.7] CLOUDSTACK-8958: add dedicated ips to domain (account for now)For now, we dedicate ip pool to account, however, other accounts in the same domain cannot fetch the ip from this ip pool.
By dedicating ip pool to domain, accounts in the domain can fetch the public ip from same ip pool.

* pr/1007:
  CLOUDSTACK-8958: throw an exception if project account cannot be found
  CLOUDSTACK-8958: add dedicated ips to domain (account for now)

Signed-off-by: Remi Bergsma <github@remi.nl>
This commit is contained in:
Remi Bergsma 2015-11-29 09:39:24 +01:00
commit a1d2c531f6
20 changed files with 380 additions and 55 deletions

View File

@ -48,6 +48,7 @@ import org.apache.cloudstack.region.PortableIpRange;
import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.domain.Domain;
import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
@ -255,6 +256,8 @@ public interface ConfigurationService {
Account getVlanAccount(long vlanId); Account getVlanAccount(long vlanId);
Domain getVlanDomain(long vlanId);
List<? extends NetworkOffering> listNetworkOfferings(TrafficType trafficType, boolean systemOnly); List<? extends NetworkOffering> listNetworkOfferings(TrafficType trafficType, boolean systemOnly);
Long getDefaultPageSize(); Long getDefaultPageSize();

View File

@ -47,7 +47,7 @@ public class DedicatePublicIpRangeCmd extends BaseCmd {
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = VlanIpRangeResponse.class, required = true, description = "the id of the VLAN IP range") @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = VlanIpRangeResponse.class, required = true, description = "the id of the VLAN IP range")
private Long id; private Long id;
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, required = true, description = "account who will own the VLAN") @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "account who will own the VLAN")
private String accountName; private String accountName;
@Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "project who will own the VLAN") @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "project who will own the VLAN")

View File

@ -26,6 +26,7 @@ import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.domain.Domain;
import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
@ -213,7 +214,7 @@ public interface ConfigurationManager {
Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive); Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive);
Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP, Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP,
String vlanGateway, String vlanNetmask, String vlanId, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr) String vlanGateway, String vlanNetmask, String vlanId, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr)
throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException; throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException;
void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException; void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException;

View File

@ -140,6 +140,7 @@
<bean id="dataCenterLinkLocalIpAddressDaoImpl" class="com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl" /> <bean id="dataCenterLinkLocalIpAddressDaoImpl" class="com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl" />
<bean id="dataCenterVnetDaoImpl" class="com.cloud.dc.dao.DataCenterVnetDaoImpl" /> <bean id="dataCenterVnetDaoImpl" class="com.cloud.dc.dao.DataCenterVnetDaoImpl" />
<bean id="dataCenterDetailsDaoImpl" class="com.cloud.dc.dao.DataCenterDetailsDaoImpl" /> <bean id="dataCenterDetailsDaoImpl" class="com.cloud.dc.dao.DataCenterDetailsDaoImpl" />
<bean id="domainVlanMapDaoImpl" class="com.cloud.dc.dao.DomainVlanMapDaoImpl" />
<bean id="engineDcDetailsDaoImpl" class="org.apache.cloudstack.engine.datacenter.entity.api.db.dao.DcDetailsDaoImpl" /> <bean id="engineDcDetailsDaoImpl" class="org.apache.cloudstack.engine.datacenter.entity.api.db.dao.DcDetailsDaoImpl" />
<bean id="diskOfferingJoinDaoImpl" class="com.cloud.api.query.dao.DiskOfferingJoinDaoImpl" /> <bean id="diskOfferingJoinDaoImpl" class="com.cloud.api.query.dao.DiskOfferingJoinDaoImpl" />
<bean id="domainDaoImpl" class="com.cloud.domain.dao.DomainDaoImpl" /> <bean id="domainDaoImpl" class="com.cloud.domain.dao.DomainDaoImpl" />

View File

@ -0,0 +1,63 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.dc;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.apache.cloudstack.api.InternalIdentity;
@Entity
@Table(name="domain_vlan_map")
public class DomainVlanMapVO implements InternalIdentity {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private long id;
@Column(name="domain_id")
private long domainId;
@Column(name="vlan_db_id")
private long vlanDbId;
public DomainVlanMapVO(long domainId, long vlanDbId) {
this.domainId = domainId;
this.vlanDbId = vlanDbId;
}
public DomainVlanMapVO() {
}
public long getId() {
return id;
}
public long getDomainId() {
return domainId;
}
public long getVlanDbId() {
return vlanDbId;
}
}

View File

@ -0,0 +1,28 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.dc.dao;
import java.util.List;
import com.cloud.dc.DomainVlanMapVO;
import com.cloud.utils.db.GenericDao;
public interface DomainVlanMapDao extends GenericDao<DomainVlanMapVO, Long> {
public List<DomainVlanMapVO> listDomainVlanMapsByDomain(long domainId);
public List<DomainVlanMapVO> listDomainVlanMapsByVlan(long vlanDbId);
public DomainVlanMapVO findDomainVlanMap(long domainId, long vlanDbId);
}

View File

@ -0,0 +1,74 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.dc.dao;
import java.util.List;
import javax.ejb.Local;
import org.springframework.stereotype.Component;
import com.cloud.dc.DomainVlanMapVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
@Component
@Local(value={DomainVlanMapDao.class})
public class DomainVlanMapDaoImpl extends GenericDaoBase<DomainVlanMapVO, Long> implements DomainVlanMapDao {
protected SearchBuilder<DomainVlanMapVO> DomainSearch;
protected SearchBuilder<DomainVlanMapVO> VlanSearch;
protected SearchBuilder<DomainVlanMapVO> DomainVlanSearch;
@Override
public List<DomainVlanMapVO> listDomainVlanMapsByDomain(long domainId) {
SearchCriteria<DomainVlanMapVO> sc = DomainSearch.create();
sc.setParameters("domainId", domainId);
return listIncludingRemovedBy(sc);
}
@Override
public List<DomainVlanMapVO> listDomainVlanMapsByVlan(long vlanDbId) {
SearchCriteria<DomainVlanMapVO> sc = VlanSearch.create();
sc.setParameters("vlanDbId", vlanDbId);
return listIncludingRemovedBy(sc);
}
@Override
public DomainVlanMapVO findDomainVlanMap(long domainId, long vlanDbId) {
SearchCriteria<DomainVlanMapVO> sc = DomainVlanSearch.create();
sc.setParameters("domainId", domainId);
sc.setParameters("vlanDbId", vlanDbId);
return findOneIncludingRemovedBy(sc);
}
public DomainVlanMapDaoImpl() {
DomainSearch = createSearchBuilder();
DomainSearch.and("domainId", DomainSearch.entity().getDomainId(), SearchCriteria.Op.EQ);
DomainSearch.done();
VlanSearch = createSearchBuilder();
VlanSearch.and("vlanDbId", VlanSearch.entity().getVlanDbId(), SearchCriteria.Op.EQ);
VlanSearch.done();
DomainVlanSearch = createSearchBuilder();
DomainVlanSearch.and("domainId", DomainVlanSearch.entity().getDomainId(), SearchCriteria.Op.EQ);
DomainVlanSearch.and("vlanDbId", DomainVlanSearch.entity().getVlanDbId(), SearchCriteria.Op.EQ);
DomainVlanSearch.done();
}
}

View File

@ -29,6 +29,7 @@ import javax.naming.ConfigurationException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.AccountVlanMapVO;
import com.cloud.dc.DomainVlanMapVO;
import com.cloud.dc.PodVlanMapVO; import com.cloud.dc.PodVlanMapVO;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.Vlan.VlanType;
@ -62,12 +63,15 @@ public class VlanDaoImpl extends GenericDaoBase<VlanVO, Long> implements VlanDao
protected SearchBuilder<VlanVO> DedicatedVlanSearch; protected SearchBuilder<VlanVO> DedicatedVlanSearch;
protected SearchBuilder<AccountVlanMapVO> AccountVlanMapSearch; protected SearchBuilder<AccountVlanMapVO> AccountVlanMapSearch;
protected SearchBuilder<DomainVlanMapVO> DomainVlanMapSearch;
@Inject @Inject
protected PodVlanMapDao _podVlanMapDao; protected PodVlanMapDao _podVlanMapDao;
@Inject @Inject
protected AccountVlanMapDao _accountVlanMapDao; protected AccountVlanMapDao _accountVlanMapDao;
@Inject @Inject
protected DomainVlanMapDao _domainVlanMapDao;
@Inject
protected IPAddressDao _ipAddressDao; protected IPAddressDao _ipAddressDao;
@Override @Override
@ -214,8 +218,12 @@ public class VlanDaoImpl extends GenericDaoBase<VlanVO, Long> implements VlanDao
AccountVlanMapSearch.and("accountId", AccountVlanMapSearch.entity().getAccountId(), SearchCriteria.Op.NULL); AccountVlanMapSearch.and("accountId", AccountVlanMapSearch.entity().getAccountId(), SearchCriteria.Op.NULL);
ZoneWideNonDedicatedVlanSearch.join("AccountVlanMapSearch", AccountVlanMapSearch, ZoneWideNonDedicatedVlanSearch.entity().getId(), AccountVlanMapSearch.entity() ZoneWideNonDedicatedVlanSearch.join("AccountVlanMapSearch", AccountVlanMapSearch, ZoneWideNonDedicatedVlanSearch.entity().getId(), AccountVlanMapSearch.entity()
.getVlanDbId(), JoinBuilder.JoinType.LEFTOUTER); .getVlanDbId(), JoinBuilder.JoinType.LEFTOUTER);
DomainVlanMapSearch = _domainVlanMapDao.createSearchBuilder();
DomainVlanMapSearch.and("domainId", DomainVlanMapSearch.entity().getDomainId(), SearchCriteria.Op.NULL);
ZoneWideNonDedicatedVlanSearch.join("DomainVlanMapSearch", DomainVlanMapSearch, ZoneWideNonDedicatedVlanSearch.entity().getId(), DomainVlanMapSearch.entity().getVlanDbId(), JoinBuilder.JoinType.LEFTOUTER);
ZoneWideNonDedicatedVlanSearch.done(); ZoneWideNonDedicatedVlanSearch.done();
AccountVlanMapSearch.done(); AccountVlanMapSearch.done();
DomainVlanMapSearch.done();
DedicatedVlanSearch = createSearchBuilder(); DedicatedVlanSearch = createSearchBuilder();
AccountVlanMapSearch = _accountVlanMapDao.createSearchBuilder(); AccountVlanMapSearch = _accountVlanMapDao.createSearchBuilder();

View File

@ -139,6 +139,7 @@ import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDao;
import com.cloud.domain.Domain;
import com.cloud.domain.DomainVO; import com.cloud.domain.DomainVO;
import com.cloud.domain.dao.DomainDao; import com.cloud.domain.dao.DomainDao;
import com.cloud.event.Event; import com.cloud.event.Event;
@ -1245,6 +1246,10 @@ public class ApiDBUtils {
return s_configSvc.getVlanAccount(vlanId); return s_configSvc.getVlanAccount(vlanId);
} }
public static Domain getVlanDomain(long vlanId) {
return s_configSvc.getVlanDomain(vlanId);
}
public static boolean isSecurityGroupEnabledInZone(long zoneId) { public static boolean isSecurityGroupEnabledInZone(long zoneId) {
DataCenterVO dc = s_zoneDao.findById(zoneId); DataCenterVO dc = s_zoneDao.findById(zoneId);
if (dc == null) { if (dc == null) {

View File

@ -666,6 +666,21 @@ public class ApiResponseHelper implements ResponseGenerator {
if (owner != null) { if (owner != null) {
populateAccount(vlanResponse, owner.getId()); populateAccount(vlanResponse, owner.getId());
populateDomain(vlanResponse, owner.getDomainId()); populateDomain(vlanResponse, owner.getDomainId());
} else {
Domain domain = ApiDBUtils.getVlanDomain(vlan.getId());
if (domain != null) {
populateDomain(vlanResponse, domain.getId());
} else {
Long networkId = vlan.getNetworkId();
if (networkId != null) {
Network network = _ntwkModel.getNetwork(networkId);
if (network != null) {
Long accountId = network.getAccountId();
populateAccount(vlanResponse, accountId);
populateDomain(vlanResponse, ApiDBUtils.findAccountById(accountId).getDomainId());
}
}
}
} }
if (vlan.getPhysicalNetworkId() != null) { if (vlan.getPhysicalNetworkId() != null) {

View File

@ -100,6 +100,7 @@ import com.cloud.dc.DataCenterIpAddressVO;
import com.cloud.dc.DataCenterLinkLocalIpAddressVO; import com.cloud.dc.DataCenterLinkLocalIpAddressVO;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.DedicatedResourceVO; import com.cloud.dc.DedicatedResourceVO;
import com.cloud.dc.DomainVlanMapVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.PodVlanMapVO; import com.cloud.dc.PodVlanMapVO;
@ -113,6 +114,7 @@ import com.cloud.dc.dao.DataCenterDetailsDao;
import com.cloud.dc.dao.DataCenterIpAddressDao; import com.cloud.dc.dao.DataCenterIpAddressDao;
import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao; import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao;
import com.cloud.dc.dao.DedicatedResourceDao; import com.cloud.dc.dao.DedicatedResourceDao;
import com.cloud.dc.dao.DomainVlanMapDao;
import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.PodVlanMapDao; import com.cloud.dc.dao.PodVlanMapDao;
import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDao;
@ -237,6 +239,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Inject @Inject
AccountVlanMapDao _accountVlanMapDao; AccountVlanMapDao _accountVlanMapDao;
@Inject @Inject
DomainVlanMapDao _domainVlanMapDao;
@Inject
PodVlanMapDao _podVlanMapDao; PodVlanMapDao _podVlanMapDao;
@Inject @Inject
DataCenterDao _zoneDao; DataCenterDao _zoneDao;
@ -2621,8 +2625,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
vlanOwner = _accountMgr.getAccount(project.getProjectAccountId()); vlanOwner = _accountMgr.getAccount(project.getProjectAccountId());
if (vlanOwner == null) {
throw new InvalidParameterValueException("Please specify a valid projectId");
}
} }
Domain domain = null;
if (accountName != null && domainId != null) { if (accountName != null && domainId != null) {
vlanOwner = _accountDao.findActiveAccount(accountName, domainId); vlanOwner = _accountDao.findActiveAccount(accountName, domainId);
if (vlanOwner == null) { if (vlanOwner == null) {
@ -2631,6 +2639,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
// by default vlan is dedicated to system account // by default vlan is dedicated to system account
vlanOwner = null; vlanOwner = null;
} }
} else if (domainId != null) {
domain = _domainDao.findById(domainId);
if (domain == null) {
throw new InvalidParameterValueException("Please specify a valid domain id");
}
} }
// Verify that network exists // Verify that network exists
@ -2789,12 +2802,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
return commitVlan(zoneId, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId, forVirtualNetwork, networkId, physicalNetworkId, startIPv6, endIPv6, ip6Gateway, return commitVlan(zoneId, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId, forVirtualNetwork, networkId, physicalNetworkId, startIPv6, endIPv6, ip6Gateway,
ip6Cidr, vlanOwner, network, sameSubnet); ip6Cidr, domain, vlanOwner, network, sameSubnet);
} }
private Vlan commitVlan(final Long zoneId, final Long podId, final String startIP, final String endIP, final String newVlanGatewayFinal, final String newVlanNetmaskFinal, private Vlan commitVlan(final Long zoneId, final Long podId, final String startIP, final String endIP, final String newVlanGatewayFinal, final String newVlanNetmaskFinal,
final String vlanId, final Boolean forVirtualNetwork, final Long networkId, final Long physicalNetworkId, final String startIPv6, final String endIPv6, final String vlanId, final Boolean forVirtualNetwork, final Long networkId, final Long physicalNetworkId, final String startIPv6, final String endIPv6,
final String ip6Gateway, final String ip6Cidr, final Account vlanOwner, final Network network, final Pair<Boolean, Pair<String, String>> sameSubnet) { final String ip6Gateway, final String ip6Cidr, final Domain domain, final Account vlanOwner, final Network network, final Pair<Boolean, Pair<String, String>> sameSubnet) {
return Transaction.execute(new TransactionCallback<Vlan>() { return Transaction.execute(new TransactionCallback<Vlan>() {
@Override @Override
public Vlan doInTransaction(final TransactionStatus status) { public Vlan doInTransaction(final TransactionStatus status) {
@ -2818,7 +2831,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
newVlanNetmask = sameSubnet.second().second(); newVlanNetmask = sameSubnet.second().second();
} }
final Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId, final Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId,
vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr); domain, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
// create an entry in the nic_secondary table. This will be the new // create an entry in the nic_secondary table. This will be the new
// gateway that will be configured on the corresponding routervm. // gateway that will be configured on the corresponding routervm.
return vlan; return vlan;
@ -2925,7 +2938,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override @Override
@DB @DB
public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final boolean forVirtualNetwork, final Long podId, final String startIP, final String endIP, public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final boolean forVirtualNetwork, final Long podId, final String startIP, final String endIP,
final String vlanGateway, final String vlanNetmask, String vlanId, final Account vlanOwner, final String startIPv6, final String endIPv6, final String vlanIp6Gateway, final String vlanIp6Cidr) { final String vlanGateway, final String vlanNetmask, String vlanId, Domain domain, final Account vlanOwner, final String startIPv6, final String endIPv6, final String vlanIp6Gateway, final String vlanIp6Cidr) {
final Network network = _networkModel.getNetwork(networkId); final Network network = _networkModel.getNetwork(networkId);
boolean ipv4 = false, ipv6 = false; boolean ipv4 = false, ipv6 = false;
@ -3003,7 +3016,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
final VlanType vlanType = forVirtualNetwork ? VlanType.VirtualNetwork : VlanType.DirectAttached; final VlanType vlanType = forVirtualNetwork ? VlanType.VirtualNetwork : VlanType.DirectAttached;
if (vlanOwner != null && zone.getNetworkType() != NetworkType.Advanced) { if ((domain != null || vlanOwner != null) && zone.getNetworkType() != NetworkType.Advanced) {
throw new InvalidParameterValueException("Vlan owner can be defined only in the zone of type " + NetworkType.Advanced); throw new InvalidParameterValueException("Vlan owner can be defined only in the zone of type " + NetworkType.Advanced);
} }
@ -3157,14 +3170,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
// Everything was fine, so persist the VLAN // Everything was fine, so persist the VLAN
final VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway, vlanNetmask, vlanId, vlanOwner, vlanIp6Gateway, vlanIp6Cidr, final VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway, vlanNetmask, vlanId, domain, vlanOwner, vlanIp6Gateway, vlanIp6Cidr,
ipv4, zone, vlanType, ipv6Range, ipRange); ipv4, zone, vlanType, ipv6Range, ipRange);
return vlan; return vlan;
} }
private VlanVO commitVlanAndIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final Long podId, final String startIP, final String endIP, private VlanVO commitVlanAndIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final Long podId, final String startIP, final String endIP,
final String vlanGateway, final String vlanNetmask, final String vlanId, final Account vlanOwner, final String vlanIp6Gateway, final String vlanIp6Cidr, final String vlanGateway, final String vlanNetmask, final String vlanId, final Domain domain, final Account vlanOwner, final String vlanIp6Gateway, final String vlanIp6Cidr,
final boolean ipv4, final DataCenterVO zone, final VlanType vlanType, final String ipv6Range, final String ipRange) { final boolean ipv4, final DataCenterVO zone, final VlanType vlanType, final String ipv6Range, final String ipRange) {
return Transaction.execute(new TransactionCallback<VlanVO>() { return Transaction.execute(new TransactionCallback<VlanVO>() {
@Override @Override
@ -3196,6 +3209,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
// increment resource count for dedicated public ip's // increment resource count for dedicated public ip's
_resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size())); _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
} else if (domain != null) {
// This VLAN is domain-wide, so create a DomainVlanMapVO entry
final DomainVlanMapVO domainVlanMapVO = new DomainVlanMapVO(domain.getId(), vlan.getId());
_domainVlanMapDao.persist(domainVlanMapVO);
} else if (podId != null) { } else if (podId != null) {
// This VLAN is pod-wide, so create a PodVlanMapVO entry // This VLAN is pod-wide, so create a PodVlanMapVO entry
final PodVlanMapVO podVlanMapVO = new PodVlanMapVO(podId, vlan.getId()); final PodVlanMapVO podVlanMapVO = new PodVlanMapVO(podId, vlan.getId());
@ -3223,6 +3240,13 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
isAccountSpecific = true; isAccountSpecific = true;
} }
boolean isDomainSpecific = false;
List<DomainVlanMapVO> domainVln = _domainVlanMapDao.listDomainVlanMapsByVlan(vlanRange.getId());
// Check for domain wide pool. It will have an entry for domain_vlan_map.
if (domainVln != null && !domainVln.isEmpty()) {
isDomainSpecific = true;
}
// Check if the VLAN has any allocated public IPs // Check if the VLAN has any allocated public IPs
final List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlanDbId); final List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlanDbId);
if (isAccountSpecific) { if (isAccountSpecific) {
@ -3315,15 +3339,24 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
throw new InvalidParameterValueException("Unable to find project by id " + projectId); throw new InvalidParameterValueException("Unable to find project by id " + projectId);
} }
vlanOwner = _accountMgr.getAccount(project.getProjectAccountId()); vlanOwner = _accountMgr.getAccount(project.getProjectAccountId());
if (vlanOwner == null) {
throw new InvalidParameterValueException("Please specify a valid projectId");
}
} }
Domain domain = null;
if (accountName != null && domainId != null) { if (accountName != null && domainId != null) {
vlanOwner = _accountDao.findActiveAccount(accountName, domainId); vlanOwner = _accountDao.findActiveAccount(accountName, domainId);
} if (vlanOwner == null) {
if (vlanOwner == null) { throw new InvalidParameterValueException("Unable to find account by name " + accountName);
throw new InvalidParameterValueException("Unable to find account by name " + accountName); } else if (vlanOwner.getId() == Account.ACCOUNT_ID_SYSTEM) {
} else if (vlanOwner.getId() == Account.ACCOUNT_ID_SYSTEM) { throw new InvalidParameterValueException("Please specify a valid account. Cannot dedicate IP range to system account");
throw new InvalidParameterValueException("Please specify a valid account. Cannot dedicate IP range to system account"); }
} else if (domainId != null) {
domain = _domainDao.findById(domainId);
if (domain == null) {
throw new InvalidParameterValueException("Please specify a valid domain id");
}
} }
// Check if range is valid // Check if range is valid
@ -3338,6 +3371,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
throw new InvalidParameterValueException("Specified Public IP range has already been dedicated"); throw new InvalidParameterValueException("Specified Public IP range has already been dedicated");
} }
List<DomainVlanMapVO> domainmaps = _domainVlanMapDao.listDomainVlanMapsByVlan(vlanDbId);
if (domainmaps != null && !domainmaps.isEmpty()) {
throw new InvalidParameterValueException("Specified Public IP range has already been dedicated to a domain");
}
// Verify that zone exists and is advanced // Verify that zone exists and is advanced
final Long zoneId = vlan.getDataCenterId(); final Long zoneId = vlan.getDataCenterId();
final DataCenterVO zone = _zoneDao.findById(zoneId); final DataCenterVO zone = _zoneDao.findById(zoneId);
@ -3349,8 +3387,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
// Check Public IP resource limits // Check Public IP resource limits
final int accountPublicIpRange = _publicIpAddressDao.countIPs(zoneId, vlanDbId, false); if (vlanOwner != null) {
_resourceLimitMgr.checkResourceLimit(vlanOwner, ResourceType.public_ip, accountPublicIpRange); final int accountPublicIpRange = _publicIpAddressDao.countIPs(zoneId, vlanDbId, false);
_resourceLimitMgr.checkResourceLimit(vlanOwner, ResourceType.public_ip, accountPublicIpRange);
}
// Check if any of the Public IP addresses is allocated to another // Check if any of the Public IP addresses is allocated to another
// account // account
@ -3362,21 +3402,33 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
if (!accountAllocatedTo.getAccountName().equalsIgnoreCase(accountName)) { if (!accountAllocatedTo.getAccountName().equalsIgnoreCase(accountName)) {
throw new InvalidParameterValueException(ip.getAddress() + " Public IP address in range is allocated to another account "); throw new InvalidParameterValueException(ip.getAddress() + " Public IP address in range is allocated to another account ");
} }
if (vlanOwner == null && domain != null && domain.getId() != accountAllocatedTo.getDomainId()){
throw new InvalidParameterValueException(ip.getAddress()
+ " Public IP address in range is allocated to another domain/account ");
}
} }
} }
// Create an AccountVlanMapVO entry if (vlanOwner != null) {
final AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId()); // Create an AccountVlanMapVO entry
_accountVlanMapDao.persist(accountVlanMapVO); final AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
_accountVlanMapDao.persist(accountVlanMapVO);
// generate usage event for dedication of every ip address in the range // generate usage event for dedication of every ip address in the range
for (final IPAddressVO ip : ips) { for (final IPAddressVO ip : ips) {
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(),
vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid()); vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
}
} else if (domain != null) {
// Create an DomainVlanMapVO entry
DomainVlanMapVO domainVlanMapVO = new DomainVlanMapVO(domain.getId(), vlan.getId());
_domainVlanMapDao.persist(domainVlanMapVO);
} }
// increment resource count for dedicated public ip's // increment resource count for dedicated public ip's
_resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size())); if (vlanOwner != null) {
_resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
}
return vlan; return vlan;
} }
@ -3398,12 +3450,25 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
public boolean releasePublicIpRange(final long vlanDbId, final long userId, final Account caller) { public boolean releasePublicIpRange(final long vlanDbId, final long userId, final Account caller) {
VlanVO vlan = _vlanDao.findById(vlanDbId); VlanVO vlan = _vlanDao.findById(vlanDbId);
// Verify range is dedicated
boolean isAccountSpecific = false;
final List<AccountVlanMapVO> acctVln = _accountVlanMapDao.listAccountVlanMapsByVlan(vlanDbId); final List<AccountVlanMapVO> acctVln = _accountVlanMapDao.listAccountVlanMapsByVlan(vlanDbId);
// Verify range is dedicated // Verify range is dedicated
if (acctVln == null || acctVln.isEmpty()) { if (acctVln != null && !acctVln.isEmpty()) {
throw new InvalidParameterValueException("Can't release Public IP range " + vlanDbId + " as it not dedicated to any account"); isAccountSpecific = true;
} }
boolean isDomainSpecific = false;
final List<DomainVlanMapVO> domainVln = _domainVlanMapDao.listDomainVlanMapsByVlan(vlanDbId);
// Check for domain wide pool. It will have an entry for domain_vlan_map.
if (domainVln != null && !domainVln.isEmpty()) {
isDomainSpecific = true;
}
if (!isAccountSpecific && !isDomainSpecific) {
throw new InvalidParameterValueException("Can't release Public IP range " + vlanDbId
+ " as it not dedicated to any domain and any account");
}
// Check if range has any allocated public IPs // Check if range has any allocated public IPs
final long allocIpCount = _publicIpAddressDao.countIPs(vlan.getDataCenterId(), vlanDbId, true); final long allocIpCount = _publicIpAddressDao.countIPs(vlan.getDataCenterId(), vlanDbId, true);
final List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlanDbId); final List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlanDbId);
@ -3438,7 +3503,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
// A Public IP range can only be dedicated to one account at a time // A Public IP range can only be dedicated to one account at a time
if (_accountVlanMapDao.remove(acctVln.get(0).getId())) { if (isAccountSpecific && _accountVlanMapDao.remove(acctVln.get(0).getId())) {
// generate usage events to remove dedication for every ip in the range that has been disassociated // generate usage events to remove dedication for every ip in the range that has been disassociated
for (final IPAddressVO ip : ips) { for (final IPAddressVO ip : ips) {
if (!ipsInUse.contains(ip)) { if (!ipsInUse.contains(ip)) {
@ -3449,6 +3514,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
// decrement resource count for dedicated public ip's // decrement resource count for dedicated public ip's
_resourceLimitMgr.decrementResourceCount(acctVln.get(0).getAccountId(), ResourceType.public_ip, new Long(ips.size())); _resourceLimitMgr.decrementResourceCount(acctVln.get(0).getAccountId(), ResourceType.public_ip, new Long(ips.size()));
return true; return true;
} else if (isDomainSpecific && _domainVlanMapDao.remove(domainVln.get(0).getId())) {
s_logger.debug("Remove the vlan from domain_vlan_map successfully.");
return true;
} else { } else {
return false; return false;
} }
@ -4831,13 +4899,24 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
} }
final Long networkId = vlan.getNetworkId(); return null;
if (networkId != null) { }
final Network network = _networkModel.getNetwork(networkId);
if (network != null) { @Override
return _accountMgr.getAccount(network.getAccountId()); public Domain getVlanDomain(long vlanId) {
Vlan vlan = _vlanDao.findById(vlanId);
Long domainId = null;
// if vlan is Virtual Domain specific, get vlan information from the
// accountVlanMap; otherwise get account information
// from the network
if (vlan.getVlanType() == VlanType.VirtualNetwork) {
List<DomainVlanMapVO> maps = _domainVlanMapDao.listDomainVlanMapsByVlan(vlanId);
if (maps != null && !maps.isEmpty()) {
return _domainDao.findById(maps.get(0).getDomainId());
} }
} }
return null; return null;
} }

View File

@ -50,6 +50,7 @@ import com.cloud.configuration.Resource.ResourceType;
import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.AccountVlanMapVO;
import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.DomainVlanMapVO;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.PodVlanMapVO; import com.cloud.dc.PodVlanMapVO;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
@ -58,6 +59,7 @@ import com.cloud.dc.VlanVO;
import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.AccountVlanMapDao;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.DataCenterVnetDao; import com.cloud.dc.dao.DataCenterVnetDao;
import com.cloud.dc.dao.DomainVlanMapDao;
import com.cloud.dc.dao.PodVlanMapDao; import com.cloud.dc.dao.PodVlanMapDao;
import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeployDestination;
@ -199,6 +201,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@Inject @Inject
AccountVlanMapDao _accountVlanMapDao; AccountVlanMapDao _accountVlanMapDao;
@Inject @Inject
DomainVlanMapDao _domainVlanMapDao;
@Inject
NetworkOfferingDao _networkOfferingDao = null; NetworkOfferingDao _networkOfferingDao = null;
@Inject @Inject
NetworkDao _networksDao = null; NetworkDao _networksDao = null;
@ -685,6 +689,11 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId())) if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
dedicatedVlanDbIds.add(map.getVlanDbId()); dedicatedVlanDbIds.add(map.getVlanDbId());
} }
List<DomainVlanMapVO> domainMaps = _domainVlanMapDao.listDomainVlanMapsByDomain(owner.getDomainId());
for (DomainVlanMapVO map : domainMaps) {
if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
dedicatedVlanDbIds.add(map.getVlanDbId());
}
List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId); List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
for (VlanVO nonDedicatedVlan : nonDedicatedVlans) { for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId())) if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))

View File

@ -1393,7 +1393,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
if (_accountMgr.isRootAdmin(caller.getId()) && createVlan && network != null) { if (_accountMgr.isRootAdmin(caller.getId()) && createVlan && network != null) {
// Create vlan ip range // Create vlan ip range
_configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId, false, null, startIP, endIP, gateway, netmask, vlanId, _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId, false, null, startIP, endIP, gateway, netmask, vlanId,
null, startIPv6, endIPv6, ip6Gateway, ip6Cidr); null, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
} }
return network; return network;
} }

View File

@ -59,6 +59,7 @@ import com.cloud.dc.dao.AccountVlanMapDao;
import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.DataCenterIpAddressDao; import com.cloud.dc.dao.DataCenterIpAddressDao;
import com.cloud.dc.dao.DomainVlanMapDao;
import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDao;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
@ -115,6 +116,8 @@ public class ConfigurationManagerTest {
@Mock @Mock
AccountVlanMapDao _accountVlanMapDao; AccountVlanMapDao _accountVlanMapDao;
@Mock @Mock
DomainVlanMapDao _domainVlanMapDao;
@Mock
IPAddressDao _publicIpAddressDao; IPAddressDao _publicIpAddressDao;
@Mock @Mock
DataCenterDao _zoneDao; DataCenterDao _zoneDao;
@ -156,6 +159,7 @@ public class ConfigurationManagerTest {
configurationMgr._accountDao = _accountDao; configurationMgr._accountDao = _accountDao;
configurationMgr._vlanDao = _vlanDao; configurationMgr._vlanDao = _vlanDao;
configurationMgr._accountVlanMapDao = _accountVlanMapDao; configurationMgr._accountVlanMapDao = _accountVlanMapDao;
configurationMgr._domainVlanMapDao = _domainVlanMapDao;
configurationMgr._publicIpAddressDao = _publicIpAddressDao; configurationMgr._publicIpAddressDao = _publicIpAddressDao;
configurationMgr._zoneDao = _zoneDao; configurationMgr._zoneDao = _zoneDao;
configurationMgr._firewallDao = _firewallDao; configurationMgr._firewallDao = _firewallDao;
@ -470,10 +474,11 @@ public class ConfigurationManagerTest {
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan); when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
when(configurationMgr._accountVlanMapDao.listAccountVlanMapsByVlan(anyLong())).thenReturn(null); when(configurationMgr._accountVlanMapDao.listAccountVlanMapsByVlan(anyLong())).thenReturn(null);
when(configurationMgr._domainVlanMapDao.listDomainVlanMapsByVlan(anyLong())).thenReturn(null);
try { try {
configurationMgr.releasePublicIpRange(releasePublicIpRangesCmd); configurationMgr.releasePublicIpRange(releasePublicIpRangesCmd);
} catch (Exception e) { } catch (Exception e) {
Assert.assertTrue(e.getMessage().contains("as it not dedicated to any account")); Assert.assertTrue(e.getMessage().contains("as it not dedicated to any domain and any account"));
} finally { } finally {
txn.close("runReleaseNonDedicatedPublicIpRange"); txn.close("runReleaseNonDedicatedPublicIpRange");
} }
@ -561,15 +566,6 @@ public class ConfigurationManagerTest {
} }
} }
@Test
public void getVlanAccount() {
Mockito.when(_vlanDao.findById(42l)).thenReturn(vlan);
Mockito.when(_networkModel.getNetwork(1l)).thenReturn(network);
Mockito.when(network.getAccountId()).thenReturn(1l);
Mockito.when(_accountMgr.getAccount(1l)).thenReturn(account);
Assert.assertNotNull(configurationMgr.getVlanAccount(42l));
}
@Test @Test
public void checkIfPodIsDeletableSuccessTest() { public void checkIfPodIsDeletableSuccessTest() {
HostPodVO hostPodVO = Mockito.mock(HostPodVO.class); HostPodVO hostPodVO = Mockito.mock(HostPodVO.class);
@ -795,4 +791,4 @@ public class ConfigurationManagerTest {
configurationMgr.checkIfZoneIsDeletable(new Random().nextLong()); configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
} }
} }

View File

@ -60,6 +60,7 @@ import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.domain.Domain;
import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
@ -439,7 +440,7 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
*/ */
@Override @Override
public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP, public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP,
String vlanGateway, String vlanNetmask, String vlanId, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6) String vlanGateway, String vlanNetmask, String vlanId, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6)
throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException { throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
@ -522,4 +523,10 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
return false; return false;
} }
} @Override
public Domain getVlanDomain(long vlanId) {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -44,6 +44,7 @@ import com.cloud.dc.dao.DataCenterDetailsDaoImpl;
import com.cloud.dc.dao.DataCenterIpAddressDaoImpl; import com.cloud.dc.dao.DataCenterIpAddressDaoImpl;
import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl; import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl;
import com.cloud.dc.dao.DataCenterVnetDaoImpl; import com.cloud.dc.dao.DataCenterVnetDaoImpl;
import com.cloud.dc.dao.DomainVlanMapDaoImpl;
import com.cloud.dc.dao.HostPodDaoImpl; import com.cloud.dc.dao.HostPodDaoImpl;
import com.cloud.dc.dao.PodVlanDaoImpl; import com.cloud.dc.dao.PodVlanDaoImpl;
import com.cloud.dc.dao.PodVlanMapDaoImpl; import com.cloud.dc.dao.PodVlanMapDaoImpl;
@ -110,7 +111,7 @@ import com.cloud.vpc.dao.MockVpcOfferingServiceMapDaoImpl;
@ComponentScan(basePackageClasses = {VpcManagerImpl.class, NetworkElement.class, VpcOfferingDao.class, ConfigurationDaoImpl.class, IPAddressDaoImpl.class, @ComponentScan(basePackageClasses = {VpcManagerImpl.class, NetworkElement.class, VpcOfferingDao.class, ConfigurationDaoImpl.class, IPAddressDaoImpl.class,
DomainRouterDaoImpl.class, VpcGatewayDaoImpl.class, PrivateIpDaoImpl.class, StaticRouteDaoImpl.class, PhysicalNetworkDaoImpl.class, DomainRouterDaoImpl.class, VpcGatewayDaoImpl.class, PrivateIpDaoImpl.class, StaticRouteDaoImpl.class, PhysicalNetworkDaoImpl.class,
ResourceTagsDaoImpl.class, FirewallRulesDaoImpl.class, VlanDaoImpl.class, AccountDaoImpl.class, ResourceCountDaoImpl.class, ResourceTagsDaoImpl.class, FirewallRulesDaoImpl.class, VlanDaoImpl.class, AccountDaoImpl.class, ResourceCountDaoImpl.class,
Site2SiteVpnGatewayDaoImpl.class, PodVlanMapDaoImpl.class, AccountVlanMapDaoImpl.class, HostDaoImpl.class, HostDetailsDaoImpl.class, Site2SiteVpnGatewayDaoImpl.class, PodVlanMapDaoImpl.class, AccountVlanMapDaoImpl.class, DomainVlanMapDaoImpl.class, HostDaoImpl.class, HostDetailsDaoImpl.class,
HostTagsDaoImpl.class, HostTransferMapDaoImpl.class, ClusterDaoImpl.class, HostPodDaoImpl.class, RouterNetworkDaoImpl.class, HostTagsDaoImpl.class, HostTransferMapDaoImpl.class, ClusterDaoImpl.class, HostPodDaoImpl.class, RouterNetworkDaoImpl.class,
UserStatisticsDaoImpl.class, PhysicalNetworkTrafficTypeDaoImpl.class, FirewallRulesCidrsDaoImpl.class, ResourceLimitManagerImpl.class, UserStatisticsDaoImpl.class, PhysicalNetworkTrafficTypeDaoImpl.class, FirewallRulesCidrsDaoImpl.class, ResourceLimitManagerImpl.class,
ResourceLimitDaoImpl.class, ResourceCountDaoImpl.class, DomainDaoImpl.class, UserVmDaoImpl.class, UserVmDetailsDaoImpl.class, NicDaoImpl.class, ResourceLimitDaoImpl.class, ResourceCountDaoImpl.class, DomainDaoImpl.class, UserVmDaoImpl.class, UserVmDetailsDaoImpl.class, NicDaoImpl.class,

View File

@ -58,6 +58,7 @@ import com.cloud.dc.dao.DataCenterIpAddressDaoImpl;
import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao; import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao;
import com.cloud.dc.dao.DataCenterVnetDaoImpl; import com.cloud.dc.dao.DataCenterVnetDaoImpl;
import com.cloud.dc.dao.DedicatedResourceDao; import com.cloud.dc.dao.DedicatedResourceDao;
import com.cloud.dc.dao.DomainVlanMapDaoImpl;
import com.cloud.dc.dao.HostPodDaoImpl; import com.cloud.dc.dao.HostPodDaoImpl;
import com.cloud.dc.dao.PodVlanDaoImpl; import com.cloud.dc.dao.PodVlanDaoImpl;
import com.cloud.dc.dao.PodVlanMapDaoImpl; import com.cloud.dc.dao.PodVlanMapDaoImpl;
@ -121,7 +122,7 @@ import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.VMInstanceDaoImpl; import com.cloud.vm.dao.VMInstanceDaoImpl;
@Configuration @Configuration
@ComponentScan(basePackageClasses = {AccountVlanMapDaoImpl.class, VolumeDaoImpl.class, HostPodDaoImpl.class, DomainDaoImpl.class, ServiceOfferingDaoImpl.class, @ComponentScan(basePackageClasses = {AccountVlanMapDaoImpl.class, DomainVlanMapDaoImpl.class, VolumeDaoImpl.class, HostPodDaoImpl.class, DomainDaoImpl.class, ServiceOfferingDaoImpl.class,
ServiceOfferingDetailsDaoImpl.class, VlanDaoImpl.class, IPAddressDaoImpl.class, ResourceTagsDaoImpl.class, AccountDaoImpl.class, ServiceOfferingDetailsDaoImpl.class, VlanDaoImpl.class, IPAddressDaoImpl.class, ResourceTagsDaoImpl.class, AccountDaoImpl.class,
InstanceGroupDaoImpl.class, UserAccountJoinDaoImpl.class, CapacityDaoImpl.class, SnapshotDaoImpl.class, HostDaoImpl.class, VMInstanceDaoImpl.class, InstanceGroupDaoImpl.class, UserAccountJoinDaoImpl.class, CapacityDaoImpl.class, SnapshotDaoImpl.class, HostDaoImpl.class, VMInstanceDaoImpl.class,
HostTransferMapDaoImpl.class, PortForwardingRulesDaoImpl.class, PrivateIpDaoImpl.class, UsageEventDaoImpl.class, PodVlanMapDaoImpl.class, HostTransferMapDaoImpl.class, PortForwardingRulesDaoImpl.class, PrivateIpDaoImpl.class, UsageEventDaoImpl.class, PodVlanMapDaoImpl.class,

View File

@ -18,3 +18,15 @@
--; --;
-- Schema upgrade from 4.6.0 to 4.7.0; -- Schema upgrade from 4.6.0 to 4.7.0;
--; --;
CREATE TABLE IF NOT EXISTS `cloud`.`domain_vlan_map` (
`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT,
`domain_id` bigint unsigned NOT NULL COMMENT 'domain id. foreign key to domain table',
`vlan_db_id` bigint unsigned NOT NULL COMMENT 'database id of vlan. foreign key to vlan table',
PRIMARY KEY (`id`),
CONSTRAINT `fk_domain_vlan_map__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain` (`id`) ON DELETE CASCADE,
INDEX `i_account_vlan_map__domain_id`(`domain_id`),
CONSTRAINT `fk_domain_vlan_map__vlan_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan` (`id`) ON DELETE CASCADE,
INDEX `i_account_vlan_map__vlan_id`(`vlan_db_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -18,3 +18,15 @@
--; --;
-- Schema upgrade from 4.6.1 to 4.7.0; -- Schema upgrade from 4.6.1 to 4.7.0;
--; --;
CREATE TABLE IF NOT EXISTS `cloud`.`domain_vlan_map` (
`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT,
`domain_id` bigint unsigned NOT NULL COMMENT 'domain id. foreign key to domain table',
`vlan_db_id` bigint unsigned NOT NULL COMMENT 'database id of vlan. foreign key to vlan table',
PRIMARY KEY (`id`),
CONSTRAINT `fk_domain_vlan_map__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain` (`id`) ON DELETE CASCADE,
INDEX `i_account_vlan_map__domain_id`(`domain_id`),
CONSTRAINT `fk_domain_vlan_map__vlan_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan` (`id`) ON DELETE CASCADE,
INDEX `i_account_vlan_map__vlan_id`(`vlan_db_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -83,9 +83,14 @@
success: function (json) { success: function (json) {
var domain = json.listdomainsresponse.domain[0]; var domain = json.listdomainsresponse.domain[0];
cloudStack.dialog.notice({ if (data.account != null)
message: '<ul><li>' + _l('label.account') + ': ' + data.account + '</li>' + '<li>' + _l('label.domain') + ': ' + domain.path + '</li></ul>' cloudStack.dialog.notice({
}); message: '<ul><li>' + _l('label.account') + ': ' + data.account + '</li>' + '<li>' + _l('label.domain') + ': ' + domain.path + '</li></ul>'
});
else
cloudStack.dialog.notice({
message: '<ul><li>' + _l('label.domain') + ': ' + domain.path + '</li></ul>'
});
} }
}); });
} else { } else {
@ -743,7 +748,8 @@
array1.push("&endip=" + args.data.endip); array1.push("&endip=" + args.data.endip);
if (args.data.account) { if (args.data.account) {
array1.push("&account=" + args.data.account.account); if (args.data.account.account)
array1.push("&account=" + args.data.account.account);
array1.push("&domainid=" + args.data.account.domainid); array1.push("&domainid=" + args.data.account.domainid);
} }
@ -774,7 +780,7 @@
}, },
actionPreFilter: function (args) { actionPreFilter: function (args) {
var actionsToShow =[ 'destroy']; var actionsToShow =[ 'destroy'];
if (args.context.multiRule[0].domain == 'ROOT' && args.context.multiRule[0].account.account == 'system') if (args.context.multiRule[0].domain == 'ROOT' && args.context.multiRule[0].account != null && args.context.multiRule[0].account.account == 'system')
actionsToShow.push('addAccount'); else actionsToShow.push('addAccount'); else
actionsToShow.push('releaseFromAccount'); actionsToShow.push('releaseFromAccount');
return actionsToShow; return actionsToShow;
@ -865,8 +871,12 @@
id: args.context.multiRule[0].id, id: args.context.multiRule[0].id,
zoneid: args.context.multiRule[0].zoneid, zoneid: args.context.multiRule[0].zoneid,
domainid: args.data.domainid, domainid: args.data.domainid,
account: args.data.account
}; };
if (args.data.account) {
$.extend(data, {
account: args.data.account
});
}
$.ajax({ $.ajax({
url: createURL('dedicatePublicIpRange'), url: createURL('dedicatePublicIpRange'),
data: data, data: data,
@ -898,7 +908,7 @@
data: $.map(items, function (item) { data: $.map(items, function (item) {
return $.extend(item, { return $.extend(item, {
account: { account: {
_buttonLabel: item.account, _buttonLabel: item.account ? '[' + item.domain + '] ' + item.account: item.domain,
account: item.account, account: item.account,
domainid: item.domainid domainid: item.domainid
} }