mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Added new paramerer "start" to createVPC command. When false is passed in, VPC won't be started (its VPC VR won't get implemented) till the point when the first netwotrk gets implemented in the VPC.
The parameter is optional and true by default to preserve the original behavior Conflicts: api/src/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
This commit is contained in:
parent
4517b9277b
commit
fad0cfcc18
@ -410,7 +410,8 @@ public class ApiConstants {
|
|||||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_ID = "vsmdeviceid";
|
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_ID = "vsmdeviceid";
|
||||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_NAME = "vsmdevicename";
|
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_NAME = "vsmdevicename";
|
||||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_STATE = "vsmdevicestate";
|
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_STATE = "vsmdevicestate";
|
||||||
// Would we need to have a capacity field for Cisco N1KV VSM? Max hosts managed by it perhaps? May remove this later.
|
// Would we need to have a capacity field for Cisco N1KV VSM? Max hosts managed by it perhaps? May remove this
|
||||||
|
// later.
|
||||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_CAPACITY = "vsmdevicecapacity";
|
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_CAPACITY = "vsmdevicecapacity";
|
||||||
public static final String CISCO_NEXUS_VSM_NAME = "vsmname";
|
public static final String CISCO_NEXUS_VSM_NAME = "vsmname";
|
||||||
public static final String VSM_USERNAME = "vsmusername";
|
public static final String VSM_USERNAME = "vsmusername";
|
||||||
@ -534,6 +535,7 @@ public class ApiConstants {
|
|||||||
public static final String FOR_DISPLAY = "fordisplay";
|
public static final String FOR_DISPLAY = "fordisplay";
|
||||||
public static final String PASSIVE = "passive";
|
public static final String PASSIVE = "passive";
|
||||||
public static final String VERSION = "version";
|
public static final String VERSION = "version";
|
||||||
|
public static final String START = "start";
|
||||||
|
|
||||||
public enum HostDetails {
|
public enum HostDetails {
|
||||||
all, capacity, events, stats, min;
|
all, capacity, events, stats, min;
|
||||||
|
|||||||
@ -16,8 +16,6 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.user.vpc;
|
package org.apache.cloudstack.api.command.user.vpc;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -30,6 +28,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse;
|
|||||||
import org.apache.cloudstack.api.response.VpcResponse;
|
import org.apache.cloudstack.api.response.VpcResponse;
|
||||||
import org.apache.cloudstack.api.response.ZoneResponse;
|
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||||
import org.apache.cloudstack.context.CallContext;
|
import org.apache.cloudstack.context.CallContext;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
import com.cloud.exception.ConcurrentOperationException;
|
||||||
@ -43,47 +42,54 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||||||
public static final Logger s_logger = Logger.getLogger(CreateVPCCmd.class.getName());
|
public static final Logger s_logger = Logger.getLogger(CreateVPCCmd.class.getName());
|
||||||
private static final String s_name = "createvpcresponse";
|
private static final String s_name = "createvpcresponse";
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////
|
||||||
//////////////// API parameters /////////////////////
|
// ////////////// API parameters /////////////////////
|
||||||
/////////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "the account associated with the VPC. "
|
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "the account associated with the VPC. " +
|
||||||
+ "Must be used with the domainId parameter.")
|
"Must be used with the domainId parameter.")
|
||||||
private String accountName;
|
private String accountName;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "the domain ID associated with the VPC. "
|
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class,
|
||||||
+ "If used with the account parameter returns the VPC associated with the account for the specified domain.")
|
description = "the domain ID associated with the VPC. " +
|
||||||
|
"If used with the account parameter returns the VPC associated with the account for the specified domain.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "create VPC for the project")
|
@Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class,
|
||||||
|
description = "create VPC for the project")
|
||||||
private Long projectId;
|
private Long projectId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of the availability zone")
|
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class,
|
||||||
|
required = true, description = "the ID of the availability zone")
|
||||||
private Long zoneId;
|
private Long zoneId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "the name of the VPC")
|
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "the name of the VPC")
|
||||||
private String vpcName;
|
private String vpcName;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, required = true, description = "the display text of " + "the VPC")
|
@Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, required = true, description = "the display text of " +
|
||||||
|
"the VPC")
|
||||||
private String displayText;
|
private String displayText;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.CIDR, type = CommandType.STRING, required = true, description = "the cidr of the VPC. All VPC "
|
@Parameter(name = ApiConstants.CIDR, type = CommandType.STRING, required = true, description = "the cidr of the VPC. All VPC " +
|
||||||
+ "guest networks' cidrs should be within this CIDR")
|
"guest networks' cidrs should be within this CIDR")
|
||||||
private String cidr;
|
private String cidr;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.VPC_OFF_ID,
|
@Parameter(name = ApiConstants.VPC_OFF_ID, type = CommandType.UUID, entityType = VpcOfferingResponse.class,
|
||||||
type = CommandType.UUID,
|
required = true, description = "the ID of the VPC offering")
|
||||||
entityType = VpcOfferingResponse.class,
|
|
||||||
required = true,
|
|
||||||
description = "the ID of the VPC offering")
|
|
||||||
private Long vpcOffering;
|
private Long vpcOffering;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING, description = "VPC network domain. All networks inside the VPC will belong to this domain")
|
@Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING,
|
||||||
|
description = "VPC network domain. All networks inside the VPC will belong to this domain")
|
||||||
private String networkDomain;
|
private String networkDomain;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
@Parameter(name = ApiConstants.START, type = CommandType.BOOLEAN,
|
||||||
/////////////////// Accessors ///////////////////////
|
description = "If set to false, the VPC won't start (VPC VR will not get allocated) until its first network gets implemented. " +
|
||||||
/////////////////////////////////////////////////////
|
"True by default.", since = "4.3")
|
||||||
|
private Boolean start;
|
||||||
|
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
// ///////////////// Accessors ///////////////////////
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
public String getAccountName() {
|
public String getAccountName() {
|
||||||
return accountName;
|
return accountName;
|
||||||
@ -117,6 +123,13 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||||||
return networkDomain;
|
return networkDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isStart() {
|
||||||
|
if (start != null) {
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create() throws ResourceAllocationException {
|
public void create() throws ResourceAllocationException {
|
||||||
Vpc vpc = _vpcService.createVpc(getZoneId(), getVpcOffering(), getEntityOwnerId(), getVpcName(), getDisplayText(), getCidr(), getNetworkDomain());
|
Vpc vpc = _vpcService.createVpc(getZoneId(), getVpcOffering(), getEntityOwnerId(), getVpcName(), getDisplayText(), getCidr(), getNetworkDomain());
|
||||||
@ -131,10 +144,14 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
Vpc vpc = null;
|
Vpc vpc = null;
|
||||||
|
boolean success = true;
|
||||||
try {
|
try {
|
||||||
if (_vpcService.startVpc(getEntityId(), true)) {
|
if (isStart()) {
|
||||||
vpc = _entityMgr.findById(Vpc.class, getEntityId());
|
success = _vpcService.startVpc(getEntityId(), true);
|
||||||
|
} else {
|
||||||
|
s_logger.debug("Not starting VPC as " + ApiConstants.START + "=false was passed to the API");
|
||||||
}
|
}
|
||||||
|
vpc = _entityMgr.findById(Vpc.class, getEntityId());
|
||||||
} catch (ResourceUnavailableException ex) {
|
} catch (ResourceUnavailableException ex) {
|
||||||
s_logger.warn("Exception: ", ex);
|
s_logger.warn("Exception: ", ex);
|
||||||
throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
|
throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
|
||||||
@ -147,7 +164,7 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||||||
throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ex.getMessage());
|
throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ex.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vpc != null) {
|
if (vpc != null && success) {
|
||||||
VpcResponse response = _responseGenerator.createVpcResponse(vpc);
|
VpcResponse response = _responseGenerator.createVpcResponse(vpc);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
setResponseObject(response);
|
setResponseObject(response);
|
||||||
|
|||||||
@ -47,6 +47,7 @@ import org.apache.cloudstack.framework.config.Configurable;
|
|||||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||||
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
|
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
|
||||||
import org.apache.cloudstack.region.PortableIpDao;
|
import org.apache.cloudstack.region.PortableIpDao;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.Listener;
|
import com.cloud.agent.Listener;
|
||||||
@ -147,6 +148,7 @@ import com.cloud.network.rules.StaticNatRule;
|
|||||||
import com.cloud.network.rules.StaticNatRuleImpl;
|
import com.cloud.network.rules.StaticNatRuleImpl;
|
||||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
||||||
import com.cloud.network.vpc.NetworkACLManager;
|
import com.cloud.network.vpc.NetworkACLManager;
|
||||||
|
import com.cloud.network.vpc.Vpc;
|
||||||
import com.cloud.network.vpc.VpcManager;
|
import com.cloud.network.vpc.VpcManager;
|
||||||
import com.cloud.network.vpc.dao.PrivateIpDao;
|
import com.cloud.network.vpc.dao.PrivateIpDao;
|
||||||
import com.cloud.network.vpn.RemoteAccessVpnService;
|
import com.cloud.network.vpn.RemoteAccessVpnService;
|
||||||
@ -1031,22 +1033,22 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
|||||||
(network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) {
|
(network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) {
|
||||||
|
|
||||||
List<IPAddressVO> ips = null;
|
List<IPAddressVO> ips = null;
|
||||||
|
Account owner = _entityMgr.findById(Account.class, network.getAccountId());
|
||||||
if (network.getVpcId() != null) {
|
if (network.getVpcId() != null) {
|
||||||
ips = _ipAddressDao.listByAssociatedVpc(network.getVpcId(), true);
|
ips = _ipAddressDao.listByAssociatedVpc(network.getVpcId(), true);
|
||||||
if (ips.isEmpty()) {
|
if (ips.isEmpty()) {
|
||||||
throw new CloudRuntimeException("Vpc is not implemented; there is no source nat ip");
|
Vpc vpc = _vpcMgr.getActiveVpc(network.getVpcId());
|
||||||
|
s_logger.debug("Creating a source nat ip for vpc " + vpc);
|
||||||
|
_vpcMgr.assignSourceNatIpAddressToVpc(owner, vpc);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ips = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
|
ips = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
|
||||||
}
|
if (ips.isEmpty()) {
|
||||||
|
s_logger.debug("Creating a source nat ip for network " + network);
|
||||||
if (ips.isEmpty()) {
|
_ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network);
|
||||||
s_logger.debug("Creating a source nat ip for network " + network);
|
}
|
||||||
Account owner = _entityMgr.findById(Account.class, network.getAccountId());
|
|
||||||
_ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// get providers to implement
|
// get providers to implement
|
||||||
List<Provider> providersToImplement = getNetworkProviders(network.getId());
|
List<Provider> providersToImplement = getNetworkProviders(network.getId());
|
||||||
for (NetworkElement element : _networkElements) {
|
for (NetworkElement element : _networkElements) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user