diff --git a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index 37004d29866..5cfc802703f 100644
--- a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -186,9 +186,6 @@
-
-
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index 4481a2025f1..0fd22bd119a 100755
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -42,6 +42,7 @@ import com.cloud.configuration.ConfigurationManager;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@@ -154,6 +155,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
OvsProviderDao _ovsProviderDao;
@Inject
IPAddressDao _ipAddressDao;
+ @Inject
+ DataCenterDao _dcDao;
@Inject
NetworkTopologyContext networkTopologyContext;
@@ -291,7 +294,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
if (endChar != null) {
boolean matchedEndChar = false;
if (str.length() < 2) {
- return false; // atleast one numeric and one char. example:
+ return false; // at least one numeric and one char. example:
}
// 3h
char strEnd = str.toCharArray()[str.length() - 1];
@@ -712,7 +715,6 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
// If any router is running then send save password command otherwise
@@ -750,7 +752,6 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
@@ -770,7 +771,6 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
@@ -913,7 +913,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}
- @SuppressWarnings("unchecked")
+
VirtualMachineProfile uservm = vm;
List routers = getRouters(network, dest);
@@ -922,7 +922,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
- return _routerMgr.configDhcpForSubnet(network, nic, uservm, dest, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.configDhcpForSubnet(network, nic, uservm, dest, routers);
}
return false;
}
@@ -951,7 +954,6 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
return false;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List routers = getRouters(network, dest);
@@ -963,7 +965,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
- return _routerMgr.applyDhcpEntry(network, nic, uservm, dest, routers);
+ return networkTopology.applyDhcpEntry(network, nic, uservm, dest, routers);
}
return false;
}
@@ -981,7 +983,6 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List routers = getRouters(network, dest);
@@ -1122,7 +1123,15 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
- _routerMgr.setupDhcpForPvlan(false, router, router.getHostId(), nic);
+
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ try {
+ networkTopology.setupDhcpForPvlan(false, router, router.getHostId(), nic);
+ } catch (ResourceUnavailableException e) {
+ s_logger.warn("Timed Out", e);
+ }
} else if (vm.getType() == VirtualMachine.Type.User) {
assert vm instanceof UserVmVO;
UserVmVO userVm = (UserVmVO) vm.getVirtualMachine();
@@ -1139,7 +1148,15 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
- _routerMgr.setupDhcpForPvlan(true, router, router.getHostId(), nic);
+
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ try {
+ networkTopology.setupDhcpForPvlan(true, router, router.getHostId(), nic);
+ } catch (ResourceUnavailableException e) {
+ s_logger.warn("Timed Out", e);
+ }
} else if (vm.getType() == VirtualMachine.Type.User) {
assert vm instanceof UserVmVO;
UserVmVO userVm = (UserVmVO) vm.getVirtualMachine();
@@ -1155,7 +1172,15 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
- _routerMgr.setupDhcpForPvlan(true, router, router.getHostId(), nic);
+
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ try {
+ networkTopology.setupDhcpForPvlan(true, router, router.getHostId(), nic);
+ } catch (ResourceUnavailableException e) {
+ s_logger.warn("Timed Out", e);
+ }
} else if (vm.getType() == VirtualMachine.Type.User) {
assert vm instanceof UserVmVO;
UserVmVO userVm = (UserVmVO) vm.getVirtualMachine();
diff --git a/server/src/com/cloud/network/router/NEWVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/NEWVirtualNetworkApplianceManagerImpl.java
deleted file mode 100644
index 7e416abdfcb..00000000000
--- a/server/src/com/cloud/network/router/NEWVirtualNetworkApplianceManagerImpl.java
+++ /dev/null
@@ -1,301 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.network.router;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.log4j.Logger;
-
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.manager.Commands;
-import com.cloud.deploy.DeployDestination;
-import com.cloud.exception.AgentUnavailableException;
-import com.cloud.exception.ConcurrentOperationException;
-import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.OperationTimedoutException;
-import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.maint.Version;
-import com.cloud.network.Network;
-import com.cloud.network.RemoteAccessVpn;
-import com.cloud.network.VirtualNetworkApplianceService;
-import com.cloud.user.Account;
-import com.cloud.user.User;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.vm.DomainRouterVO;
-import com.cloud.vm.VirtualMachineProfile.Param;
-
-
-/**
- * NetworkManager manages the network for the different end users.
- *
- */
-@Local(value = { NEWVirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class })
-public class NEWVirtualNetworkApplianceManagerImpl implements NEWVirtualNetworkApplianceManager {
-
- private static final Logger s_logger = Logger.getLogger(NEWVirtualNetworkApplianceManagerImpl.class);
-
- static final ConfigKey routerVersionCheckEnabled = new ConfigKey("Advanced", Boolean.class, "router.version.check", "true",
- "If true, router minimum required version is checked before sending command", false);
-
- @Inject
- private AgentManager _agentMgr;
-
- @Override
- public String getName() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void setName(final String name) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setConfigParams(final Map params) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public Map getConfigParams() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int getRunLevel() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public void setRunLevel(final int level) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean configure(final String name, final Map params)
- throws ConfigurationException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean start() {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean stop() {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public VirtualRouter startRouter(final long routerId, final boolean reprogramNetwork)
- throws ConcurrentOperationException, ResourceUnavailableException,
- InsufficientCapacityException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public VirtualRouter rebootRouter(final long routerId, final boolean reprogramNetwork)
- throws ConcurrentOperationException, ResourceUnavailableException,
- InsufficientCapacityException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public VirtualRouter upgradeRouter(final UpgradeRouterCmd cmd) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public VirtualRouter stopRouter(final long routerId, final boolean forced)
- throws ResourceUnavailableException, ConcurrentOperationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public VirtualRouter startRouter(final long id)
- throws ResourceUnavailableException, InsufficientCapacityException,
- ConcurrentOperationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public VirtualRouter destroyRouter(final long routerId, final Account caller,
- final Long callerUserId) throws ResourceUnavailableException,
- ConcurrentOperationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public VirtualRouter findRouter(final long routerId) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public List upgradeRouterTemplate(final UpgradeRouterTemplateCmd cmd) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public List deployVirtualRouterInGuestNetwork(
- final Network guestNetwork, final DeployDestination dest, final Account owner,
- final Map params, final boolean isRedundant)
- throws InsufficientCapacityException, ResourceUnavailableException,
- ConcurrentOperationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean startRemoteAccessVpn(final Network network, final RemoteAccessVpn vpn,
- final List extends VirtualRouter> routers)
- throws ResourceUnavailableException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean deleteRemoteAccessVpn(final Network network, final RemoteAccessVpn vpn,
- final List extends VirtualRouter> routers)
- throws ResourceUnavailableException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public List getRoutersForNetwork(final long networkId) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public VirtualRouter stop(final VirtualRouter router, final boolean forced,
- final User callingUser, final Account callingAccount)
- throws ConcurrentOperationException, ResourceUnavailableException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public String getDnsBasicZoneUpdate() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean removeDhcpSupportForSubnet(final Network network,
- final List routers) throws ResourceUnavailableException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean prepareAggregatedExecution(final Network network,
- final List routers) throws AgentUnavailableException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean completeAggregatedExecution(final Network network,
- final List routers) throws AgentUnavailableException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean cleanupAggregatedExecution(final Network network,
- final List routers) throws AgentUnavailableException {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean sendCommandsToRouter(final VirtualRouter router, final Commands cmds) throws AgentUnavailableException {
- if(!checkRouterVersion(router)){
- s_logger.debug("Router requires upgrade. Unable to send command to router:" + router.getId() + ", router template version : " + router.getTemplateVersion()
- + ", minimal required version : " + MinVRVersion);
- throw new CloudRuntimeException("Unable to send command. Upgrade in progress. Please contact administrator.");
- }
- Answer[] answers = null;
- try {
- answers = _agentMgr.send(router.getHostId(), cmds);
- } catch (final OperationTimedoutException e) {
- s_logger.warn("Timed Out", e);
- throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e);
- }
-
- if (answers == null) {
- return false;
- }
-
- if (answers.length != cmds.size()) {
- return false;
- }
-
- // FIXME: Have to return state for individual command in the future
- boolean result = true;
- if (answers.length > 0) {
- for (final Answer answer : answers) {
- if (!answer.getResult()) {
- result = false;
- break;
- }
- }
- }
- return result;
- }
-
- // Checks if the router is at the required version
- // Compares MS version and router version
- protected boolean checkRouterVersion(final VirtualRouter router) {
- if(!routerVersionCheckEnabled.value()){
- //Router version check is disabled.
- return true;
- }
- if(router.getTemplateVersion() == null){
- return false;
- }
- final String trimmedVersion = Version.trimRouterVersion(router.getTemplateVersion());
- return (Version.compare(trimmedVersion, MinVRVersion) >= 0);
- }
-}
\ No newline at end of file
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
index 857cfe90e7b..f5b5096187f 100644
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -20,26 +20,22 @@ import java.util.List;
import org.apache.cloudstack.framework.config.ConfigKey;
-import com.cloud.deploy.DeployDestination;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VirtualNetworkApplianceService;
-import com.cloud.network.VpnUser;
import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.component.Manager;
import com.cloud.vm.DomainRouterVO;
-import com.cloud.vm.NicProfile;
-import com.cloud.vm.VirtualMachineProfile;
/**
* NetworkManager manages the network for the different end users.
- *
*/
public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkApplianceService {
+
static final String RouterTemplateXenCK = "router.template.xenserver";
static final String RouterTemplateKvmCK = "router.template.kvm";
static final String RouterTemplateVmwareCK = "router.template.vmware";
@@ -75,8 +71,11 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
* @param hostId
* @param pubKey
* @param prvKey
+ *
+ * NOT USED IN THE VIRTUAL NET APPLIANCE
+ *
*/
- boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey);
+ //boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey):
boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List extends VirtualRouter> routers) throws ResourceUnavailableException;
@@ -84,19 +83,12 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
List getRoutersForNetwork(long networkId);
- String[] applyVpnUsers(Network network, List extends VpnUser> users, List routers) throws ResourceUnavailableException;
-
VirtualRouter stop(VirtualRouter router, boolean forced, User callingUser, Account callingAccount) throws ConcurrentOperationException, ResourceUnavailableException;
String getDnsBasicZoneUpdate();
- boolean configDhcpForSubnet(Network network, NicProfile nic, VirtualMachineProfile uservm, DeployDestination dest, List routers)
- throws ResourceUnavailableException;
-
boolean removeDhcpSupportForSubnet(Network network, List routers) throws ResourceUnavailableException;
- boolean setupDhcpForPvlan(boolean add, DomainRouterVO router, Long hostId, NicProfile nic);
-
public boolean prepareAggregatedExecution(Network network, List routers) throws AgentUnavailableException;
public boolean completeAggregatedExecution(Network network, List routers) throws AgentUnavailableException;
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
old mode 100755
new mode 100644
index e95a079b7c0..5986a37a570
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -56,6 +56,8 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.cloudstack.network.topology.NetworkTopology;
+import org.apache.cloudstack.network.topology.NetworkTopologyContext;
import org.apache.cloudstack.utils.identity.ManagementServerNode;
import org.apache.log4j.Logger;
import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder;
@@ -74,10 +76,8 @@ import com.cloud.agent.api.Command;
import com.cloud.agent.api.GetDomRVersionAnswer;
import com.cloud.agent.api.GetDomRVersionCmd;
import com.cloud.agent.api.GetRouterAlertsAnswer;
-import com.cloud.agent.api.ModifySshKeysCommand;
import com.cloud.agent.api.NetworkUsageAnswer;
import com.cloud.agent.api.NetworkUsageCommand;
-import com.cloud.agent.api.PvlanSetupCommand;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.check.CheckSshCommand;
import com.cloud.agent.api.routing.AggregationControlCommand;
@@ -92,7 +92,6 @@ import com.cloud.agent.api.routing.IpAssocCommand;
import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand;
-import com.cloud.agent.api.routing.SavePasswordCommand;
import com.cloud.agent.api.routing.SetFirewallRulesCommand;
import com.cloud.agent.api.routing.SetMonitorServiceCommand;
import com.cloud.agent.api.routing.SetPortForwardingRulesCommand;
@@ -120,9 +119,6 @@ import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
-import com.cloud.dc.Pod;
-import com.cloud.dc.Vlan;
-import com.cloud.dc.VlanVO;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
@@ -133,7 +129,6 @@ import com.cloud.event.EventTypes;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.ConnectionException;
-import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
import com.cloud.exception.InvalidParameterValueException;
@@ -228,7 +223,6 @@ import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.user.dao.UserStatsLogDao;
import com.cloud.uservm.UserVm;
import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.PasswordGenerator;
import com.cloud.utils.StringUtils;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.component.ManagerBase;
@@ -389,6 +383,9 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
@Inject
OpRouterMonitorServiceDao _opRouterMonitorServiceDao;
+ @Inject
+ NetworkTopologyContext networkTopologyContext;
+
@Inject
protected NetworkGeneralHelper nwHelper;
@Inject
@@ -425,18 +422,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
BlockingQueue _vrUpdateQueue = null;
- @Override
- public boolean sendSshKeysToHost(final Long hostId, final String pubKey, final String prvKey) {
- final ModifySshKeysCommand cmd = new ModifySshKeysCommand(pubKey, prvKey);
- final Answer answer = _agentMgr.easySend(hostId, cmd);
-
- if (answer != null) {
- return true;
- } else {
- return false;
- }
- }
-
@Override
public VirtualRouter destroyRouter(final long routerId, final Account caller, final Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
return nwHelper.destroyRouter(routerId, caller, callerUserId);
@@ -1712,37 +1697,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
return dhcpRange;
}
- @Override
- public boolean setupDhcpForPvlan(final boolean add, final DomainRouterVO router, final Long hostId, final NicProfile nic) {
- if (!nic.getBroadCastUri().getScheme().equals("pvlan")) {
- return false;
- }
- String op = "add";
- if (!add) {
- op = "delete";
- }
- final Network network = _networkDao.findById(nic.getNetworkId());
- final String networkTag = _networkModel.getNetworkTag(router.getHypervisorType(), network);
- final PvlanSetupCommand cmd = PvlanSetupCommand.createDhcpSetup(op, nic.getBroadCastUri(), networkTag, router.getInstanceName(), nic.getMacAddress(), nic.getIp4Address());
- // In fact we send command to the host of router, we're not programming
- // router but the host
- Answer answer = null;
- try {
- answer = _agentMgr.send(hostId, cmd);
- } catch (final OperationTimedoutException e) {
- s_logger.warn("Timed Out", e);
- return false;
- } catch (final AgentUnavailableException e) {
- s_logger.warn("Agent Unavailable ", e);
- return false;
- }
-
- if (answer == null || !answer.getResult()) {
- return false;
- }
- return true;
- }
-
@Override
public boolean finalizeDeployment(final Commands cmds, final VirtualMachineProfile profile, final DeployDestination dest, final ReservationContext context)
throws ResourceUnavailableException {
@@ -2159,11 +2113,20 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
final List extends Nic> routerNics = _nicDao.listByVmId(profile.getId());
for (final Nic nic : routerNics) {
final Network network = _networkModel.getNetwork(nic.getNetworkId());
+
+ final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+
if (network.getTrafficType() == TrafficType.Guest) {
guestNetworks.add(network);
if (nic.getBroadcastUri().getScheme().equals("pvlan")) {
final NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), 0, false, "pvlan-nic");
- result = setupDhcpForPvlan(true, router, router.getHostId(), nicProfile);
+
+ final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+ try {
+ result = networkTopology.setupDhcpForPvlan(true, router, router.getHostId(), nicProfile);
+ } catch (final ResourceUnavailableException e) {
+ s_logger.debug("ERROR in finalizeStart: ", e);
+ }
}
}
}
@@ -2186,9 +2149,17 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
final List extends Nic> routerNics = _nicDao.listByVmId(profile.getId());
for (final Nic nic : routerNics) {
final Network network = _networkModel.getNetwork(nic.getNetworkId());
+ final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+
if (network.getTrafficType() == TrafficType.Guest && nic.getBroadcastUri() != null && nic.getBroadcastUri().getScheme().equals("pvlan")) {
final NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), 0, false, "pvlan-nic");
- setupDhcpForPvlan(false, domR, domR.getHostId(), nicProfile);
+
+ final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+ try {
+ networkTopology.setupDhcpForPvlan(false, domR, domR.getHostId(), nicProfile);
+ } catch (final ResourceUnavailableException e) {
+ s_logger.debug("ERROR in finalizeStop: ", e);
+ }
}
}
@@ -2277,96 +2248,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
}
- @Override
- public boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest,
- final List routers) throws ResourceUnavailableException {
- final UserVmVO vm = _userVmDao.findById(profile.getId());
- _userVmDao.loadDetails(vm);
-
- // Asuming we have only one router per network For Now.
- final DomainRouterVO router = routers.get(0);
- if (router.getState() != State.Running) {
- s_logger.warn("Failed to configure dhcp: router not in running state");
- throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId());
- }
- // check if this is not the primary subnet.
- final NicVO domr_guest_nic = _nicDao.findByInstanceIdAndIpAddressAndVmtype(router.getId(), _nicDao.getIpAddress(nic.getNetworkId(), router.getId()),
- VirtualMachine.Type.DomainRouter);
- // check if the router ip address and the vm ip address belong to same
- // subnet.
- // if they do not belong to same netwoek check for the alias ips. if not
- // create one.
- // This should happen only in case of Basic and Advanced SG enabled
- // networks.
- if (!NetUtils.sameSubnet(domr_guest_nic.getIp4Address(), nic.getIp4Address(), nic.getNetmask())) {
- final List aliasIps = _nicIpAliasDao.listByNetworkIdAndState(domr_guest_nic.getNetworkId(), NicIpAlias.state.active);
- boolean ipInVmsubnet = false;
- for (final NicIpAliasVO alias : aliasIps) {
- // check if any of the alias ips belongs to the Vm's subnet.
- if (NetUtils.sameSubnet(alias.getIp4Address(), nic.getIp4Address(), nic.getNetmask())) {
- ipInVmsubnet = true;
- break;
- }
- }
- PublicIp routerPublicIP = null;
- String routerAliasIp = null;
- final DataCenter dc = _dcDao.findById(router.getDataCenterId());
- if (ipInVmsubnet == false) {
- try {
- if (network.getTrafficType() == TrafficType.Guest && network.getGuestType() == GuestType.Shared) {
- _podDao.findById(vm.getPodIdToDeployIn());
- final Account caller = CallContext.current().getCallingAccount();
- final List vlanList = _vlanDao.listVlansByNetworkIdAndGateway(network.getId(), nic.getGateway());
- final List vlanDbIdList = new ArrayList();
- for (final VlanVO vlan : vlanList) {
- vlanDbIdList.add(vlan.getId());
- }
- if (dc.getNetworkType() == NetworkType.Basic) {
- routerPublicIP = _ipAddrMgr.assignPublicIpAddressFromVlans(router.getDataCenterId(), vm.getPodIdToDeployIn(), caller, Vlan.VlanType.DirectAttached,
- vlanDbIdList, nic.getNetworkId(), null, false);
- } else {
- routerPublicIP = _ipAddrMgr.assignPublicIpAddressFromVlans(router.getDataCenterId(), null, caller, Vlan.VlanType.DirectAttached, vlanDbIdList,
- nic.getNetworkId(), null, false);
- }
-
- routerAliasIp = routerPublicIP.getAddress().addr();
- }
- } catch (final InsufficientAddressCapacityException e) {
- s_logger.info(e.getMessage());
- s_logger.info("unable to configure dhcp for this VM.");
- return false;
- }
- // this means we did not create a ip alis on the router.
- final NicIpAliasVO alias = new NicIpAliasVO(domr_guest_nic.getId(), routerAliasIp, router.getId(), CallContext.current().getCallingAccountId(),
- network.getDomainId(), nic.getNetworkId(), nic.getGateway(), nic.getNetmask());
- alias.setAliasCount(routerPublicIP.getIpMacAddress());
- _nicIpAliasDao.persist(alias);
- final List ipaliasTo = new ArrayList();
- ipaliasTo.add(new IpAliasTO(routerAliasIp, alias.getNetmask(), alias.getAliasCount().toString()));
- final Commands cmds = new Commands(Command.OnError.Stop);
- createIpAlias(router, ipaliasTo, alias.getNetworkId(), cmds);
- // also add the required configuration to the dnsmasq for
- // supporting dhcp and dns on the new ip.
- configDnsMasq(router, network, cmds);
- final boolean result = sendCommandsToRouter(router, cmds);
- if (result == false) {
- final NicIpAliasVO ipAliasVO = _nicIpAliasDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
- final PublicIp routerPublicIPFinal = routerPublicIP;
- Transaction.execute(new TransactionCallbackNoReturn() {
- @Override
- public void doInTransactionWithoutResult(final TransactionStatus status) {
- _nicIpAliasDao.expunge(ipAliasVO.getId());
- _ipAddressDao.unassignIpAddress(routerPublicIPFinal.getId());
- }
- });
- throw new CloudRuntimeException("failed to configure ip alias on the router as a part of dhcp config");
- }
- }
- return true;
- }
- return true;
- }
-
@Override
public boolean removeDhcpSupportForSubnet(final Network network, final List routers) throws ResourceUnavailableException {
if (routers == null || routers.isEmpty()) {
@@ -2477,45 +2358,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
cmds.addCommand("users", cmd);
}
- @Override
- // FIXME add partial success and STOP state support
- public String[] applyVpnUsers(final Network network, final List extends VpnUser> users, final List routers) throws ResourceUnavailableException {
- if (routers == null || routers.isEmpty()) {
- s_logger.warn("Failed to add/remove VPN users: no router found for account and zone");
- throw new ResourceUnavailableException("Unable to assign ip addresses, domR doesn't exist for network " + network.getId(), DataCenter.class, network.getDataCenterId());
- }
-
- boolean agentResults = true;
-
- for (final DomainRouterVO router : routers) {
- if (router.getState() != State.Running) {
- s_logger.warn("Failed to add/remove VPN users: router not in running state");
- throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class,
- network.getDataCenterId());
- }
-
- final Commands cmds = new Commands(Command.OnError.Continue);
- createApplyVpnUsersCommand(users, router, cmds);
-
- // Currently we receive just one answer from the agent. In the
- // future we have to parse individual answers and set
- // results accordingly
- final boolean agentResult = sendCommandsToRouter(router, cmds);
- agentResults = agentResults && agentResult;
- }
-
- final String[] result = new String[users.size()];
- for (int i = 0; i < result.length; i++) {
- if (agentResults) {
- result[i] = null;
- } else {
- result[i] = String.valueOf(agentResults);
- }
- }
-
- return result;
- }
-
@Override
@ActionEvent(eventType = EventTypes.EVENT_ROUTER_START, eventDescription = "starting router Vm", async = true)
public VirtualRouter startRouter(final long id) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException {
@@ -2813,25 +2655,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
cmds.addCommand("startVpn", startVpnCmd);
}
- private 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, getRouterControlIp(router.getId()));
- cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, 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);
- }
-
- }
-
private 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();
@@ -2953,7 +2776,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
}
- protected boolean sendCommandsToRouter(final VirtualRouter router, final Commands cmds) throws AgentUnavailableException {
+ @Override
+ public boolean sendCommandsToRouter(final VirtualRouter router, final Commands cmds) throws AgentUnavailableException {
if (!nwHelper.checkRouterVersion(router)) {
s_logger.debug("Router requires upgrade. Unable to send command to router:" + router.getId() + ", router template version : " + router.getTemplateVersion()
+ ", minimal required version : " + MinVRVersion);
@@ -3038,24 +2862,6 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
}
- protected boolean sendLBRules(final VirtualRouter router, final List rules, final long guestNetworkId) throws ResourceUnavailableException {
- final Commands cmds = new Commands(Command.OnError.Continue);
- createApplyLoadBalancingRulesCommands(rules, router, cmds, guestNetworkId);
- return sendCommandsToRouter(router, cmds);
- }
-
- protected boolean sendPortForwardingRules(final VirtualRouter router, final List rules, final long guestNetworkId) throws ResourceUnavailableException {
- final Commands cmds = new Commands(Command.OnError.Continue);
- createApplyPortForwardingRulesCommands(rules, router, cmds, guestNetworkId);
- return sendCommandsToRouter(router, cmds);
- }
-
- protected boolean sendStaticNatRules(final VirtualRouter router, final List rules, final long guestNetworkId) throws ResourceUnavailableException {
- final Commands cmds = new Commands(Command.OnError.Continue);
- createApplyStaticNatRulesCommands(rules, router, cmds, guestNetworkId);
- return sendCommandsToRouter(router, cmds);
- }
-
@Override
public List getRoutersForNetwork(final long networkId) {
final List routers = _routerDao.findByNetwork(networkId);
@@ -3109,110 +2915,11 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
cmds.addCommand(cmd);
}
- protected boolean sendFirewallRules(final VirtualRouter router, final List rules, final long guestNetworkId) throws ResourceUnavailableException {
- final Commands cmds = new Commands(Command.OnError.Continue);
- createFirewallRulesCommands(rules, router, cmds, guestNetworkId);
- return sendCommandsToRouter(router, cmds);
- }
-
@Override
public String getDnsBasicZoneUpdate() {
return _dnsBasicZoneUpdates;
}
- protected interface RuleApplier {
- boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException;
- }
-
- protected boolean applyRules(final Network network, final List extends VirtualRouter> routers, final String typeString, final boolean isPodLevelException, final Long podId,
- final boolean failWhenDisconnect, final RuleApplier applier) throws ResourceUnavailableException {
- if (routers == null || routers.isEmpty()) {
- s_logger.warn("Unable to apply " + typeString + ", virtual router doesn't exist in the network " + network.getId());
- throw new ResourceUnavailableException("Unable to apply " + typeString, DataCenter.class, network.getDataCenterId());
- }
-
- final DataCenter dc = _dcDao.findById(network.getDataCenterId());
- final boolean isZoneBasic = dc.getNetworkType() == NetworkType.Basic;
-
- // isPodLevelException and podId is only used for basic zone
- assert !(!isZoneBasic && isPodLevelException || isZoneBasic && isPodLevelException && podId == null);
-
- final List connectedRouters = new ArrayList();
- final List disconnectedRouters = new ArrayList();
- boolean result = true;
- final String msg = "Unable to apply " + typeString + " on disconnected router ";
- for (final VirtualRouter router : routers) {
- if (router.getState() == State.Running) {
- s_logger.debug("Applying " + typeString + " in network " + network);
-
- if (router.isStopPending()) {
- if (_hostDao.findById(router.getHostId()).getState() == Status.Up) {
- throw new ResourceUnavailableException("Unable to process due to the stop pending router " + router.getInstanceName()
- + " haven't been stopped after it's host coming back!", DataCenter.class, router.getDataCenterId());
- }
- s_logger.debug("Router " + router.getInstanceName() + " is stop pending, so not sending apply " + typeString + " commands to the backend");
- continue;
- }
-
- try {
- result = applier.execute(network, router);
- connectedRouters.add(router);
- } catch (final AgentUnavailableException e) {
- s_logger.warn(msg + router.getInstanceName(), e);
- disconnectedRouters.add(router);
- }
-
- // If rules fail to apply on one domR and not due to
- // disconnection, no need to proceed with the rest
- if (!result) {
- if (isZoneBasic && isPodLevelException) {
- throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", Pod.class, podId);
- }
- throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", DataCenter.class, router.getDataCenterId());
- }
-
- } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) {
- s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + ", so not sending apply " + typeString + " commands to the backend");
- } else {
- s_logger.warn("Unable to apply " + typeString + ", virtual router is not in the right state " + router.getState());
- if (isZoneBasic && isPodLevelException) {
- throw new ResourceUnavailableException("Unable to apply " + typeString + ", virtual router is not in the right state", Pod.class, podId);
- }
- throw new ResourceUnavailableException("Unable to apply " + typeString + ", virtual router is not in the right state", DataCenter.class, router.getDataCenterId());
- }
- }
-
- if (!connectedRouters.isEmpty()) {
- if (!isZoneBasic && !disconnectedRouters.isEmpty() && disconnectedRouters.get(0).getIsRedundantRouter()) {
- // These disconnected redundant virtual routers are out of sync
- // now, stop them for synchronization
- handleSingleWorkingRedundantRouter(connectedRouters, disconnectedRouters, msg);
- }
- } else if (!disconnectedRouters.isEmpty()) {
- for (final VirtualRouter router : disconnectedRouters) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug(msg + router.getInstanceName() + "(" + router.getId() + ")");
- }
- }
- if (isZoneBasic && isPodLevelException) {
- throw new ResourceUnavailableException(msg, Pod.class, podId);
- }
- throw new ResourceUnavailableException(msg, DataCenter.class, disconnectedRouters.get(0).getDataCenterId());
- }
-
- result = true;
- if (failWhenDisconnect) {
- result = !connectedRouters.isEmpty();
- }
- return result;
- }
-
- protected boolean applyStaticNat(final VirtualRouter router, final List extends StaticNat> rules, final long guestNetworkId) throws ResourceUnavailableException {
- final Commands cmds = new Commands(Command.OnError.Continue);
- createApplyStaticNatCommands(rules, router, cmds, guestNetworkId);
- return sendCommandsToRouter(router, cmds);
- }
-
private void createApplyStaticNatCommands(final List extends StaticNat> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
List rulesTO = new ArrayList();
if (rules != null) {
@@ -3575,4 +3282,9 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
public boolean completeAggregatedExecution(final Network network, final List routers) throws AgentUnavailableException {
return aggregationExecution(Action.Finish, network, routers);
}
+
+ @Override
+ public boolean cleanupAggregatedExecution(final Network network, final List routers) throws AgentUnavailableException {
+ return aggregationExecution(Action.Cleanup, network, routers);
+ }
}
diff --git a/server/src/com/cloud/network/rules/DhcpRules.java b/server/src/com/cloud/network/rules/DhcpRules.java
index 172c198ff85..0ff2462adb2 100644
--- a/server/src/com/cloud/network/rules/DhcpRules.java
+++ b/server/src/com/cloud/network/rules/DhcpRules.java
@@ -19,43 +19,44 @@ package com.cloud.network.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
-import com.cloud.deploy.DeployDestination;
+import com.cloud.agent.api.PvlanSetupCommand;
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.VirtualMachineProfile;
public class DhcpRules extends RuleApplier {
- private final NicProfile nic;
- private final VirtualMachineProfile profile;
- private final DeployDestination destination;
+ private final boolean _isAddPvlan;
+ private final NicProfile _nic;
- public DhcpRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination destination) {
- super(network);
+ private PvlanSetupCommand _setupCommand;
- this.nic = nic;
- this.profile = profile;
- this.destination = destination;
+ public DhcpPvlanRules(final boolean isAddPvlan, final NicProfile nic) {
+ super(null);
+
+ _isAddPvlan = isAddPvlan;
+ _nic = nic;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
- this._router = router;
+ _router = router;
+
+ String op = "add";
+ if (!_isAddPvlan) {
+ op = "delete";
+ }
+
+ final Network network = _networkDao.findById(_nic.getNetworkId());
+ final String networkTag = _networkModel.getNetworkTag(router.getHypervisorType(), network);
+
+ _setupCommand = PvlanSetupCommand.createDhcpSetup(op, _nic.getBroadCastUri(), networkTag, router.getInstanceName(), _nic.getMacAddress(), _nic.getIp4Address());
return visitor.visit(this);
}
- public NicProfile getNic() {
- return nic;
- }
-
- public VirtualMachineProfile getProfile() {
- return profile;
- }
-
- public DeployDestination getDestination() {
- return destination;
+ public PvlanSetupCommand getSetupCommand() {
+ return _setupCommand;
}
}
\ No newline at end of file
diff --git a/server/src/com/cloud/network/rules/DhcpSubNetRules.java b/server/src/com/cloud/network/rules/DhcpSubNetRules.java
index b3374bab97e..e10a92a6ef9 100644
--- a/server/src/com/cloud/network/rules/DhcpSubNetRules.java
+++ b/server/src/com/cloud/network/rules/DhcpSubNetRules.java
@@ -17,45 +17,196 @@
package com.cloud.network.rules;
-import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
+import java.util.ArrayList;
+import java.util.List;
-import com.cloud.deploy.DeployDestination;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.routing.CreateIpAliasCommand;
+import com.cloud.agent.api.routing.DnsMasqConfigCommand;
+import com.cloud.agent.api.routing.IpAliasTO;
+import com.cloud.agent.api.routing.NetworkElementCommand;
+import com.cloud.agent.api.to.DhcpTO;
+import com.cloud.agent.manager.Commands;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.Vlan;
+import com.cloud.dc.VlanVO;
+import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.addr.PublicIp;
import com.cloud.network.router.VirtualRouter;
+import com.cloud.user.Account;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.NicIpAlias;
import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.NicIpAliasVO;
public class DhcpSubNetRules extends RuleApplier {
- private final NicProfile nic;
- private final VirtualMachineProfile profile;
- private final DeployDestination destination;
+ private static final Logger s_logger = Logger.getLogger(DhcpSubNetRules.class);
- public DhcpSubNetRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination destination) {
+ private final NicProfile _nic;
+ private final VirtualMachineProfile _profile;
+
+ private NicIpAliasVO _nicAlias;
+ private String _routerAliasIp;
+
+ public DhcpSubNetRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) {
super(network);
- this.nic = nic;
- this.profile = profile;
- this.destination = destination;
+ _nic = nic;
+ _profile = profile;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
- this._router = router;
+ _router = router;
+
+ final UserVmVO vm = _userVmDao.findById(_profile.getId());
+ _userVmDao.loadDetails(vm);
+
+ //check if this is not the primary subnet.
+ final NicVO domr_guest_nic =
+ _nicDao.findByInstanceIdAndIpAddressAndVmtype(router.getId(), _nicDao.getIpAddress(_nic.getNetworkId(), router.getId()), VirtualMachine.Type.DomainRouter);
+ //check if the router ip address and the vm ip address belong to same subnet.
+ //if they do not belong to same netwoek check for the alias ips. if not create one.
+ // This should happen only in case of Basic and Advanced SG enabled networks.
+ if (!NetUtils.sameSubnet(domr_guest_nic.getIp4Address(), _nic.getIp4Address(), _nic.getNetmask())) {
+ final List aliasIps = _nicIpAliasDao.listByNetworkIdAndState(domr_guest_nic.getNetworkId(), NicIpAlias.state.active);
+ boolean ipInVmsubnet = false;
+ for (final NicIpAliasVO alias : aliasIps) {
+ //check if any of the alias ips belongs to the Vm's subnet.
+ if (NetUtils.sameSubnet(alias.getIp4Address(), _nic.getIp4Address(), _nic.getNetmask())) {
+ ipInVmsubnet = true;
+ break;
+ }
+ }
+
+ PublicIp routerPublicIP = null;
+ final DataCenter dc = _dcDao.findById(router.getDataCenterId());
+ if (ipInVmsubnet == false) {
+ try {
+ if (_network.getTrafficType() == TrafficType.Guest && _network.getGuestType() == GuestType.Shared) {
+ _podDao.findById(vm.getPodIdToDeployIn());
+ final Account caller = CallContext.current().getCallingAccount();
+ final List vlanList = _vlanDao.listVlansByNetworkIdAndGateway(_network.getId(), _nic.getGateway());
+ final List vlanDbIdList = new ArrayList();
+ for (final VlanVO vlan : vlanList) {
+ vlanDbIdList.add(vlan.getId());
+ }
+ if (dc.getNetworkType() == NetworkType.Basic) {
+ routerPublicIP =
+ _ipAddrMgr.assignPublicIpAddressFromVlans(router.getDataCenterId(), vm.getPodIdToDeployIn(), caller, Vlan.VlanType.DirectAttached,
+ vlanDbIdList, _nic.getNetworkId(), null, false);
+ } else {
+ routerPublicIP =
+ _ipAddrMgr.assignPublicIpAddressFromVlans(router.getDataCenterId(), null, caller, Vlan.VlanType.DirectAttached, vlanDbIdList,
+ _nic.getNetworkId(), null, false);
+ }
+
+ _routerAliasIp = routerPublicIP.getAddress().addr();
+ }
+ } catch (final InsufficientAddressCapacityException e) {
+ s_logger.info(e.getMessage());
+ s_logger.info("unable to configure dhcp for this VM.");
+ return false;
+ }
+ //this means we did not create an IP alias on the router.
+ _nicAlias = new NicIpAliasVO(domr_guest_nic.getId(), _routerAliasIp, router.getId(), CallContext.current().getCallingAccountId(), _network.getDomainId(),
+ _nic.getNetworkId(), _nic.getGateway(), _nic.getNetmask());
+ _nicAlias.setAliasCount((routerPublicIP.getIpMacAddress()));
+ _nicIpAliasDao.persist(_nicAlias);
+
+ final boolean result = visitor.visit(this);
+
+ // Clean the routerAliasIp just to make sure it will keep an older value.
+ // The rules classes area created every time a command is issued, but I want to make 100% sure
+ // that the routerAliasIp won't float around.
+ _routerAliasIp = null;
+
+ if (result == false) {
+ final NicIpAliasVO ipAliasVO = _nicIpAliasDao.findByInstanceIdAndNetworkId(_network.getId(), router.getId());
+ final PublicIp routerPublicIPFinal = routerPublicIP;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(final TransactionStatus status) {
+ _nicIpAliasDao.expunge(ipAliasVO.getId());
+ _ipAddressDao.unassignIpAddress(routerPublicIPFinal.getId());
+ }
+ });
+ throw new CloudRuntimeException("failed to configure ip alias on the router as a part of dhcp config");
+ }
+ }
+ return true;
+ }
return visitor.visit(this);
}
- public NicProfile getNic() {
- return nic;
+ public NicIpAliasVO getNicAlias() {
+ return _nicAlias;
}
- public VirtualMachineProfile getProfile() {
- return profile;
+ public String getRouterAliasIp() {
+ return _routerAliasIp;
}
- public DeployDestination getDestination() {
- return destination;
+ public void createIpAlias(final VirtualRouter router, final List ipAliasTOs, final Long networkid, final Commands cmds) {
+
+ final String routerip = _routerControlHelper.getRouterIpInNetwork(networkid, router.getId());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ final CreateIpAliasCommand ipaliasCmd = new CreateIpAliasCommand(routerip, ipAliasTOs);
+ ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ ipaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, routerip);
+ ipaliasCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("ipalias", ipaliasCmd);
+ }
+
+ public void configDnsMasq(final VirtualRouter router, final Network network, final Commands cmds) {
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ final List ipAliasVOList = _nicIpAliasDao.listByNetworkIdAndState(network.getId(), NicIpAlias.state.active);
+ final List ipList = new ArrayList();
+
+ final NicVO router_guest_nic = _nicDao.findByNtwkIdAndInstanceId(network.getId(), router.getId());
+ final String cidr = NetUtils.getCidrFromGatewayAndNetmask(router_guest_nic.getGateway(), router_guest_nic.getNetmask());
+ final String[] cidrPair = cidr.split("\\/");
+ final String cidrAddress = cidrPair[0];
+ final long cidrSize = Long.parseLong(cidrPair[1]);
+ final String startIpOfSubnet = NetUtils.getIpRangeStartIpFromCidr(cidrAddress, cidrSize);
+
+ ipList.add(new DhcpTO(router_guest_nic.getIp4Address(), router_guest_nic.getGateway(), router_guest_nic.getNetmask(), startIpOfSubnet));
+ for (final NicIpAliasVO ipAliasVO : ipAliasVOList) {
+ final DhcpTO DhcpTO = new DhcpTO(ipAliasVO.getIp4Address(), ipAliasVO.getGateway(), ipAliasVO.getNetmask(), ipAliasVO.getStartIpOfSubnet());
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("configDnsMasq : adding ip {" + DhcpTO.getGateway() + ", " + DhcpTO.getNetmask() + ", " + DhcpTO.getRouterIp() + ", " +
+ DhcpTO.getStartIpOfSubnet() + "}");
+ }
+ ipList.add(DhcpTO);
+ ipAliasVO.setVmId(router.getId());
+ }
+ _dcDao.findById(router.getDataCenterId());
+ final DnsMasqConfigCommand dnsMasqConfigCmd = new DnsMasqConfigCommand(ipList);
+ dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId()));
+ dnsMasqConfigCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand("dnsMasqConfig", dnsMasqConfigCmd);
}
}
\ No newline at end of file
diff --git a/server/src/com/cloud/network/rules/RuleApplier.java b/server/src/com/cloud/network/rules/RuleApplier.java
index cc29461406c..110d5da9be6 100644
--- a/server/src/com/cloud/network/rules/RuleApplier.java
+++ b/server/src/com/cloud/network/rules/RuleApplier.java
@@ -26,16 +26,20 @@ 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.dc.dao.HostPodDao;
+import com.cloud.dc.dao.VlanDao;
import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.IpAddressManager;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRulesManager;
-import com.cloud.network.router.NEWVirtualNetworkApplianceManager;
import com.cloud.network.router.NetworkGeneralHelper;
import com.cloud.network.router.RouterControlHelper;
+import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.dao.VpcDao;
@@ -49,11 +53,12 @@ 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.NicIpAliasDao;
import com.cloud.vm.dao.UserVmDao;
public abstract class RuleApplier {
- protected NEWVirtualNetworkApplianceManager _applianceManager;
+ protected VirtualNetworkApplianceManager _applianceManager;
protected NetworkModel _networkModel;
@@ -85,10 +90,20 @@ public abstract class RuleApplier {
protected VpcDao _vpcDao;
+ protected NicIpAliasDao _nicIpAliasDao;
+
+ protected HostPodDao _podDao;
+
+ protected VlanDao _vlanDao;
+
+ protected IPAddressDao _ipAddressDao;
+
protected VpcManager _vpcMgr;
protected VirtualMachineManager _itMgr;
+ protected IpAddressManager _ipAddrMgr;
+
protected Network _network;
protected VirtualRouter _router;
@@ -111,7 +126,7 @@ public abstract class RuleApplier {
return _router;
}
- public NEWVirtualNetworkApplianceManager getApplianceManager() {
+ public VirtualNetworkApplianceManager getApplianceManager() {
return _applianceManager;
}
diff --git a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java
index 356f3bbe657..44c4a9f6260 100644
--- a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java
+++ b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java
@@ -23,18 +23,23 @@ import javax.inject.Inject;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.HostPodDao;
+import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DeployDestination;
+import com.cloud.network.IpAddressManager;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.NetworkGeneralHelper;
import com.cloud.network.router.RouterControlHelper;
+import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.dao.VpcDao;
@@ -47,6 +52,7 @@ 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.NicIpAliasDao;
import com.cloud.vm.dao.UserVmDao;
public class VirtualNetworkApplianceFactory {
@@ -102,9 +108,27 @@ public class VirtualNetworkApplianceFactory {
@Inject
protected FirewallRulesDao _rulesDao;
+ @Inject
+ protected NicIpAliasDao _nicIpAliasDao;
+
+ @Inject
+ protected HostPodDao _podDao;
+
+ @Inject
+ protected VlanDao _vlanDao;
+
+ @Inject
+ protected IPAddressDao _ipAddressDao;
+
@Inject
protected RouterControlHelper _routerControlHelper;
+ @Inject
+ protected VirtualNetworkApplianceManager _applianceManager;
+
+ @Inject
+ protected IpAddressManager _ipAddrMgr;
+
@Inject
protected NetworkGeneralHelper _networkHelper;
@@ -254,4 +278,30 @@ public class VirtualNetworkApplianceFactory {
return networkAclsRules;
}
+
+ public DhcpSubNetRules createDhcpSubNetRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) {
+ DhcpSubNetRules subNetRules = new DhcpSubNetRules(network, nic, profile);
+
+ initBeans(subNetRules);
+
+ subNetRules._vpcDao = _vpcDao;
+ subNetRules._userVmDao = _userVmDao;
+ subNetRules._podDao = _podDao;
+ subNetRules._vlanDao = _vlanDao;
+ subNetRules._nicIpAliasDao = _nicIpAliasDao;
+ subNetRules._ipAddrMgr = _ipAddrMgr;
+ subNetRules._ipAddressDao = _ipAddressDao;
+
+ return subNetRules;
+ }
+
+ public DhcpPvlanRules createDhcpPvlanRules(final boolean isAddPvlan, final NicProfile nic) {
+ DhcpPvlanRules pvlanRules = new DhcpPvlanRules(isAddPvlan, nic);
+
+ initBeans(pvlanRules);
+
+ pvlanRules._networkDao = _networkDao;
+
+ return pvlanRules;
+ }
}
\ 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 a39fed6196c..8b2b55ccc1a 100644
--- a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java
+++ b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkTopology.java
@@ -36,6 +36,7 @@ import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.DhcpEntryRules;
+import com.cloud.network.rules.DhcpSubNetRules;
import com.cloud.network.rules.NetworkAclsRules;
import com.cloud.network.rules.NicPlugInOutRules;
import com.cloud.network.rules.RuleApplier;
@@ -57,6 +58,36 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology {
@Qualifier("advancedNetworkVisitor")
protected AdvancedNetworkVisitor _advancedVisitor;
+ @Override
+ public boolean setupDhcpForPvlan(final boolean isAddPvlan, final DomainRouterVO router, final Long hostId, final NicProfile nic) throws ResourceUnavailableException {
+
+ if (!nic.getBroadCastUri().getScheme().equals("pvlan")) {
+ return false;
+ }
+
+ DhcpPvlanRules pvlanRules = _virtualNetworkApplianceFactory.createDhcpPvlanRules(isAddPvlan, nic);
+
+ return pvlanRules.accept(_advancedVisitor, router);
+ }
+
+ @Override
+ public boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest,
+ final List routers) throws ResourceUnavailableException {
+
+ s_logger.debug("CONFIG DHCP FOR SUBNETS RULES");
+
+ // Asuming we have only one router per network For Now.
+ final DomainRouterVO router = routers.get(0);
+ if (router.getState() != State.Running) {
+ s_logger.warn("Failed to configure dhcp: router not in running state");
+ throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId());
+ }
+
+ DhcpSubNetRules subNetRules = _virtualNetworkApplianceFactory.createDhcpSubNetRules(network, nic, profile);
+
+ return subNetRules.accept(_advancedVisitor, router);
+ }
+
@Override
public boolean applyUserData(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers)
throws ResourceUnavailableException {
@@ -92,12 +123,13 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology {
@Override
public boolean associatePublicIP(final Network network, final List extends PublicIpAddress> ipAddresses, final List extends VirtualRouter> routers)
throws ResourceUnavailableException {
+
if (ipAddresses == null || ipAddresses.isEmpty()) {
s_logger.debug("No ip association rules to be applied for network " + network.getId());
return true;
}
- //only one router is supported in VPC now
+ // only one router is supported in VPC now
VirtualRouter router = routers.get(0);
if (router.getVpcId() == null) {
@@ -127,6 +159,7 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology {
@Override
public boolean applyNetworkACLs(final Network network, final List extends NetworkACLItem> rules, final List extends VirtualRouter> routers, final boolean isPrivateGateway)
throws ResourceUnavailableException {
+
if (rules == null || rules.isEmpty()) {
s_logger.debug("No network ACLs to be applied for network " + network.getId());
return true;
@@ -145,22 +178,21 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology {
}
@Override
- public boolean applyRules(final Network network, final List extends VirtualRouter> routers, final String typeString, final boolean isPodLevelException, final Long podId, final boolean failWhenDisconnect,
- final RuleApplierWrapper ruleApplierWrapper)
- throws ResourceUnavailableException {
+ public boolean applyRules(final Network network, final List extends VirtualRouter> routers, final String typeString, final boolean isPodLevelException, final Long podId,
+ final boolean failWhenDisconnect, final RuleApplierWrapper ruleApplierWrapper) throws ResourceUnavailableException {
if (routers == null || routers.isEmpty()) {
s_logger.warn("Unable to apply " + typeString + ", virtual router doesn't exist in the network " + network.getId());
throw new ResourceUnavailableException("Unable to apply " + typeString, DataCenter.class, network.getDataCenterId());
}
- RuleApplier ruleApplier = ruleApplierWrapper.getRuleType();
+ RuleApplier ruleApplier = ruleApplierWrapper.getRuleType();
final DataCenter dc = _dcDao.findById(network.getDataCenterId());
- final boolean isZoneBasic = (dc.getNetworkType() == NetworkType.Basic);
+ final boolean isZoneBasic = dc.getNetworkType() == NetworkType.Basic;
// isPodLevelException and podId is only used for basic zone
- assert !((!isZoneBasic && isPodLevelException) || (isZoneBasic && isPodLevelException && podId == null));
+ assert !(!isZoneBasic && isPodLevelException || isZoneBasic && isPodLevelException && podId == null);
final List connectedRouters = new ArrayList();
final List disconnectedRouters = new ArrayList();
@@ -172,8 +204,8 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology {
if (router.isStopPending()) {
if (_hostDao.findById(router.getHostId()).getState() == Status.Up) {
- throw new ResourceUnavailableException("Unable to process due to the stop pending router " + router.getInstanceName() +
- " haven't been stopped after it's host coming back!", DataCenter.class, router.getDataCenterId());
+ throw new ResourceUnavailableException("Unable to process due to the stop pending router " + router.getInstanceName()
+ + " haven't been stopped after it's host coming back!", DataCenter.class, router.getDataCenterId());
}
s_logger.debug("Router " + router.getInstanceName() + " is stop pending, so not sending apply " + typeString + " commands to the backend");
continue;
@@ -188,7 +220,8 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology {
disconnectedRouters.add(router);
}
- //If rules fail to apply on one domR and not due to disconnection, no need to proceed with the rest
+ // If rules fail to apply on one domR and not due to
+ // disconnection, no need to proceed with the rest
if (!result) {
if (isZoneBasic && isPodLevelException) {
throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", Pod.class, podId);
@@ -203,15 +236,16 @@ public class AdvancedNetworkTopology extends BasicNetworkTopology {
if (isZoneBasic && isPodLevelException) {
throw new ResourceUnavailableException("Unable to apply " + typeString + ", virtual router is not in the right state", Pod.class, podId);
}
- throw new ResourceUnavailableException("Unable to apply " + typeString + ", virtual router is not in the right state", DataCenter.class,
- router.getDataCenterId());
+ throw new ResourceUnavailableException("Unable to apply " + typeString + ", virtual router is not in the right state", DataCenter.class, router.getDataCenterId());
}
}
if (!connectedRouters.isEmpty()) {
if (!isZoneBasic && !disconnectedRouters.isEmpty() && disconnectedRouters.get(0).getIsRedundantRouter()) {
- // These disconnected redundant virtual routers are out of sync now, stop them for synchronization
- //[FIXME] handleSingleWorkingRedundantRouter(connectedRouters, disconnectedRouters, msg);
+ // These disconnected redundant virtual routers are out of sync
+ // now, stop them for synchronization
+ // [FIXME] handleSingleWorkingRedundantRouter(connectedRouters,
+ // disconnectedRouters, msg);
}
} else if (!disconnectedRouters.isEmpty()) {
for (final VirtualRouter router : disconnectedRouters) {
diff --git a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
index cdd9ba03314..1b6b20debbe 100644
--- a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
+++ b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
@@ -17,12 +17,16 @@
package org.apache.cloudstack.network.topology;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.cloud.agent.api.Command;
+import com.cloud.agent.api.PvlanSetupCommand;
+import com.cloud.agent.api.routing.IpAliasTO;
import com.cloud.agent.manager.Commands;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
@@ -39,10 +43,13 @@ import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.NicIpAliasVO;
@Component
public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
+ private static final Logger s_logger = Logger.getLogger(AdvancedNetworkVisitor.class);
+
@Override
public boolean visit(final UserdataPwdRules userdata) throws ResourceUnavailableException {
final VirtualRouter router = userdata.getRouter();
@@ -119,11 +126,38 @@ public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
@Override
public boolean visit(final DhcpPvlanRules dhcp) throws ResourceUnavailableException {
- return false;
+ final VirtualRouter router = dhcp.getRouter();
+ final PvlanSetupCommand setupCommand = dhcp.getSetupCommand();
+
+ // In fact we send command to the host of router, we're not programming router but the host
+ Commands cmds = new Commands(Command.OnError.Stop);
+ cmds.addCommand(setupCommand);
+
+ try {
+ return _applianceManager.sendCommandsToRouter(router, cmds);
+ } catch (final ResourceUnavailableException e) {
+ s_logger.warn("Timed Out", e);
+ return false;
+ }
}
@Override
public boolean visit(final DhcpSubNetRules subnet) throws ResourceUnavailableException {
- return false;
+ final VirtualRouter router = subnet.getRouter();
+ final Network network = subnet.getNetwork();
+ final NicIpAliasVO nicAlias = subnet.getNicAlias();
+ final String routerAliasIp = subnet.getRouterAliasIp();
+
+ final Commands cmds = new Commands(Command.OnError.Stop);
+
+ final List ipaliasTo = new ArrayList();
+ ipaliasTo.add(new IpAliasTO(routerAliasIp, nicAlias.getNetmask(), nicAlias.getAliasCount().toString()));
+
+ subnet.createIpAlias(router, ipaliasTo, nicAlias.getNetworkId(), cmds);
+
+ //also add the required configuration to the dnsmasq for supporting dhcp and dns on the new ip.
+ subnet.configDnsMasq(router, network, cmds);
+
+ return _applianceManager.sendCommandsToRouter(router, cmds);
}
}
\ 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 318f7e2563e..1d0c9b3d32b 100644
--- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
+++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
@@ -109,10 +109,16 @@ public class BasicNetworkTopology implements NetworkTopology {
throw new CloudRuntimeException("applyNetworkACLs not implemented in Basic Network Topology.");
}
+ @Override
+ public boolean setupDhcpForPvlan(final boolean add, final DomainRouterVO router, final Long hostId, final NicProfile nic) throws ResourceUnavailableException {
+ throw new CloudRuntimeException("setupDhcpForPvlan not implemented in Basic Network Topology.");
+ }
+
@Override
public boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest,
final List routers) throws ResourceUnavailableException {
- return false;
+
+ throw new CloudRuntimeException("configDhcpForSubnet not implemented in Basic Network Topology.");
}
@Override
diff --git a/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java b/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java
index d95ca0364db..7dddb815309 100644
--- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java
+++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java
@@ -32,8 +32,10 @@ import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.DhcpEntryRules;
+import com.cloud.network.rules.DhcpSubNetRules;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
import com.cloud.network.rules.FirewallRules;
@@ -68,7 +70,7 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor {
}
@Inject
- protected NEWVirtualNetworkApplianceManager _applianceManager;
+ protected VirtualNetworkApplianceManager _applianceManager;
@Override
public boolean visit(final StaticNatRules nat) throws ResourceUnavailableException {
@@ -242,12 +244,12 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor {
@Override
public boolean visit(final DhcpPvlanRules vpn) throws ResourceUnavailableException {
- return false;
+ throw new CloudRuntimeException("DhcpPvlanRules not implemented in Basic Network Topology.");
}
@Override
- public boolean visit(final VpnRules userdata) throws ResourceUnavailableException {
- return false;
+ public boolean visit(final DhcpSubNetRules vpn) throws ResourceUnavailableException {
+ throw new CloudRuntimeException("DhcpSubNetRules not implemented in Basic Network Topology.");
}
@Override
diff --git a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java
index d61de3762e6..5a501f7a10c 100644
--- a/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java
+++ b/server/src/org/apache/cloudstack/network/topology/NetworkTopology.java
@@ -44,19 +44,22 @@ public interface NetworkTopology {
NicProfile retrieveControlNic(final VirtualMachineProfile profile);
- boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers)
- throws ResourceUnavailableException;
-
- boolean applyDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers)
- throws ResourceUnavailableException;
// ====== USER FOR VPC ONLY ====== //
+ boolean setupDhcpForPvlan(final boolean add, final DomainRouterVO router, final Long hostId, final NicProfile nic) throws ResourceUnavailableException;
+
+ boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers)
+ throws ResourceUnavailableException;
+
boolean applyNetworkACLs(final Network network, final List extends NetworkACLItem> rules, final List extends VirtualRouter> routers, final boolean isPrivateGateway)
throws ResourceUnavailableException;
// ====== USER FOR GUEST NETWORK AND VCP ====== //
+ boolean applyDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers)
+ throws ResourceUnavailableException;
+
boolean applyUserData(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List routers)
throws ResourceUnavailableException;
diff --git a/server/src/org/apache/cloudstack/network/topology/NetworkTopologyVisitor.java b/server/src/org/apache/cloudstack/network/topology/NetworkTopologyVisitor.java
index e284ac5cc79..32dcc8944e4 100644
--- a/server/src/org/apache/cloudstack/network/topology/NetworkTopologyVisitor.java
+++ b/server/src/org/apache/cloudstack/network/topology/NetworkTopologyVisitor.java
@@ -19,6 +19,7 @@ package org.apache.cloudstack.network.topology;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.rules.DhcpRules;
+import com.cloud.network.rules.DhcpSubNetRules;
import com.cloud.network.rules.FirewallRules;
import com.cloud.network.rules.IpAssociationRules;
import com.cloud.network.rules.LoadBalancingRules;
@@ -69,6 +70,7 @@ public abstract class NetworkTopologyVisitor {
public abstract boolean visit(DhcpPvlanRules vpn) throws ResourceUnavailableException;
- public abstract boolean visit(DhcpSubNetRules vpn) throws ResourceUnavailableException;
+ public abstract boolean visit(DhcpSubNetRules subnet) throws ResourceUnavailableException;
+
public abstract boolean visit(NicPlugInOutRules nicPlugInOutRules) throws ResourceUnavailableException;
}
\ No newline at end of file
diff --git a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
index d24951e9e67..3127858ca4d 100644
--- a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
+++ b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
@@ -27,7 +27,7 @@ import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
import org.springframework.stereotype.Component;
-import com.cloud.deploy.DeployDestination;
+import com.cloud.agent.manager.Commands;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@@ -45,22 +45,12 @@ import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.component.ManagerBase;
import com.cloud.vm.DomainRouterVO;
-import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineProfile;
@Component
@Local(value = {VpcVirtualNetworkApplianceManager.class, VpcVirtualNetworkApplianceService.class})
public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implements VpcVirtualNetworkApplianceManager, VpcVirtualNetworkApplianceService {
- /* (non-Javadoc)
- * @see com.cloud.network.router.VirtualNetworkApplianceManager#sendSshKeysToHost(java.lang.Long, java.lang.String, java.lang.String)
- */
- @Override
- public boolean sendSshKeysToHost(final Long hostId, final String pubKey, final String prvKey) {
- // TODO Auto-generated method stub
- return false;
- }
-
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#startRemoteAccessVpn(com.cloud.network.Network, com.cloud.network.RemoteAccessVpn, java.util.List)
*/
@@ -88,15 +78,6 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
return null;
}
- /* (non-Javadoc)
- * @see com.cloud.network.router.VirtualNetworkApplianceManager#applyVpnUsers(com.cloud.network.Network, java.util.List, java.util.List)
- */
- @Override
- public String[] applyVpnUsers(final Network network, final List extends VpnUser> users, final List routers) throws ResourceUnavailableException {
- // TODO Auto-generated method stub
- return null;
- }
-
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#stop(com.cloud.network.router.VirtualRouter, boolean, com.cloud.user.User, com.cloud.user.Account)
*/
@@ -115,12 +96,6 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
return null;
}
- @Override
- public boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile uservm, final DeployDestination dest, final List routers)
- throws ResourceUnavailableException {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
@Override
public boolean removeDhcpSupportForSubnet(final Network network, final List routers) throws ResourceUnavailableException {
return false; //To change body of implemented methods use File | Settings | File Templates.
@@ -296,12 +271,6 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
return null; //To change body of implemented methods use File | Settings | File Templates.
}
- @Override
- public boolean setupDhcpForPvlan(final boolean add, final DomainRouterVO router, final Long hostId, final NicProfile nic) {
- // TODO Auto-generated method stub
- return false;
- }
-
@Override
public boolean prepareAggregatedExecution(final Network network, final List routers) throws AgentUnavailableException {
return true; //To change body of implemented methods use File | Settings | File Templates.
@@ -329,4 +298,11 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
// TODO Auto-generated method stub
return null;
}
+
+ @Override
+ public boolean sendCommandsToRouter(final VirtualRouter router, final Commands cmds)
+ throws AgentUnavailableException {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
\ No newline at end of file