diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index dc9eba52eb1..7a4862484f8 100755 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -748,7 +748,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @SuppressWarnings("unchecked") VirtualMachineProfile uservm = vm; - return _routerMgr.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey); + DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + + return networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey); } @Override @@ -765,7 +768,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @SuppressWarnings("unchecked") VirtualMachineProfile uservm = vm; - return _routerMgr.saveUserDataToRouter(network, nic, uservm, routers); + DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + + return networkTopology.saveUserDataToRouter(network, nic, uservm, routers); } @Override diff --git a/server/src/com/cloud/network/rules/IpAssociationRules.java b/server/src/com/cloud/network/rules/IpAssociationRules.java index 03f5961c5da..03a74a1a7aa 100644 --- a/server/src/com/cloud/network/rules/IpAssociationRules.java +++ b/server/src/com/cloud/network/rules/IpAssociationRules.java @@ -26,7 +26,6 @@ import java.util.Map; import org.apache.cloudstack.network.topology.NetworkTopologyVisitor; -import com.cloud.agent.api.Command; import com.cloud.agent.api.routing.IpAssocCommand; import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.to.IpAddressTO; @@ -46,8 +45,6 @@ public class IpAssociationRules extends RuleApplier { private final List ipAddresses; - private Commands commands; - public IpAssociationRules(final Network network, final List ipAddresses) { super(network); this.ipAddresses = ipAddresses; @@ -56,7 +53,6 @@ public class IpAssociationRules extends RuleApplier { @Override public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException { this.router = router; - commands = new Commands(Command.OnError.Continue); return visitor.visit(this); } @@ -65,10 +61,6 @@ public class IpAssociationRules extends RuleApplier { return ipAddresses; } - public Commands getCommands() { - return commands; - } - public void createAssociateIPCommands(final VirtualRouter router, final List ips, final Commands cmds, final long vmId) { // Ensure that in multiple vlans case we first send all ip addresses of vlan1, then all ip addresses of vlan2, etc.. diff --git a/server/src/com/cloud/network/rules/PasswordToRouterRules.java b/server/src/com/cloud/network/rules/PasswordToRouterRules.java index 5bbee19bcdf..379601bf034 100644 --- a/server/src/com/cloud/network/rules/PasswordToRouterRules.java +++ b/server/src/com/cloud/network/rules/PasswordToRouterRules.java @@ -29,6 +29,7 @@ import com.cloud.network.router.VirtualRouter; import com.cloud.utils.PasswordGenerator; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; +import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachineProfile; public class PasswordToRouterRules extends RuleApplier { @@ -48,6 +49,8 @@ public class PasswordToRouterRules extends RuleApplier { @Override public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException { this.router = router; + + userVmDao.loadDetails((UserVmVO)profile.getVirtualMachine()); // for basic zone, send vm data/password information only to the router in the same pod nicVo = nicDao.findById(nic.getId()); diff --git a/server/src/com/cloud/network/rules/RuleApplier.java b/server/src/com/cloud/network/rules/RuleApplier.java index ff4a97a18e2..55baa14644c 100644 --- a/server/src/com/cloud/network/rules/RuleApplier.java +++ b/server/src/com/cloud/network/rules/RuleApplier.java @@ -20,6 +20,11 @@ package com.cloud.network.rules; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.network.topology.NetworkTopologyVisitor; +import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.routing.VmDataCommand; +import com.cloud.agent.manager.Commands; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; @@ -32,9 +37,15 @@ import com.cloud.network.router.NEWVirtualNetworkApplianceManager; import com.cloud.network.router.RouterControlHelper; import com.cloud.network.router.VirtualRouter; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.uservm.UserVm; +import com.cloud.utils.StringUtils; +import com.cloud.vm.NicVO; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.UserVmDao; public abstract class RuleApplier { @@ -56,6 +67,12 @@ public abstract class RuleApplier { protected DomainRouterDao routerDao; + protected UserVmDao userVmDao; + + protected ServiceOfferingDao serviceOfferingDao; + + protected VMTemplateDao templateDao; + protected NetworkDao networkDao; protected FirewallRulesDao rulesDao; @@ -85,4 +102,68 @@ public abstract class RuleApplier { public NEWVirtualNetworkApplianceManager getApplianceManager() { return applianceManager; } + + public void createVmDataCommand(final VirtualRouter router, final UserVm vm, final NicVO nic, final String publicKey, final Commands cmds) { + final String serviceOffering = serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText(); + final String zoneName = dcDao.findById(router.getDataCenterId()).getName(); + cmds.addCommand( + "vmdata", + generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(), + vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId())); + } + + public VmDataCommand generateVmDataCommand(final VirtualRouter router, final String vmPrivateIpAddress, final String userData, final String serviceOffering, final String zoneName, + final String guestIpAddress, final String vmName, final String vmInstanceName, final long vmId, final String vmUuid, final String publicKey, final long guestNetworkId) { + final VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName, networkModel.getExecuteInSeqNtwkElmtCmd()); + + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, routerControlHelper.getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + + final DataCenterVO dcVo = dcDao.findById(router.getDataCenterId()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmd.addVmData("userdata", "user-data", userData); + cmd.addVmData("metadata", "service-offering", StringUtils.unicodeEscape(serviceOffering)); + cmd.addVmData("metadata", "availability-zone", StringUtils.unicodeEscape(zoneName)); + cmd.addVmData("metadata", "local-ipv4", guestIpAddress); + cmd.addVmData("metadata", "local-hostname", StringUtils.unicodeEscape(vmName)); + if (dcVo.getNetworkType() == NetworkType.Basic) { + cmd.addVmData("metadata", "public-ipv4", guestIpAddress); + cmd.addVmData("metadata", "public-hostname", StringUtils.unicodeEscape(vmName)); + } else { + if (router.getPublicIpAddress() == null) { + cmd.addVmData("metadata", "public-ipv4", guestIpAddress); + } else { + cmd.addVmData("metadata", "public-ipv4", router.getPublicIpAddress()); + } + cmd.addVmData("metadata", "public-hostname", router.getPublicIpAddress()); + } + if (vmUuid == null) { + setVmInstanceId(vmInstanceName, vmId, cmd); + } else { + setVmInstanceId(vmUuid, cmd); + } + cmd.addVmData("metadata", "public-keys", publicKey); + + String cloudIdentifier = configDao.getValue("cloud.identifier"); + if (cloudIdentifier == null) { + cloudIdentifier = ""; + } else { + cloudIdentifier = "CloudStack-{" + cloudIdentifier + "}"; + } + cmd.addVmData("metadata", "cloud-identifier", cloudIdentifier); + + return cmd; + } + + private void setVmInstanceId(final String vmUuid, final VmDataCommand cmd) { + cmd.addVmData("metadata", "instance-id", vmUuid); + cmd.addVmData("metadata", "vm-id", vmUuid); + } + + private void setVmInstanceId(final String vmInstanceName, final long vmId, final VmDataCommand cmd) { + cmd.addVmData("metadata", "instance-id", vmInstanceName); + cmd.addVmData("metadata", "vm-id", String.valueOf(vmId)); + } } \ No newline at end of file diff --git a/server/src/com/cloud/network/rules/SshKeyToRouterRules.java b/server/src/com/cloud/network/rules/SshKeyToRouterRules.java index 750fbd5f048..73d0e004ae2 100644 --- a/server/src/com/cloud/network/rules/SshKeyToRouterRules.java +++ b/server/src/com/cloud/network/rules/SshKeyToRouterRules.java @@ -19,36 +19,87 @@ package com.cloud.network.rules; import org.apache.cloudstack.network.topology.NetworkTopologyVisitor; +import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.routing.SavePasswordCommand; +import com.cloud.agent.manager.Commands; +import com.cloud.dc.DataCenterVO; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.router.VirtualRouter; +import com.cloud.storage.VMTemplateVO; +import com.cloud.utils.PasswordGenerator; import com.cloud.vm.NicProfile; +import com.cloud.vm.NicVO; +import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachineProfile; public class SshKeyToRouterRules extends RuleApplier { private final NicProfile nic; private final VirtualMachineProfile profile; + private final String sshPublicKey; - public SshKeyToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) { + private NicVO nicVo; + private VMTemplateVO template; + private UserVmVO userVM; + + public SshKeyToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final String sshPublicKey) { super(network); this.nic = nic; this.profile = profile; + this.sshPublicKey = sshPublicKey; } @Override public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException { this.router = router; + userVM = userVmDao.findById(profile.getVirtualMachine().getId()); + userVmDao.loadDetails(userVM); + + nicVo = nicDao.findById(nic.getId()); + // for basic zone, send vm data/password information only to the router in the same pod + template = templateDao.findByIdIncludingRemoved(profile.getTemplateId()); return visitor.visit(this); } - public NicProfile getNic() { - return nic; + public void createPasswordCommand(final VirtualRouter router, final VirtualMachineProfile profile, final NicVO nic, final Commands cmds) { + final String password = (String)profile.getParameter(VirtualMachineProfile.Param.VmPassword); + final DataCenterVO dcVo = dcDao.findById(router.getDataCenterId()); + + // password should be set only on default network element + if (password != null && nic.isDefaultNic()) { + final String encodedPassword = PasswordGenerator.rot13(password); + final SavePasswordCommand cmd = + new SavePasswordCommand(encodedPassword, nic.getIp4Address(), profile.getVirtualMachine().getHostName(), networkModel.getExecuteInSeqNtwkElmtCmd()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, routerControlHelper.getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, routerControlHelper.getRouterIpInNetwork(nic.getNetworkId(), router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand("password", cmd); + } + } public VirtualMachineProfile getProfile() { return profile; } + + public String getSshPublicKey() { + return sshPublicKey; + } + + public UserVmVO getUserVM() { + return userVM; + } + + public NicVO getNicVo() { + return nicVo; + } + + public VMTemplateVO getTemplate() { + return template; + } } \ No newline at end of file diff --git a/server/src/com/cloud/network/rules/UserdataToRouterRules.java b/server/src/com/cloud/network/rules/UserdataToRouterRules.java index e3baeded889..f7f8d3a66a8 100644 --- a/server/src/com/cloud/network/rules/UserdataToRouterRules.java +++ b/server/src/com/cloud/network/rules/UserdataToRouterRules.java @@ -19,12 +19,12 @@ package com.cloud.network.rules; import org.apache.cloudstack.network.topology.NetworkTopologyVisitor; -import com.cloud.agent.api.Command; -import com.cloud.agent.manager.Commands; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.router.VirtualRouter; import com.cloud.vm.NicProfile; +import com.cloud.vm.NicVO; +import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachineProfile; public class UserdataToRouterRules extends RuleApplier { @@ -32,6 +32,9 @@ public class UserdataToRouterRules extends RuleApplier { private final NicProfile nic; private final VirtualMachineProfile profile; + private NicVO nicVo; + private UserVmVO userVM; + public UserdataToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) { super(network); @@ -43,26 +46,20 @@ public class UserdataToRouterRules extends RuleApplier { public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException { this.router = router; + userVM = userVmDao.findById(profile.getVirtualMachine().getId()); + userVmDao.loadDetails(userVM); + // for basic zone, send vm data/password information only to the router in the same pod - final Commands cmds = new Commands(Command.OnError.Stop); - //final NicVO nicVo = _nicDao.findById(nic.getId()); - - //final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText(); - //final String zoneName = _dcDao.findById(router.getDataCenterId()).getName(); - - // cmds.addCommand( - // "vmdata", - // generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(), - // vm.getId(), vm.getUuid(), null, nic.getNetworkId())); + nicVo = nicDao.findById(nic.getId()); return visitor.visit(this); } - public NicProfile getNic() { - return nic; + public NicVO getNicVo() { + return nicVo; } - public VirtualMachineProfile getProfile() { - return profile; + public UserVmVO getUserVM() { + return userVM; } } \ No newline at end of file diff --git a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java index cc57830677e..b6723608a32 100644 --- a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java +++ b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java @@ -35,11 +35,14 @@ import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.NEWVirtualNetworkApplianceManager; import com.cloud.network.router.RouterControlHelper; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.dao.VMTemplateDao; import com.cloud.vm.NicProfile; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.UserVmDao; public class VirtualNetworkApplianceFactory { @@ -67,6 +70,15 @@ public class VirtualNetworkApplianceFactory { @Inject protected DataCenterDao dcDao; + @Inject + protected UserVmDao userVmDao; + + @Inject + protected ServiceOfferingDao serviceOfferingDao; + + @Inject + protected VMTemplateDao templateDao; + @Inject protected DomainRouterDao routerDao; @@ -150,6 +162,32 @@ public class VirtualNetworkApplianceFactory { initBeans(routerRules); + routerRules.userVmDao = userVmDao; + return routerRules; } + + public SshKeyToRouterRules createSshKeyToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final String sshKey) { + SshKeyToRouterRules sshKeyToRouterRules = new SshKeyToRouterRules(network, nic, profile, sshKey); + + initBeans(sshKeyToRouterRules); + + sshKeyToRouterRules.userVmDao = userVmDao; + sshKeyToRouterRules.templateDao = templateDao; + sshKeyToRouterRules.serviceOfferingDao = serviceOfferingDao; + + return sshKeyToRouterRules; + } + + public UserdataToRouterRules createUserdataToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) { + UserdataToRouterRules userdataRules = new UserdataToRouterRules(network, nic, profile); + + initBeans(userdataRules); + + userdataRules.userVmDao = userVmDao; + userdataRules.templateDao = templateDao; + userdataRules.serviceOfferingDao = serviceOfferingDao; + + return userdataRules; + } } \ No newline at end of file diff --git a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java index 3d599863626..83bd8aeda44 100644 --- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java @@ -34,7 +34,6 @@ import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; @@ -50,8 +49,10 @@ import com.cloud.network.rules.LoadBalancingRules; import com.cloud.network.rules.PasswordToRouterRules; import com.cloud.network.rules.RuleApplier; import com.cloud.network.rules.RuleApplierWrapper; +import com.cloud.network.rules.SshKeyToRouterRules; import com.cloud.network.rules.StaticNat; import com.cloud.network.rules.StaticNatRules; +import com.cloud.network.rules.UserdataToRouterRules; import com.cloud.network.rules.VirtualNetworkApplianceFactory; import com.cloud.network.rules.VpnRules; import com.cloud.user.Account; @@ -60,7 +61,6 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.VirtualMachineProfile.Param; import com.cloud.vm.dao.UserVmDao; public class BasicNetworkTopology implements NetworkTopology { @@ -259,6 +259,36 @@ public class BasicNetworkTopology implements NetworkTopology { return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper(routerRules)); } + @Override + public boolean saveSSHPublicKeyToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List routers, + final String sshPublicKey) throws ResourceUnavailableException { + s_logger.debug("SAVE SSH PUB KEY TO ROUTE RULES"); + + final String typeString = "save SSHkey entry"; + final boolean isPodLevelException = false; + final boolean failWhenDisconnect = false; + final Long podId = null; + + SshKeyToRouterRules keyToRouterRules = virtualNetworkApplianceFactory.createSshKeyToRouterRules(network, nic, profile, sshPublicKey); + + return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper(keyToRouterRules)); + } + + @Override + public boolean saveUserDataToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List routers) + throws ResourceUnavailableException { + s_logger.debug("SAVE USERDATA TO ROUTE RULES"); + + final String typeString = "save userdata entry"; + final boolean isPodLevelException = false; + final boolean failWhenDisconnect = false; + final Long podId = null; + + UserdataToRouterRules userdataToRouterRules = virtualNetworkApplianceFactory.createUserdataToRouterRules(network, nic, profile); + + return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper(userdataToRouterRules)); + } + @Override public boolean applyRules(final Network network, final List routers, final String typeString, final boolean isPodLevelException, final Long podId, final boolean failWhenDisconnect, final RuleApplierWrapper ruleApplierWrapper) throws ResourceUnavailableException { diff --git a/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java b/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java index ef3f7c7ef0b..a787d9b2ec8 100644 --- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java +++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java @@ -32,7 +32,7 @@ import com.cloud.network.PublicIpAddress; import com.cloud.network.VpnUser; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.router.VirtualRouter; -import com.cloud.network.rules.DhcpRules; +import com.cloud.network.rules.DhcpEntryRules; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.FirewallRules; @@ -50,8 +50,10 @@ import com.cloud.network.rules.UserdataPwdRules; import com.cloud.network.rules.UserdataToRouterRules; import com.cloud.network.rules.VpcIpAssociationRules; import com.cloud.network.rules.VpnRules; +import com.cloud.storage.VMTemplateVO; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.NicVO; +import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachineProfile; @Component @@ -68,9 +70,9 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor { @Override public boolean visit(final StaticNatRules nat) throws ResourceUnavailableException { - Network network = nat.getNetwork(); - VirtualRouter router = nat.getRouter(); - List rules = nat.getRules(); + final Network network = nat.getNetwork(); + final VirtualRouter router = nat.getRouter(); + final List rules = nat.getRules(); final Commands cmds = new Commands(Command.OnError.Continue); nat.createApplyStaticNatCommands(rules, router, cmds, network.getId()); @@ -80,9 +82,9 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor { @Override public boolean visit(final LoadBalancingRules loadbalancing) throws ResourceUnavailableException { - Network network = loadbalancing.getNetwork(); - VirtualRouter router = loadbalancing.getRouter(); - List rules = loadbalancing.getRules(); + final Network network = loadbalancing.getNetwork(); + final VirtualRouter router = loadbalancing.getRouter(); + final List rules = loadbalancing.getRules(); final Commands cmds = new Commands(Command.OnError.Continue); loadbalancing.createApplyLoadBalancingRulesCommands(rules, router, cmds, network.getId()); @@ -93,12 +95,12 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor { @SuppressWarnings("unchecked") @Override public boolean visit(final FirewallRules firewall) throws ResourceUnavailableException { - Network network = firewall.getNetwork(); - VirtualRouter router = firewall.getRouter(); - List rules = firewall.getRules(); - List loadbalancingRules = firewall.getLoadbalancingRules(); + final Network network = firewall.getNetwork(); + final VirtualRouter router = firewall.getRouter(); + final List rules = firewall.getRules(); + final List loadbalancingRules = firewall.getLoadbalancingRules(); - Purpose purpose = firewall.getPurpose(); + final Purpose purpose = firewall.getPurpose(); final Commands cmds = new Commands(Command.OnError.Continue); if (purpose == Purpose.LoadBalancing) { @@ -133,37 +135,53 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor { @Override public boolean visit(final IpAssociationRules ipRules) throws ResourceUnavailableException { - Network network = ipRules.getNetwork(); - VirtualRouter router = ipRules.getRouter(); - Commands commands = ipRules.getCommands(); - List ips = ipRules.getIpAddresses(); + final Network network = ipRules.getNetwork(); + final VirtualRouter router = ipRules.getRouter(); + + final Commands commands = new Commands(Command.OnError.Continue); + final List ips = ipRules.getIpAddresses(); ipRules.createAssociateIPCommands(router, ips, commands, network.getId()); return applianceManager.sendCommandsToRouter(router, commands); } @Override - public boolean visit(final UserdataPwdRules nat) throws ResourceUnavailableException { + public boolean visit(final UserdataPwdRules userdata) throws ResourceUnavailableException { return false; } @Override - public boolean visit(final DhcpRules nat) throws ResourceUnavailableException { + public boolean visit(final DhcpEntryRules dhcp) throws ResourceUnavailableException { return false; } @Override - public boolean visit(final SshKeyToRouterRules nat) throws ResourceUnavailableException { - return false; + public boolean visit(final SshKeyToRouterRules sshkey) throws ResourceUnavailableException { + final VirtualRouter router = sshkey.getRouter(); + final VirtualMachineProfile profile = sshkey.getProfile(); + final String sshKeystr = sshkey.getSshPublicKey(); + final UserVmVO userVM = sshkey.getUserVM(); + + final Commands commands = new Commands(Command.OnError.Stop); + final NicVO nicVo = sshkey.getNicVo(); + final VMTemplateVO template = sshkey.getTemplate(); + + if (template != null && template.getEnablePassword()) { + sshkey.createPasswordCommand(router, profile, nicVo, commands); + } + + sshkey.createVmDataCommand(router, userVM, nicVo, sshKeystr, commands); + + return applianceManager.sendCommandsToRouter(router, commands); } @Override public boolean visit(final PasswordToRouterRules passwd) throws ResourceUnavailableException { - VirtualRouter router = passwd.getRouter(); - NicVO nicVo = passwd.getNicVo(); - VirtualMachineProfile profile = passwd.getProfile(); + final VirtualRouter router = passwd.getRouter(); + final NicVO nicVo = passwd.getNicVo(); + final VirtualMachineProfile profile = passwd.getProfile(); - Commands cmds = new Commands(Command.OnError.Stop); + final Commands cmds = new Commands(Command.OnError.Stop); passwd.createPasswordCommand(router, profile, nicVo, cmds); return applianceManager.sendCommandsToRouter(router, cmds); @@ -181,11 +199,15 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor { @Override public boolean visit(final UserdataToRouterRules userdata) throws ResourceUnavailableException { - Network network = userdata.getNetwork(); - VirtualRouter router = userdata.getRouter(); + final VirtualRouter router = userdata.getRouter(); - // return sendCommandsToRouter(router, cmds); - return false; + final UserVmVO userVM = userdata.getUserVM(); + final NicVO nicVo = userdata.getNicVo(); + + final Commands commands = new Commands(Command.OnError.Stop); + userdata.createVmDataCommand(router, userVM, nicVo, null, commands); + + return applianceManager.sendCommandsToRouter(router, commands); } @Override diff --git a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java index 7d5c470a808..008196c7fef 100644 --- a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java @@ -18,12 +18,9 @@ package org.apache.cloudstack.network.topology; import java.util.List; -import java.util.Map; import com.cloud.dc.DataCenter; import com.cloud.deploy.DeployDestination; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.PublicIpAddress; @@ -34,17 +31,12 @@ import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.RuleApplier; import com.cloud.network.rules.RuleApplierWrapper; import com.cloud.network.rules.StaticNat; -import com.cloud.user.Account; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.VirtualMachineProfile.Param; public interface NetworkTopology { - List findOrDeployVirtualRouterInGuestNetwork(final Network guestNetwork, final DeployDestination dest, Account owner, final boolean isRedundant, - final Map params) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; - StringBuilder createGuestBootLoadArgs(final NicProfile guestNic, final String defaultDns1, final String defaultDns2, DomainRouterVO router); String retrieveGuestDhcpRange(final NicProfile guestNic, final Network guestNetwork, final DataCenter dc); @@ -76,4 +68,10 @@ public interface NetworkTopology { String[] applyVpnUsers(final Network network, final List users, final List routers) throws ResourceUnavailableException; boolean savePasswordToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List routers) throws ResourceUnavailableException; + + boolean saveSSHPublicKeyToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List routers, + final String sshPublicKey) throws ResourceUnavailableException; + + boolean saveUserDataToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List routers) + throws ResourceUnavailableException; } \ No newline at end of file