diff --git a/api/src/com/cloud/api/BaseAsyncCreateCmd.java b/api/src/com/cloud/api/BaseAsyncCreateCmd.java index 4da990ba930..e605e3bdee3 100644 --- a/api/src/com/cloud/api/BaseAsyncCreateCmd.java +++ b/api/src/com/cloud/api/BaseAsyncCreateCmd.java @@ -8,11 +8,11 @@ public abstract class BaseAsyncCreateCmd extends BaseAsyncCmd { public abstract void callCreate(); - public Long getId() { + public Long getEntityId() { return id; } - public void setId(Long id) { + public void setEntityId(Long id) { this.id = id; } diff --git a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java index 75ceff90ac4..f5e85180f51 100644 --- a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java @@ -28,11 +28,15 @@ import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.FirewallRuleResponse; import com.cloud.event.EventTypes; +import com.cloud.exception.NetworkRuleConflictException; import com.cloud.network.rules.PortForwardingRule; import com.cloud.user.Account; +import com.cloud.user.UserContext; +import com.cloud.utils.net.Ip; +import com.cloud.utils.net.NetUtils; @Implementation(description="Creates an ip forwarding rule", responseObject=FirewallRuleResponse.class) -public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd { +public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd implements PortForwardingRule { public static final Logger s_logger = Logger.getLogger(CreateIpForwardingRuleCmd.class.getName()); private static final String s_name = "createipforwardingruleresponse"; @@ -72,9 +76,17 @@ public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd { @Override public void execute(){ - PortForwardingRule result = _rulesService.createIpForwardingRuleInDb(ipAddress, virtualMachineId); - if (result != null) { - FirewallRuleResponse fwResponse = _responseGenerator.createFirewallRuleResponse(result); + boolean result; + try { + result = _rulesService.applyPortForwardingRules(new Ip(ipAddress), UserContext.current().getAccount()); + } catch (Exception e) { + s_logger.error("Unable to apply port forwarding rules", e); + _rulesService.revokePortForwardingRule(getEntityId(), true); + result = false; + } + if (result) { + PortForwardingRule rule = _entityMgr.findById(PortForwardingRule.class, getEntityId()); + FirewallRuleResponse fwResponse = _responseGenerator.createFirewallRuleResponse(rule); fwResponse.setResponseName(getName()); this.setResponseObject(fwResponse); } else { @@ -84,13 +96,16 @@ public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd { } @Override - public void callCreate(){ - PortForwardingRule rule = _rulesService.createIpForwardingRuleInDb(ipAddress,virtualMachineId); - if (rule != null){ - this.setId(rule.getId()); - } else { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create ip forwarding rule"); + public void callCreate() { + PortForwardingRule rule; + try { + rule = _rulesService.createPortForwardingRule(this, virtualMachineId); + } catch (NetworkRuleConflictException e) { + s_logger.info("Unable to create Port Forwarding Rule due to " + e.getMessage()); + throw new ServerApiException(BaseCmd.NETWORK_RULE_CONFLICT_ERROR, e.getMessage()); } + + this.setEntityId(rule.getId()); } @Override @@ -108,4 +123,69 @@ public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd { return ("Creating an ipforwarding 1:1 NAT rule for "+ipAddress+" with virtual machine:"+virtualMachineId); } + @Override + public long getId() { + throw new UnsupportedOperationException("Don't call me"); + } + + @Override + public String getXid() { + return null; + } + + @Override + public Ip getSourceIpAddress() { + return new Ip(ipAddress); + } + + @Override + public int getSourcePortStart() { + return -1; + } + + @Override + public int getSourcePortEnd() { + return -1; + } + + @Override + public String getProtocol() { + return NetUtils.NAT_PROTO; + } + + @Override + public Purpose getPurpose() { + return Purpose.PortForwarding; + } + + @Override + public State getState() { + throw new UnsupportedOperationException("Don't call me"); + } + + @Override + public long getNetworkId() { + return -1; + } + + @Override + public long getDomainId() { + throw new UnsupportedOperationException("Don't call me"); + } + + @Override + public Ip getDestinationIpAddress() { + return null; + } + + @Override + public int getDestinationPortStart() { + return -1; + } + + @Override + public int getDestinationPortEnd() { + return -1; + } + } diff --git a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java index 1b812eb3730..bd8c6fba8ef 100644 --- a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java @@ -21,11 +21,13 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCreateCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.FirewallRuleResponse; +import com.cloud.event.EventTypes; import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.rules.PortForwardingRule; @@ -33,7 +35,7 @@ import com.cloud.user.UserContext; import com.cloud.utils.net.Ip; @Implementation(description="Creates a port forwarding rule", responseObject=FirewallRuleResponse.class) -public class CreatePortForwardingRuleCmd extends BaseCmd implements PortForwardingRule { +public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements PortForwardingRule { public static final Logger s_logger = Logger.getLogger(CreatePortForwardingRuleCmd.class.getName()); private static final String s_name = "createportforwardingruleresponse"; @@ -98,7 +100,7 @@ public class CreatePortForwardingRuleCmd extends BaseCmd implements PortForwardi try { UserContext callerContext = UserContext.current(); - PortForwardingRule result = _rulesService.createPortForwardingRule(this, virtualMachineId, callerContext.getAccount()); + PortForwardingRule result = _rulesService.createPortForwardingRule(this, virtualMachineId); if (result == null) { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "An existing rule for ipAddress / port / protocol of " + ipAddress + " / " + publicPort + " / " + protocol + " exits."); } @@ -183,4 +185,26 @@ public class CreatePortForwardingRuleCmd extends BaseCmd implements PortForwardi public int getDestinationPortEnd() { return Integer.parseInt(privatePort); } + + @Override + public void callCreate() { + try { + PortForwardingRule result = _rulesService.createPortForwardingRule(this, virtualMachineId); + setEntityId(result.getId()); + } catch (NetworkRuleConflictException ex) { + s_logger.info("Network rule conflict: " + ex.getMessage()); + throw new ServerApiException(BaseCmd.NETWORK_RULE_CONFLICT_ERROR, ex.getMessage()); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_NET_RULE_ADD; + } + + @Override + public String getEventDescription() { + return ("Creating an port forwarding rule for "+ipAddress+" with virtual machine:"+virtualMachineId); + } + } diff --git a/api/src/com/cloud/api/commands/CreateRemoteAccessVpnCmd.java b/api/src/com/cloud/api/commands/CreateRemoteAccessVpnCmd.java index ddc1944737f..0e8aa294853 100644 --- a/api/src/com/cloud/api/commands/CreateRemoteAccessVpnCmd.java +++ b/api/src/com/cloud/api/commands/CreateRemoteAccessVpnCmd.java @@ -138,7 +138,7 @@ public class CreateRemoteAccessVpnCmd extends BaseAsyncCreateCmd { try { RemoteAccessVpn vpn = _networkService.createRemoteAccessVpn(this); if (vpn != null) { - this.setId(vpn.getId()); + this.setEntityId(vpn.getId()); } else { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create remote access vpn"); } diff --git a/api/src/com/cloud/api/commands/CreateTemplateCmd.java b/api/src/com/cloud/api/commands/CreateTemplateCmd.java index f4d5ad76448..5bdac90fd08 100644 --- a/api/src/com/cloud/api/commands/CreateTemplateCmd.java +++ b/api/src/com/cloud/api/commands/CreateTemplateCmd.java @@ -171,7 +171,7 @@ public class CreateTemplateCmd extends BaseAsyncCreateCmd { public void callCreate(){ VirtualMachineTemplate template = _userVmService.createPrivateTemplateRecord(this); if (template != null){ - this.setId(template.getId()); + this.setEntityId(template.getId()); } else { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create a template"); } diff --git a/api/src/com/cloud/api/commands/CreateVolumeCmd.java b/api/src/com/cloud/api/commands/CreateVolumeCmd.java index fd921467060..585dbbbbd5d 100644 --- a/api/src/com/cloud/api/commands/CreateVolumeCmd.java +++ b/api/src/com/cloud/api/commands/CreateVolumeCmd.java @@ -148,7 +148,7 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd { try { Volume volume = _storageMgr.allocVolume(this); if (volume != null) { - this.setId(volume.getId()); + this.setEntityId(volume.getId()); } else { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create volume"); } diff --git a/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java index 2c62fc0a9f5..9d4cc3f897f 100644 --- a/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java @@ -28,6 +28,7 @@ import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; import com.cloud.event.EventTypes; +import com.cloud.network.rules.PortForwardingRule; import com.cloud.user.Account; @Implementation(description="Deletes an ip forwarding rule", responseObject=SuccessResponse.class) @@ -62,9 +63,8 @@ public class DeleteIpForwardingRuleCmd extends BaseAsyncCmd { @Override public void execute(){ - boolean result = false; - result = _rulesService.deleteIpForwardingRule(id); - if (result) { + PortForwardingRule rule = _rulesService.revokePortForwardingRule(id, true); + if (rule != null) { SuccessResponse response = new SuccessResponse(getName()); this.setResponseObject(response); } else { diff --git a/api/src/com/cloud/network/rules/FirewallRule.java b/api/src/com/cloud/network/rules/FirewallRule.java index 7e4e94f2338..71420ff9235 100644 --- a/api/src/com/cloud/network/rules/FirewallRule.java +++ b/api/src/com/cloud/network/rules/FirewallRule.java @@ -22,6 +22,7 @@ import com.cloud.utils.net.Ip; public interface FirewallRule extends ControlledEntity { enum Purpose { + Firewall, PortForwarding, LoadBalancing, Vpn, diff --git a/api/src/com/cloud/network/rules/RulesService.java b/api/src/com/cloud/network/rules/RulesService.java index a898649cac9..f9d48bf618e 100644 --- a/api/src/com/cloud/network/rules/RulesService.java +++ b/api/src/com/cloud/network/rules/RulesService.java @@ -27,20 +27,16 @@ import com.cloud.utils.net.Ip; public interface RulesService { List searchForIpForwardingRules(Ip ip, Long start, Long size); - PortForwardingRule createIpForwardingRuleInDb(String ipAddr, long virtualMachineId); - boolean deleteIpForwardingRule(Long id); - /** * Creates a port forwarding rule between two ip addresses or between * an ip address and a virtual machine. * @param rule rule to be created. * @param vmId vm to be linked to. If specified the destination ip address is ignored. - * @param caller caller * @return PortForwardingRule if created. * @throws NetworkRuleConflictException if conflicts in the network rules are detected. */ - PortForwardingRule createPortForwardingRule(PortForwardingRule rule, Long vmId, Account caller) throws NetworkRuleConflictException; + PortForwardingRule createPortForwardingRule(PortForwardingRule rule, Long vmId) throws NetworkRuleConflictException; /** * Revokes a port forwarding rule @@ -56,7 +52,5 @@ public interface RulesService { */ public List listPortForwardingRules(ListPortForwardingRulesCmd cmd); - boolean applyFirewallRules(Ip ip, Account caller) throws ResourceUnavailableException; - boolean applyNatRules(Ip ip) throws ResourceUnavailableException; boolean applyPortForwardingRules(Ip ip, Account caller) throws ResourceUnavailableException; } diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 4a307839a64..fad2f3405ef 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -373,7 +373,7 @@ public class ApiServer implements HttpRequestHandler { if (cmdObj instanceof BaseAsyncCreateCmd) { BaseAsyncCreateCmd createCmd = (BaseAsyncCreateCmd)cmdObj; _dispatcher.dispatchCreateCmd(createCmd, params); - objectId = createCmd.getId(); + objectId = createCmd.getEntityId(); params.put("id", objectId.toString()); } else { ApiDispatcher.setupParameters(cmdObj, params); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 96b36264d39..011e6c032d3 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1687,7 +1687,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Long userId = UserContext.current().getUserId(); Account account = getAccountForApiCommand(cmd.getAccountName(), cmd.getDomainId()); EventUtils.saveStartedEvent(userId, account.getId(), EventTypes.EVENT_REMOTE_ACCESS_VPN_CREATE, "Creating a Remote Access VPN for account: " + account.getAccountName() + " in zone " + cmd.getZoneId(), cmd.getStartEventId()); - RemoteAccessVpnVO vpnVO = _remoteAccessVpnDao.findById(cmd.getId()); + RemoteAccessVpnVO vpnVO = _remoteAccessVpnDao.findById(cmd.getEntityId()); String publicIp = vpnVO.getVpnServerAddress(); Long vpnId = vpnVO.getId(); Transaction txn = Transaction.currentTxn(); diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 28236ae3525..b1f72c8dfd0 100644 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -46,8 +46,11 @@ import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.UserContext; import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.Ip; import com.cloud.utils.net.NetUtils; @@ -66,7 +69,6 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { @Inject UserVmDao _vmDao; @Inject AccountManager _accountMgr; @Inject NetworkManager _networkMgr; - @Override public void detectRulesConflict(FirewallRule newRule, IpAddress ipAddress) throws NetworkRuleConflictException { @@ -113,6 +115,10 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return; } + if (userVm.getState() == com.cloud.vm.State.Destroyed || userVm.getState() == com.cloud.vm.State.Expunging) { + throw new InvalidParameterValueException("Invalid user vm: " + userVm.getId()); + } + _accountMgr.checkAccess(caller, userVm); // validate that IP address and userVM belong to the same account @@ -124,10 +130,14 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { if (ipAddress.getDataCenterId() != userVm.getDataCenterId()) { throw new InvalidParameterValueException("Unable to create ip forwarding rule, IP address " + ipAddress + " is not in the same availability zone as virtual machine " + userVm.toString()); } + } - @Override - public PortForwardingRule createPortForwardingRule(PortForwardingRule rule, Long vmId, Account caller) throws NetworkRuleConflictException { + @Override @DB + public PortForwardingRule createPortForwardingRule(PortForwardingRule rule, Long vmId) throws NetworkRuleConflictException { + UserContext ctx = UserContext.current(); + Account caller = ctx.getAccount(); + String ipAddr = rule.getSourceIpAddress().addr(); IPAddressVO ipAddress = _ipAddressDao.findById(ipAddr); @@ -171,7 +181,13 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { long domainId = network.getDomainId(); checkIpAndUserVm(ipAddress, vm, caller); + boolean isNat = NetUtils.NAT_PROTO.equals(rule.getProtocol()); + if (isNat && (ipAddress.isSourceNat() || ipAddress.isOneToOneNat())) { + throw new NetworkRuleConflictException("Can't do one to one NAT on ip address: " + ipAddress.getAddress()); + } + Transaction txn = Transaction.currentTxn(); + txn.start(); PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddress(), @@ -185,6 +201,12 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { accountId, domainId); newRule = _forwardingDao.persist(newRule); + + if (isNat) { + ipAddress.setOneToOneNat(true); + _ipAddressDao.update(ipAddress.getAddress(), ipAddress); + } + txn.commit(); boolean success = false; try { @@ -196,7 +218,13 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { success = true; return newRule; } catch (Exception e) { + txn.start(); _forwardingDao.remove(newRule.getId()); + if (isNat) { + ipAddress.setOneToOneNat(false); + _ipAddressDao.update(ipAddress.getAddress(), ipAddress); + } + txn.commit(); if (e instanceof NetworkRuleConflictException) { throw (NetworkRuleConflictException)e; } @@ -221,19 +249,43 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } } + protected Pair getUserVmGuestIpAddress(UserVm vm) { + Ip dstIp = null; + List nics = _networkMgr.getNics(vm); + for (Nic nic : nics) { + Network ntwk = _networkMgr.getNetwork(nic.getNetworkId()); + if (ntwk.getGuestType() == GuestIpType.Virtualized) { + dstIp = new Ip(nic.getIp4Address()); + return new Pair(ntwk, dstIp); + } + } + + throw new CloudRuntimeException("Unable to find ip address to map to in " + vm.getId()); + } + + @DB protected void revokeRule(FirewallRuleVO rule, Account caller) { _accountMgr.checkAccess(caller, rule); - + + Transaction txn = Transaction.currentTxn(); + txn.start(); if (rule.getState() == State.Staged) { if (s_logger.isDebugEnabled()) { s_logger.debug("Found a rule that is still in stage state so just removing it: " + rule); } _firewallDao.remove(rule.getId()); - return; } else if (rule.getState() == State.Add) { rule.setState(State.Revoke); _firewallDao.update(rule.getId(), rule); } + if (NetUtils.NAT_PROTO.equals(rule.protocol) && rule.getSourcePortStart() == -1) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Removing one to one nat so setting the ip back to one to one nat is false: " + rule.getSourceIpAddress()); + } + IPAddressVO ipAddress = _ipAddressDao.findById(rule.getSourceIpAddress().addr()); + ipAddress.setOneToOneNat(false); + _ipAddressDao.update(ipAddress.getAddress(), ipAddress); + } } @Override @@ -283,18 +335,6 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return rules; } - @Override - public PortForwardingRule createIpForwardingRuleInDb(String ipAddr, long virtualMachineId) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean deleteIpForwardingRule(Long id) { - // TODO Auto-generated method stub - return false; - } - @Override public boolean applyPortForwardingRules(Ip ip, boolean continueOnError) { try { @@ -335,25 +375,11 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return _forwardingDao.searchNatRules(ip, start, size); } - - @Override public boolean applyPortForwardingRules(Ip ip, Account caller) throws ResourceUnavailableException { return applyPortForwardingRules(ip, false, caller); } - @Override - public boolean applyNatRules(Ip ip) throws ResourceUnavailableException { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean applyFirewallRules(Ip ip, Account caller) throws ResourceUnavailableException { - // TODO Auto-generated method stub - return false; - } - @Override public boolean configure(String name, Map params) throws ConfigurationException { _name = name; @@ -675,9 +701,6 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { // return newFwRule; // } // -// @Override @DB -// public boolean deletePortForwardingRule(Long id, boolean sysContext) { -// } // @Override @DB // public PortForwardingRule createIpForwardingRuleOnDomr(long ruleId) { // Transaction txn = Transaction.currentTxn(); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 11b1c51c97b..058f3396ffe 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1094,7 +1094,7 @@ public class ManagementServerImpl implements ManagementServer { } DeployVm2Cmd cmd2 = new DeployVm2Cmd(); - cmd2.setId(vm.getId()); + cmd2.setEntityId(vm.getId()); vm = _userVmService.startVirtualMachine(cmd2); return vm; } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 5a840d2b551..831042001d8 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1831,7 +1831,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag @Override @DB public VolumeVO createVolume(CreateVolumeCmd cmd) { - VolumeVO volume = _volsDao.findById(cmd.getId()); + VolumeVO volume = _volsDao.findById(cmd.getEntityId()); // VolumeVO createdVolume = null; Long userId = UserContext.current().getUserId(); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 0fd87985904..d419919b62b 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2567,13 +2567,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM if (s_logger.isInfoEnabled()) { s_logger.info(msg); } - _templateDao.remove(command.getId()); // Mark it removed so that templates with the same name can be created subsequently. Bug 7366 + _templateDao.remove(command.getEntityId()); // Mark it removed so that templates with the same name can be created subsequently. Bug 7366 throw new CloudRuntimeException(msg); } SnapshotCommand cmd = null; VMTemplateVO privateTemplate = null; - long templateId = command.getId(); + long templateId = command.getEntityId(); long zoneId = volume.getDataCenterId(); String uniqueName = getRandomPrivateTemplateName(); @@ -3722,7 +3722,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM @Override public UserVm startVirtualMachine(DeployVm2Cmd cmd) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { - long vmId = cmd.getId(); + long vmId = cmd.getEntityId(); UserVmVO vm = _vmDao.findById(vmId); // Check that the password was passed in and is valid