From b14f42665ed586737eca6245d56d38846c1f7725 Mon Sep 17 00:00:00 2001 From: Wilder Rodrigues Date: Tue, 15 Jul 2014 15:56:02 +0200 Subject: [PATCH] adding password to router rules; moving the advance code to the advance net topology. Conflicts: server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java --- .../network/element/VirtualRouterElement.java | 6 ++- .../network/rules/PasswordToRouterRules.java | 33 +++++++++++++- .../rules/VirtualNetworkApplianceFactory.java | 10 +++++ .../topology/AdvancedNetworkTopology.java | 44 +++++++++---------- .../topology/BasicNetworkTopology.java | 28 ++++++++++-- .../network/topology/BasicNetworkVisitor.java | 13 +++++- .../network/topology/NetworkTopology.java | 2 + 7 files changed, 104 insertions(+), 32 deletions(-) diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index bb95c965ea6..dc9eba52eb1 100755 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -727,7 +727,11 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl userVmVO.setUpdateParameters(true); _userVmDao.update(userVmVO.getId(), userVmVO); - return true; + + DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId()); + NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + + return networkTopology.savePasswordToRouter(network, nic, uservm, routers); } @Override diff --git a/server/src/com/cloud/network/rules/PasswordToRouterRules.java b/server/src/com/cloud/network/rules/PasswordToRouterRules.java index f2b681ccd26..5bbee19bcdf 100644 --- a/server/src/com/cloud/network/rules/PasswordToRouterRules.java +++ b/server/src/com/cloud/network/rules/PasswordToRouterRules.java @@ -19,10 +19,16 @@ 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.utils.PasswordGenerator; import com.cloud.vm.NicProfile; +import com.cloud.vm.NicVO; import com.cloud.vm.VirtualMachineProfile; public class PasswordToRouterRules extends RuleApplier { @@ -30,6 +36,8 @@ public class PasswordToRouterRules extends RuleApplier { private final NicProfile nic; private final VirtualMachineProfile profile; + private NicVO nicVo; + public PasswordToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) { super(network); @@ -40,15 +48,36 @@ public class PasswordToRouterRules extends RuleApplier { @Override public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException { this.router = router; + // for basic zone, send vm data/password information only to the router in the same pod + nicVo = nicDao.findById(nic.getId()); 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 NicVO getNicVo() { + return nicVo; + } } \ 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 6cca42b186d..cc57830677e 100644 --- a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java +++ b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java @@ -35,7 +35,9 @@ 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.vm.NicProfile; import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; @@ -142,4 +144,12 @@ public class VirtualNetworkApplianceFactory { return vpnRules; } + + public PasswordToRouterRules createPasswordToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) { + PasswordToRouterRules routerRules = new PasswordToRouterRules(network, nic, profile); + + initBeans(routerRules); + + return routerRules; + } } \ No newline at end of file diff --git a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java index 2d491d5d414..21ccbb1c3e7 100644 --- a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java @@ -20,6 +20,10 @@ package org.apache.cloudstack.network.topology; import java.util.List; import java.util.Map; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + import com.cloud.dc.DataCenter; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; @@ -38,23 +42,18 @@ import com.cloud.vm.VirtualMachineProfile.Param; public class AdvancedNetworkTopology implements NetworkTopology { @Override - public List findOrDeployVirtualRouterInGuestNetwork( - final Network guestNetwork, final DeployDestination dest, final Account owner, - final boolean isRedundant, final Map params) - throws ConcurrentOperationException, InsufficientCapacityException, - ResourceUnavailableException { + public List findOrDeployVirtualRouterInGuestNetwork(final Network guestNetwork, final DeployDestination dest, final Account owner, final boolean isRedundant, + final Map params) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { return null; } @Override - public StringBuilder createGuestBootLoadArgs(final NicProfile guestNic, - final String defaultDns1, final String defaultDns2, final DomainRouterVO router) { + public StringBuilder createGuestBootLoadArgs(final NicProfile guestNic, final String defaultDns1, final String defaultDns2, final DomainRouterVO router) { return null; } @Override - public String retrieveGuestDhcpRange(final NicProfile guestNic, - final Network guestNetwork, final DataCenter dc) { + public String retrieveGuestDhcpRange(final NicProfile guestNic, final Network guestNetwork, final DataCenter dc) { return null; } @@ -64,32 +63,26 @@ public class AdvancedNetworkTopology implements NetworkTopology { } @Override - public boolean configDhcpForSubnet(final Network network, final NicProfile nic, - final VirtualMachineProfile profile, final DeployDestination dest, + public boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers) throws ResourceUnavailableException { return false; } @Override - public boolean applyDhcpEntry(final Network network, final NicProfile nic, - final VirtualMachineProfile profile, final DeployDestination dest, + public boolean applyDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers) throws ResourceUnavailableException { return false; } @Override - public boolean applyUserData(final Network network, final NicProfile nic, - final VirtualMachineProfile profile, final DeployDestination dest, - final List routers) throws ResourceUnavailableException { + public boolean applyUserData(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers) + throws ResourceUnavailableException { return false; } @Override - public boolean applyRules(final Network network, - final List routers, final String typeString, - final boolean isPodLevelException, final Long podId, - final boolean failWhenDisconnect, final RuleApplier applier) - throws ResourceUnavailableException { + public boolean applyRules(final Network network, final List routers, final String typeString, final boolean isPodLevelException, final Long podId, + final boolean failWhenDisconnect, final RuleApplier applier) throws ResourceUnavailableException { AdvancedNetworkVisitor visitor = new AdvancedNetworkVisitor(this); applier.accept(visitor, null); @@ -98,10 +91,15 @@ public class AdvancedNetworkTopology implements NetworkTopology { } @Override - public boolean sendCommandsToRouter(VirtualRouter router, - List rules, long id) { + public boolean sendCommandsToRouter(final VirtualRouter router, final List rules, final long id) { // TODO Auto-generated method stub return false; } + private static final Logger s_logger = Logger.getLogger(AdvancedNetworkTopology.class); + + @Autowired + @Qualifier("advancedNetworkVisitor") + protected AdvancedNetworkVisitor advancedVisitor; + } \ 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 41b3a25125b..3d599863626 100644 --- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java @@ -47,6 +47,7 @@ import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRules; import com.cloud.network.rules.IpAssociationRules; 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.StaticNat; @@ -56,9 +57,11 @@ import com.cloud.network.rules.VpnRules; import com.cloud.user.Account; import com.cloud.vm.DomainRouterVO; 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 { @@ -71,16 +74,15 @@ public class BasicNetworkTopology implements NetworkTopology { @Qualifier("basicNetworkVisitor") protected BasicNetworkVisitor basicVisitor; - @Autowired - @Qualifier("advancedNetworkVisitor") - protected AdvancedNetworkVisitor advancedVisitor; - @Inject protected DataCenterDao _dcDao; @Inject protected HostDao _hostDao; + @Inject + protected UserVmDao _userVmDao; + @Override public List findOrDeployVirtualRouterInGuestNetwork(final Network guestNetwork, final DeployDestination dest, final Account owner, final boolean isRedundant, final Map params) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { @@ -239,6 +241,24 @@ public class BasicNetworkTopology implements NetworkTopology { return result; } + @Override + public boolean savePasswordToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List routers) + throws ResourceUnavailableException { + + _userVmDao.loadDetails((UserVmVO) profile.getVirtualMachine()); + + s_logger.debug("SAVE PASSWORD TO ROUTE RULES"); + + final String typeString = "save password entry"; + final boolean isPodLevelException = false; + final boolean failWhenDisconnect = false; + final Long podId = null; + + PasswordToRouterRules routerRules = virtualNetworkApplianceFactory.createPasswordToRouterRules(network, nic, profile); + + return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper(routerRules)); + } + @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 cc154043e09..ef3f7c7ef0b 100644 --- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java +++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java @@ -51,6 +51,8 @@ import com.cloud.network.rules.UserdataToRouterRules; import com.cloud.network.rules.VpcIpAssociationRules; import com.cloud.network.rules.VpnRules; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.NicVO; +import com.cloud.vm.VirtualMachineProfile; @Component public class BasicNetworkVisitor extends NetworkTopologyVisitor { @@ -156,8 +158,15 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor { } @Override - public boolean visit(final PasswordToRouterRules nat) throws ResourceUnavailableException { - return false; + public boolean visit(final PasswordToRouterRules passwd) throws ResourceUnavailableException { + VirtualRouter router = passwd.getRouter(); + NicVO nicVo = passwd.getNicVo(); + VirtualMachineProfile profile = passwd.getProfile(); + + Commands cmds = new Commands(Command.OnError.Stop); + passwd.createPasswordCommand(router, profile, nicVo, cmds); + + return applianceManager.sendCommandsToRouter(router, cmds); } @Override diff --git a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java index 54531d6d1b7..7d5c470a808 100644 --- a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java +++ b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java @@ -74,4 +74,6 @@ public interface NetworkTopology { boolean associatePublicIP(final Network network, final List ipAddress, final List routers) throws ResourceUnavailableException; 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; } \ No newline at end of file