mirror of https://github.com/apache/cloudstack.git
fix identation
This commit is contained in:
parent
23b19a9776
commit
61afb4cb78
|
|
@ -2745,358 +2745,357 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
|||
boolean ipv6 = false;
|
||||
|
||||
try (CheckedReservation networkReservation = new CheckedReservation(owner, domainId, Resource.ResourceType.network, null, null, 1L, reservationDao, _resourceLimitMgr)) {
|
||||
|
||||
if (StringUtils.isNoneBlank(ip6Gateway, ip6Cidr)) {
|
||||
ipv6 = true;
|
||||
}
|
||||
// Validate zone
|
||||
if (zone.getNetworkType() == NetworkType.Basic) {
|
||||
// In Basic zone the network should have aclType=Domain, domainId=1, subdomainAccess=true
|
||||
if (aclType == null || aclType != ACLType.Domain) {
|
||||
throw new InvalidParameterValueException("Only AclType=Domain can be specified for network creation in Basic zone");
|
||||
if (StringUtils.isNoneBlank(ip6Gateway, ip6Cidr)) {
|
||||
ipv6 = true;
|
||||
}
|
||||
// Validate zone
|
||||
if (zone.getNetworkType() == NetworkType.Basic) {
|
||||
// In Basic zone the network should have aclType=Domain, domainId=1, subdomainAccess=true
|
||||
if (aclType == null || aclType != ACLType.Domain) {
|
||||
throw new InvalidParameterValueException("Only AclType=Domain can be specified for network creation in Basic zone");
|
||||
}
|
||||
|
||||
// Only one guest network is supported in Basic zone
|
||||
final List<NetworkVO> guestNetworks = _networksDao.listByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
|
||||
if (!guestNetworks.isEmpty()) {
|
||||
throw new InvalidParameterValueException("Can't have more than one Guest network in zone with network type " + NetworkType.Basic);
|
||||
}
|
||||
// Only one guest network is supported in Basic zone
|
||||
final List<NetworkVO> guestNetworks = _networksDao.listByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
|
||||
if (!guestNetworks.isEmpty()) {
|
||||
throw new InvalidParameterValueException("Can't have more than one Guest network in zone with network type " + NetworkType.Basic);
|
||||
}
|
||||
|
||||
// if zone is basic, only Shared network offerings w/o source nat service are allowed
|
||||
if (!(ntwkOff.getGuestType() == GuestType.Shared && !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))) {
|
||||
throw new InvalidParameterValueException("For zone of type " + NetworkType.Basic + " only offerings of " + "guestType " + GuestType.Shared + " with disabled "
|
||||
+ Service.SourceNat.getName() + " service are allowed");
|
||||
}
|
||||
// if zone is basic, only Shared network offerings w/o source nat service are allowed
|
||||
if (!(ntwkOff.getGuestType() == GuestType.Shared && !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))) {
|
||||
throw new InvalidParameterValueException("For zone of type " + NetworkType.Basic + " only offerings of " + "guestType " + GuestType.Shared + " with disabled "
|
||||
+ Service.SourceNat.getName() + " service are allowed");
|
||||
}
|
||||
|
||||
if (domainId == null || domainId != Domain.ROOT_DOMAIN) {
|
||||
throw new InvalidParameterValueException("Guest network in Basic zone should be dedicated to ROOT domain");
|
||||
}
|
||||
if (domainId == null || domainId != Domain.ROOT_DOMAIN) {
|
||||
throw new InvalidParameterValueException("Guest network in Basic zone should be dedicated to ROOT domain");
|
||||
}
|
||||
|
||||
if (subdomainAccess == null) {
|
||||
subdomainAccess = true;
|
||||
} else if (!subdomainAccess) {
|
||||
throw new InvalidParameterValueException("Subdomain access should be set to true for the" + " guest network in the Basic zone");
|
||||
}
|
||||
if (subdomainAccess == null) {
|
||||
subdomainAccess = true;
|
||||
} else if (!subdomainAccess) {
|
||||
throw new InvalidParameterValueException("Subdomain access should be set to true for the" + " guest network in the Basic zone");
|
||||
}
|
||||
|
||||
if (vlanId == null) {
|
||||
vlanId = Vlan.UNTAGGED;
|
||||
} else {
|
||||
if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
|
||||
throw new InvalidParameterValueException("Only vlan " + Vlan.UNTAGGED + " can be created in " + "the zone of type " + NetworkType.Basic);
|
||||
if (vlanId == null) {
|
||||
vlanId = Vlan.UNTAGGED;
|
||||
} else {
|
||||
if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
|
||||
throw new InvalidParameterValueException("Only vlan " + Vlan.UNTAGGED + " can be created in " + "the zone of type " + NetworkType.Basic);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (zone.getNetworkType() == NetworkType.Advanced) {
|
||||
if (zone.isSecurityGroupEnabled()) {
|
||||
if (isolatedPvlan != null) {
|
||||
throw new InvalidParameterValueException("Isolated Private VLAN is not supported with security group!");
|
||||
}
|
||||
// Only Account specific Isolated network with sourceNat service disabled are allowed in security group
|
||||
// enabled zone
|
||||
if ((ntwkOff.getGuestType() != GuestType.Shared) && (ntwkOff.getGuestType() != GuestType.L2)) {
|
||||
throw new InvalidParameterValueException("Only shared or L2 guest network can be created in security group enabled zone");
|
||||
}
|
||||
if (_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)) {
|
||||
throw new InvalidParameterValueException("Service SourceNat is not allowed in security group enabled zone");
|
||||
}
|
||||
}
|
||||
|
||||
//don't allow eip/elb networks in Advance zone
|
||||
if (ntwkOff.isElasticIp() || ntwkOff.isElasticLb()) {
|
||||
throw new InvalidParameterValueException("Elastic IP and Elastic LB services are supported in zone of type " + NetworkType.Basic);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (zone.getNetworkType() == NetworkType.Advanced) {
|
||||
if (zone.isSecurityGroupEnabled()) {
|
||||
if (isolatedPvlan != null) {
|
||||
throw new InvalidParameterValueException("Isolated Private VLAN is not supported with security group!");
|
||||
}
|
||||
// Only Account specific Isolated network with sourceNat service disabled are allowed in security group
|
||||
// enabled zone
|
||||
if ((ntwkOff.getGuestType() != GuestType.Shared) && (ntwkOff.getGuestType() != GuestType.L2)) {
|
||||
throw new InvalidParameterValueException("Only shared or L2 guest network can be created in security group enabled zone");
|
||||
}
|
||||
if (_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)) {
|
||||
throw new InvalidParameterValueException("Service SourceNat is not allowed in security group enabled zone");
|
||||
if (ipv6 && !GuestType.Shared.equals(ntwkOff.getGuestType())) {
|
||||
_networkModel.checkIp6CidrSizeEqualTo64(ip6Cidr);
|
||||
}
|
||||
|
||||
//TODO(VXLAN): Support VNI specified
|
||||
// VlanId can be specified only when network offering supports it
|
||||
final boolean vlanSpecified = vlanId != null;
|
||||
if (vlanSpecified != ntwkOff.isSpecifyVlan()) {
|
||||
if (vlanSpecified) {
|
||||
if (!isSharedNetworkWithoutSpecifyVlan(ntwkOff) && !isPrivateGatewayWithoutSpecifyVlan(ntwkOff)) {
|
||||
throw new InvalidParameterValueException("Can't specify vlan; corresponding offering says specifyVlan=false");
|
||||
}
|
||||
} else {
|
||||
throw new InvalidParameterValueException("Vlan has to be specified; corresponding offering says specifyVlan=true");
|
||||
}
|
||||
}
|
||||
|
||||
//don't allow eip/elb networks in Advance zone
|
||||
if (ntwkOff.isElasticIp() || ntwkOff.isElasticLb()) {
|
||||
throw new InvalidParameterValueException("Elastic IP and Elastic LB services are supported in zone of type " + NetworkType.Basic);
|
||||
}
|
||||
}
|
||||
|
||||
if (ipv6 && !GuestType.Shared.equals(ntwkOff.getGuestType())) {
|
||||
_networkModel.checkIp6CidrSizeEqualTo64(ip6Cidr);
|
||||
}
|
||||
|
||||
//TODO(VXLAN): Support VNI specified
|
||||
// VlanId can be specified only when network offering supports it
|
||||
final boolean vlanSpecified = vlanId != null;
|
||||
if (vlanSpecified != ntwkOff.isSpecifyVlan()) {
|
||||
if (vlanSpecified) {
|
||||
if (!isSharedNetworkWithoutSpecifyVlan(ntwkOff) && !isPrivateGatewayWithoutSpecifyVlan(ntwkOff)) {
|
||||
throw new InvalidParameterValueException("Can't specify vlan; corresponding offering says specifyVlan=false");
|
||||
URI uri = encodeVlanIdIntoBroadcastUri(vlanId, pNtwk);
|
||||
// Aux: generate secondary URI for secondary VLAN ID (if provided) for performing checks
|
||||
URI secondaryUri = StringUtils.isNotBlank(isolatedPvlan) ? BroadcastDomainType.fromString(isolatedPvlan) : null;
|
||||
if (isSharedNetworkWithoutSpecifyVlan(ntwkOff) || isPrivateGatewayWithoutSpecifyVlan(ntwkOff)) {
|
||||
bypassVlanOverlapCheck = true;
|
||||
}
|
||||
} else {
|
||||
throw new InvalidParameterValueException("Vlan has to be specified; corresponding offering says specifyVlan=true");
|
||||
}
|
||||
}
|
||||
|
||||
if (vlanSpecified) {
|
||||
URI uri = encodeVlanIdIntoBroadcastUri(vlanId, pNtwk);
|
||||
// Aux: generate secondary URI for secondary VLAN ID (if provided) for performing checks
|
||||
URI secondaryUri = StringUtils.isNotBlank(isolatedPvlan) ? BroadcastDomainType.fromString(isolatedPvlan) : null;
|
||||
if (isSharedNetworkWithoutSpecifyVlan(ntwkOff) || isPrivateGatewayWithoutSpecifyVlan(ntwkOff)) {
|
||||
bypassVlanOverlapCheck = true;
|
||||
}
|
||||
//don't allow to specify vlan tag used by physical network for dynamic vlan allocation
|
||||
if (!(bypassVlanOverlapCheck && (ntwkOff.getGuestType() == GuestType.Shared || isPrivateNetwork))
|
||||
&& _dcDao.findVnet(zoneId, pNtwk.getId(), BroadcastDomainType.getValue(uri)).size() > 0) {
|
||||
throw new InvalidParameterValueException("The VLAN tag to use for new guest network, " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone "
|
||||
+ zone.getName());
|
||||
}
|
||||
if (secondaryUri != null && !(bypassVlanOverlapCheck && ntwkOff.getGuestType() == GuestType.Shared) &&
|
||||
_dcDao.findVnet(zoneId, pNtwk.getId(), BroadcastDomainType.getValue(secondaryUri)).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"The VLAN tag for isolated PVLAN %s is already being used for dynamic vlan allocation for the guest network in zone %s",
|
||||
isolatedPvlan, zone));
|
||||
}
|
||||
if (!UuidUtils.isUuid(vlanId)) {
|
||||
// For Isolated and L2 networks, don't allow to create network with vlan that already exists in the zone
|
||||
if (!hasGuestBypassVlanOverlapCheck(bypassVlanOverlapCheck, ntwkOff, isPrivateNetwork)) {
|
||||
if (_networksDao.listByZoneAndUriAndGuestType(zoneId, uri.toString(), null).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with vlan %s already exists or overlaps with other network vlans in zone %s",
|
||||
vlanId, zone));
|
||||
} else if (secondaryUri != null && _networksDao.listByZoneAndUriAndGuestType(zoneId, secondaryUri.toString(), null).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with vlan %s already exists or overlaps with other network vlans in zone %s",
|
||||
isolatedPvlan, zone));
|
||||
} else {
|
||||
final List<DataCenterVnetVO> dcVnets = _datacenterVnetDao.findVnet(zoneId, BroadcastDomainType.getValue(uri));
|
||||
//for the network that is created as part of private gateway,
|
||||
//the vnet is not coming from the data center vnet table, so the list can be empty
|
||||
if (!dcVnets.isEmpty()) {
|
||||
final DataCenterVnetVO dcVnet = dcVnets.get(0);
|
||||
// Fail network creation if specified vlan is dedicated to a different account
|
||||
if (dcVnet.getAccountGuestVlanMapId() != null) {
|
||||
final Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId();
|
||||
final AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId);
|
||||
if (map.getAccountId() != owner.getAccountId()) {
|
||||
throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account");
|
||||
}
|
||||
// Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool
|
||||
} else {
|
||||
final List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId());
|
||||
if (maps != null && !maps.isEmpty()) {
|
||||
final int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId());
|
||||
final int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId());
|
||||
if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) {
|
||||
throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" + " to the vlan range dedicated to the owner "
|
||||
+ owner.getAccountName());
|
||||
//don't allow to specify vlan tag used by physical network for dynamic vlan allocation
|
||||
if (!(bypassVlanOverlapCheck && (ntwkOff.getGuestType() == GuestType.Shared || isPrivateNetwork))
|
||||
&& _dcDao.findVnet(zoneId, pNtwk.getId(), BroadcastDomainType.getValue(uri)).size() > 0) {
|
||||
throw new InvalidParameterValueException("The VLAN tag to use for new guest network, " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone "
|
||||
+ zone.getName());
|
||||
}
|
||||
if (secondaryUri != null && !(bypassVlanOverlapCheck && ntwkOff.getGuestType() == GuestType.Shared) &&
|
||||
_dcDao.findVnet(zoneId, pNtwk.getId(), BroadcastDomainType.getValue(secondaryUri)).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"The VLAN tag for isolated PVLAN %s is already being used for dynamic vlan allocation for the guest network in zone %s",
|
||||
isolatedPvlan, zone));
|
||||
}
|
||||
if (!UuidUtils.isUuid(vlanId)) {
|
||||
// For Isolated and L2 networks, don't allow to create network with vlan that already exists in the zone
|
||||
if (!hasGuestBypassVlanOverlapCheck(bypassVlanOverlapCheck, ntwkOff, isPrivateNetwork)) {
|
||||
if (_networksDao.listByZoneAndUriAndGuestType(zoneId, uri.toString(), null).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with vlan %s already exists or overlaps with other network vlans in zone %s",
|
||||
vlanId, zone));
|
||||
} else if (secondaryUri != null && _networksDao.listByZoneAndUriAndGuestType(zoneId, secondaryUri.toString(), null).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with vlan %s already exists or overlaps with other network vlans in zone %s",
|
||||
isolatedPvlan, zone));
|
||||
} else {
|
||||
final List<DataCenterVnetVO> dcVnets = _datacenterVnetDao.findVnet(zoneId, BroadcastDomainType.getValue(uri));
|
||||
//for the network that is created as part of private gateway,
|
||||
//the vnet is not coming from the data center vnet table, so the list can be empty
|
||||
if (!dcVnets.isEmpty()) {
|
||||
final DataCenterVnetVO dcVnet = dcVnets.get(0);
|
||||
// Fail network creation if specified vlan is dedicated to a different account
|
||||
if (dcVnet.getAccountGuestVlanMapId() != null) {
|
||||
final Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId();
|
||||
final AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId);
|
||||
if (map.getAccountId() != owner.getAccountId()) {
|
||||
throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account");
|
||||
}
|
||||
// Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool
|
||||
} else {
|
||||
final List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId());
|
||||
if (maps != null && !maps.isEmpty()) {
|
||||
final int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId());
|
||||
final int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId());
|
||||
if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) {
|
||||
throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" + " to the vlan range dedicated to the owner "
|
||||
+ owner.getAccountName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// don't allow to creating shared network with given Vlan ID, if there already exists a isolated network or
|
||||
// shared network with same Vlan ID in the zone
|
||||
if (!bypassVlanOverlapCheck && _networksDao.listByZoneAndUriAndGuestType(zoneId, uri.toString(), GuestType.Isolated).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"There is an existing isolated/shared network that overlaps with vlan id:%s in zone %s", vlanId, zone));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// don't allow to creating shared network with given Vlan ID, if there already exists a isolated network or
|
||||
// shared network with same Vlan ID in the zone
|
||||
if (!bypassVlanOverlapCheck && _networksDao.listByZoneAndUriAndGuestType(zoneId, uri.toString(), GuestType.Isolated).size() > 0) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If networkDomain is not specified, take it from the global configuration
|
||||
if (_networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Dns)) {
|
||||
final Map<Network.Capability, String> dnsCapabilities = _networkModel.getNetworkOfferingServiceCapabilities(_entityMgr.findById(NetworkOffering.class, networkOfferingId),
|
||||
Service.Dns);
|
||||
final String isUpdateDnsSupported = dnsCapabilities.get(Capability.AllowDnsSuffixModification);
|
||||
if (isUpdateDnsSupported == null || !Boolean.valueOf(isUpdateDnsSupported)) {
|
||||
if (networkDomain != null) {
|
||||
// TBD: NetworkOfferingId and zoneId. Send uuids instead.
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"There is an existing isolated/shared network that overlaps with vlan id:%s in zone %s", vlanId, zone));
|
||||
"Domain name change is not supported by network offering id=%d in zone %s",
|
||||
networkOfferingId, zone));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If networkDomain is not specified, take it from the global configuration
|
||||
if (_networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Dns)) {
|
||||
final Map<Network.Capability, String> dnsCapabilities = _networkModel.getNetworkOfferingServiceCapabilities(_entityMgr.findById(NetworkOffering.class, networkOfferingId),
|
||||
Service.Dns);
|
||||
final String isUpdateDnsSupported = dnsCapabilities.get(Capability.AllowDnsSuffixModification);
|
||||
if (isUpdateDnsSupported == null || !Boolean.valueOf(isUpdateDnsSupported)) {
|
||||
if (networkDomain != null) {
|
||||
// TBD: NetworkOfferingId and zoneId. Send uuids instead.
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Domain name change is not supported by network offering id=%d in zone %s",
|
||||
networkOfferingId, zone));
|
||||
}
|
||||
} else {
|
||||
if (networkDomain == null) {
|
||||
// 1) Get networkDomain from the corresponding account/domain/zone
|
||||
if (aclType == ACLType.Domain) {
|
||||
networkDomain = _networkModel.getDomainNetworkDomain(domainId, zoneId);
|
||||
} else if (aclType == ACLType.Account) {
|
||||
networkDomain = _networkModel.getAccountNetworkDomain(owner.getId(), zoneId);
|
||||
}
|
||||
|
||||
// 2) If null, generate networkDomain using domain suffix from the global config variables
|
||||
if (networkDomain == null) {
|
||||
networkDomain = "cs" + Long.toHexString(owner.getId()) + GuestDomainSuffix.valueIn(zoneId);
|
||||
}
|
||||
|
||||
} else {
|
||||
// validate network domain
|
||||
if (!NetUtils.verifyDomainName(networkDomain)) {
|
||||
throw new InvalidParameterValueException("Invalid network domain. Total length shouldn't exceed 190 chars. Each domain "
|
||||
+ "label must be between 1 and 63 characters long, can contain ASCII letters 'a' through 'z', the digits '0' through '9', "
|
||||
+ "and the hyphen ('-'); can't start or end with \"-\"");
|
||||
if (networkDomain == null) {
|
||||
// 1) Get networkDomain from the corresponding account/domain/zone
|
||||
if (aclType == ACLType.Domain) {
|
||||
networkDomain = _networkModel.getDomainNetworkDomain(domainId, zoneId);
|
||||
} else if (aclType == ACLType.Account) {
|
||||
networkDomain = _networkModel.getAccountNetworkDomain(owner.getId(), zoneId);
|
||||
}
|
||||
|
||||
// 2) If null, generate networkDomain using domain suffix from the global config variables
|
||||
if (networkDomain == null) {
|
||||
networkDomain = "cs" + Long.toHexString(owner.getId()) + GuestDomainSuffix.valueIn(zoneId);
|
||||
}
|
||||
|
||||
} else {
|
||||
// validate network domain
|
||||
if (!NetUtils.verifyDomainName(networkDomain)) {
|
||||
throw new InvalidParameterValueException("Invalid network domain. Total length shouldn't exceed 190 chars. Each domain "
|
||||
+ "label must be between 1 and 63 characters long, can contain ASCII letters 'a' through 'z', the digits '0' through '9', "
|
||||
+ "and the hyphen ('-'); can't start or end with \"-\"");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// In Advance zone Cidr for Shared networks and Isolated networks w/o source nat service can't be NULL - 2.2.x
|
||||
// limitation, remove after we introduce support for multiple ip ranges
|
||||
// with different Cidrs for the same Shared network
|
||||
final boolean cidrRequired = zone.getNetworkType() == NetworkType.Advanced
|
||||
&& ntwkOff.getTrafficType() == TrafficType.Guest
|
||||
&& (ntwkOff.getGuestType() == GuestType.Shared || (ntwkOff.getGuestType() == GuestType.Isolated
|
||||
&& !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)
|
||||
&& !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.Gateway)));
|
||||
if (cidr == null && ip6Cidr == null && cidrRequired) {
|
||||
if (ntwkOff.getGuestType() == GuestType.Shared) {
|
||||
throw new InvalidParameterValueException(String.format("Gateway/netmask are required when creating %s networks.", Network.GuestType.Shared));
|
||||
} else {
|
||||
throw new InvalidParameterValueException("gateway/netmask are required when create network of" + " type " + GuestType.Isolated + " with service " + Service.SourceNat.getName() + " disabled");
|
||||
// In Advance zone Cidr for Shared networks and Isolated networks w/o source nat service can't be NULL - 2.2.x
|
||||
// limitation, remove after we introduce support for multiple ip ranges
|
||||
// with different Cidrs for the same Shared network
|
||||
final boolean cidrRequired = zone.getNetworkType() == NetworkType.Advanced
|
||||
&& ntwkOff.getTrafficType() == TrafficType.Guest
|
||||
&& (ntwkOff.getGuestType() == GuestType.Shared || (ntwkOff.getGuestType() == GuestType.Isolated
|
||||
&& !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)
|
||||
&& !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.Gateway)));
|
||||
if (cidr == null && ip6Cidr == null && cidrRequired) {
|
||||
if (ntwkOff.getGuestType() == GuestType.Shared) {
|
||||
throw new InvalidParameterValueException(String.format("Gateway/netmask are required when creating %s networks.", Network.GuestType.Shared));
|
||||
} else {
|
||||
throw new InvalidParameterValueException("gateway/netmask are required when create network of" + " type " + GuestType.Isolated + " with service " + Service.SourceNat.getName() + " disabled");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkL2OfferingServices(ntwkOff);
|
||||
checkL2OfferingServices(ntwkOff);
|
||||
|
||||
// No cidr can be specified in Basic zone
|
||||
if (zone.getNetworkType() == NetworkType.Basic && cidr != null) {
|
||||
throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask can't be specified for zone of type " + NetworkType.Basic);
|
||||
}
|
||||
// No cidr can be specified in Basic zone
|
||||
if (zone.getNetworkType() == NetworkType.Basic && cidr != null) {
|
||||
throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask can't be specified for zone of type " + NetworkType.Basic);
|
||||
}
|
||||
|
||||
// Check if cidr is RFC1918 compliant if the network is Guest Isolated for IPv4
|
||||
if (cidr != null && (ntwkOff.getGuestType() == Network.GuestType.Isolated && ntwkOff.getTrafficType() == TrafficType.Guest) &&
|
||||
!NetUtils.validateGuestCidr(cidr, !ConfigurationManager.AllowNonRFC1918CompliantIPs.value())) {
|
||||
// Check if cidr is RFC1918 compliant if the network is Guest Isolated for IPv4
|
||||
if (cidr != null && (ntwkOff.getGuestType() == Network.GuestType.Isolated && ntwkOff.getTrafficType() == TrafficType.Guest) &&
|
||||
!NetUtils.validateGuestCidr(cidr, !ConfigurationManager.AllowNonRFC1918CompliantIPs.value())) {
|
||||
throw new InvalidParameterValueException("Virtual Guest Cidr " + cidr + " is not RFC 1918 or 6598 compliant");
|
||||
}
|
||||
}
|
||||
|
||||
final String networkDomainFinal = networkDomain;
|
||||
final String vlanIdFinal = vlanId;
|
||||
final Boolean subdomainAccessFinal = subdomainAccess;
|
||||
final Network network = Transaction.execute(new TransactionCallback<Network>() {
|
||||
@Override
|
||||
public Network doInTransaction(final TransactionStatus status) {
|
||||
Long physicalNetworkId = null;
|
||||
if (pNtwk != null) {
|
||||
physicalNetworkId = pNtwk.getId();
|
||||
}
|
||||
final DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId);
|
||||
final NetworkVO userNetwork = new NetworkVO();
|
||||
userNetwork.setNetworkDomain(networkDomainFinal);
|
||||
final String networkDomainFinal = networkDomain;
|
||||
final String vlanIdFinal = vlanId;
|
||||
final Boolean subdomainAccessFinal = subdomainAccess;
|
||||
final Network network = Transaction.execute(new TransactionCallback<Network>() {
|
||||
@Override
|
||||
public Network doInTransaction(final TransactionStatus status) {
|
||||
Long physicalNetworkId = null;
|
||||
if (pNtwk != null) {
|
||||
physicalNetworkId = pNtwk.getId();
|
||||
}
|
||||
final DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId);
|
||||
final NetworkVO userNetwork = new NetworkVO();
|
||||
userNetwork.setNetworkDomain(networkDomainFinal);
|
||||
|
||||
if (cidr != null && gateway != null) {
|
||||
userNetwork.setCidr(cidr);
|
||||
userNetwork.setGateway(gateway);
|
||||
}
|
||||
if (cidr != null && gateway != null) {
|
||||
userNetwork.setCidr(cidr);
|
||||
userNetwork.setGateway(gateway);
|
||||
}
|
||||
|
||||
if (StringUtils.isNoneBlank(ip6Gateway, ip6Cidr)) {
|
||||
userNetwork.setIp6Cidr(ip6Cidr);
|
||||
userNetwork.setIp6Gateway(ip6Gateway);
|
||||
}
|
||||
if (StringUtils.isNoneBlank(ip6Gateway, ip6Cidr)) {
|
||||
userNetwork.setIp6Cidr(ip6Cidr);
|
||||
userNetwork.setIp6Gateway(ip6Gateway);
|
||||
}
|
||||
|
||||
if (externalId != null) {
|
||||
userNetwork.setExternalId(externalId);
|
||||
}
|
||||
if (externalId != null) {
|
||||
userNetwork.setExternalId(externalId);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(routerIp)) {
|
||||
userNetwork.setRouterIp(routerIp);
|
||||
}
|
||||
if (StringUtils.isNotBlank(routerIp)) {
|
||||
userNetwork.setRouterIp(routerIp);
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(routerIpv6)) {
|
||||
userNetwork.setRouterIpv6(routerIpv6);
|
||||
}
|
||||
if (StringUtils.isNotBlank(routerIpv6)) {
|
||||
userNetwork.setRouterIpv6(routerIpv6);
|
||||
}
|
||||
|
||||
if (vrIfaceMTUs != null) {
|
||||
if (vrIfaceMTUs.first() != null && vrIfaceMTUs.first() > 0) {
|
||||
userNetwork.setPublicMtu(vrIfaceMTUs.first());
|
||||
if (vrIfaceMTUs != null) {
|
||||
if (vrIfaceMTUs.first() != null && vrIfaceMTUs.first() > 0) {
|
||||
userNetwork.setPublicMtu(vrIfaceMTUs.first());
|
||||
} else {
|
||||
userNetwork.setPublicMtu(Integer.valueOf(NetworkService.VRPublicInterfaceMtu.defaultValue()));
|
||||
}
|
||||
|
||||
if (vrIfaceMTUs.second() != null && vrIfaceMTUs.second() > 0) {
|
||||
userNetwork.setPrivateMtu(vrIfaceMTUs.second());
|
||||
} else {
|
||||
userNetwork.setPrivateMtu(Integer.valueOf(NetworkService.VRPrivateInterfaceMtu.defaultValue()));
|
||||
}
|
||||
} else {
|
||||
userNetwork.setPublicMtu(Integer.valueOf(NetworkService.VRPublicInterfaceMtu.defaultValue()));
|
||||
}
|
||||
|
||||
if (vrIfaceMTUs.second() != null && vrIfaceMTUs.second() > 0) {
|
||||
userNetwork.setPrivateMtu(vrIfaceMTUs.second());
|
||||
} else {
|
||||
userNetwork.setPrivateMtu(Integer.valueOf(NetworkService.VRPrivateInterfaceMtu.defaultValue()));
|
||||
}
|
||||
} else {
|
||||
userNetwork.setPublicMtu(Integer.valueOf(NetworkService.VRPublicInterfaceMtu.defaultValue()));
|
||||
userNetwork.setPrivateMtu(Integer.valueOf(NetworkService.VRPrivateInterfaceMtu.defaultValue()));
|
||||
}
|
||||
|
||||
if (!GuestType.L2.equals(userNetwork.getGuestType())) {
|
||||
if (StringUtils.isNotBlank(ip4Dns1)) {
|
||||
userNetwork.setDns1(ip4Dns1);
|
||||
if (!GuestType.L2.equals(userNetwork.getGuestType())) {
|
||||
if (StringUtils.isNotBlank(ip4Dns1)) {
|
||||
userNetwork.setDns1(ip4Dns1);
|
||||
}
|
||||
if (StringUtils.isNotBlank(ip4Dns2)) {
|
||||
userNetwork.setDns2(ip4Dns2);
|
||||
}
|
||||
if (StringUtils.isNotBlank(ip6Dns1)) {
|
||||
userNetwork.setIp6Dns1(ip6Dns1);
|
||||
}
|
||||
if (StringUtils.isNotBlank(ip6Dns2)) {
|
||||
userNetwork.setIp6Dns2(ip6Dns2);
|
||||
}
|
||||
}
|
||||
if (StringUtils.isNotBlank(ip4Dns2)) {
|
||||
userNetwork.setDns2(ip4Dns2);
|
||||
}
|
||||
if (StringUtils.isNotBlank(ip6Dns1)) {
|
||||
userNetwork.setIp6Dns1(ip6Dns1);
|
||||
}
|
||||
if (StringUtils.isNotBlank(ip6Dns2)) {
|
||||
userNetwork.setIp6Dns2(ip6Dns2);
|
||||
}
|
||||
}
|
||||
|
||||
if (vlanIdFinal != null) {
|
||||
if (isolatedPvlan == null) {
|
||||
URI uri = null;
|
||||
if (UuidUtils.isUuid(vlanIdFinal)) {
|
||||
//Logical router's UUID provided as VLAN_ID
|
||||
userNetwork.setVlanIdAsUUID(vlanIdFinal); //Set transient field
|
||||
} else {
|
||||
uri = encodeVlanIdIntoBroadcastUri(vlanIdFinal, pNtwk);
|
||||
}
|
||||
|
||||
if (_networksDao.listByPhysicalNetworkPvlan(physicalNetworkId, uri.toString()).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with vlan %s already exists or overlaps with other network pvlans in zone %s",
|
||||
vlanIdFinal, zone));
|
||||
}
|
||||
|
||||
userNetwork.setBroadcastUri(uri);
|
||||
if (!vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
|
||||
userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
|
||||
} else {
|
||||
userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
|
||||
}
|
||||
} else {
|
||||
if (vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
|
||||
throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
|
||||
}
|
||||
URI uri = NetUtils.generateUriForPvlan(vlanIdFinal, isolatedPvlan, isolatedPvlanType.toString());
|
||||
if (_networksDao.listByPhysicalNetworkPvlan(physicalNetworkId, uri.toString(), isolatedPvlanType).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with primary vlan %s and secondary vlan %s type %s already exists or overlaps with other network pvlans in zone %s",
|
||||
vlanIdFinal, isolatedPvlan, isolatedPvlanType, zone));
|
||||
}
|
||||
userNetwork.setBroadcastUri(uri);
|
||||
userNetwork.setBroadcastDomainType(BroadcastDomainType.Pvlan);
|
||||
userNetwork.setPvlanType(isolatedPvlanType);
|
||||
}
|
||||
}
|
||||
userNetwork.setNetworkCidrSize(networkCidrSize);
|
||||
final List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccessFinal, vpcId,
|
||||
isDisplayNetworkEnabled);
|
||||
Network network = null;
|
||||
if (networks == null || networks.isEmpty()) {
|
||||
throw new CloudRuntimeException("Fail to create a network");
|
||||
} else {
|
||||
if (networks.size() > 0 && networks.get(0).getGuestType() == Network.GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) {
|
||||
Network defaultGuestNetwork = networks.get(0);
|
||||
for (final Network nw : networks) {
|
||||
if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) {
|
||||
defaultGuestNetwork = nw;
|
||||
if (vlanIdFinal != null) {
|
||||
if (isolatedPvlan == null) {
|
||||
URI uri = null;
|
||||
if (UuidUtils.isUuid(vlanIdFinal)) {
|
||||
//Logical router's UUID provided as VLAN_ID
|
||||
userNetwork.setVlanIdAsUUID(vlanIdFinal); //Set transient field
|
||||
} else {
|
||||
uri = encodeVlanIdIntoBroadcastUri(vlanIdFinal, pNtwk);
|
||||
}
|
||||
|
||||
if (_networksDao.listByPhysicalNetworkPvlan(physicalNetworkId, uri.toString()).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with vlan %s already exists or overlaps with other network pvlans in zone %s",
|
||||
vlanIdFinal, zone));
|
||||
}
|
||||
|
||||
userNetwork.setBroadcastUri(uri);
|
||||
if (!vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
|
||||
userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
|
||||
} else {
|
||||
userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
|
||||
}
|
||||
} else {
|
||||
if (vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
|
||||
throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
|
||||
}
|
||||
URI uri = NetUtils.generateUriForPvlan(vlanIdFinal, isolatedPvlan, isolatedPvlanType.toString());
|
||||
if (_networksDao.listByPhysicalNetworkPvlan(physicalNetworkId, uri.toString(), isolatedPvlanType).size() > 0) {
|
||||
throw new InvalidParameterValueException(String.format(
|
||||
"Network with primary vlan %s and secondary vlan %s type %s already exists or overlaps with other network pvlans in zone %s",
|
||||
vlanIdFinal, isolatedPvlan, isolatedPvlanType, zone));
|
||||
}
|
||||
userNetwork.setBroadcastUri(uri);
|
||||
userNetwork.setBroadcastDomainType(BroadcastDomainType.Pvlan);
|
||||
userNetwork.setPvlanType(isolatedPvlanType);
|
||||
}
|
||||
network = defaultGuestNetwork;
|
||||
} else {
|
||||
// For shared network
|
||||
network = networks.get(0);
|
||||
}
|
||||
userNetwork.setNetworkCidrSize(networkCidrSize);
|
||||
final List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccessFinal, vpcId,
|
||||
isDisplayNetworkEnabled);
|
||||
Network network = null;
|
||||
if (networks == null || networks.isEmpty()) {
|
||||
throw new CloudRuntimeException("Fail to create a network");
|
||||
} else {
|
||||
if (networks.size() > 0 && networks.get(0).getGuestType() == Network.GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) {
|
||||
Network defaultGuestNetwork = networks.get(0);
|
||||
for (final Network nw : networks) {
|
||||
if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) {
|
||||
defaultGuestNetwork = nw;
|
||||
}
|
||||
}
|
||||
network = defaultGuestNetwork;
|
||||
} else {
|
||||
// For shared network
|
||||
network = networks.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
if (isResourceCountUpdateNeeded(ntwkOff)) {
|
||||
changeAccountResourceCountOrRecalculateDomainResourceCount(owner.getAccountId(), domainId, isDisplayNetworkEnabled, true);
|
||||
}
|
||||
UsageEventUtils.publishNetworkCreation(network);
|
||||
|
||||
return network;
|
||||
}
|
||||
});
|
||||
|
||||
if (isResourceCountUpdateNeeded(ntwkOff)) {
|
||||
changeAccountResourceCountOrRecalculateDomainResourceCount(owner.getAccountId(), domainId, isDisplayNetworkEnabled, true);
|
||||
}
|
||||
UsageEventUtils.publishNetworkCreation(network);
|
||||
|
||||
return network;
|
||||
}
|
||||
});
|
||||
|
||||
CallContext.current().setEventDetails("Network Id: " + network.getId());
|
||||
CallContext.current().putContextParameter(Network.class, network.getUuid());
|
||||
return network;
|
||||
CallContext.current().setEventDetails("Network Id: " + network.getId());
|
||||
CallContext.current().putContextParameter(Network.class, network.getUuid());
|
||||
return network;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5430,19 +5430,17 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
}
|
||||
|
||||
try (CheckedReservation publicIpReservation = new CheckedReservation(account, ResourceType.public_ip, null, null, null, newIpAddressAmount, existingIpAddressAmount, reservationDao, _resourceLimitMgr)) {
|
||||
updateVlanAndIpv4Range(id, vlanRange, startIp, endIp, gateway, netmask, isRangeForSystemVM, forSystemVms);
|
||||
|
||||
updateVlanAndIpv4Range(id, vlanRange, startIp, endIp, gateway, netmask, isRangeForSystemVM, forSystemVms);
|
||||
|
||||
if (account != null) {
|
||||
long countDiff = newIpAddressAmount - existingIpAddressAmount;
|
||||
if (countDiff > 0) {
|
||||
_resourceLimitMgr.incrementResourceCount(account.getId(), ResourceType.public_ip, countDiff);
|
||||
} else if (countDiff < 0) {
|
||||
_resourceLimitMgr.decrementResourceCount(account.getId(), ResourceType.public_ip, Math.abs(countDiff));
|
||||
if (account != null) {
|
||||
long countDiff = newIpAddressAmount - existingIpAddressAmount;
|
||||
if (countDiff > 0) {
|
||||
_resourceLimitMgr.incrementResourceCount(account.getId(), ResourceType.public_ip, countDiff);
|
||||
} else if (countDiff < 0) {
|
||||
_resourceLimitMgr.decrementResourceCount(account.getId(), ResourceType.public_ip, Math.abs(countDiff));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if (ipv6) {
|
||||
updateVlanAndIpv6Range(id, vlanRange, startIpv6, endIpv6, ip6Gateway, ip6Cidr, isRangeForSystemVM, forSystemVms);
|
||||
|
|
@ -5852,31 +5850,29 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
// Check Public IP resource limits
|
||||
long reservedIpAddressesAmount = vlanOwner != null ? _publicIpAddressDao.countIPs(zoneId, vlanDbId, false) : 0L;
|
||||
try (CheckedReservation publicIpReservation = new CheckedReservation(vlanOwner, ResourceType.public_ip, null, null, null, reservedIpAddressesAmount, null, reservationDao, _resourceLimitMgr)) {
|
||||
if (vlanOwner != null) {
|
||||
// Create an AccountVlanMapVO entry
|
||||
final AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
|
||||
_accountVlanMapDao.persist(accountVlanMapVO);
|
||||
|
||||
if (vlanOwner != null) {
|
||||
// Create an AccountVlanMapVO entry
|
||||
final AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
|
||||
_accountVlanMapDao.persist(accountVlanMapVO);
|
||||
|
||||
// generate usage event for dedication of every ip address in the range
|
||||
for (final IPAddressVO ip : ips) {
|
||||
final boolean usageHidden = _ipAddrMgr.isUsageHidden(ip);
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(),
|
||||
vlan.getVlanType().toString(), ip.getSystem(), usageHidden, ip.getClass().getName(), ip.getUuid());
|
||||
// generate usage event for dedication of every ip address in the range
|
||||
for (final IPAddressVO ip : ips) {
|
||||
final boolean usageHidden = _ipAddrMgr.isUsageHidden(ip);
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(),
|
||||
vlan.getVlanType().toString(), ip.getSystem(), usageHidden, ip.getClass().getName(), ip.getUuid());
|
||||
}
|
||||
} else if (domain != null) {
|
||||
// Create an DomainVlanMapVO entry
|
||||
DomainVlanMapVO domainVlanMapVO = new DomainVlanMapVO(domain.getId(), vlan.getId());
|
||||
_domainVlanMapDao.persist(domainVlanMapVO);
|
||||
}
|
||||
} 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
|
||||
if (vlanOwner != null) {
|
||||
_resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
|
||||
}
|
||||
|
||||
return vlan;
|
||||
// increment resource count for dedicated public ip's
|
||||
if (vlanOwner != null) {
|
||||
_resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
|
||||
}
|
||||
|
||||
return vlan;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1150,21 +1150,19 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
|
|||
|
||||
long reservedIpAddressesAmount = ipDedicatedAccountId == null ? 1L : 0L;
|
||||
try (CheckedReservation publicIpAddressReservation = new CheckedReservation(account, Resource.ResourceType.public_ip, reservedIpAddressesAmount, reservationDao, _resourceLimitMgr)) {
|
||||
|
||||
List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByVlan(ipVO.getVlanId());
|
||||
ipVO.setAllocatedTime(new Date());
|
||||
ipVO.setAllocatedToAccountId(account.getAccountId());
|
||||
ipVO.setAllocatedInDomainId(account.getDomainId());
|
||||
ipVO.setState(State.Reserved);
|
||||
if (displayIp != null) {
|
||||
ipVO.setDisplay(displayIp);
|
||||
}
|
||||
ipVO = _ipAddressDao.persist(ipVO);
|
||||
if (reservedIpAddressesAmount > 0) {
|
||||
_resourceLimitMgr.incrementResourceCount(account.getId(), Resource.ResourceType.public_ip);
|
||||
}
|
||||
return ipVO;
|
||||
|
||||
List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByVlan(ipVO.getVlanId());
|
||||
ipVO.setAllocatedTime(new Date());
|
||||
ipVO.setAllocatedToAccountId(account.getAccountId());
|
||||
ipVO.setAllocatedInDomainId(account.getDomainId());
|
||||
ipVO.setState(State.Reserved);
|
||||
if (displayIp != null) {
|
||||
ipVO.setDisplay(displayIp);
|
||||
}
|
||||
ipVO = _ipAddressDao.persist(ipVO);
|
||||
if (reservedIpAddressesAmount > 0) {
|
||||
_resourceLimitMgr.incrementResourceCount(account.getId(), Resource.ResourceType.public_ip);
|
||||
}
|
||||
return ipVO;
|
||||
} catch (ResourceAllocationException ex) {
|
||||
logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + account);
|
||||
throw new AccountLimitException("Maximum number of public IP addresses for account: " + account.getAccountName() + " has been exceeded.");
|
||||
|
|
|
|||
|
|
@ -1248,25 +1248,25 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
|
|||
vpc.setDisplay(Boolean.TRUE.equals(displayVpc));
|
||||
|
||||
try (CheckedReservation vpcReservation = new CheckedReservation(owner, ResourceType.vpc, null, null, 1L, reservationDao, _resourceLimitMgr)) {
|
||||
if (vpc.getCidr() == null && cidrSize != null) {
|
||||
// Allocate a CIDR for VPC
|
||||
Ipv4GuestSubnetNetworkMap subnet = routedIpv4Manager.getOrCreateIpv4SubnetForVpc(vpc, cidrSize);
|
||||
if (subnet != null) {
|
||||
vpc.setCidr(subnet.getSubnet());
|
||||
} else {
|
||||
throw new CloudRuntimeException("Failed to allocate a CIDR with requested size for VPC.");
|
||||
if (vpc.getCidr() == null && cidrSize != null) {
|
||||
// Allocate a CIDR for VPC
|
||||
Ipv4GuestSubnetNetworkMap subnet = routedIpv4Manager.getOrCreateIpv4SubnetForVpc(vpc, cidrSize);
|
||||
if (subnet != null) {
|
||||
vpc.setCidr(subnet.getSubnet());
|
||||
} else {
|
||||
throw new CloudRuntimeException("Failed to allocate a CIDR with requested size for VPC.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vpc newVpc = createVpc(displayVpc, vpc);
|
||||
// assign Ipv4 subnet to Routed VPC
|
||||
if (routedIpv4Manager.isRoutedVpc(vpc)) {
|
||||
routedIpv4Manager.assignIpv4SubnetToVpc(newVpc);
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(bgpPeerIds)) {
|
||||
routedIpv4Manager.persistBgpPeersForVpc(newVpc.getId(), bgpPeerIds);
|
||||
}
|
||||
return newVpc;
|
||||
Vpc newVpc = createVpc(displayVpc, vpc);
|
||||
// assign Ipv4 subnet to Routed VPC
|
||||
if (routedIpv4Manager.isRoutedVpc(vpc)) {
|
||||
routedIpv4Manager.assignIpv4SubnetToVpc(newVpc);
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(bgpPeerIds)) {
|
||||
routedIpv4Manager.persistBgpPeersForVpc(newVpc.getId(), bgpPeerIds);
|
||||
}
|
||||
return newVpc;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -277,40 +277,39 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager, C
|
|||
}
|
||||
|
||||
try (CheckedReservation projectReservation = new CheckedReservation(owner, ResourceType.project, null, null, 1L, reservationDao, _resourceLimitMgr)) {
|
||||
final Account ownerFinal = owner;
|
||||
User finalUser = user;
|
||||
Project project = Transaction.execute(new TransactionCallback<Project>() {
|
||||
@Override
|
||||
public Project doInTransaction(TransactionStatus status) {
|
||||
|
||||
final Account ownerFinal = owner;
|
||||
User finalUser = user;
|
||||
Project project = Transaction.execute(new TransactionCallback<Project>() {
|
||||
@Override
|
||||
public Project doInTransaction(TransactionStatus status) {
|
||||
//Create an account associated with the project
|
||||
StringBuilder acctNm = new StringBuilder("PrjAcct-");
|
||||
acctNm.append(name).append("-").append(ownerFinal.getDomainId());
|
||||
|
||||
//Create an account associated with the project
|
||||
StringBuilder acctNm = new StringBuilder("PrjAcct-");
|
||||
acctNm.append(name).append("-").append(ownerFinal.getDomainId());
|
||||
Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.Type.PROJECT, null, domainId, null, null, UUID.randomUUID().toString());
|
||||
|
||||
Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.Type.PROJECT, null, domainId, null, null, UUID.randomUUID().toString());
|
||||
Project project = _projectDao.persist(new ProjectVO(name, displayText, ownerFinal.getDomainId(), projectAccount.getId()));
|
||||
|
||||
Project project = _projectDao.persist(new ProjectVO(name, displayText, ownerFinal.getDomainId(), projectAccount.getId()));
|
||||
//assign owner to the project
|
||||
assignAccountToProject(project, ownerFinal.getId(), ProjectAccount.Role.Admin,
|
||||
Optional.ofNullable(finalUser).map(User::getId).orElse(null), null);
|
||||
|
||||
//assign owner to the project
|
||||
assignAccountToProject(project, ownerFinal.getId(), ProjectAccount.Role.Admin,
|
||||
Optional.ofNullable(finalUser).map(User::getId).orElse(null), null);
|
||||
if (project != null) {
|
||||
CallContext.current().setEventDetails("Project id=" + project.getId());
|
||||
CallContext.current().putContextParameter(Project.class, project.getUuid());
|
||||
}
|
||||
|
||||
if (project != null) {
|
||||
CallContext.current().setEventDetails("Project id=" + project.getId());
|
||||
CallContext.current().putContextParameter(Project.class, project.getUuid());
|
||||
//Increment resource count
|
||||
_resourceLimitMgr.incrementResourceCount(ownerFinal.getId(), ResourceType.project);
|
||||
|
||||
return project;
|
||||
}
|
||||
});
|
||||
|
||||
//Increment resource count
|
||||
_resourceLimitMgr.incrementResourceCount(ownerFinal.getId(), ResourceType.project);
|
||||
messageBus.publish(_name, ProjectManager.MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT, PublishScope.LOCAL, project);
|
||||
|
||||
return project;
|
||||
}
|
||||
});
|
||||
|
||||
messageBus.publish(_name, ProjectManager.MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT, PublishScope.LOCAL, project);
|
||||
|
||||
return project;
|
||||
return project;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -671,13 +670,13 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager, C
|
|||
boolean shouldIncrementResourceCount = Role.Admin == newAccRole;
|
||||
|
||||
try (CheckedReservation checkedReservation = new CheckedReservation(account, ResourceType.project, shouldIncrementResourceCount ? 1L : 0L, reservationDao, _resourceLimitMgr)) {
|
||||
futureOwner.setAccountRole(newAccRole);
|
||||
_projectAccountDao.update(futureOwner.getId(), futureOwner);
|
||||
if (shouldIncrementResourceCount) {
|
||||
_resourceLimitMgr.incrementResourceCount(accountId, ResourceType.project);
|
||||
} else {
|
||||
_resourceLimitMgr.decrementResourceCount(accountId, ResourceType.project);
|
||||
}
|
||||
futureOwner.setAccountRole(newAccRole);
|
||||
_projectAccountDao.update(futureOwner.getId(), futureOwner);
|
||||
if (shouldIncrementResourceCount) {
|
||||
_resourceLimitMgr.incrementResourceCount(accountId, ResourceType.project);
|
||||
} else {
|
||||
_resourceLimitMgr.decrementResourceCount(accountId, ResourceType.project);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -877,16 +876,16 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager, C
|
|||
|
||||
boolean shouldIncrementResourceCount = projectRoleType != null && Role.Admin == projectRoleType;
|
||||
try (CheckedReservation cr = new CheckedReservation(account, ResourceType.project, shouldIncrementResourceCount ? 1L : 0L, reservationDao, _resourceLimitMgr)) {
|
||||
if (assignAccountToProject(project, account.getId(), projectRoleType, null,
|
||||
Optional.ofNullable(projectRole).map(ProjectRole::getId).orElse(null)) != null) {
|
||||
if (shouldIncrementResourceCount) {
|
||||
_resourceLimitMgr.incrementResourceCount(account.getId(), ResourceType.project);
|
||||
if (assignAccountToProject(project, account.getId(), projectRoleType, null,
|
||||
Optional.ofNullable(projectRole).map(ProjectRole::getId).orElse(null)) != null) {
|
||||
if (shouldIncrementResourceCount) {
|
||||
_resourceLimitMgr.incrementResourceCount(account.getId(), ResourceType.project);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
logger.warn("Failed to add account {} to project {}", accountName, project);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
logger.warn("Failed to add account {} to project {}", accountName, project);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -431,9 +431,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
|
||||
validateVolume(caller, ownerId, zoneId, volumeName, url, format, diskOfferingId, reservations);
|
||||
volume = persistVolume(owner, zoneId, volumeName, url, format, diskOfferingId, Volume.State.Allocated);
|
||||
validateVolume(caller, ownerId, zoneId, volumeName, url, format, diskOfferingId, reservations);
|
||||
volume = persistVolume(owner, zoneId, volumeName, url, format, diskOfferingId, Volume.State.Allocated);
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
@ -479,74 +478,74 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
validateVolume(caller, ownerId, zoneId, volumeName, null, format, diskOfferingId, reservations);
|
||||
validateVolume(caller, ownerId, zoneId, volumeName, null, format, diskOfferingId, reservations);
|
||||
|
||||
return Transaction.execute(new TransactionCallbackWithException<GetUploadParamsResponse, MalformedURLException>() {
|
||||
@Override
|
||||
public GetUploadParamsResponse doInTransaction(TransactionStatus status) throws MalformedURLException {
|
||||
return Transaction.execute(new TransactionCallbackWithException<GetUploadParamsResponse, MalformedURLException>() {
|
||||
@Override
|
||||
public GetUploadParamsResponse doInTransaction(TransactionStatus status) throws MalformedURLException {
|
||||
|
||||
VolumeVO volume = persistVolume(owner, zoneId, volumeName, null, format, diskOfferingId, Volume.State.NotUploaded);
|
||||
VolumeVO volume = persistVolume(owner, zoneId, volumeName, null, format, diskOfferingId, Volume.State.NotUploaded);
|
||||
|
||||
final DataStore store = _tmpltMgr.getImageStore(imageStoreUuid, zoneId, volume);
|
||||
final DataStore store = _tmpltMgr.getImageStore(imageStoreUuid, zoneId, volume);
|
||||
|
||||
VolumeInfo vol = volFactory.getVolume(volume.getId());
|
||||
VolumeInfo vol = volFactory.getVolume(volume.getId());
|
||||
|
||||
RegisterVolumePayload payload = new RegisterVolumePayload(null, cmd.getChecksum(), format);
|
||||
vol.addPayload(payload);
|
||||
RegisterVolumePayload payload = new RegisterVolumePayload(null, cmd.getChecksum(), format);
|
||||
vol.addPayload(payload);
|
||||
|
||||
Pair<EndPoint, DataObject> pair = volService.registerVolumeForPostUpload(vol, store);
|
||||
EndPoint ep = pair.first();
|
||||
DataObject dataObject = pair.second();
|
||||
Pair<EndPoint, DataObject> pair = volService.registerVolumeForPostUpload(vol, store);
|
||||
EndPoint ep = pair.first();
|
||||
DataObject dataObject = pair.second();
|
||||
|
||||
GetUploadParamsResponse response = new GetUploadParamsResponse();
|
||||
GetUploadParamsResponse response = new GetUploadParamsResponse();
|
||||
|
||||
String ssvmUrlDomain = _configDao.getValue(Config.SecStorageSecureCopyCert.key());
|
||||
String protocol = UseHttpsToUpload.value() ? "https" : "http";
|
||||
String ssvmUrlDomain = _configDao.getValue(Config.SecStorageSecureCopyCert.key());
|
||||
String protocol = UseHttpsToUpload.value() ? "https" : "http";
|
||||
|
||||
String url = ImageStoreUtil.generatePostUploadUrl(ssvmUrlDomain, ep.getPublicAddr(), vol.getUuid(), protocol);
|
||||
response.setPostURL(new URL(url));
|
||||
String url = ImageStoreUtil.generatePostUploadUrl(ssvmUrlDomain, ep.getPublicAddr(), vol.getUuid(), protocol);
|
||||
response.setPostURL(new URL(url));
|
||||
|
||||
// set the post url, this is used in the monitoring thread to determine the SSVM
|
||||
VolumeDataStoreVO volumeStore = _volumeStoreDao.findByVolume(vol.getId());
|
||||
assert (volumeStore != null) : "sincle volume is registered, volumestore cannot be null at this stage";
|
||||
volumeStore.setExtractUrl(url);
|
||||
_volumeStoreDao.persist(volumeStore);
|
||||
// set the post url, this is used in the monitoring thread to determine the SSVM
|
||||
VolumeDataStoreVO volumeStore = _volumeStoreDao.findByVolume(vol.getId());
|
||||
assert (volumeStore != null) : "sincle volume is registered, volumestore cannot be null at this stage";
|
||||
volumeStore.setExtractUrl(url);
|
||||
_volumeStoreDao.persist(volumeStore);
|
||||
|
||||
response.setId(UUID.fromString(vol.getUuid()));
|
||||
response.setId(UUID.fromString(vol.getUuid()));
|
||||
|
||||
int timeout = ImageStoreUploadMonitorImpl.getUploadOperationTimeout();
|
||||
DateTime currentDateTime = new DateTime(DateTimeZone.UTC);
|
||||
String expires = currentDateTime.plusMinutes(timeout).toString();
|
||||
response.setTimeout(expires);
|
||||
int timeout = ImageStoreUploadMonitorImpl.getUploadOperationTimeout();
|
||||
DateTime currentDateTime = new DateTime(DateTimeZone.UTC);
|
||||
String expires = currentDateTime.plusMinutes(timeout).toString();
|
||||
response.setTimeout(expires);
|
||||
|
||||
String key = _configDao.getValue(Config.SSVMPSK.key());
|
||||
/*
|
||||
* encoded metadata using the post upload config key
|
||||
*/
|
||||
TemplateOrVolumePostUploadCommand command = new TemplateOrVolumePostUploadCommand(vol.getId(), vol.getUuid(), volumeStore.getInstallPath(), cmd.getChecksum(), vol.getType().toString(),
|
||||
vol.getName(), vol.getFormat().toString(), dataObject.getDataStore().getUri(), dataObject.getDataStore().getRole().toString());
|
||||
command.setLocalPath(volumeStore.getLocalDownloadPath());
|
||||
//using the existing max upload size configuration
|
||||
command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600));
|
||||
command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key()));
|
||||
String key = _configDao.getValue(Config.SSVMPSK.key());
|
||||
/*
|
||||
* encoded metadata using the post upload config key
|
||||
*/
|
||||
TemplateOrVolumePostUploadCommand command = new TemplateOrVolumePostUploadCommand(vol.getId(), vol.getUuid(), volumeStore.getInstallPath(), cmd.getChecksum(), vol.getType().toString(),
|
||||
vol.getName(), vol.getFormat().toString(), dataObject.getDataStore().getUri(), dataObject.getDataStore().getRole().toString());
|
||||
command.setLocalPath(volumeStore.getLocalDownloadPath());
|
||||
//using the existing max upload size configuration
|
||||
command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600));
|
||||
command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key()));
|
||||
|
||||
long accountId = vol.getAccountId();
|
||||
Account account = _accountDao.findById(accountId);
|
||||
Domain domain = domainDao.findById(account.getDomainId());
|
||||
long accountId = vol.getAccountId();
|
||||
Account account = _accountDao.findById(accountId);
|
||||
Domain domain = domainDao.findById(account.getDomainId());
|
||||
|
||||
command.setDefaultMaxSecondaryStorageInBytes(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage, null));
|
||||
command.setAccountId(accountId);
|
||||
Gson gson = new GsonBuilder().create();
|
||||
String metadata = EncryptionUtil.encodeData(gson.toJson(command), key);
|
||||
response.setMetadata(metadata);
|
||||
command.setDefaultMaxSecondaryStorageInBytes(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage, null));
|
||||
command.setAccountId(accountId);
|
||||
Gson gson = new GsonBuilder().create();
|
||||
String metadata = EncryptionUtil.encodeData(gson.toJson(command), key);
|
||||
response.setMetadata(metadata);
|
||||
|
||||
/*
|
||||
* signature calculated on the url, expiry, metadata.
|
||||
*/
|
||||
response.setSignature(EncryptionUtil.generateSignature(metadata + url + expires, key));
|
||||
return response;
|
||||
}
|
||||
});
|
||||
/*
|
||||
* signature calculated on the url, expiry, metadata.
|
||||
*/
|
||||
response.setSignature(EncryptionUtil.generateSignature(metadata + url + expires, key));
|
||||
return response;
|
||||
}
|
||||
});
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
@ -945,29 +944,29 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
_resourceLimitMgr.checkVolumeResourceLimit(owner, displayVolume, size, diskOffering, reservations);
|
||||
_resourceLimitMgr.checkVolumeResourceLimit(owner, displayVolume, size, diskOffering, reservations);
|
||||
|
||||
// Verify that zone exists
|
||||
DataCenterVO zone = _dcDao.findById(zoneId);
|
||||
if (zone == null) {
|
||||
throw new InvalidParameterValueException("Unable to find zone by id " + zoneId);
|
||||
}
|
||||
// Verify that zone exists
|
||||
DataCenterVO zone = _dcDao.findById(zoneId);
|
||||
if (zone == null) {
|
||||
throw new InvalidParameterValueException("Unable to find zone by id " + zoneId);
|
||||
}
|
||||
|
||||
// Check if zone is disabled
|
||||
if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getId())) {
|
||||
throw new PermissionDeniedException(String.format("Cannot perform this operation, Zone: %s is currently disabled", zone));
|
||||
}
|
||||
// Check if zone is disabled
|
||||
if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getId())) {
|
||||
throw new PermissionDeniedException(String.format("Cannot perform this operation, Zone: %s is currently disabled", zone));
|
||||
}
|
||||
|
||||
// If local storage is disabled then creation of volume with local disk
|
||||
// offering not allowed
|
||||
if (!zone.isLocalStorageEnabled() && diskOffering.isUseLocalStorage()) {
|
||||
throw new InvalidParameterValueException("Zone is not configured to use local storage but volume's disk offering " + diskOffering.getName() + " uses it");
|
||||
}
|
||||
// If local storage is disabled then creation of volume with local disk
|
||||
// offering not allowed
|
||||
if (!zone.isLocalStorageEnabled() && diskOffering.isUseLocalStorage()) {
|
||||
throw new InvalidParameterValueException("Zone is not configured to use local storage but volume's disk offering " + diskOffering.getName() + " uses it");
|
||||
}
|
||||
|
||||
String userSpecifiedName = getVolumeNameFromCommand(cmd);
|
||||
String userSpecifiedName = getVolumeNameFromCommand(cmd);
|
||||
|
||||
return commitVolume(cmd, caller, owner, displayVolume, zoneId, diskOfferingId, provisioningType, size, minIops, maxIops, parentVolume, userSpecifiedName,
|
||||
_uuidMgr.generateUuid(Volume.class, cmd.getCustomId()), details);
|
||||
return commitVolume(cmd, caller, owner, displayVolume, zoneId, diskOfferingId, provisioningType, size, minIops, maxIops, parentVolume, userSpecifiedName,
|
||||
_uuidMgr.generateUuid(Volume.class, cmd.getCustomId()), details);
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
}
|
||||
|
|
@ -1298,134 +1297,134 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
validateVolumeResizeWithSize(volume, currentSize, newSize, shrinkOk, diskOffering, newDiskOffering, reservations);
|
||||
validateVolumeResizeWithSize(volume, currentSize, newSize, shrinkOk, diskOffering, newDiskOffering, reservations);
|
||||
|
||||
// Note: The storage plug-in in question should perform validation on the IOPS to check if a sufficient number of IOPS is available to perform
|
||||
// the requested change
|
||||
// Note: The storage plug-in in question should perform validation on the IOPS to check if a sufficient number of IOPS is available to perform
|
||||
// the requested change
|
||||
|
||||
/* If this volume has never been beyond allocated state, short circuit everything and simply update the database. */
|
||||
// We need to publish this event to usage_volume table
|
||||
if (volume.getState() == Volume.State.Allocated) {
|
||||
logger.debug("Volume is in the allocated state, but has never been created. Simply updating database with new size and IOPS.");
|
||||
/* If this volume has never been beyond allocated state, short circuit everything and simply update the database. */
|
||||
// We need to publish this event to usage_volume table
|
||||
if (volume.getState() == Volume.State.Allocated) {
|
||||
logger.debug("Volume is in the allocated state, but has never been created. Simply updating database with new size and IOPS.");
|
||||
|
||||
volume.setSize(newSize);
|
||||
volume.setMinIops(newMinIops);
|
||||
volume.setMaxIops(newMaxIops);
|
||||
volume.setHypervisorSnapshotReserve(newHypervisorSnapshotReserve);
|
||||
volume.setSize(newSize);
|
||||
volume.setMinIops(newMinIops);
|
||||
volume.setMaxIops(newMaxIops);
|
||||
volume.setHypervisorSnapshotReserve(newHypervisorSnapshotReserve);
|
||||
|
||||
if (newDiskOffering != null) {
|
||||
volume.setDiskOfferingId(cmd.getNewDiskOfferingId());
|
||||
}
|
||||
|
||||
_volsDao.update(volume.getId(), volume);
|
||||
_resourceLimitMgr.updateVolumeResourceCountForDiskOfferingChange(volume.getAccountId(), volume.isDisplayVolume(), currentSize, newSize,
|
||||
diskOffering, newDiskOffering);
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_RESIZE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
|
||||
volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
|
||||
return volume;
|
||||
}
|
||||
|
||||
Long newDiskOfferingId = newDiskOffering != null ? newDiskOffering.getId() : diskOffering.getId();
|
||||
|
||||
boolean volumeMigrateRequired = false;
|
||||
List<? extends StoragePool> suitableStoragePoolsWithEnoughSpace = null;
|
||||
StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId());
|
||||
if (!storageMgr.storagePoolHasEnoughSpaceForResize(storagePool, currentSize, newSize)) {
|
||||
if (!autoMigrateVolume) {
|
||||
throw new CloudRuntimeException(String.format("Failed to resize volume %s since the storage pool does not have enough space to accommodate new size for the volume %s, try with automigrate set to true in order to check in the other suitable pools for the new size and then migrate & resize volume there.", volume.getUuid(), volume.getName()));
|
||||
}
|
||||
Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForSystemMigrationOfVolume(volume.getId(), newDiskOfferingId, currentSize, newMinIops, newMaxIops, true, false);
|
||||
List<? extends StoragePool> suitableStoragePools = poolsPair.second();
|
||||
if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume resize failed for volume ID: %s as no suitable pool(s) found for migrating to support new disk offering or new size", volume.getUuid()));
|
||||
}
|
||||
final Long newSizeFinal = newSize;
|
||||
suitableStoragePoolsWithEnoughSpace = suitableStoragePools.stream().filter(pool -> storageMgr.storagePoolHasEnoughSpaceForResize(pool, 0L, newSizeFinal)).collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(suitableStoragePoolsWithEnoughSpace)) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume resize failed for volume ID: %s as no suitable pool(s) with enough space found.", volume.getUuid()));
|
||||
}
|
||||
Collections.shuffle(suitableStoragePoolsWithEnoughSpace);
|
||||
volumeMigrateRequired = true;
|
||||
}
|
||||
|
||||
boolean volumeResizeRequired = false;
|
||||
if (currentSize != newSize || !compareEqualsIncludingNullOrZero(newMaxIops, volume.getMaxIops()) || !compareEqualsIncludingNullOrZero(newMinIops, volume.getMinIops())) {
|
||||
volumeResizeRequired = true;
|
||||
}
|
||||
if (!volumeMigrateRequired && !volumeResizeRequired && newDiskOffering != null) {
|
||||
_volsDao.updateDiskOffering(volume.getId(), newDiskOffering.getId());
|
||||
volume = _volsDao.findById(volume.getId());
|
||||
updateStorageWithTheNewDiskOffering(volume, newDiskOffering);
|
||||
|
||||
return volume;
|
||||
}
|
||||
|
||||
if (volumeMigrateRequired) {
|
||||
MigrateVolumeCmd migrateVolumeCmd = new MigrateVolumeCmd(volume.getId(), suitableStoragePoolsWithEnoughSpace.get(0).getId(), newDiskOfferingId, true);
|
||||
try {
|
||||
Volume result = migrateVolume(migrateVolumeCmd);
|
||||
volume = (result != null) ? _volsDao.findById(result.getId()) : null;
|
||||
if (volume == null) {
|
||||
throw new CloudRuntimeException(String.format("Volume resize operation failed for volume ID: %s as migration failed to storage pool %s accommodating new size", volume.getUuid(), suitableStoragePoolsWithEnoughSpace.get(0).getId()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new CloudRuntimeException(String.format("Volume resize operation failed for volume ID: %s as migration failed to storage pool %s accommodating new size", volume.getUuid(), suitableStoragePoolsWithEnoughSpace.get(0).getId()));
|
||||
}
|
||||
}
|
||||
|
||||
UserVmVO userVm = _userVmDao.findById(volume.getInstanceId());
|
||||
|
||||
if (userVm != null) {
|
||||
// serialize VM operation
|
||||
AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
|
||||
|
||||
if (jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
|
||||
// avoid re-entrance
|
||||
|
||||
VmWorkJobVO placeHolder = null;
|
||||
|
||||
placeHolder = createPlaceHolderWork(userVm.getId());
|
||||
|
||||
try {
|
||||
return orchestrateResizeVolume(volume.getId(), currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve,
|
||||
newDiskOffering != null ? cmd.getNewDiskOfferingId() : null, shrinkOk);
|
||||
} finally {
|
||||
_workJobDao.expunge(placeHolder.getId());
|
||||
}
|
||||
} else {
|
||||
Outcome<Volume> outcome = resizeVolumeThroughJobQueue(userVm.getId(), volume.getId(), currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve,
|
||||
newDiskOffering != null ? cmd.getNewDiskOfferingId() : null, shrinkOk);
|
||||
|
||||
try {
|
||||
outcome.get();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException("Operation was interrupted", e);
|
||||
} catch (ExecutionException e) {
|
||||
throw new RuntimeException("Execution exception", e);
|
||||
if (newDiskOffering != null) {
|
||||
volume.setDiskOfferingId(cmd.getNewDiskOfferingId());
|
||||
}
|
||||
|
||||
Object jobResult = _jobMgr.unmarshallResultObject(outcome.getJob());
|
||||
_volsDao.update(volume.getId(), volume);
|
||||
_resourceLimitMgr.updateVolumeResourceCountForDiskOfferingChange(volume.getAccountId(), volume.isDisplayVolume(), currentSize, newSize,
|
||||
diskOffering, newDiskOffering);
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_RESIZE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
|
||||
volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
|
||||
return volume;
|
||||
}
|
||||
|
||||
if (jobResult != null) {
|
||||
if (jobResult instanceof ConcurrentOperationException) {
|
||||
throw (ConcurrentOperationException) jobResult;
|
||||
} else if (jobResult instanceof ResourceAllocationException) {
|
||||
throw (ResourceAllocationException) jobResult;
|
||||
} else if (jobResult instanceof RuntimeException) {
|
||||
throw (RuntimeException) jobResult;
|
||||
} else if (jobResult instanceof Throwable) {
|
||||
throw new RuntimeException("Unexpected exception", (Throwable) jobResult);
|
||||
} else if (jobResult instanceof Long) {
|
||||
return _volsDao.findById((Long) jobResult);
|
||||
}
|
||||
Long newDiskOfferingId = newDiskOffering != null ? newDiskOffering.getId() : diskOffering.getId();
|
||||
|
||||
boolean volumeMigrateRequired = false;
|
||||
List<? extends StoragePool> suitableStoragePoolsWithEnoughSpace = null;
|
||||
StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId());
|
||||
if (!storageMgr.storagePoolHasEnoughSpaceForResize(storagePool, currentSize, newSize)) {
|
||||
if (!autoMigrateVolume) {
|
||||
throw new CloudRuntimeException(String.format("Failed to resize volume %s since the storage pool does not have enough space to accommodate new size for the volume %s, try with automigrate set to true in order to check in the other suitable pools for the new size and then migrate & resize volume there.", volume.getUuid(), volume.getName()));
|
||||
}
|
||||
Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForSystemMigrationOfVolume(volume.getId(), newDiskOfferingId, currentSize, newMinIops, newMaxIops, true, false);
|
||||
List<? extends StoragePool> suitableStoragePools = poolsPair.second();
|
||||
if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume resize failed for volume ID: %s as no suitable pool(s) found for migrating to support new disk offering or new size", volume.getUuid()));
|
||||
}
|
||||
final Long newSizeFinal = newSize;
|
||||
suitableStoragePoolsWithEnoughSpace = suitableStoragePools.stream().filter(pool -> storageMgr.storagePoolHasEnoughSpaceForResize(pool, 0L, newSizeFinal)).collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(suitableStoragePoolsWithEnoughSpace)) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume resize failed for volume ID: %s as no suitable pool(s) with enough space found.", volume.getUuid()));
|
||||
}
|
||||
Collections.shuffle(suitableStoragePoolsWithEnoughSpace);
|
||||
volumeMigrateRequired = true;
|
||||
}
|
||||
|
||||
boolean volumeResizeRequired = false;
|
||||
if (currentSize != newSize || !compareEqualsIncludingNullOrZero(newMaxIops, volume.getMaxIops()) || !compareEqualsIncludingNullOrZero(newMinIops, volume.getMinIops())) {
|
||||
volumeResizeRequired = true;
|
||||
}
|
||||
if (!volumeMigrateRequired && !volumeResizeRequired && newDiskOffering != null) {
|
||||
_volsDao.updateDiskOffering(volume.getId(), newDiskOffering.getId());
|
||||
volume = _volsDao.findById(volume.getId());
|
||||
updateStorageWithTheNewDiskOffering(volume, newDiskOffering);
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
return orchestrateResizeVolume(volume.getId(), currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve, newDiskOffering != null ? cmd.getNewDiskOfferingId() : null,
|
||||
shrinkOk);
|
||||
if (volumeMigrateRequired) {
|
||||
MigrateVolumeCmd migrateVolumeCmd = new MigrateVolumeCmd(volume.getId(), suitableStoragePoolsWithEnoughSpace.get(0).getId(), newDiskOfferingId, true);
|
||||
try {
|
||||
Volume result = migrateVolume(migrateVolumeCmd);
|
||||
volume = (result != null) ? _volsDao.findById(result.getId()) : null;
|
||||
if (volume == null) {
|
||||
throw new CloudRuntimeException(String.format("Volume resize operation failed for volume ID: %s as migration failed to storage pool %s accommodating new size", volume.getUuid(), suitableStoragePoolsWithEnoughSpace.get(0).getId()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new CloudRuntimeException(String.format("Volume resize operation failed for volume ID: %s as migration failed to storage pool %s accommodating new size", volume.getUuid(), suitableStoragePoolsWithEnoughSpace.get(0).getId()));
|
||||
}
|
||||
}
|
||||
|
||||
UserVmVO userVm = _userVmDao.findById(volume.getInstanceId());
|
||||
|
||||
if (userVm != null) {
|
||||
// serialize VM operation
|
||||
AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
|
||||
|
||||
if (jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
|
||||
// avoid re-entrance
|
||||
|
||||
VmWorkJobVO placeHolder = null;
|
||||
|
||||
placeHolder = createPlaceHolderWork(userVm.getId());
|
||||
|
||||
try {
|
||||
return orchestrateResizeVolume(volume.getId(), currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve,
|
||||
newDiskOffering != null ? cmd.getNewDiskOfferingId() : null, shrinkOk);
|
||||
} finally {
|
||||
_workJobDao.expunge(placeHolder.getId());
|
||||
}
|
||||
} else {
|
||||
Outcome<Volume> outcome = resizeVolumeThroughJobQueue(userVm.getId(), volume.getId(), currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve,
|
||||
newDiskOffering != null ? cmd.getNewDiskOfferingId() : null, shrinkOk);
|
||||
|
||||
try {
|
||||
outcome.get();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException("Operation was interrupted", e);
|
||||
} catch (ExecutionException e) {
|
||||
throw new RuntimeException("Execution exception", e);
|
||||
}
|
||||
|
||||
Object jobResult = _jobMgr.unmarshallResultObject(outcome.getJob());
|
||||
|
||||
if (jobResult != null) {
|
||||
if (jobResult instanceof ConcurrentOperationException) {
|
||||
throw (ConcurrentOperationException) jobResult;
|
||||
} else if (jobResult instanceof ResourceAllocationException) {
|
||||
throw (ResourceAllocationException) jobResult;
|
||||
} else if (jobResult instanceof RuntimeException) {
|
||||
throw (RuntimeException) jobResult;
|
||||
} else if (jobResult instanceof Throwable) {
|
||||
throw new RuntimeException("Unexpected exception", (Throwable) jobResult);
|
||||
} else if (jobResult instanceof Long) {
|
||||
return _volsDao.findById((Long) jobResult);
|
||||
}
|
||||
}
|
||||
|
||||
return volume;
|
||||
}
|
||||
}
|
||||
|
||||
return orchestrateResizeVolume(volume.getId(), currentSize, newSize, newMinIops, newMaxIops,newHypervisorSnapshotReserve,
|
||||
newDiskOffering != null ? cmd.getNewDiskOfferingId() : null, shrinkOk);
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
@ -2116,96 +2115,96 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
validateVolumeResizeWithSize(volume, currentSize, newSize, shrinkOk, existingDiskOffering, newDiskOffering, reservations);
|
||||
validateVolumeResizeWithSize(volume, currentSize, newSize, shrinkOk, existingDiskOffering, newDiskOffering, reservations);
|
||||
|
||||
/* If this volume has never been beyond allocated state, short circuit everything and simply update the database. */
|
||||
// We need to publish this event to usage_volume table
|
||||
if (volume.getState() == Volume.State.Allocated) {
|
||||
logger.debug("Volume {} is in the allocated state, but has never been created. Simply updating database with new size and IOPS.", volume);
|
||||
/* If this volume has never been beyond allocated state, short circuit everything and simply update the database. */
|
||||
// We need to publish this event to usage_volume table
|
||||
if (volume.getState() == Volume.State.Allocated) {
|
||||
logger.debug("Volume {} is in the allocated state, but has never been created. Simply updating database with new size and IOPS.", volume);
|
||||
|
||||
volume.setSize(newSize);
|
||||
volume.setMinIops(newMinIops);
|
||||
volume.setMaxIops(newMaxIops);
|
||||
volume.setHypervisorSnapshotReserve(newHypervisorSnapshotReserve);
|
||||
volume.setSize(newSize);
|
||||
volume.setMinIops(newMinIops);
|
||||
volume.setMaxIops(newMaxIops);
|
||||
volume.setHypervisorSnapshotReserve(newHypervisorSnapshotReserve);
|
||||
|
||||
if (newDiskOffering != null) {
|
||||
volume.setDiskOfferingId(newDiskOfferingId);
|
||||
_volumeMgr.saveVolumeDetails(newDiskOfferingId, volume.getId());
|
||||
}
|
||||
|
||||
_volsDao.update(volume.getId(), volume);
|
||||
_resourceLimitMgr.updateVolumeResourceCountForDiskOfferingChange(volume.getAccountId(), volume.isDisplayVolume(), currentSize, newSize,
|
||||
existingDiskOffering, newDiskOffering);
|
||||
|
||||
if (currentSize != newSize) {
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_RESIZE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
|
||||
volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
|
||||
}
|
||||
return volume;
|
||||
}
|
||||
|
||||
if (currentSize != newSize || !compareEqualsIncludingNullOrZero(newMaxIops, volume.getMaxIops()) || !compareEqualsIncludingNullOrZero(newMinIops, volume.getMinIops())) {
|
||||
volumeResizeRequired = true;
|
||||
validateVolumeReadyStateAndHypervisorChecks(volume, currentSize, newSize);
|
||||
}
|
||||
|
||||
StoragePoolVO existingStoragePool = _storagePoolDao.findById(volume.getPoolId());
|
||||
|
||||
Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForSystemMigrationOfVolume(volume.getId(), newDiskOffering.getId(), currentSize, newMinIops, newMaxIops, true, false);
|
||||
List<? extends StoragePool> suitableStoragePools = poolsPair.second();
|
||||
|
||||
if (!suitableStoragePools.stream().anyMatch(p -> (p.getId() == existingStoragePool.getId()))) {
|
||||
volumeMigrateRequired = true;
|
||||
if (!autoMigrateVolume) {
|
||||
throw new InvalidParameterValueException(String.format("Failed to change offering for volume %s since automigrate is set to false but volume needs to migrated", volume.getUuid()));
|
||||
}
|
||||
}
|
||||
|
||||
if (!volumeMigrateRequired && !volumeResizeRequired) {
|
||||
_volsDao.updateDiskOffering(volume.getId(), newDiskOffering.getId());
|
||||
volume = _volsDao.findById(volume.getId());
|
||||
updateStorageWithTheNewDiskOffering(volume, newDiskOffering);
|
||||
|
||||
return volume;
|
||||
}
|
||||
|
||||
if (volumeMigrateRequired) {
|
||||
if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) found for migrating to support new disk offering", volume));
|
||||
}
|
||||
final Long newSizeFinal = newSize;
|
||||
List<? extends StoragePool> suitableStoragePoolsWithEnoughSpace = suitableStoragePools.stream().filter(pool -> storageMgr.storagePoolHasEnoughSpaceForResize(pool, 0L, newSizeFinal)).collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(suitableStoragePoolsWithEnoughSpace)) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) with enough space found for volume migration.", volume));
|
||||
}
|
||||
Collections.shuffle(suitableStoragePoolsWithEnoughSpace);
|
||||
MigrateVolumeCmd migrateVolumeCmd = new MigrateVolumeCmd(volume.getId(), suitableStoragePoolsWithEnoughSpace.get(0).getId(), newDiskOffering.getId(), true);
|
||||
try {
|
||||
Volume result = migrateVolume(migrateVolumeCmd);
|
||||
volume = (result != null) ? _volsDao.findById(result.getId()) : null;
|
||||
if (volume == null) {
|
||||
throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume: %s migration failed to storage pool %s", volume, suitableStoragePools.get(0)));
|
||||
if (newDiskOffering != null) {
|
||||
volume.setDiskOfferingId(newDiskOfferingId);
|
||||
_volumeMgr.saveVolumeDetails(newDiskOfferingId, volume.getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume: %s migration failed to storage pool %s due to %s", volume, suitableStoragePools.get(0), e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
if (volumeResizeRequired) {
|
||||
// refresh volume data
|
||||
volume = _volsDao.findById(volume.getId());
|
||||
try {
|
||||
volume = resizeVolumeInternal(volume, newDiskOffering, currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve, shrinkOk);
|
||||
} catch (Exception e) {
|
||||
if (volumeMigrateRequired) {
|
||||
logger.warn(String.format("Volume change offering operation succeeded for volume ID: %s but volume resize operation failed, so please try resize volume operation separately", volume.getUuid()));
|
||||
} else {
|
||||
throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume ID: %s due to resize volume operation failed", volume.getUuid()));
|
||||
_volsDao.update(volume.getId(), volume);
|
||||
_resourceLimitMgr.updateVolumeResourceCountForDiskOfferingChange(volume.getAccountId(), volume.isDisplayVolume(), currentSize, newSize,
|
||||
existingDiskOffering, newDiskOffering);
|
||||
|
||||
if (currentSize != newSize) {
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_RESIZE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
|
||||
volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
|
||||
}
|
||||
return volume;
|
||||
}
|
||||
|
||||
if (currentSize != newSize || !compareEqualsIncludingNullOrZero(newMaxIops, volume.getMaxIops()) || !compareEqualsIncludingNullOrZero(newMinIops, volume.getMinIops())) {
|
||||
volumeResizeRequired = true;
|
||||
validateVolumeReadyStateAndHypervisorChecks(volume, currentSize, newSize);
|
||||
}
|
||||
|
||||
StoragePoolVO existingStoragePool = _storagePoolDao.findById(volume.getPoolId());
|
||||
|
||||
Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForSystemMigrationOfVolume(volume.getId(), newDiskOffering.getId(), currentSize, newMinIops, newMaxIops, true, false);
|
||||
List<? extends StoragePool> suitableStoragePools = poolsPair.second();
|
||||
|
||||
if (!suitableStoragePools.stream().anyMatch(p -> (p.getId() == existingStoragePool.getId()))) {
|
||||
volumeMigrateRequired = true;
|
||||
if (!autoMigrateVolume) {
|
||||
throw new InvalidParameterValueException(String.format("Failed to change offering for volume %s since automigrate is set to false but volume needs to migrated", volume.getUuid()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return volume;
|
||||
if (!volumeMigrateRequired && !volumeResizeRequired) {
|
||||
_volsDao.updateDiskOffering(volume.getId(), newDiskOffering.getId());
|
||||
volume = _volsDao.findById(volume.getId());
|
||||
updateStorageWithTheNewDiskOffering(volume, newDiskOffering);
|
||||
|
||||
return volume;
|
||||
}
|
||||
|
||||
if (volumeMigrateRequired) {
|
||||
if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) found for migrating to support new disk offering", volume));
|
||||
}
|
||||
final Long newSizeFinal = newSize;
|
||||
List<? extends StoragePool> suitableStoragePoolsWithEnoughSpace = suitableStoragePools.stream().filter(pool -> storageMgr.storagePoolHasEnoughSpaceForResize(pool, 0L, newSizeFinal)).collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(suitableStoragePoolsWithEnoughSpace)) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume change offering operation failed for volume: %s as no suitable pool(s) with enough space found for volume migration.", volume));
|
||||
}
|
||||
Collections.shuffle(suitableStoragePoolsWithEnoughSpace);
|
||||
MigrateVolumeCmd migrateVolumeCmd = new MigrateVolumeCmd(volume.getId(), suitableStoragePoolsWithEnoughSpace.get(0).getId(), newDiskOffering.getId(), true);
|
||||
try {
|
||||
Volume result = migrateVolume(migrateVolumeCmd);
|
||||
volume = (result != null) ? _volsDao.findById(result.getId()) : null;
|
||||
if (volume == null) {
|
||||
throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume: %s migration failed to storage pool %s", volume, suitableStoragePools.get(0)));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume: %s migration failed to storage pool %s due to %s", volume, suitableStoragePools.get(0), e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
if (volumeResizeRequired) {
|
||||
// refresh volume data
|
||||
volume = _volsDao.findById(volume.getId());
|
||||
try {
|
||||
volume = resizeVolumeInternal(volume, newDiskOffering, currentSize, newSize, newMinIops, newMaxIops, newHypervisorSnapshotReserve, shrinkOk);
|
||||
} catch (Exception e) {
|
||||
if (volumeMigrateRequired) {
|
||||
logger.warn(String.format("Volume change offering operation succeeded for volume ID: %s but volume resize operation failed, so please try resize volume operation separately", volume.getUuid()));
|
||||
} else {
|
||||
throw new CloudRuntimeException(String.format("Volume change offering operation failed for volume ID: %s due to resize volume operation failed", volume.getUuid()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return volume;
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
@ -2690,13 +2689,13 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
try (CheckedReservation primaryStorageReservation = new CheckedReservation(owner, ResourceType.primary_storage, resourceLimitStorageTags, requiredPrimaryStorageSpace, reservationDao, _resourceLimitMgr)) {
|
||||
|
||||
_jobMgr.updateAsyncJobAttachment(job.getId(), "Volume", volumeId);
|
||||
_jobMgr.updateAsyncJobAttachment(job.getId(), "Volume", volumeId);
|
||||
|
||||
if (asyncExecutionContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
|
||||
return safelyOrchestrateAttachVolume(vmId, volumeId, deviceId);
|
||||
} else {
|
||||
return getVolumeAttachJobResult(vmId, volumeId, deviceId);
|
||||
}
|
||||
if (asyncExecutionContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
|
||||
return safelyOrchestrateAttachVolume(vmId, volumeId, deviceId);
|
||||
} else {
|
||||
return getVolumeAttachJobResult(vmId, volumeId, deviceId);
|
||||
}
|
||||
|
||||
} catch (ResourceAllocationException e) {
|
||||
logger.error("primary storage resource limit check failed", e);
|
||||
|
|
@ -4247,16 +4246,16 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
_resourceLimitMgr.checkVolumeResourceLimit(newAccount, true, volume.getSize(), _diskOfferingDao.findById(volume.getDiskOfferingId()), reservations);
|
||||
_resourceLimitMgr.checkVolumeResourceLimit(newAccount, true, volume.getSize(), _diskOfferingDao.findById(volume.getDiskOfferingId()), reservations);
|
||||
|
||||
Transaction.execute(new TransactionCallbackNoReturn() {
|
||||
@Override
|
||||
public void doInTransactionWithoutResult(TransactionStatus status) {
|
||||
updateVolumeAccount(oldAccount, volume, newAccount);
|
||||
}
|
||||
});
|
||||
Transaction.execute(new TransactionCallbackNoReturn() {
|
||||
@Override
|
||||
public void doInTransactionWithoutResult(TransactionStatus status) {
|
||||
updateVolumeAccount(oldAccount, volume, newAccount);
|
||||
}
|
||||
});
|
||||
|
||||
return volume;
|
||||
return volume;
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
|
|||
|
|
@ -403,23 +403,23 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||
|
||||
try (CheckedReservation templateReservation = new CheckedReservation(owner, ResourceType.template, null, null, 1L, reservationDao, _resourceLimitMgr);
|
||||
CheckedReservation secondaryStorageReservation = new CheckedReservation(owner, ResourceType.secondary_storage, null, null, secondaryStorageUsage, reservationDao, _resourceLimitMgr)) {
|
||||
TemplateProfile profile = adapter.prepare(cmd);
|
||||
VMTemplateVO template = adapter.create(profile);
|
||||
TemplateProfile profile = adapter.prepare(cmd);
|
||||
VMTemplateVO template = adapter.create(profile);
|
||||
|
||||
// Secondary storage resource usage will be incremented in com.cloud.template.HypervisorTemplateAdapter.createTemplateAsyncCallBack
|
||||
// for HypervisorTemplateAdapter
|
||||
_resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template);
|
||||
if (secondaryStorageUsage > 0) {
|
||||
_resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.secondary_storage, secondaryStorageUsage);
|
||||
}
|
||||
|
||||
if (template != null) {
|
||||
CallContext.current().putContextParameter(VirtualMachineTemplate.class, template.getUuid());
|
||||
if (cmd instanceof RegisterVnfTemplateCmd) {
|
||||
vnfTemplateManager.persistVnfTemplate(template.getId(), (RegisterVnfTemplateCmd) cmd);
|
||||
// Secondary storage resource usage will be incremented in com.cloud.template.HypervisorTemplateAdapter.createTemplateAsyncCallBack
|
||||
// for HypervisorTemplateAdapter
|
||||
_resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template);
|
||||
if (secondaryStorageUsage > 0) {
|
||||
_resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.secondary_storage, secondaryStorageUsage);
|
||||
}
|
||||
|
||||
if (template != null) {
|
||||
CallContext.current().putContextParameter(VirtualMachineTemplate.class, template.getUuid());
|
||||
if (cmd instanceof RegisterVnfTemplateCmd) {
|
||||
vnfTemplateManager.persistVnfTemplate(template.getId(), (RegisterVnfTemplateCmd) cmd);
|
||||
}
|
||||
return template;
|
||||
}
|
||||
return template;
|
||||
}
|
||||
}
|
||||
throw new CloudRuntimeException("Failed to create a Template");
|
||||
}
|
||||
|
|
@ -2000,102 +2000,102 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||
try (CheckedReservation templateReservation = new CheckedReservation(templateOwner, ResourceType.template, null, null, 1L, reservationDao, _resourceLimitMgr);
|
||||
CheckedReservation secondaryStorageReservation = new CheckedReservation(templateOwner, ResourceType.secondary_storage, null, null, templateSize, reservationDao, _resourceLimitMgr)) {
|
||||
|
||||
if (!isAdmin || featured == null) {
|
||||
featured = Boolean.FALSE;
|
||||
}
|
||||
Long guestOSId = cmd.getOsTypeId();
|
||||
GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
|
||||
if (guestOS == null) {
|
||||
throw new InvalidParameterValueException("GuestOS with ID: " + guestOSId + " does not exist.");
|
||||
}
|
||||
|
||||
Long nextTemplateId = _tmpltDao.getNextInSequence(Long.class, "id");
|
||||
String description = cmd.getDisplayText();
|
||||
boolean isExtractable = false;
|
||||
Long sourceTemplateId = null;
|
||||
if (volume != null) {
|
||||
VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
|
||||
isExtractable = template != null && template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM;
|
||||
if (template != null) {
|
||||
arch = template.getArch();
|
||||
if (!isAdmin || featured == null) {
|
||||
featured = Boolean.FALSE;
|
||||
}
|
||||
if (volume.getIsoId() != null && volume.getIsoId() != 0) {
|
||||
sourceTemplateId = volume.getIsoId();
|
||||
} else if (volume.getTemplateId() != null) {
|
||||
sourceTemplateId = volume.getTemplateId();
|
||||
Long guestOSId = cmd.getOsTypeId();
|
||||
GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
|
||||
if (guestOS == null) {
|
||||
throw new InvalidParameterValueException("GuestOS with ID: " + guestOSId + " does not exist.");
|
||||
}
|
||||
}
|
||||
String templateTag = cmd.getTemplateTag();
|
||||
if (templateTag != null) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Adding Template tag: " + templateTag);
|
||||
|
||||
Long nextTemplateId = _tmpltDao.getNextInSequence(Long.class, "id");
|
||||
String description = cmd.getDisplayText();
|
||||
boolean isExtractable = false;
|
||||
Long sourceTemplateId = null;
|
||||
if (volume != null) {
|
||||
VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
|
||||
isExtractable = template != null && template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM;
|
||||
if (template != null) {
|
||||
arch = template.getArch();
|
||||
}
|
||||
if (volume.getIsoId() != null && volume.getIsoId() != 0) {
|
||||
sourceTemplateId = volume.getIsoId();
|
||||
} else if (volume.getTemplateId() != null) {
|
||||
sourceTemplateId = volume.getTemplateId();
|
||||
}
|
||||
}
|
||||
}
|
||||
privateTemplate = new VMTemplateVO(nextTemplateId, name, ImageFormat.RAW, isPublic, featured, isExtractable,
|
||||
TemplateType.USER, null, requiresHvmValue, bitsValue, templateOwner.getId(), null, description,
|
||||
passwordEnabledValue, guestOS.getId(), true, hyperType, templateTag, cmd.getDetails(), sshKeyEnabledValue, isDynamicScalingEnabled, false, false, arch);
|
||||
|
||||
if (sourceTemplateId != null) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("This Template is getting created from other Template, setting source Template ID to: " + sourceTemplateId);
|
||||
String templateTag = cmd.getTemplateTag();
|
||||
if (templateTag != null) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Adding Template tag: " + templateTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// for region wide storage, set cross zones flag
|
||||
List<ImageStoreVO> stores = _imgStoreDao.findRegionImageStores();
|
||||
if (!CollectionUtils.isEmpty(stores)) {
|
||||
privateTemplate.setCrossZones(true);
|
||||
}
|
||||
|
||||
privateTemplate.setSourceTemplateId(sourceTemplateId);
|
||||
|
||||
VMTemplateVO template = _tmpltDao.persist(privateTemplate);
|
||||
// Increment the number of templates
|
||||
if (template != null) {
|
||||
Map<String, String> details = new HashMap<String, String>();
|
||||
privateTemplate = new VMTemplateVO(nextTemplateId, name, ImageFormat.RAW, isPublic, featured, isExtractable,
|
||||
TemplateType.USER, null, requiresHvmValue, bitsValue, templateOwner.getId(), null, description,
|
||||
passwordEnabledValue, guestOS.getId(), true, hyperType, templateTag, cmd.getDetails(), sshKeyEnabledValue, isDynamicScalingEnabled, false, false, arch);
|
||||
|
||||
if (sourceTemplateId != null) {
|
||||
VMTemplateVO sourceTemplate = _tmpltDao.findById(sourceTemplateId);
|
||||
if (sourceTemplate != null && sourceTemplate.getDetails() != null) {
|
||||
details.putAll(sourceTemplate.getDetails());
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("This Template is getting created from other Template, setting source Template ID to: " + sourceTemplateId);
|
||||
}
|
||||
}
|
||||
|
||||
if (volume != null) {
|
||||
Long vmId = volume.getInstanceId();
|
||||
if (vmId != null) {
|
||||
UserVmVO userVm = _userVmDao.findById(vmId);
|
||||
if (userVm != null) {
|
||||
_userVmDao.loadDetails(userVm);
|
||||
Map<String, String> vmDetails = userVm.getDetails();
|
||||
vmDetails = vmDetails.entrySet()
|
||||
.stream()
|
||||
.filter(map -> map.getValue() != null)
|
||||
.collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()));
|
||||
details.putAll(vmDetails);
|
||||
|
||||
// for region wide storage, set cross zones flag
|
||||
List<ImageStoreVO> stores = _imgStoreDao.findRegionImageStores();
|
||||
if (!CollectionUtils.isEmpty(stores)) {
|
||||
privateTemplate.setCrossZones(true);
|
||||
}
|
||||
|
||||
privateTemplate.setSourceTemplateId(sourceTemplateId);
|
||||
|
||||
VMTemplateVO template = _tmpltDao.persist(privateTemplate);
|
||||
// Increment the number of templates
|
||||
if (template != null) {
|
||||
Map<String, String> details = new HashMap<String, String>();
|
||||
|
||||
if (sourceTemplateId != null) {
|
||||
VMTemplateVO sourceTemplate = _tmpltDao.findById(sourceTemplateId);
|
||||
if (sourceTemplate != null && sourceTemplate.getDetails() != null) {
|
||||
details.putAll(sourceTemplate.getDetails());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cmd.getDetails() != null) {
|
||||
details.remove(VmDetailConstants.ENCRYPTED_PASSWORD); // new password will be generated during vm deployment from password enabled template
|
||||
details.putAll(cmd.getDetails());
|
||||
}
|
||||
if (!details.isEmpty()) {
|
||||
privateTemplate.setDetails(details);
|
||||
_tmpltDao.saveDetails(privateTemplate);
|
||||
|
||||
if (volume != null) {
|
||||
Long vmId = volume.getInstanceId();
|
||||
if (vmId != null) {
|
||||
UserVmVO userVm = _userVmDao.findById(vmId);
|
||||
if (userVm != null) {
|
||||
_userVmDao.loadDetails(userVm);
|
||||
Map<String, String> vmDetails = userVm.getDetails();
|
||||
vmDetails = vmDetails.entrySet()
|
||||
.stream()
|
||||
.filter(map -> map.getValue() != null)
|
||||
.collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()));
|
||||
details.putAll(vmDetails);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cmd.getDetails() != null) {
|
||||
details.remove(VmDetailConstants.ENCRYPTED_PASSWORD); // new password will be generated during vm deployment from password enabled template
|
||||
details.putAll(cmd.getDetails());
|
||||
}
|
||||
if (!details.isEmpty()) {
|
||||
privateTemplate.setDetails(details);
|
||||
_tmpltDao.saveDetails(privateTemplate);
|
||||
}
|
||||
|
||||
_resourceLimitMgr.incrementResourceCount(templateOwner.getId(), ResourceType.template);
|
||||
_resourceLimitMgr.incrementResourceCount(templateOwner.getId(), ResourceType.secondary_storage, templateSize);
|
||||
}
|
||||
|
||||
_resourceLimitMgr.incrementResourceCount(templateOwner.getId(), ResourceType.template);
|
||||
_resourceLimitMgr.incrementResourceCount(templateOwner.getId(), ResourceType.secondary_storage, templateSize);
|
||||
}
|
||||
|
||||
if (template != null) {
|
||||
CallContext.current().putContextParameter(VirtualMachineTemplate.class, template.getUuid());
|
||||
return template;
|
||||
} else {
|
||||
throw new CloudRuntimeException("Failed to create a Template");
|
||||
}
|
||||
if (template != null) {
|
||||
CallContext.current().putContextParameter(VirtualMachineTemplate.class, template.getUuid());
|
||||
return template;
|
||||
} else {
|
||||
throw new CloudRuntimeException("Failed to create a Template");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1356,30 +1356,30 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
if (!VirtualMachineManager.ResourceCountRunningVMsonly.value()) {
|
||||
_resourceLimitMgr.checkVmResourceLimitsForServiceOfferingChange(owner, vmInstance.isDisplay(), (long) currentCpu, (long) newCpu,
|
||||
(long) currentMemory, (long) newMemory, currentServiceOffering, newServiceOffering, template, reservations);
|
||||
}
|
||||
if (!VirtualMachineManager.ResourceCountRunningVMsonly.value()) {
|
||||
_resourceLimitMgr.checkVmResourceLimitsForServiceOfferingChange(owner, vmInstance.isDisplay(), (long) currentCpu, (long) newCpu,
|
||||
(long) currentMemory, (long) newMemory, currentServiceOffering, newServiceOffering, template, reservations);
|
||||
}
|
||||
|
||||
// Check that the specified service offering ID is valid
|
||||
_itMgr.checkIfCanUpgrade(vmInstance, newServiceOffering);
|
||||
// Check that the specified service offering ID is valid
|
||||
_itMgr.checkIfCanUpgrade(vmInstance, newServiceOffering);
|
||||
|
||||
// Check if the new service offering can be applied to vm instance
|
||||
_accountMgr.checkAccess(owner, newServiceOffering, _dcDao.findById(vmInstance.getDataCenterId()));
|
||||
// Check if the new service offering can be applied to vm instance
|
||||
_accountMgr.checkAccess(owner, newServiceOffering, _dcDao.findById(vmInstance.getDataCenterId()));
|
||||
|
||||
// resize and migrate the root volume if required
|
||||
DiskOfferingVO newDiskOffering = _diskOfferingDao.findById(newServiceOffering.getDiskOfferingId());
|
||||
changeDiskOfferingForRootVolume(vmId, newDiskOffering, customParameters, vmInstance.getDataCenterId());
|
||||
// resize and migrate the root volume if required
|
||||
DiskOfferingVO newDiskOffering = _diskOfferingDao.findById(newServiceOffering.getDiskOfferingId());
|
||||
changeDiskOfferingForRootVolume(vmId, newDiskOffering, customParameters, vmInstance.getDataCenterId());
|
||||
|
||||
_itMgr.upgradeVmDb(vmId, newServiceOffering, currentServiceOffering);
|
||||
_itMgr.upgradeVmDb(vmId, newServiceOffering, currentServiceOffering);
|
||||
|
||||
// Increment or decrement CPU and Memory count accordingly.
|
||||
if (!VirtualMachineManager.ResourceCountRunningVMsonly.value()) {
|
||||
_resourceLimitMgr.updateVmResourceCountForServiceOfferingChange(owner.getAccountId(), vmInstance.isDisplay(), (long) currentCpu, (long) newCpu,
|
||||
(long) currentMemory, (long) newMemory, currentServiceOffering, newServiceOffering, template);
|
||||
}
|
||||
// Increment or decrement CPU and Memory count accordingly.
|
||||
if (!VirtualMachineManager.ResourceCountRunningVMsonly.value()) {
|
||||
_resourceLimitMgr.updateVmResourceCountForServiceOfferingChange(owner.getAccountId(), vmInstance.isDisplay(), (long) currentCpu, (long) newCpu,
|
||||
(long) currentMemory, (long) newMemory, currentServiceOffering, newServiceOffering, template);
|
||||
}
|
||||
|
||||
return _vmDao.findById(vmInstance.getId());
|
||||
return _vmDao.findById(vmInstance.getId());
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
@ -2338,34 +2338,34 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
// First check that the maximum number of UserVMs, CPU and Memory limit for the given
|
||||
// accountId will not be exceeded
|
||||
if (!VirtualMachineManager.ResourceCountRunningVMsonly.value()) {
|
||||
resourceLimitService.checkVmResourceLimit(account, vm.isDisplayVm(), serviceOffering, template, reservations);
|
||||
}
|
||||
// First check that the maximum number of UserVMs, CPU and Memory limit for the given
|
||||
// accountId will not be exceeded
|
||||
if (!VirtualMachineManager.ResourceCountRunningVMsonly.value()) {
|
||||
resourceLimitService.checkVmResourceLimit(account, vm.isDisplayVm(), serviceOffering, template, reservations);
|
||||
}
|
||||
|
||||
_haMgr.cancelDestroy(vm, vm.getHostId());
|
||||
_haMgr.cancelDestroy(vm, vm.getHostId());
|
||||
|
||||
try {
|
||||
if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.RecoveryRequested, null)) {
|
||||
logger.debug("Unable to recover the vm {} because it is not in the correct state. current state: {}", vm, vm.getState());
|
||||
try {
|
||||
if (!_itMgr.stateTransitTo(vm, VirtualMachine.Event.RecoveryRequested, null)) {
|
||||
logger.debug("Unable to recover the vm {} because it is not in the correct state. current state: {}", vm, vm.getState());
|
||||
throw new InvalidParameterValueException(String.format("Unable to recover the vm %s because it is not in the correct state. current state: %s", vm, vm.getState()));
|
||||
}
|
||||
} catch (NoTransitionException e) {
|
||||
throw new InvalidParameterValueException(String.format("Unable to recover the vm %s because it is not in the correct state. current state: %s", vm, vm.getState()));
|
||||
}
|
||||
} catch (NoTransitionException e) {
|
||||
throw new InvalidParameterValueException(String.format("Unable to recover the vm %s because it is not in the correct state. current state: %s", vm, vm.getState()));
|
||||
}
|
||||
|
||||
// Recover the VM's disks
|
||||
List<VolumeVO> volumes = _volsDao.findByInstance(vmId);
|
||||
for (VolumeVO volume : volumes) {
|
||||
if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
|
||||
recoverRootVolume(volume, vmId);
|
||||
break;
|
||||
// Recover the VM's disks
|
||||
List<VolumeVO> volumes = _volsDao.findByInstance(vmId);
|
||||
for (VolumeVO volume : volumes) {
|
||||
if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
|
||||
recoverRootVolume(volume, vmId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Update Resource Count for the given account
|
||||
resourceCountIncrement(account.getId(), vm.isDisplayVm(), serviceOffering, template);
|
||||
//Update Resource Count for the given account
|
||||
resourceCountIncrement(account.getId(), vm.isDisplayVm(), serviceOffering, template);
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
|
|||
|
|
@ -211,20 +211,20 @@ public class VolumeImportUnmanageManagerImpl implements VolumeImportUnmanageServ
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
// 6. check resource limitation
|
||||
checkResourceLimitForImportVolume(owner, volume, diskOffering, reservations);
|
||||
// 6. check resource limitation
|
||||
checkResourceLimitForImportVolume(owner, volume, diskOffering, reservations);
|
||||
|
||||
// 7. create records
|
||||
String volumeName = StringUtils.isNotBlank(cmd.getName()) ? cmd.getName().trim() : volumePath;
|
||||
VolumeVO volumeVO = importVolumeInternal(volume, diskOffering, owner, pool, volumeName);
|
||||
// 7. create records
|
||||
String volumeName = StringUtils.isNotBlank(cmd.getName()) ? cmd.getName().trim() : volumePath;
|
||||
VolumeVO volumeVO = importVolumeInternal(volume, diskOffering, owner, pool, volumeName);
|
||||
|
||||
// 8. Update resource count
|
||||
updateResourceLimitForVolumeImport(volumeVO);
|
||||
// 8. Update resource count
|
||||
updateResourceLimitForVolumeImport(volumeVO);
|
||||
|
||||
// 9. Publish event
|
||||
publicUsageEventForVolumeImportAndUnmanage(volumeVO, true);
|
||||
// 9. Publish event
|
||||
publicUsageEventForVolumeImportAndUnmanage(volumeVO, true);
|
||||
|
||||
return responseGenerator.createVolumeResponse(ResponseObject.ResponseView.Full, volumeVO);
|
||||
return responseGenerator.createVolumeResponse(ResponseObject.ResponseView.Full, volumeVO);
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
|
|||
|
|
@ -2466,91 +2466,91 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
|
||||
List<Reserver> reservations = new ArrayList<>();
|
||||
try {
|
||||
checkVolumeResourceLimitsForExternalKvmVmImport(owner, rootDisk, dataDisks, diskOffering, dataDiskOfferingMap, reservations);
|
||||
checkVolumeResourceLimitsForExternalKvmVmImport(owner, rootDisk, dataDisks, diskOffering, dataDiskOfferingMap, reservations);
|
||||
|
||||
// Check NICs and supplied networks
|
||||
Map<String, Network.IpAddresses> nicIpAddressMap = getNicIpAddresses(unmanagedInstance.getNics(), callerNicIpAddressMap);
|
||||
Map<String, Long> allNicNetworkMap = getUnmanagedNicNetworkMap(unmanagedInstance.getName(), unmanagedInstance.getNics(), nicNetworkMap, nicIpAddressMap, zone, hostName, owner, Hypervisor.HypervisorType.KVM);
|
||||
if (!CollectionUtils.isEmpty(unmanagedInstance.getNics())) {
|
||||
allDetails.put(VmDetailConstants.NIC_ADAPTER, unmanagedInstance.getNics().get(0).getAdapterType());
|
||||
}
|
||||
VirtualMachine.PowerState powerState = VirtualMachine.PowerState.PowerOff;
|
||||
// Check NICs and supplied networks
|
||||
Map<String, Network.IpAddresses> nicIpAddressMap = getNicIpAddresses(unmanagedInstance.getNics(), callerNicIpAddressMap);
|
||||
Map<String, Long> allNicNetworkMap = getUnmanagedNicNetworkMap(unmanagedInstance.getName(), unmanagedInstance.getNics(), nicNetworkMap, nicIpAddressMap, zone, hostName, owner, Hypervisor.HypervisorType.KVM);
|
||||
if (!CollectionUtils.isEmpty(unmanagedInstance.getNics())) {
|
||||
allDetails.put(VmDetailConstants.NIC_ADAPTER, unmanagedInstance.getNics().get(0).getAdapterType());
|
||||
}
|
||||
VirtualMachine.PowerState powerState = VirtualMachine.PowerState.PowerOff;
|
||||
|
||||
try {
|
||||
userVm = userVmManager.importVM(zone, null, template, null, displayName, owner,
|
||||
null, caller, true, null, owner.getAccountId(), userId,
|
||||
serviceOffering, null, hostName,
|
||||
Hypervisor.HypervisorType.KVM, allDetails, powerState, null);
|
||||
} catch (InsufficientCapacityException ice) {
|
||||
logger.error(String.format("Failed to import vm name: %s", instanceName), ice);
|
||||
throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ice.getMessage());
|
||||
}
|
||||
if (userVm == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import vm name: %s", instanceName));
|
||||
}
|
||||
String rootVolumeName = String.format("ROOT-%s", userVm.getId());
|
||||
DiskProfile diskProfile = volumeManager.allocateRawVolume(Volume.Type.ROOT, rootVolumeName, diskOffering, null, null, null, userVm, template, owner, null, false);
|
||||
try {
|
||||
userVm = userVmManager.importVM(zone, null, template, null, displayName, owner,
|
||||
null, caller, true, null, owner.getAccountId(), userId,
|
||||
serviceOffering, null, hostName,
|
||||
Hypervisor.HypervisorType.KVM, allDetails, powerState, null);
|
||||
} catch (InsufficientCapacityException ice) {
|
||||
logger.error(String.format("Failed to import vm name: %s", instanceName), ice);
|
||||
throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ice.getMessage());
|
||||
}
|
||||
if (userVm == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import vm name: %s", instanceName));
|
||||
}
|
||||
String rootVolumeName = String.format("ROOT-%s", userVm.getId());
|
||||
DiskProfile diskProfile = volumeManager.allocateRawVolume(Volume.Type.ROOT, rootVolumeName, diskOffering, null, null, null, userVm, template, owner, null, false);
|
||||
|
||||
DiskProfile[] dataDiskProfiles = new DiskProfile[dataDisks.size()];
|
||||
int diskSeq = 0;
|
||||
for (UnmanagedInstanceTO.Disk disk : dataDisks) {
|
||||
DiskOffering offering = diskOfferingDao.findById(dataDiskOfferingMap.get(disk.getDiskId()));
|
||||
DiskProfile dataDiskProfile = volumeManager.allocateRawVolume(Volume.Type.DATADISK, String.format("DATA-%d-%s", userVm.getId(), disk.getDiskId()), offering, null, null, null, userVm, template, owner, null, false);
|
||||
dataDiskProfiles[diskSeq++] = dataDiskProfile;
|
||||
}
|
||||
|
||||
final VirtualMachineProfile profile = new VirtualMachineProfileImpl(userVm, template, serviceOffering, owner, null);
|
||||
ServiceOfferingVO dummyOffering = serviceOfferingDao.findById(userVm.getId(), serviceOffering.getId());
|
||||
profile.setServiceOffering(dummyOffering);
|
||||
DeploymentPlanner.ExcludeList excludeList = new DeploymentPlanner.ExcludeList();
|
||||
final DataCenterDeployment plan = new DataCenterDeployment(zone.getId(), null, null, null, null, null);
|
||||
DeployDestination dest = null;
|
||||
try {
|
||||
dest = deploymentPlanningManager.planDeployment(profile, plan, excludeList, null);
|
||||
} catch (Exception e) {
|
||||
logger.warn("Import failed for Vm: {} while finding deployment destination", userVm, e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s while finding deployment destination", userVm.getInstanceName()));
|
||||
}
|
||||
if(dest == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s. Suitable deployment destination not found", userVm.getInstanceName()));
|
||||
}
|
||||
|
||||
List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
|
||||
try {
|
||||
diskProfileStoragePoolList.add(importExternalDisk(rootDisk, userVm, dest, diskOffering, Volume.Type.ROOT,
|
||||
template, null, remoteUrl, username, password, tmpPath, diskProfile));
|
||||
|
||||
long deviceId = 1L;
|
||||
diskSeq = 0;
|
||||
DiskProfile[] dataDiskProfiles = new DiskProfile[dataDisks.size()];
|
||||
int diskSeq = 0;
|
||||
for (UnmanagedInstanceTO.Disk disk : dataDisks) {
|
||||
DiskProfile dataDiskProfile = dataDiskProfiles[diskSeq++];
|
||||
DiskOffering offering = diskOfferingDao.findById(dataDiskOfferingMap.get(disk.getDiskId()));
|
||||
DiskProfile dataDiskProfile = volumeManager.allocateRawVolume(Volume.Type.DATADISK, String.format("DATA-%d-%s", userVm.getId(), disk.getDiskId()), offering, null, null, null, userVm, template, owner, null, false);
|
||||
dataDiskProfiles[diskSeq++] = dataDiskProfile;
|
||||
}
|
||||
|
||||
diskProfileStoragePoolList.add(importExternalDisk(disk, userVm, dest, offering, Volume.Type.DATADISK,
|
||||
template, deviceId, remoteUrl, username, password, tmpPath, dataDiskProfile));
|
||||
deviceId++;
|
||||
final VirtualMachineProfile profile = new VirtualMachineProfileImpl(userVm, template, serviceOffering, owner, null);
|
||||
ServiceOfferingVO dummyOffering = serviceOfferingDao.findById(userVm.getId(), serviceOffering.getId());
|
||||
profile.setServiceOffering(dummyOffering);
|
||||
DeploymentPlanner.ExcludeList excludeList = new DeploymentPlanner.ExcludeList();
|
||||
final DataCenterDeployment plan = new DataCenterDeployment(zone.getId(), null, null, null, null, null);
|
||||
DeployDestination dest = null;
|
||||
try {
|
||||
dest = deploymentPlanningManager.planDeployment(profile, plan, excludeList, null);
|
||||
} catch (Exception e) {
|
||||
logger.warn("Import failed for Vm: {} while finding deployment destination", userVm, e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s while finding deployment destination", userVm.getInstanceName()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(String.format("Failed to import volumes while importing vm: %s", instanceName), e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import volumes while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
|
||||
}
|
||||
try {
|
||||
int nicIndex = 0;
|
||||
for (UnmanagedInstanceTO.Nic nic : unmanagedInstance.getNics()) {
|
||||
Network network = networkDao.findById(allNicNetworkMap.get(nic.getNicId()));
|
||||
Network.IpAddresses ipAddresses = nicIpAddressMap.get(nic.getNicId());
|
||||
importNic(nic, userVm, network, ipAddresses, nicIndex, nicIndex==0, true);
|
||||
nicIndex++;
|
||||
if(dest == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s. Suitable deployment destination not found", userVm.getInstanceName()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(String.format("Failed to import NICs while importing vm: %s", instanceName), e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import NICs while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
|
||||
}
|
||||
publishVMUsageUpdateResourceCount(userVm, dummyOffering, template);
|
||||
return userVm;
|
||||
|
||||
List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
|
||||
try {
|
||||
diskProfileStoragePoolList.add(importExternalDisk(rootDisk, userVm, dest, diskOffering, Volume.Type.ROOT,
|
||||
template, null, remoteUrl, username, password, tmpPath, diskProfile));
|
||||
|
||||
long deviceId = 1L;
|
||||
diskSeq = 0;
|
||||
for (UnmanagedInstanceTO.Disk disk : dataDisks) {
|
||||
DiskProfile dataDiskProfile = dataDiskProfiles[diskSeq++];
|
||||
DiskOffering offering = diskOfferingDao.findById(dataDiskOfferingMap.get(disk.getDiskId()));
|
||||
|
||||
diskProfileStoragePoolList.add(importExternalDisk(disk, userVm, dest, offering, Volume.Type.DATADISK,
|
||||
template, deviceId, remoteUrl, username, password, tmpPath, dataDiskProfile));
|
||||
deviceId++;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(String.format("Failed to import volumes while importing vm: %s", instanceName), e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import volumes while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
|
||||
}
|
||||
try {
|
||||
int nicIndex = 0;
|
||||
for (UnmanagedInstanceTO.Nic nic : unmanagedInstance.getNics()) {
|
||||
Network network = networkDao.findById(allNicNetworkMap.get(nic.getNicId()));
|
||||
Network.IpAddresses ipAddresses = nicIpAddressMap.get(nic.getNicId());
|
||||
importNic(nic, userVm, network, ipAddresses, nicIndex, nicIndex==0, true);
|
||||
nicIndex++;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(String.format("Failed to import NICs while importing vm: %s", instanceName), e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import NICs while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
|
||||
}
|
||||
publishVMUsageUpdateResourceCount(userVm, dummyOffering, template);
|
||||
return userVm;
|
||||
|
||||
} finally {
|
||||
ReservationHelper.closeAll(reservations);
|
||||
|
|
@ -2648,77 +2648,77 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
|
|||
List<Reserver> reservations = new ArrayList<>();
|
||||
List<String> resourceLimitStorageTags = resourceLimitService.getResourceLimitStorageTagsForResourceCountOperation(true, diskOffering);
|
||||
try {
|
||||
CheckedReservation volumeReservation = new CheckedReservation(owner, Resource.ResourceType.volume, resourceLimitStorageTags,
|
||||
CheckedReservation volumeReservation = new CheckedReservation(owner, Resource.ResourceType.volume, resourceLimitStorageTags,
|
||||
CollectionUtils.isNotEmpty(resourceLimitStorageTags) ? 1L : 0L, reservationDao, resourceLimitService);
|
||||
reservations.add(volumeReservation);
|
||||
reservations.add(volumeReservation);
|
||||
|
||||
String rootVolumeName = String.format("ROOT-%s", userVm.getId());
|
||||
DiskProfile diskProfile = volumeManager.allocateRawVolume(Volume.Type.ROOT, rootVolumeName, diskOffering, null, null, null, userVm, template, owner, null, false);
|
||||
String rootVolumeName = String.format("ROOT-%s", userVm.getId());
|
||||
DiskProfile diskProfile = volumeManager.allocateRawVolume(Volume.Type.ROOT, rootVolumeName, diskOffering, null, null, null, userVm, template, owner, null, false);
|
||||
|
||||
final VirtualMachineProfile profile = new VirtualMachineProfileImpl(userVm, template, serviceOffering, owner, null);
|
||||
ServiceOfferingVO dummyOffering = serviceOfferingDao.findById(userVm.getId(), serviceOffering.getId());
|
||||
profile.setServiceOffering(dummyOffering);
|
||||
DeploymentPlanner.ExcludeList excludeList = new DeploymentPlanner.ExcludeList();
|
||||
final DataCenterDeployment plan = new DataCenterDeployment(zone.getId(), null, null, hostId, poolId, null);
|
||||
DeployDestination dest = null;
|
||||
try {
|
||||
dest = deploymentPlanningManager.planDeployment(profile, plan, excludeList, null);
|
||||
} catch (Exception e) {
|
||||
logger.warn("Import failed for Vm: {} while finding deployment destination", userVm, e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s while finding deployment destination", userVm.getInstanceName()));
|
||||
}
|
||||
if(dest == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s. Suitable deployment destination not found", userVm.getInstanceName()));
|
||||
}
|
||||
|
||||
Map<Volume, StoragePool> storage = dest.getStorageForDisks();
|
||||
Volume volume = volumeDao.findById(diskProfile.getVolumeId());
|
||||
StoragePool storagePool = storage.get(volume);
|
||||
CheckVolumeCommand checkVolumeCommand = new CheckVolumeCommand();
|
||||
checkVolumeCommand.setSrcFile(diskPath);
|
||||
StorageFilerTO storageTO = new StorageFilerTO(storagePool);
|
||||
checkVolumeCommand.setStorageFilerTO(storageTO);
|
||||
Answer answer = agentManager.easySend(dest.getHost().getId(), checkVolumeCommand);
|
||||
if (!(answer instanceof CheckVolumeAnswer)) {
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new CloudRuntimeException("Disk not found or is invalid");
|
||||
}
|
||||
CheckVolumeAnswer checkVolumeAnswer = (CheckVolumeAnswer) answer;
|
||||
try {
|
||||
checkVolume(checkVolumeAnswer.getVolumeDetails());
|
||||
} catch (CloudRuntimeException e) {
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw e;
|
||||
}
|
||||
if (!checkVolumeAnswer.getResult()) {
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new CloudRuntimeException("Disk not found or is invalid");
|
||||
}
|
||||
diskProfile.setSize(checkVolumeAnswer.getSize());
|
||||
|
||||
CheckedReservation primaryStorageReservation = new CheckedReservation(owner, Resource.ResourceType.primary_storage, resourceLimitStorageTags,
|
||||
CollectionUtils.isNotEmpty(resourceLimitStorageTags) ? diskProfile.getSize() : 0L, reservationDao, resourceLimitService);
|
||||
reservations.add(primaryStorageReservation);
|
||||
|
||||
List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
|
||||
try {
|
||||
long deviceId = 1L;
|
||||
if(ImportSource.SHARED == importSource) {
|
||||
diskProfileStoragePoolList.add(importKVMSharedDisk(userVm, diskOffering, Volume.Type.ROOT,
|
||||
template, deviceId, poolId, diskPath, diskProfile));
|
||||
} else if(ImportSource.LOCAL == importSource) {
|
||||
diskProfileStoragePoolList.add(importKVMLocalDisk(userVm, diskOffering, Volume.Type.ROOT,
|
||||
template, deviceId, hostId, diskPath, diskProfile));
|
||||
final VirtualMachineProfile profile = new VirtualMachineProfileImpl(userVm, template, serviceOffering, owner, null);
|
||||
ServiceOfferingVO dummyOffering = serviceOfferingDao.findById(userVm.getId(), serviceOffering.getId());
|
||||
profile.setServiceOffering(dummyOffering);
|
||||
DeploymentPlanner.ExcludeList excludeList = new DeploymentPlanner.ExcludeList();
|
||||
final DataCenterDeployment plan = new DataCenterDeployment(zone.getId(), null, null, hostId, poolId, null);
|
||||
DeployDestination dest = null;
|
||||
try {
|
||||
dest = deploymentPlanningManager.planDeployment(profile, plan, excludeList, null);
|
||||
} catch (Exception e) {
|
||||
logger.warn("Import failed for Vm: {} while finding deployment destination", userVm, e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s while finding deployment destination", userVm.getInstanceName()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(String.format("Failed to import volumes while importing vm: %s", instanceName), e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import volumes while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
|
||||
}
|
||||
networkOrchestrationService.importNic(macAddress, 0, network, true, userVm, requestedIpPair, zone, true);
|
||||
publishVMUsageUpdateResourceCount(userVm, dummyOffering, template);
|
||||
return userVm;
|
||||
if(dest == null) {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Import failed for Vm: %s. Suitable deployment destination not found", userVm.getInstanceName()));
|
||||
}
|
||||
|
||||
Map<Volume, StoragePool> storage = dest.getStorageForDisks();
|
||||
Volume volume = volumeDao.findById(diskProfile.getVolumeId());
|
||||
StoragePool storagePool = storage.get(volume);
|
||||
CheckVolumeCommand checkVolumeCommand = new CheckVolumeCommand();
|
||||
checkVolumeCommand.setSrcFile(diskPath);
|
||||
StorageFilerTO storageTO = new StorageFilerTO(storagePool);
|
||||
checkVolumeCommand.setStorageFilerTO(storageTO);
|
||||
Answer answer = agentManager.easySend(dest.getHost().getId(), checkVolumeCommand);
|
||||
if (!(answer instanceof CheckVolumeAnswer)) {
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new CloudRuntimeException("Disk not found or is invalid");
|
||||
}
|
||||
CheckVolumeAnswer checkVolumeAnswer = (CheckVolumeAnswer) answer;
|
||||
try {
|
||||
checkVolume(checkVolumeAnswer.getVolumeDetails());
|
||||
} catch (CloudRuntimeException e) {
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw e;
|
||||
}
|
||||
if (!checkVolumeAnswer.getResult()) {
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new CloudRuntimeException("Disk not found or is invalid");
|
||||
}
|
||||
diskProfile.setSize(checkVolumeAnswer.getSize());
|
||||
|
||||
CheckedReservation primaryStorageReservation = new CheckedReservation(owner, Resource.ResourceType.primary_storage, resourceLimitStorageTags,
|
||||
CollectionUtils.isNotEmpty(resourceLimitStorageTags) ? diskProfile.getSize() : 0L, reservationDao, resourceLimitService);
|
||||
reservations.add(primaryStorageReservation);
|
||||
|
||||
List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
|
||||
try {
|
||||
long deviceId = 1L;
|
||||
if(ImportSource.SHARED == importSource) {
|
||||
diskProfileStoragePoolList.add(importKVMSharedDisk(userVm, diskOffering, Volume.Type.ROOT,
|
||||
template, deviceId, poolId, diskPath, diskProfile));
|
||||
} else if(ImportSource.LOCAL == importSource) {
|
||||
diskProfileStoragePoolList.add(importKVMLocalDisk(userVm, diskOffering, Volume.Type.ROOT,
|
||||
template, deviceId, hostId, diskPath, diskProfile));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(String.format("Failed to import volumes while importing vm: %s", instanceName), e);
|
||||
cleanupFailedImportVM(userVm);
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import volumes while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
|
||||
}
|
||||
networkOrchestrationService.importNic(macAddress, 0, network, true, userVm, requestedIpPair, zone, true);
|
||||
publishVMUsageUpdateResourceCount(userVm, dummyOffering, template);
|
||||
return userVm;
|
||||
|
||||
} catch (ResourceAllocationException e) {
|
||||
cleanupFailedImportVM(userVm);
|
||||
|
|
|
|||
Loading…
Reference in New Issue