diff --git a/api/src/com/cloud/agent/api/routing/SavePasswordCommand.java b/api/src/com/cloud/agent/api/routing/SavePasswordCommand.java index 4c45d9bfcd1..56d6d3720f7 100644 --- a/api/src/com/cloud/agent/api/routing/SavePasswordCommand.java +++ b/api/src/com/cloud/agent/api/routing/SavePasswordCommand.java @@ -23,11 +23,9 @@ public class SavePasswordCommand extends NetworkElementCommand { String password; String vmIpAddress; - String routerPrivateIpAddress; String vmName; - protected SavePasswordCommand() { - + protected SavePasswordCommand() { } @Override @@ -35,10 +33,9 @@ public class SavePasswordCommand extends NetworkElementCommand { return true; } - public SavePasswordCommand(String password, String vmIpAddress, String routerPrivateIpAddress, String vmName) { + public SavePasswordCommand(String password, String vmIpAddress, String vmName) { this.password = password; this.vmIpAddress = vmIpAddress; - this.routerPrivateIpAddress = routerPrivateIpAddress; this.vmName = vmName; } @@ -46,16 +43,14 @@ public class SavePasswordCommand extends NetworkElementCommand { return password; } - public String getRouterPrivateIpAddress() { - return routerPrivateIpAddress; - } - public String getVmIpAddress() { return vmIpAddress; } + + public String getVmName() { + return vmName; + } + - public String getVmName() { - return vmName; - } } diff --git a/api/src/com/cloud/api/commands/DeployVMCmd.java b/api/src/com/cloud/api/commands/DeployVMCmd.java index 6f4343f365f..1f204c30588 100644 --- a/api/src/com/cloud/api/commands/DeployVMCmd.java +++ b/api/src/com/cloud/api/commands/DeployVMCmd.java @@ -20,8 +20,6 @@ package com.cloud.api.commands; import java.util.List; -import javax.naming.InsufficientResourcesException; - import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; @@ -36,7 +34,6 @@ import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.exception.StorageUnavailableException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.user.Account; import com.cloud.user.UserContext; @@ -96,10 +93,6 @@ public class DeployVMCmd extends BaseAsyncCreateCmd { @Parameter(name="keypair", type=CommandType.STRING, description="name of the ssh key pair used to login to the virtual machine") private String sshKeyPairName; - - // unexposed parameter needed for serializing/deserializing the command - @Parameter(name=ApiConstants.PASSWORD, type=CommandType.STRING, expose=false) - private String password; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -159,15 +152,6 @@ public class DeployVMCmd extends BaseAsyncCreateCmd { return zoneId; } - // not exposed parameter - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - public List getNetworkIds() { return networkIds; } diff --git a/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java b/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java index 4b62ab30de0..5f5c4d5e6a8 100644 --- a/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java +++ b/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java @@ -17,8 +17,6 @@ */ package com.cloud.api.commands; -import java.util.Random; - import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; @@ -106,11 +104,10 @@ public class ResetVMPasswordCmd extends BaseAsyncCmd { public Long getInstanceId() { return getId(); } - - Random _rand = new Random(System.currentTimeMillis()); + @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException{ - password = Long.toHexString(_rand.nextLong()); + password = _mgr.generateRandomPassword(); UserVm result = _userVmService.resetVMPassword(this, password); if (result != null){ UserVmResponse response = _responseGenerator.createUserVmResponse(result); diff --git a/api/src/com/cloud/network/vpn/PasswordResetElement.java b/api/src/com/cloud/network/vpn/PasswordResetElement.java new file mode 100644 index 00000000000..62f6fa57394 --- /dev/null +++ b/api/src/com/cloud/network/vpn/PasswordResetElement.java @@ -0,0 +1,12 @@ +package com.cloud.network.vpn; + +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; + +public interface PasswordResetElement { + + boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException; +} diff --git a/api/src/com/cloud/vm/VirtualMachineProfile.java b/api/src/com/cloud/vm/VirtualMachineProfile.java index bb91f9120a4..d48e61f3906 100644 --- a/api/src/com/cloud/vm/VirtualMachineProfile.java +++ b/api/src/com/cloud/vm/VirtualMachineProfile.java @@ -40,6 +40,11 @@ import com.cloud.user.Account; */ public interface VirtualMachineProfile { + enum Param { + VmPassword, + ControlNic, + } + String getHostName(); String getInstanceName(); @@ -59,7 +64,7 @@ public interface VirtualMachineProfile { /** * @return parameter specific for this type of virtual machine. */ - Object getParameter(String name); + Object getParameter(Param name); /** * @return the hypervisor type needed for this virtual machine. @@ -106,7 +111,7 @@ public interface VirtualMachineProfile { VirtualMachine.Type getType(); - void setParameter(String name, Object value); + void setParameter(Param name, Object value); void setBootLoaderType(BootloaderType bootLoader); BootloaderType getBootLoaderType(); diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index 025de65215a..5f063c7ec66 100755 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -287,7 +287,7 @@ public class VirtualRoutingResource implements Manager { protected synchronized Answer execute(final SavePasswordCommand cmd) { final String password = cmd.getPassword(); - final String routerPrivateIPAddress = cmd.getRouterPrivateIpAddress(); + final String routerPrivateIPAddress = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); final String vmName = cmd.getVmName(); final String vmIpAddress = cmd.getVmIpAddress(); final String local = vmName; diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 617f02ce2ad..1a9066d7682 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -199,7 +199,6 @@ import com.xensource.xenapi.PBD; import com.xensource.xenapi.PIF; import com.xensource.xenapi.Pool; import com.xensource.xenapi.SR; -import com.xensource.xenapi.Session; import com.xensource.xenapi.Task; import com.xensource.xenapi.Types; import com.xensource.xenapi.Types.BadServerResponse; @@ -1261,7 +1260,7 @@ public abstract class CitrixResourceBase implements ServerResource { protected Answer execute(final SavePasswordCommand cmd) { Connection conn = getConnection(); final String password = cmd.getPassword(); - final String routerPrivateIPAddress = cmd.getRouterPrivateIpAddress(); + final String routerPrivateIPAddress = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); final String vmName = cmd.getVmName(); final String vmIpAddress = cmd.getVmIpAddress(); final String local = vmName; diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index b3a7e91279a..081273fe4ea 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -1482,14 +1482,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx s_logger.debug("Boot Args for " + profile + ": " + bootArgs); } - profile.setParameter("control.nic", controlNic); + profile.setParameter(VirtualMachineProfile.Param.ControlNic, controlNic); return true; } @Override public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - NicProfile controlNic = (NicProfile)profile.getParameter("control.nic"); + NicProfile controlNic = (NicProfile)profile.getParameter(VirtualMachineProfile.Param.ControlNic); CheckSshCommand check = new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922, 5, 20); cmds.addCommand("checkSsh", check); diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 09f9660db7e..f47c24c1805 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -36,6 +36,7 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; import com.cloud.network.guru.NetworkGuru; import com.cloud.network.rules.FirewallRule; +import com.cloud.network.vpn.PasswordResetElement; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.user.Account; @@ -160,4 +161,10 @@ public interface NetworkManager extends NetworkService { Nic getNicInNetwork(long vmId, long networkId); Nic getNicForTraffic(long vmId, TrafficType type); + + Network getDefaultNetworkForVm(long vmId); + + Nic getDefaultNic(long vmId); + + List getPasswordResetElements(); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index be01e003cf1..1cc61d6be60 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -91,6 +91,7 @@ import com.cloud.network.guru.NetworkGuru; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.RulesManager; +import com.cloud.network.vpn.PasswordResetElement; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Availability; @@ -2010,4 +2011,50 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return profile; } + + @Override + public Network getDefaultNetworkForVm(long vmId) { + Nic defaultNic = getDefaultNic(vmId); + if (defaultNic == null) { + return null; + } else { + return _networksDao.findById(defaultNic.getNetworkId()); + } + } + + + @Override + public Nic getDefaultNic(long vmId) { + List nics = _nicDao.listBy(vmId); + Nic defaultNic = null; + if (nics != null) { + for (Nic nic: nics) { + if (nic.isDefaultNic()) { + defaultNic = nic; + break; + } + } + } else { + s_logger.debug("Unable to find default network for the vm; vm doesn't have any nics"); + return null; + } + + if (defaultNic == null) { + s_logger.debug("Unable to find default network for the vm; vm doesn't have default nic"); + } + + return defaultNic; + + } + + @Override + public List getPasswordResetElements() { + List elements = new ArrayList(); + for (NetworkElement element : _networkElements) { + if (element instanceof PasswordResetElement) { + elements.add((PasswordResetElement) element); + } + } + return elements; + } } diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index f287c122659..33f7a62e191 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -44,23 +44,25 @@ import com.cloud.network.dao.NetworkDao; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule; +import com.cloud.network.vpn.PasswordResetElement; import com.cloud.offering.NetworkOffering; import com.cloud.uservm.UserVm; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; @Local(value=NetworkElement.class) -public class DhcpElement extends AdapterBase implements NetworkElement{ +public class DhcpElement extends AdapterBase implements NetworkElement, PasswordResetElement{ private static final Logger s_logger = Logger.getLogger(DhcpElement.class); private static final Map> capabilities = setCapabilities(); @@ -197,4 +199,13 @@ public class DhcpElement extends AdapterBase implements NetworkElement{ return true; } } + + @Override + public boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException{ + + @SuppressWarnings("unchecked") + VirtualMachineProfile uservm = (VirtualMachineProfile)vm; + + return _routerMgr.savePasswordToRouter(network, nic, uservm); + } } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index da46251e315..29752e22568 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -28,8 +28,6 @@ import org.apache.log4j.Logger; import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -50,7 +48,6 @@ import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.VirtualNetworkApplianceManager; -import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.PortForwardingRule; @@ -59,7 +56,6 @@ import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.user.AccountManager; import com.cloud.uservm.UserVm; -import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.DomainRouterVO; @@ -67,14 +63,14 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; @Local(value=NetworkElement.class) -public class VirtualRouterElement extends AdapterBase implements NetworkElement, RemoteAccessVpnElement { +public class VirtualRouterElement extends DhcpElement implements NetworkElement, RemoteAccessVpnElement { private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class); private static final Map> capabilities = setCapabilities(); @@ -110,10 +106,11 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, return true; } - + + @Override - public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { - if (canHandle(config.getGuestType(), dest.getDataCenter())) { + public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { + if (canHandle(network.getGuestType(), dest.getDataCenter())) { if (vm.getType() != VirtualMachine.Type.User) { return false; } @@ -121,39 +118,12 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @SuppressWarnings("unchecked") VirtualMachineProfile uservm = (VirtualMachineProfile)vm; - return _routerMgr.addVirtualMachineIntoNetwork(config, nic, uservm, dest, context, false) != null; + return _routerMgr.addVirtualMachineIntoNetwork(network, nic, uservm, dest, context, false) != null; } else { return false; } } - @Override - public boolean release(Network config, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) { - return true; - } - - @Override - public boolean shutdown(Network config, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { - DomainRouterVO router = _routerDao.findByNetworkConfiguration(config.getId()); - if (router == null) { - return true; - } - if (_routerMgr.stopRouter(router.getId()) != null) { - return true; - } else { - return false; - } - } - - @Override - public boolean destroy(Network config) throws ConcurrentOperationException, ResourceUnavailableException{ - DomainRouterVO router = _routerDao.findByNetworkConfiguration(config.getId()); - if (router == null) { - return true; - } - return _routerMgr.destroyRouter(router.getId()); - } - @Override public boolean applyRules(Network config, List rules) throws ResourceUnavailableException { @@ -242,7 +212,6 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, return false; } } - @Override public Provider getProvider() { @@ -287,31 +256,4 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, return capabilities; } - - @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ - DataCenter dc = _configMgr.getZone(network.getDataCenterId()); - DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); - if (router == null) { - s_logger.trace("Can't find domain router in network " + network.getId()); - return true; - } - - VirtualRouter result = null; - if (canHandle(network.getGuestType(), dc)) { - if (router.getState() == State.Stopped) { - result = _routerMgr.startRouter(router.getId()); - } else { - result = _routerMgr.rebootRouter(router.getId()); - } - if (result == null) { - s_logger.warn("Failed to restart domain router " + router + " as a part of netowrk " + network + " restart"); - return false; - } else { - return true; - } - } - return true; - } - } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java index ab4528df487..2c93bf9db59 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java @@ -62,11 +62,8 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA /** * save a vm password on the router. * - * @param routerId the ID of the router to save the password to - * @param vmIpAddress the IP address of the User VM that will use the password - * @param password the password to save to the router */ - boolean savePasswordToRouter(long routerId, String vmIpAddress, String password); + boolean savePasswordToRouter(Network network, NicProfile nic, VirtualMachineProfile profile) throws ResourceUnavailableException; boolean destroyRouter(long routerId) throws ResourceUnavailableException, ConcurrentOperationException; diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 11ffe5faeb6..ee7dfb0edcd 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -165,6 +165,7 @@ import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineName; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.VirtualMachineProfile.Param; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.UserVmDao; @@ -414,21 +415,24 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } @Override - public boolean savePasswordToRouter(final long routerId, final String vmIpAddress, final String password) { - - final DomainRouterVO router = _routerDao.findById(routerId); - final String routerPrivateIpAddress = router.getPrivateIpAddress(); - final String vmName = router.getName(); - final String encodedPassword = rot13(password); - final SavePasswordCommand cmdSavePassword = new SavePasswordCommand(encodedPassword, vmIpAddress, routerPrivateIpAddress, vmName); - - if (router != null && router.getHostId() != null) { - final Answer answer = _agentMgr.easySend(router.getHostId(), cmdSavePassword); - return (answer != null && answer.getResult()); - } else { - // either the router doesn't exist or router isn't running at all - return false; + public boolean savePasswordToRouter(Network network, NicProfile nic, VirtualMachineProfile profile) throws ResourceUnavailableException{ + DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); + if (router == null) { + s_logger.warn("Unable save password, router doesn't exist in network " + network.getId()); + throw new CloudRuntimeException("Unable to save password to router"); } + + UserVm userVm = profile.getVirtualMachine(); + String password = (String)profile.getParameter(Param.VmPassword); + String encodedPassword = rot13(password); + + Commands cmds = new Commands(OnError.Continue); + SavePasswordCommand cmd = new SavePasswordCommand(encodedPassword, nic.getIp4Address(), userVm.getName()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmds.addCommand("password", cmd); + + return sendCommandsToRouter(router, cmds); } @@ -1090,14 +1094,14 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian throw new CloudRuntimeException("Didn't start a control port"); } - profile.setParameter("control.nic", controlNic); + profile.setParameter(VirtualMachineProfile.Param.ControlNic, controlNic); return true; } @Override public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException{ - NicProfile controlNic = (NicProfile) profile.getParameter("control.nic"); + NicProfile controlNic = (NicProfile) profile.getParameter(VirtualMachineProfile.Param.ControlNic); _ovsNetworkMgr.RouterCheckAndCreateTunnel(cmds, profile, dest); _ovsNetworkMgr.applyDefaultFlowToRouter(cmds, profile, dest); @@ -1320,7 +1324,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian _userVmDao.loadDetails((UserVmVO) profile.getVirtualMachine()); - String password = profile.getVirtualMachine().getPassword(); + String password = (String)profile.getParameter(VirtualMachineProfile.Param.VmPassword); String userData = profile.getVirtualMachine().getUserData(); String sshPublicKey = profile.getVirtualMachine().getDetail("SSH.PublicKey"); Commands cmds = new Commands(OnError.Stop); @@ -1339,11 +1343,13 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, routerControlIpAddress); dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); cmds.addCommand("dhcp", dhcpCommand); - + if (password != null) { final String encodedPassword = rot13(password); - cmds.addCommand("password", new SavePasswordCommand(encodedPassword, nic.getIp4Address(), routerControlIpAddress, profile - .getVirtualMachine().getName())); + SavePasswordCommand cmd = new SavePasswordCommand(encodedPassword, nic.getIp4Address(), profile.getVirtualMachine().getName()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmds.addCommand("password", cmd); } String serviceOffering = _serviceOfferingDao.findById(profile.getServiceOfferingId()).getDisplayText(); diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 2126c1a6eb0..4e95731e8c8 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -1115,7 +1115,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V s_logger.debug("Boot Args for " + profile + ": " + bootArgs); } - profile.setParameter("control.nic", controlNic); + profile.setParameter(VirtualMachineProfile.Param.ControlNic, controlNic); return true; } @@ -1123,7 +1123,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @Override public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - NicProfile controlNic = (NicProfile) profile.getParameter("control.nic"); + NicProfile controlNic = (NicProfile) profile.getParameter(VirtualMachineProfile.Param.ControlNic); CheckSshCommand check = new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922, 5, 20); cmds.addCommand("checkSsh", check); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 8f465102967..b62b2cb3a75 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -124,6 +124,7 @@ import com.cloud.network.ovs.OvsTunnelManager; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.RulesManager; import com.cloud.network.security.SecurityGroupManager; +import com.cloud.network.vpn.PasswordResetElement; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.server.Criteria; import com.cloud.service.ServiceOfferingVO; @@ -310,42 +311,61 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return userVm; } - private boolean resetVMPasswordInternal(ResetVMPasswordCmd cmd, String password) throws ResourceUnavailableException, InsufficientCapacityException{ - - return true; -// Long vmId = cmd.getId(); -// Long userId = UserContext.current().getCallerUserId(); -// UserVmVO vmInstance = _vmDao.findById(vmId); -// -// if (password == null || password.equals("")) { -// return false; -// } -// -// VMTemplateVO template = _templateDao.findById(vmInstance.getTemplateId()); -// if (template.getEnablePassword()) { -// if (vmInstance.getDomainRouterId() == null) { -// /*TODO: add it for external dhcp mode*/ -// return true; -// } -// if (_routerMgr.savePasswordToRouter(vmInstance.getDomainRouterId(), vmInstance.getPrivateIpAddress(), password)) { -// // Need to reboot the virtual machine so that the password gets redownloaded from the DomR, and reset on the VM -// if (rebootVirtualMachine(userId, vmId) == null) { -// if (vmInstance.getState() == State.Stopped) { -// return true; -// } -// return false; -// } else { -// return true; -// } -// } else { -// return false; -// } -// } else { -// if (s_logger.isDebugEnabled()) { -// s_logger.debug("Reset password called for a vm that is not using a password enabled template"); -// } -// return false; -// } + private boolean resetVMPasswordInternal(ResetVMPasswordCmd cmd, String password) throws ResourceUnavailableException, InsufficientCapacityException{ + Long vmId = cmd.getId(); + Long userId = UserContext.current().getCallerUserId(); + VMInstanceVO vmInstance = _vmDao.findById(vmId); + + if (password == null || password.equals("")) { + return false; + } + + VMTemplateVO template = _templateDao.findById(vmInstance.getTemplateId()); + if (template.getEnablePassword()) { + Nic defaultNic = _networkMgr.getDefaultNic(vmId); + if (defaultNic == null) { + s_logger.error("Unable to reset password for vm " + vmInstance + " as the instance doesn't have default nic"); + return false; + } + + Network defaultNetwork = _networkDao.findById(defaultNic.getNetworkId()); + NicProfile defaultNicProfile = new NicProfile(defaultNic, defaultNetwork, null, null, null); + VirtualMachineProfile vmProfile = new VirtualMachineProfileImpl(vmInstance); + vmProfile.setParameter(VirtualMachineProfile.Param.VmPassword, password); + + + List elements = _networkMgr.getPasswordResetElements(); + + boolean result = true; + for (PasswordResetElement element : elements) { + if (!element.savePassword(defaultNetwork, defaultNicProfile, vmProfile)) { + result = false; + } + } + + // Need to reboot the virtual machine so that the password gets redownloaded from the DomR, and reset on the VM + if (!result) { + s_logger.debug("Failed to reset password for the virutal machine; no need to reboot the vm"); + return false; + } else { + if (rebootVirtualMachine(userId, vmId) == null) { + if (vmInstance.getState() == State.Stopped) { + s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of password reset"); + return true; + } + s_logger.warn("Failed to reboot the vm " + vmInstance); + return false; + } else { + s_logger.debug("Vm " + vmInstance + " is rebooted successfully as a part of password reset"); + return true; + } + } + } else { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Reset password called for a vm that is not using a password enabled template"); + } + return false; + } } @Override @@ -2124,7 +2144,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (password == null || password.equals("") || (!validPassword(password))) { throw new InvalidParameterValueException("A valid password for this virtual machine was not provided."); } - vm.setPassword(password); + // Check if an SSH key pair was selected for the instance and if so use it to encrypt & save the vm password String sshPublicKey = vm.getDetail("SSH.PublicKey"); @@ -2144,13 +2164,21 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager AccountVO owner = _accountDao.findById(vm.getAccountId()); try { - vm = _itMgr.start(vm, null, caller, owner); + Map params = new HashMap(); + params.put(VirtualMachineProfile.Param.VmPassword, password); + vm = _itMgr.start(vm, params, caller, owner); } finally { updateVmStateForFailedVmCreation(vm.getId()); } _networkGroupMgr.addInstanceToGroups(vm.getId(), cmd.getSecurityGroupList()); + + if (template.getEnablePassword()) { + //this value is not being sent to the backend; need only for api dispaly purposes + vm.setPassword(password); + } + return vm; } diff --git a/server/src/com/cloud/vm/VirtualMachineManager.java b/server/src/com/cloud/vm/VirtualMachineManager.java index 9f594f890b1..58f721ad50f 100644 --- a/server/src/com/cloud/vm/VirtualMachineManager.java +++ b/server/src/com/cloud/vm/VirtualMachineManager.java @@ -37,9 +37,6 @@ import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; -import com.cloud.utils.fsm.StateListener; -import com.cloud.vm.VirtualMachine.Event; -import com.cloud.vm.VirtualMachine.State; /** * Manages allocating resources to vms. @@ -52,7 +49,7 @@ public interface VirtualMachineManager extends Manager { Pair rootDiskOffering, List> dataDiskOfferings, List> networks, - Map params, + Map params, DeploymentPlan plan, HypervisorType hyperType, Account owner) throws InsufficientCapacityException; @@ -75,7 +72,7 @@ public interface VirtualMachineManager extends Manager { HypervisorType hyperType, Account owner) throws InsufficientCapacityException; - T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException; + T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException; boolean stop(T vm, User caller, Account account) throws ResourceUnavailableException; @@ -85,7 +82,7 @@ public interface VirtualMachineManager extends Manager { boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId); - T advanceStart(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; + T advanceStart(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; boolean advanceStop(T vm, boolean forced, User caller, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException; @@ -99,7 +96,7 @@ public interface VirtualMachineManager extends Manager { T migrate(T vm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException; - T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException; + T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException; - T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; + T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; } diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 34b1e910d23..fb05f09d9b5 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -183,7 +183,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, StateLi Pair rootDiskOffering, List> dataDiskOfferings, List> networks, - Map params, + Map params, DeploymentPlan plan, HypervisorType hyperType, Account owner) throws InsufficientCapacityException { @@ -441,7 +441,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, StateLi } @Override - public T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { + public T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { try { return advanceStart(vm, params, caller, account); } catch (ConcurrentOperationException e) { @@ -555,7 +555,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, StateLi } @Override - public T advanceStart(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + public T advanceStart(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { long vmId = vm.getId(); VirtualMachineGuru vmGuru = getVmGuru(vm); @@ -1086,7 +1086,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, StateLi } @Override - public T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { + public T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { try { return advanceReboot(vm, params, caller, account); } catch (ConcurrentOperationException e) { @@ -1095,8 +1095,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, StateLi } @Override - - public T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + public T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { T rebootedVm = null; DataCenter dc = _configMgr.getZone(vm.getDataCenterId()); diff --git a/server/src/com/cloud/vm/VirtualMachineProfileImpl.java b/server/src/com/cloud/vm/VirtualMachineProfileImpl.java index 28551ac3989..52a9698c237 100644 --- a/server/src/com/cloud/vm/VirtualMachineProfileImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineProfileImpl.java @@ -43,7 +43,7 @@ public class VirtualMachineProfileImpl implements Virtua T _vm; ServiceOfferingVO _offering; VMTemplateVO _template; - Map _params; + Map _params; List _nics = new ArrayList(); List _disks = new ArrayList(); StringBuilder _bootArgs = new StringBuilder(); @@ -52,14 +52,14 @@ public class VirtualMachineProfileImpl implements Virtua VirtualMachine.Type _type; - public VirtualMachineProfileImpl(T vm, VMTemplateVO template, ServiceOfferingVO offering, Account owner, Map params) { + public VirtualMachineProfileImpl(T vm, VMTemplateVO template, ServiceOfferingVO offering, Account owner, Map params) { _vm = vm; _template = template; _offering = offering; _params = params; _owner = owner; if (_params == null) { - _params = new HashMap(); + _params = new HashMap(); } _type = vm.getType(); } @@ -91,7 +91,7 @@ public class VirtualMachineProfileImpl implements Virtua } @Override - public void setParameter(String name, Object value) { + public void setParameter(Param name, Object value) { _params.put(name, value); } @@ -206,7 +206,7 @@ public class VirtualMachineProfileImpl implements Virtua } @Override - public Object getParameter(String name) { + public Object getParameter(Param name) { return _params.get(name); }