diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index 6baa95c39abb..762ad7097fc0 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -268,6 +268,7 @@ public class ApiConstants {
public static final String VIRTUAL_MACHINE_ID = "virtualmachineid";
public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids";
public static final String VIRTUAL_MACHINE_ID_IP = "vmidipmap";
+ public static final String USAGE_ID = "usageid";
public static final String VLAN = "vlan";
public static final String VLAN_RANGE = "vlanrange";
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
index 21a7e4a1b06c..8c1ce87fd881 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
@@ -73,6 +73,9 @@ public class GetUsageRecordsCmd extends BaseListCmd {
@Parameter(name = ApiConstants.TYPE, type = CommandType.LONG, description = "List usage records for the specified usage type")
private Long usageType;
+ @Parameter(name = ApiConstants.USAGE_ID, type = CommandType.STRING, description = "List usage records for the specified usage UUID. Can be used only together with TYPE parameter.")
+ private String usageId;
+
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@@ -105,6 +108,10 @@ public Long getProjectId() {
return projectId;
}
+ public String getUsageId() {
+ return usageId;
+ }
+
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 8edef770e836..0e12bcb26740 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1843,7 +1843,7 @@ protected void migrate(VMInstanceVO vm, long srcHostId, DeployDestination dest)
vmSrc.addNic(nic);
}
- VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+ VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm, null, _offeringDao.findById(vm.getId(), vm.getServiceOfferingId()), null, null);
_networkMgr.prepareNicForMigration(profile, dest);
volumeMgr.prepareForMigration(profile, dest);
diff --git a/engine/schema/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java b/engine/schema/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java
deleted file mode 100755
index 4a5566b81a48..000000000000
--- a/engine/schema/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java
+++ /dev/null
@@ -1,127 +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.upgrade;
-
-import javax.ejb.Local;
-
-import com.cloud.upgrade.dao.DbUpgrade;
-import com.cloud.upgrade.dao.Upgrade217to218;
-import com.cloud.upgrade.dao.Upgrade218to224DomainVlans;
-import com.cloud.upgrade.dao.Upgrade218to22Premium;
-import com.cloud.upgrade.dao.Upgrade2210to2211;
-import com.cloud.upgrade.dao.Upgrade2211to2212Premium;
-import com.cloud.upgrade.dao.Upgrade2212to2213;
-import com.cloud.upgrade.dao.Upgrade2213to2214;
-import com.cloud.upgrade.dao.Upgrade2214to30;
-import com.cloud.upgrade.dao.Upgrade221to222Premium;
-import com.cloud.upgrade.dao.Upgrade222to224Premium;
-import com.cloud.upgrade.dao.Upgrade224to225;
-import com.cloud.upgrade.dao.Upgrade225to226;
-import com.cloud.upgrade.dao.Upgrade227to228Premium;
-import com.cloud.upgrade.dao.Upgrade228to229;
-import com.cloud.upgrade.dao.Upgrade229to2210;
-import com.cloud.upgrade.dao.Upgrade301to302;
-import com.cloud.upgrade.dao.Upgrade302to40;
-import com.cloud.upgrade.dao.Upgrade30to301;
-import com.cloud.upgrade.dao.Upgrade40to41;
-import com.cloud.upgrade.dao.UpgradeSnapshot217to224;
-import com.cloud.upgrade.dao.UpgradeSnapshot223to224;
-import com.cloud.utils.component.SystemIntegrityChecker;
-
-@Local(value = {SystemIntegrityChecker.class})
-public class PremiumDatabaseUpgradeChecker extends DatabaseUpgradeChecker {
- public PremiumDatabaseUpgradeChecker() {
- _upgradeMap.put("2.1.7", new DbUpgrade[] {new Upgrade217to218(), new Upgrade218to22Premium(), new Upgrade221to222Premium(), new UpgradeSnapshot217to224(),
- new Upgrade222to224Premium(), new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(),
- new Upgrade2210to2211(), new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(),
- new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.1.8", new DbUpgrade[] {new Upgrade218to22Premium(), new Upgrade221to222Premium(), new UpgradeSnapshot217to224(), new Upgrade222to224Premium(),
- new Upgrade218to224DomainVlans(), new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(),
- new Upgrade2210to2211(), new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(),
- new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.1.9", new DbUpgrade[] {new Upgrade218to22Premium(), new Upgrade221to222Premium(), new UpgradeSnapshot217to224(), new Upgrade222to224Premium(),
- new Upgrade218to224DomainVlans(), new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(),
- new Upgrade2210to2211(), new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(),
- new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.1", new DbUpgrade[] {new Upgrade221to222Premium(), new Upgrade222to224Premium(), new UpgradeSnapshot223to224(), new Upgrade224to225(),
- new Upgrade225to226(), new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212Premium(),
- new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(),
- new Upgrade40to41()});
-
- _upgradeMap.put("2.2.2", new DbUpgrade[] {new Upgrade222to224Premium(), new UpgradeSnapshot223to224(), new Upgrade224to225(), new Upgrade225to226(),
- new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212Premium(),
- new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(),
- new Upgrade40to41()});
-
- _upgradeMap.put("2.2.3", new DbUpgrade[] {new Upgrade222to224Premium(), new UpgradeSnapshot223to224(), new Upgrade224to225(), new Upgrade225to226(),
- new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212Premium(),
- new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(),
- new Upgrade40to41()});
-
- _upgradeMap.put("2.2.4", new DbUpgrade[] {new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228Premium(), new Upgrade228to229(),
- new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(),
- new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.5", new DbUpgrade[] {new Upgrade225to226(), new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(),
- new Upgrade2210to2211(), new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(),
- new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.6", new DbUpgrade[] {new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(),
- new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(),
- new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.7", new DbUpgrade[] {new Upgrade227to228Premium(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(),
- new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(),
- new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.8", new DbUpgrade[] {new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212Premium(),
- new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(),
- new Upgrade40to41()});
-
- _upgradeMap.put("2.2.9", new DbUpgrade[] {new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212Premium(), new Upgrade2212to2213(),
- new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.10", new DbUpgrade[] {new Upgrade2210to2211(), new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(),
- new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.11", new DbUpgrade[] {new Upgrade2211to2212Premium(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(),
- new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.12", new DbUpgrade[] {new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(),
- new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("2.2.13", new DbUpgrade[] {new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(),
- new Upgrade40to41()});
-
- _upgradeMap.put("2.2.14", new DbUpgrade[] {new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("3.0.0", new DbUpgrade[] {new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("3.0.1", new DbUpgrade[] {new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("3.0.2", new DbUpgrade[] {new Upgrade302to40(), new Upgrade40to41()});
-
- _upgradeMap.put("4.0.0", new DbUpgrade[] {new Upgrade40to41()});
-
- _upgradeMap.put("4.0.1", new DbUpgrade[] {new Upgrade40to41()});
-
- _upgradeMap.put("4.0.2", new DbUpgrade[] {new Upgrade40to41()});
- }
-}
diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
index 76f8e75cdcaf..d0f526f1b14d 100644
--- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
+++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java
@@ -516,7 +516,7 @@ public final Answer executeRequest(final Command cmd) {
// Only Answer instances are returned by remote agents.
// E.g. see Response.getAnswers()
Answer[] result = s_gson.fromJson(ansStr, Answer[].class);
- String logResult = cleanPassword(StringEscapeUtils.unescapeJava(result.toString()));
+ String logResult = cleanPassword(s_gson.toJson(result));
s_logger.debug("executeRequest received response " + logResult);
if (result.length > 0) {
return result[0];
@@ -547,7 +547,7 @@ private Answer execute(CopyCommand cmd) {
}
Answer[] result = s_gson.fromJson(ansStr, Answer[].class);
- String logResult = cleanPassword(StringEscapeUtils.unescapeJava(result.toString()));
+ String logResult = cleanPassword(s_gson.toJson(result));
s_logger.debug("executeRequest received response " + logResult);
if (result.length > 0) {
return result[0];
diff --git a/plugins/network-elements/dns-notifier/resources/components-example.xml b/plugins/network-elements/dns-notifier/resources/components-example.xml
index c6c84f2b12f1..75744db95616 100755
--- a/plugins/network-elements/dns-notifier/resources/components-example.xml
+++ b/plugins/network-elements/dns-notifier/resources/components-example.xml
@@ -25,7 +25,6 @@ under the License.
-
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
index faf58fcfa822..5ce4d9353899 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
@@ -16,8 +16,6 @@
// under the License.
package com.cloud.network.element;
-import com.cloud.host.dao.HostDao;
-import com.cloud.vm.dao.UserVmDao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -28,13 +26,15 @@
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import org.apache.cloudstack.network.topology.NetworkTopology;
+import org.apache.cloudstack.network.topology.NetworkTopologyContext;
import org.apache.log4j.Logger;
-import com.google.gson.Gson;
-
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupOvsCommand;
import com.cloud.agent.api.to.LoadBalancerTO;
+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;
@@ -42,10 +42,12 @@
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkMigrationResponder;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks;
import com.cloud.network.Networks.BroadcastDomainType;
@@ -54,10 +56,8 @@
import com.cloud.network.dao.NetworkServiceMapDao;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
-import com.cloud.network.NetworkMigrationResponder;
import com.cloud.network.ovs.OvsTunnelManager;
import com.cloud.network.router.VirtualRouter.Role;
-import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
import com.cloud.network.rules.LbStickinessMethod;
import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
import com.cloud.network.rules.LoadBalancerContainer;
@@ -74,9 +74,11 @@
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.DomainRouterDao;
-import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.UserVmDao;
+import com.google.gson.Gson;
@Local(value = {NetworkElement.class, ConnectivityProvider.class,
SourceNatServiceProvider.class, StaticNatServiceProvider.class,
@@ -96,11 +98,14 @@ public class OvsElement extends AdapterBase implements NetworkElement,
@Inject
DomainRouterDao _routerDao;
@Inject
- VpcVirtualNetworkApplianceManager _routerMgr;
- @Inject
UserVmDao _userVmDao;
@Inject
HostDao _hostDao;
+ @Inject
+ DataCenterDao _dcDao;
+
+ @Inject
+ NetworkTopologyContext _networkTopologyContext;
private static final Logger s_logger = Logger.getLogger(OvsElement.class);
private static final Map> capabilities = setCapabilities();
@@ -115,7 +120,7 @@ public Provider getProvider() {
return Provider.Ovs;
}
- protected boolean canHandle(Network network, Service service) {
+ protected boolean canHandle(final Network network, final Service service) {
s_logger.debug("Checking if OvsElement can handle service "
+ service.getName() + " on network " + network.getDisplayText());
if (network.getBroadcastDomainType() != BroadcastDomainType.Vswitch) {
@@ -139,7 +144,7 @@ protected boolean canHandle(Network network, Service service) {
}
@Override
- public boolean configure(String name, Map params)
+ public boolean configure(final String name, final Map params)
throws ConfigurationException {
super.configure(name, params);
_resourceMgr.registerResourceStateAdapter(name, this);
@@ -147,8 +152,8 @@ public boolean configure(String name, Map params)
}
@Override
- public boolean implement(Network network, NetworkOffering offering,
- DeployDestination dest, ReservationContext context)
+ public boolean implement(final Network network, final NetworkOffering offering,
+ final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
s_logger.debug("entering OvsElement implement function for network "
@@ -162,9 +167,9 @@ public boolean implement(Network network, NetworkOffering offering,
}
@Override
- public boolean prepare(Network network, NicProfile nic,
- VirtualMachineProfile vm,
- DeployDestination dest, ReservationContext context)
+ public boolean prepare(final Network network, final NicProfile nic,
+ final VirtualMachineProfile vm,
+ final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
if (!canHandle(network, Service.Connectivity)) {
@@ -190,9 +195,9 @@ public boolean prepare(Network network, NicProfile nic,
}
@Override
- public boolean release(Network network, NicProfile nic,
- VirtualMachineProfile vm,
- ReservationContext context) throws ConcurrentOperationException,
+ public boolean release(final Network network, final NicProfile nic,
+ final VirtualMachineProfile vm,
+ final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
if (!canHandle(network, Service.Connectivity)) {
return false;
@@ -211,8 +216,8 @@ public boolean release(Network network, NicProfile nic,
}
@Override
- public boolean shutdown(Network network, ReservationContext context,
- boolean cleanup) throws ConcurrentOperationException,
+ public boolean shutdown(final Network network, final ReservationContext context,
+ final boolean cleanup) throws ConcurrentOperationException,
ResourceUnavailableException {
if (!canHandle(network, Service.Connectivity)) {
return false;
@@ -221,7 +226,7 @@ public boolean shutdown(Network network, ReservationContext context,
}
@Override
- public boolean destroy(Network network, ReservationContext context)
+ public boolean destroy(final Network network, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException {
if (!canHandle(network, Service.Connectivity)) {
return false;
@@ -230,13 +235,13 @@ public boolean destroy(Network network, ReservationContext context)
}
@Override
- public boolean isReady(PhysicalNetworkServiceProvider provider) {
+ public boolean isReady(final PhysicalNetworkServiceProvider provider) {
return true;
}
@Override
public boolean shutdownProviderInstances(
- PhysicalNetworkServiceProvider provider, ReservationContext context)
+ final PhysicalNetworkServiceProvider provider, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException {
return true;
}
@@ -247,7 +252,7 @@ public boolean canEnableIndividualServices() {
}
@Override
- public boolean verifyServicesCombination(Set services) {
+ public boolean verifyServicesCombination(final Set services) {
if (!services.contains(Service.Connectivity)) {
s_logger.warn("Unable to provide services without Connectivity service enabled for this element");
return false;
@@ -392,15 +397,15 @@ public List> getCommands() {
}
@Override
- public HostVO createHostVOForConnectedAgent(HostVO host,
- StartupCommand[] cmd) {
+ public HostVO createHostVOForConnectedAgent(final HostVO host,
+ final StartupCommand[] cmd) {
return null;
}
@Override
- public HostVO createHostVOForDirectConnectAgent(HostVO host,
- StartupCommand[] startup, ServerResource resource,
- Map details, List hostTags) {
+ public HostVO createHostVOForDirectConnectAgent(final HostVO host,
+ final StartupCommand[] startup, final ServerResource resource,
+ final Map details, final List hostTags) {
if (!(startup[0] instanceof StartupOvsCommand)) {
return null;
}
@@ -409,8 +414,8 @@ public HostVO createHostVOForDirectConnectAgent(HostVO host,
}
@Override
- public DeleteHostAnswer deleteHost(HostVO host, boolean isForced,
- boolean isForceDeleteStorage) throws UnableDeleteHostException {
+ public DeleteHostAnswer deleteHost(final HostVO host, final boolean isForced,
+ final boolean isForceDeleteStorage) throws UnableDeleteHostException {
if (!(host.getType() == Host.Type.L2Networking)) {
return null;
}
@@ -418,13 +423,13 @@ public DeleteHostAnswer deleteHost(HostVO host, boolean isForced,
}
@Override
- public IpDeployer getIpDeployer(Network network) {
+ public IpDeployer getIpDeployer(final Network network) {
return this;
}
@Override
- public boolean applyIps(Network network,
- List extends PublicIpAddress> ipAddress, Set services)
+ public boolean applyIps(final Network network,
+ final List extends PublicIpAddress> ipAddress, final Set services)
throws ResourceUnavailableException {
boolean canHandle = true;
for (Service service : services) {
@@ -444,14 +449,17 @@ public boolean applyIps(Network network,
return true;
}
- return _routerMgr.associatePublicIP(network, ipAddress, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
}
}
@Override
- public boolean applyStaticNats(Network network, List extends StaticNat> rules)
+ public boolean applyStaticNats(final Network network, final List extends StaticNat> rules)
throws ResourceUnavailableException {
if (!canHandle(network, Service.StaticNat)) {
return false;
@@ -464,11 +472,14 @@ public boolean applyStaticNats(Network network, List extends StaticNat> rules)
return true;
}
- return _routerMgr.applyStaticNats(network, rules, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.applyStaticNats(network, rules, routers);
}
@Override
- public boolean applyPFRules(Network network, List rules)
+ public boolean applyPFRules(final Network network, final List rules)
throws ResourceUnavailableException {
if (!canHandle(network, Service.PortForwarding)) {
return false;
@@ -481,11 +492,14 @@ public boolean applyPFRules(Network network, List rules)
return true;
}
- return _routerMgr.applyFirewallRules(network, rules, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.applyFirewallRules(network, rules, routers);
}
@Override
- public boolean applyLBRules(Network network, List rules)
+ public boolean applyLBRules(final Network network, final List rules)
throws ResourceUnavailableException {
if (canHandle(network, Service.Lb)) {
if (!canHandleLbRules(rules)) {
@@ -501,7 +515,10 @@ public boolean applyLBRules(Network network, List rules)
return true;
}
- if (!_routerMgr.applyLoadBalancingRules(network, rules, routers)) {
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ if (!networkTopology.applyLoadBalancingRules(network, rules, routers)) {
throw new CloudRuntimeException(
"Failed to apply load balancing rules in network "
+ network.getId());
@@ -514,7 +531,7 @@ public boolean applyLBRules(Network network, List rules)
}
@Override
- public boolean validateLBRule(Network network, LoadBalancingRule rule) {
+ public boolean validateLBRule(final Network network, final LoadBalancingRule rule) {
List rules = new ArrayList();
rules.add(rule);
if (canHandle(network, Service.Lb) && canHandleLbRules(rules)) {
@@ -529,13 +546,13 @@ public boolean validateLBRule(Network network, LoadBalancingRule rule) {
}
@Override
- public List updateHealthChecks(Network network,
- List lbrules) {
+ public List updateHealthChecks(final Network network,
+ final List lbrules) {
// TODO Auto-generated method stub
return null;
}
- private boolean canHandleLbRules(List rules) {
+ private boolean canHandleLbRules(final List rules) {
Map lbCaps = getCapabilities().get(Service.Lb);
if (!lbCaps.isEmpty()) {
String schemeCaps = lbCaps.get(Capability.LbSchemes);
@@ -553,7 +570,7 @@ private boolean canHandleLbRules(List rules) {
return true;
}
- public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
+ public static boolean validateHAProxyLBRule(final LoadBalancingRule rule) {
String timeEndChar = "dhms";
for (LbStickinessPolicy stickinessPolicy : rule.getStickinessPolicies()) {
@@ -572,10 +589,12 @@ public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
for (Pair paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
- if ("tablesize".equalsIgnoreCase(key))
+ if ("tablesize".equalsIgnoreCase(key)) {
tablesize = value;
- if ("expire".equalsIgnoreCase(key))
+ }
+ if ("expire".equalsIgnoreCase(key)) {
expire = value;
+ }
}
if ((expire != null)
&& !containsOnlyNumbers(expire, timeEndChar)) {
@@ -601,10 +620,12 @@ public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
for (Pair paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
- if ("length".equalsIgnoreCase(key))
+ if ("length".equalsIgnoreCase(key)) {
length = value;
- if ("holdtime".equalsIgnoreCase(key))
+ }
+ if ("holdtime".equalsIgnoreCase(key)) {
holdTime = value;
+ }
}
if ((length != null) && (!containsOnlyNumbers(length, null))) {
@@ -631,15 +652,18 @@ public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
* like 12 2) time or tablesize like 12h, 34m, 45k, 54m , here last
* character is non-digit but from known characters .
*/
- private static boolean containsOnlyNumbers(String str, String endChar) {
- if (str == null)
+ private static boolean containsOnlyNumbers(final String str, final String endChar) {
+ if (str == null) {
return false;
+ }
String number = str;
if (endChar != null) {
boolean matchedEndChar = false;
if (str.length() < 2)
+ {
return false; // atleast one numeric and one char. example:
+ }
// 3h
char strEnd = str.toCharArray()[str.length() - 1];
for (char c : endChar.toCharArray()) {
@@ -649,8 +673,9 @@ private static boolean containsOnlyNumbers(String str, String endChar) {
break;
}
}
- if (!matchedEndChar)
+ if (!matchedEndChar) {
return false;
+ }
}
try {
Integer.parseInt(number);
@@ -661,7 +686,7 @@ private static boolean containsOnlyNumbers(String str, String endChar) {
}
@Override
- public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
+ public boolean prepareMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context) {
if (!canHandle(network, Service.Connectivity)) {
return false;
}
@@ -685,12 +710,12 @@ public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineP
}
@Override
- public void rollbackMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+ public void rollbackMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
return;
}
@Override
- public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+ public void commitMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
return;
}
}
diff --git a/plugins/user-authenticators/saml2/test/org/apache/cloudstack/SAML2UserAuthenticatorTest.java b/plugins/user-authenticators/saml2/test/org/apache/cloudstack/SAML2UserAuthenticatorTest.java
index 6f5150b5c521..29fb4969e832 100644
--- a/plugins/user-authenticators/saml2/test/org/apache/cloudstack/SAML2UserAuthenticatorTest.java
+++ b/plugins/user-authenticators/saml2/test/org/apache/cloudstack/SAML2UserAuthenticatorTest.java
@@ -48,7 +48,7 @@ public class SAML2UserAuthenticatorTest {
@Test
public void encode() {
- Assert.assertTrue(new SAML2UserAuthenticator().encode("random String").length() == 32);
+ Assert.assertTrue(new SAML2UserAuthenticator().encode("random String").length() > 0);
}
@Test
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 e2d4d2798a4f..6d8f32e07031 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
@@ -175,14 +175,45 @@
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/server/resources/com/cloud/upgrade/databaseCreatorContext.xml b/server/resources/com/cloud/upgrade/databaseCreatorContext.xml
index d2ed26f426bc..6b70b2782074 100644
--- a/server/resources/com/cloud/upgrade/databaseCreatorContext.xml
+++ b/server/resources/com/cloud/upgrade/databaseCreatorContext.xml
@@ -47,6 +47,5 @@
-
diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java
index 1dba13b6cb2d..3f599a19f6af 100755
--- a/server/src/com/cloud/alert/AlertManagerImpl.java
+++ b/server/src/com/cloud/alert/AlertManagerImpl.java
@@ -252,7 +252,7 @@ public void sendAlert(AlertType alertType, long dataCenterId, Long podId, String
_emailAlert.sendAlert(alertType, dataCenterId, podId, null, subject, body);
} else {
s_alertsLogger.warn(" alertType:: " + alertType + " // dataCenterId:: " + dataCenterId + " // podId:: " + podId +
- " // message:: " + subject);
+ " // message:: " + subject + " // body:: " + body);
}
} catch (Exception ex) {
s_logger.error("Problem sending email alert", ex);
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index dc6ffc8b223b..5fa1e6a95a6f 100755
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -25,22 +25,24 @@
import javax.ejb.Local;
import javax.inject.Inject;
-import com.cloud.utils.net.NetUtils;
-import org.apache.log4j.Logger;
-
-import com.google.gson.Gson;
-
import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd;
import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd;
import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.network.topology.NetworkTopology;
+import org.apache.cloudstack.network.topology.NetworkTopologyContext;
+import org.apache.log4j.Logger;
+import org.cloud.network.router.deployment.RouterDeploymentDefinition;
+import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder;
import com.cloud.agent.api.to.LoadBalancerTO;
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;
@@ -94,6 +96,7 @@
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
@@ -104,6 +107,7 @@
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.UserVmDao;
+import com.google.gson.Gson;
@Local(value = {NetworkElement.class, FirewallServiceProvider.class,
DhcpServiceProvider.class, UserDataServiceProvider.class,
@@ -127,8 +131,13 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
LoadBalancingRulesManager _lbMgr;
@Inject
NetworkOfferingDao _networkOfferingDao;
+
@Inject
VpcVirtualNetworkApplianceManager _routerMgr;
+
+ @Inject
+ DataCenterDao _dcDao;
+
@Inject
ConfigurationManager _configMgr;
@Inject
@@ -155,7 +164,13 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
@Inject
IPAddressDao _ipAddressDao;
- protected boolean canHandle(Network network, Service service) {
+ @Inject
+ NetworkTopologyContext networkTopologyContext;
+
+ @Inject
+ protected RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
+
+ protected boolean canHandle(final Network network, final Service service) {
Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network);
if (physicalNetworkId == null) {
return false;
@@ -185,7 +200,7 @@ protected boolean canHandle(Network network, Service service) {
}
@Override
- public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException,
+ public boolean implement(final Network network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context) throws ResourceUnavailableException,
ConcurrentOperationException, InsufficientCapacityException {
if (offering.isSystemOnly()) {
@@ -195,14 +210,22 @@ public boolean implement(Network network, NetworkOffering offering, DeployDestin
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- List routers = _routerMgr.deployVirtualRouterInGuestNetwork(network, dest,
- _accountMgr.getAccount(network.getAccountId()), params,
- offering.getRedundantRouter());
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ routerDeploymentDefinitionBuilder.create()
+ .setGuestNetwork(network)
+ .setDeployDestination(dest)
+ .setAccountOwner(_accountMgr.getAccount(network.getAccountId()))
+ .setParams(params)
+ .setRedundant(offering.getRedundantRouter())
+ .build();
+
+ List routers = routerDeploymentDefinition.deployVirtualRouter();
+
int routerCounts = 1;
if (offering.getRedundantRouter()) {
routerCounts = 2;
}
- if ((routers == null) || (routers.size() < routerCounts)) {
+ if (routers == null || routers.size() < routerCounts) {
throw new ResourceUnavailableException("Can't find all necessary running routers!",
DataCenter.class, network.getDataCenterId());
}
@@ -211,7 +234,7 @@ public boolean implement(Network network, NetworkOffering offering, DeployDestin
}
@Override
- public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+ public boolean prepare(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (vm.getType() != VirtualMachine.Type.User || vm.getHypervisorType() == HypervisorType.BareMetal) {
return false;
@@ -229,36 +252,46 @@ public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm
return false;
}
- @SuppressWarnings("unchecked")
- VirtualMachineProfile uservm = vm;
- List routers =
- _routerMgr.deployVirtualRouterInGuestNetwork(network, dest, _accountMgr.getAccount(network.getAccountId()), uservm.getParameters(),
- offering.getRedundantRouter());
- if ((routers == null) || (routers.size() == 0)) {
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ routerDeploymentDefinitionBuilder.create()
+ .setGuestNetwork(network)
+ .setDeployDestination(dest)
+ .setAccountOwner(_accountMgr.getAccount(network.getAccountId()))
+ .setParams(vm.getParameters())
+ .setRedundant(offering.getRedundantRouter())
+ .build();
+
+ List routers = routerDeploymentDefinition.deployVirtualRouter();
+
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
return true;
}
@Override
- public boolean applyFWRules(Network config, List extends FirewallRule> rules) throws ResourceUnavailableException {
- if (canHandle(config, Service.Firewall)) {
- List routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
+ public boolean applyFWRules(final Network network, final List extends FirewallRule> rules) throws ResourceUnavailableException {
+ if (canHandle(network, Service.Firewall)) {
+ List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " +
- config.getId());
+ network.getId());
return true;
}
if (rules != null && rules.size() == 1) {
// for VR no need to add default egress rule to DENY traffic
if (rules.get(0).getTrafficType() == FirewallRule.TrafficType.Egress && rules.get(0).getType() == FirewallRule.FirewallRuleType.System &&
- !_networkMdl.getNetworkEgressDefaultPolicy(config.getId()))
+ !_networkMdl.getNetworkEgressDefaultPolicy(network.getId())) {
return true;
+ }
}
- if (!_routerMgr.applyFirewallRules(config, rules, routers)) {
- throw new CloudRuntimeException("Failed to apply firewall rules in network " + config.getId());
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ if (!networkTopology.applyFirewallRules(network, rules, routers)) {
+ throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
}
@@ -272,15 +305,17 @@ public boolean applyFWRules(Network config, List extends FirewallRule> rules)
* number like 12 2) time or tablesize like 12h, 34m, 45k, 54m , here
* last character is non-digit but from known characters .
*/
- private static boolean containsOnlyNumbers(String str, String endChar) {
- if (str == null)
+ private static boolean containsOnlyNumbers(final String str, final String endChar) {
+ if (str == null) {
return false;
+ }
String number = str;
if (endChar != null) {
boolean matchedEndChar = false;
- if (str.length() < 2)
- return false; // atleast one numeric and one char. example:
+ if (str.length() < 2) {
+ return false; // at least one numeric and one char. example:
+ }
// 3h
char strEnd = str.toCharArray()[str.length() - 1];
for (char c : endChar.toCharArray()) {
@@ -290,8 +325,9 @@ private static boolean containsOnlyNumbers(String str, String endChar) {
break;
}
}
- if (!matchedEndChar)
+ if (!matchedEndChar) {
return false;
+ }
}
try {
Integer.parseInt(number);
@@ -301,7 +337,7 @@ private static boolean containsOnlyNumbers(String str, String endChar) {
return true;
}
- public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
+ public static boolean validateHAProxyLBRule(final LoadBalancingRule rule) {
String timeEndChar = "dhms";
if (rule.getSourcePortStart() == NetUtils.HAPROXY_STATS_PORT) {
@@ -322,15 +358,17 @@ public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
for (Pair paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
- if ("tablesize".equalsIgnoreCase(key))
+ if ("tablesize".equalsIgnoreCase(key)) {
tablesize = value;
- if ("expire".equalsIgnoreCase(key))
+ }
+ if ("expire".equalsIgnoreCase(key)) {
expire = value;
+ }
}
- if ((expire != null) && !containsOnlyNumbers(expire, timeEndChar)) {
+ if (expire != null && !containsOnlyNumbers(expire, timeEndChar)) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: expire is not in timeformat: " + expire);
}
- if ((tablesize != null) && !containsOnlyNumbers(tablesize, "kmg")) {
+ if (tablesize != null && !containsOnlyNumbers(tablesize, "kmg")) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: tablesize is not in size format: " + tablesize);
}
@@ -341,16 +379,18 @@ public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
for (Pair paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
- if ("length".equalsIgnoreCase(key))
+ if ("length".equalsIgnoreCase(key)) {
length = value;
- if ("holdtime".equalsIgnoreCase(key))
+ }
+ if ("holdtime".equalsIgnoreCase(key)) {
holdTime = value;
+ }
}
- if ((length != null) && (!containsOnlyNumbers(length, null))) {
+ if (length != null && !containsOnlyNumbers(length, null)) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: length is not a number: " + length);
}
- if ((holdTime != null) && (!containsOnlyNumbers(holdTime, timeEndChar) && !containsOnlyNumbers(holdTime, null))) {
+ if (holdTime != null && !containsOnlyNumbers(holdTime, timeEndChar) && !containsOnlyNumbers(holdTime, null)) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: holdtime is not in timeformat: " + holdTime);
}
}
@@ -359,7 +399,7 @@ public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
}
@Override
- public boolean validateLBRule(Network network, LoadBalancingRule rule) {
+ public boolean validateLBRule(final Network network, final LoadBalancingRule rule) {
List rules = new ArrayList();
rules.add(rule);
if (canHandle(network, Service.Lb) && canHandleLbRules(rules)) {
@@ -373,7 +413,7 @@ public boolean validateLBRule(Network network, LoadBalancingRule rule) {
}
@Override
- public boolean applyLBRules(Network network, List rules) throws ResourceUnavailableException {
+ public boolean applyLBRules(final Network network, final List rules) throws ResourceUnavailableException {
if (canHandle(network, Service.Lb)) {
if (!canHandleLbRules(rules)) {
return false;
@@ -385,7 +425,10 @@ public boolean applyLBRules(Network network, List rules) thro
return true;
}
- if (!_routerMgr.applyLoadBalancingRules(network, rules, routers)) {
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ if (!networkTopology.applyLoadBalancingRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply load balancing rules in network " + network.getId());
} else {
return true;
@@ -396,7 +439,7 @@ public boolean applyLBRules(Network network, List rules) thro
}
@Override
- public String[] applyVpnUsers(RemoteAccessVpn vpn, List extends VpnUser> users) throws ResourceUnavailableException {
+ public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List extends VpnUser> users) throws ResourceUnavailableException {
if (vpn.getNetworkId() == null) {
return null;
}
@@ -409,7 +452,11 @@ public String[] applyVpnUsers(RemoteAccessVpn vpn, List extends VpnUser> users
network.getId());
return null;
}
- return _routerMgr.applyVpnUsers(network, users, routers);
+
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.applyVpnUsers(network, users, routers);
} else {
s_logger.debug("Element " + getName() + " doesn't handle applyVpnUsers command");
return null;
@@ -417,7 +464,7 @@ public String[] applyVpnUsers(RemoteAccessVpn vpn, List extends VpnUser> users
}
@Override
- public boolean startVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
+ public boolean startVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getNetworkId() == null) {
return false;
}
@@ -437,7 +484,7 @@ public boolean startVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException
}
@Override
- public boolean stopVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
+ public boolean stopVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getNetworkId() == null) {
return false;
}
@@ -457,7 +504,7 @@ public boolean stopVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException
}
@Override
- public boolean applyIps(Network network, List extends PublicIpAddress> ipAddress, Set services) throws ResourceUnavailableException {
+ public boolean applyIps(final Network network, final List extends PublicIpAddress> ipAddress, final Set services) throws ResourceUnavailableException {
boolean canHandle = true;
for (Service service : services) {
if (!canHandle(network, service)) {
@@ -473,7 +520,10 @@ public boolean applyIps(Network network, List extends PublicIpAddress> ipAddre
return true;
}
- return _routerMgr.associatePublicIP(network, ipAddress, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
}
@@ -620,23 +670,26 @@ private static Map> setCapabilities() {
}
@Override
- public boolean applyStaticNats(Network config, List extends StaticNat> rules) throws ResourceUnavailableException {
- if (canHandle(config, Service.StaticNat)) {
- List routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
+ public boolean applyStaticNats(final Network network, final List extends StaticNat> rules) throws ResourceUnavailableException {
+ if (canHandle(network, Service.StaticNat)) {
+ List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply static nat on the backend; virtual " + "router doesn't exist in the network " +
- config.getId());
+ network.getId());
return true;
}
- return _routerMgr.applyStaticNats(config, rules, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.applyStaticNats(network, rules, routers);
} else {
return true;
}
}
@Override
- public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean shutdown(final Network network, final ReservationContext context, final boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
return true;
@@ -648,7 +701,7 @@ public boolean shutdown(Network network, ReservationContext context, boolean cle
if (!result) {
s_logger.warn("Failed to stop virtual router element " + router + ", but would try to process clean up anyway.");
}
- result = (_routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null);
+ result = _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
if (!result) {
s_logger.warn("Failed to clean up virtual router element " + router);
}
@@ -658,7 +711,7 @@ public boolean shutdown(Network network, ReservationContext context, boolean cle
}
@Override
- public boolean destroy(Network config, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean destroy(final Network config, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
List routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
return true;
@@ -668,13 +721,13 @@ public boolean destroy(Network config, ReservationContext context) throws Concur
// not caller account
Account callerAccount = _accountMgr.getAccount(context.getCaller().getAccountId());
for (DomainRouterVO router : routers) {
- result = result && (_routerMgr.destroyRouter(router.getId(), callerAccount, context.getCaller().getId()) != null);
+ result = result && _routerMgr.destroyRouter(router.getId(), callerAccount, context.getCaller().getId()) != null;
}
return result;
}
@Override
- public boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException {
+ public boolean savePassword(final Network network, final NicProfile nic, final VirtualMachineProfile vm) throws ResourceUnavailableException {
if (!canHandle(network, null)) {
return false;
}
@@ -684,13 +737,15 @@ public boolean savePassword(Network network, NicProfile nic, VirtualMachineProfi
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
// If any router is running then send save password command otherwise save the password in DB
for (VirtualRouter router : routers) {
if (router.getState() == State.Running) {
- return _routerMgr.savePasswordToRouter(network, nic, uservm, routers);
+ return networkTopology.savePasswordToRouter(network, nic, uservm, routers);
}
}
String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword);
@@ -703,11 +758,12 @@ public boolean savePassword(Network network, NicProfile nic, VirtualMachineProfi
userVmVO.setUpdateParameters(true);
_userVmDao.update(userVmVO.getId(), userVmVO);
+
return true;
}
@Override
- public boolean saveSSHKey(Network network, NicProfile nic, VirtualMachineProfile vm, String sshPublicKey) throws ResourceUnavailableException {
+ public boolean saveSSHKey(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final String sshPublicKey) throws ResourceUnavailableException {
if (!canHandle(network, null)) {
return false;
}
@@ -717,14 +773,16 @@ public boolean saveSSHKey(Network network, NicProfile nic, VirtualMachineProfile
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
- return _routerMgr.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey);
}
@Override
- public boolean saveUserData(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException {
+ public boolean saveUserData(final Network network, final NicProfile nic, final VirtualMachineProfile vm) throws ResourceUnavailableException {
if (!canHandle(network, null)) {
return false;
}
@@ -734,10 +792,12 @@ public boolean saveUserData(Network network, NicProfile nic, VirtualMachineProfi
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
- return _routerMgr.saveUserDataToRouter(network, nic, uservm, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.saveUserDataToRouter(network, nic, uservm, routers);
}
@Override
@@ -750,7 +810,7 @@ public List> getCommands() {
}
@Override
- public VirtualRouterProvider configure(ConfigureVirtualRouterElementCmd cmd) {
+ public VirtualRouterProvider configure(final ConfigureVirtualRouterElementCmd cmd) {
VirtualRouterProviderVO element = _vrProviderDao.findById(cmd.getId());
if (element == null || !(element.getType() == Type.VirtualRouter || element.getType() == Type.VPCVirtualRouter)) {
s_logger.debug("Can't find Virtual Router element with network service provider id " + cmd.getId());
@@ -764,7 +824,7 @@ public VirtualRouterProvider configure(ConfigureVirtualRouterElementCmd cmd) {
}
@Override
- public OvsProvider configure(ConfigureOvsElementCmd cmd) {
+ public OvsProvider configure(final ConfigureOvsElementCmd cmd) {
OvsProviderVO element = _ovsProviderDao.findById(cmd.getId());
if (element == null) {
s_logger.debug("Can't find Ovs element with network service provider id "
@@ -779,7 +839,7 @@ public OvsProvider configure(ConfigureOvsElementCmd cmd) {
}
@Override
- public VirtualRouterProvider addElement(Long nspId, Type providerType) {
+ public VirtualRouterProvider addElement(final Long nspId, final Type providerType) {
if (!(providerType == Type.VirtualRouter || providerType == Type.VPCVirtualRouter)) {
throw new InvalidParameterValueException("Element " + getName() + " supports only providerTypes: " + Type.VirtualRouter.toString() + " and " +
Type.VPCVirtualRouter);
@@ -795,7 +855,7 @@ public VirtualRouterProvider addElement(Long nspId, Type providerType) {
}
@Override
- public boolean applyPFRules(Network network, List rules) throws ResourceUnavailableException {
+ public boolean applyPFRules(final Network network, final List rules) throws ResourceUnavailableException {
if (canHandle(network, Service.PortForwarding)) {
List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
@@ -804,7 +864,10 @@ public boolean applyPFRules(Network network, List rules) thr
return true;
}
- if (!_routerMgr.applyFirewallRules(network, rules, routers)) {
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ if (!networkTopology.applyFirewallRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
@@ -815,7 +878,7 @@ public boolean applyPFRules(Network network, List rules) thr
}
@Override
- public boolean isReady(PhysicalNetworkServiceProvider provider) {
+ public boolean isReady(final PhysicalNetworkServiceProvider provider) {
VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider());
if (element == null) {
return false;
@@ -824,7 +887,7 @@ public boolean isReady(PhysicalNetworkServiceProvider provider) {
}
@Override
- public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException,
+ public boolean shutdownProviderInstances(final PhysicalNetworkServiceProvider provider, final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider());
if (element == null) {
@@ -835,7 +898,7 @@ public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider
List routers = _routerDao.listByElementId(elementId);
boolean result = true;
for (DomainRouterVO router : routers) {
- result = result && (_routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null);
+ result = result && _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
}
_vrProviderDao.remove(elementId);
@@ -847,13 +910,13 @@ public boolean canEnableIndividualServices() {
return true;
}
- public Long getIdByNspId(Long nspId) {
+ public Long getIdByNspId(final Long nspId) {
VirtualRouterProviderVO vr = _vrProviderDao.findByNspIdAndType(nspId, Type.VirtualRouter);
return vr.getId();
}
@Override
- public VirtualRouterProvider getCreatedElement(long id) {
+ public VirtualRouterProvider getCreatedElement(final long id) {
VirtualRouterProvider provider = _vrProviderDao.findById(id);
if (!(provider.getType() == Type.VirtualRouter || provider.getType() == Type.VPCVirtualRouter)) {
throw new InvalidParameterValueException("Unable to find provider by id");
@@ -862,37 +925,40 @@ public VirtualRouterProvider getCreatedElement(long id) {
}
@Override
- public boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) throws ConcurrentOperationException,
+ public boolean release(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
return true;
}
@Override
- public boolean configDhcpSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+ public boolean configDhcpSupportForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (canHandle(network, Service.Dhcp)) {
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}
- @SuppressWarnings("unchecked")
+
VirtualMachineProfile uservm = vm;
List routers = getRouters(network, dest);
- if ((routers == null) || (routers.size() == 0)) {
+ if (routers == null || routers.size() == 0) {
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;
}
@Override
- public boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException {
+ public boolean removeDhcpSupportForSubnet(final Network network) throws ResourceUnavailableException {
if (canHandle(network, Service.Dhcp)) {
List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
- if ((routers == null) || (routers.size() == 0)) {
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
try {
@@ -905,29 +971,31 @@ public boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavai
}
@Override
- public boolean addDhcpEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+ public boolean addDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (canHandle(network, Service.Dhcp)) {
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List routers = getRouters(network, dest);
- if ((routers == null) || (routers.size() == 0)) {
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
- return _routerMgr.applyDhcpEntry(network, nic, uservm, dest, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.applyDhcpEntry(network, nic, uservm, dest, routers);
}
return false;
}
@Override
- public boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+ public boolean addPasswordAndUserdata(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (canHandle(network, Service.UserData)) {
if (vm.getType() != VirtualMachine.Type.User) {
@@ -939,21 +1007,23 @@ public boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMa
return true;
}
- @SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List routers = getRouters(network, dest);
- if ((routers == null) || (routers.size() == 0)) {
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
- return _routerMgr.applyUserData(network, nic, uservm, dest, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.applyUserData(network, nic, uservm, dest, routers);
}
return false;
}
- protected List getRouters(Network network, DeployDestination dest) {
+ protected List getRouters(final Network network, final DeployDestination dest) {
boolean publicNetwork = false;
if (_networkMdl.isProviderSupportServiceInNetwork(network.getId(), Service.SourceNat, getProvider())) {
publicNetwork = true;
@@ -986,7 +1056,7 @@ protected List getRouters(Network network, DeployDestination des
}
@Override
- public List extends VirtualRouterProvider> searchForVirtualRouterElement(ListVirtualRouterElementsCmd cmd) {
+ public List extends VirtualRouterProvider> searchForVirtualRouterElement(final ListVirtualRouterElementsCmd cmd) {
Long id = cmd.getId();
Long nspId = cmd.getNspId();
Boolean enabled = cmd.getEnabled();
@@ -1009,7 +1079,7 @@ public List extends VirtualRouterProvider> searchForVirtualRouterElement(ListV
}
@Override
- public List extends OvsProvider> searchForOvsElement(ListOvsElementsCmd cmd) {
+ public List extends OvsProvider> searchForOvsElement(final ListOvsElementsCmd cmd) {
Long id = cmd.getId();
Long nspId = cmd.getNspId();
Boolean enabled = cmd.getEnabled();
@@ -1029,12 +1099,12 @@ public List extends OvsProvider> searchForOvsElement(ListOvsElementsCmd cmd) {
}
@Override
- public boolean verifyServicesCombination(Set services) {
+ public boolean verifyServicesCombination(final Set services) {
return true;
}
@Override
- public IpDeployer getIpDeployer(Network network) {
+ public IpDeployer getIpDeployer(final Network network) {
return this;
}
@@ -1043,12 +1113,12 @@ protected VirtualRouterProvider.Type getVirtualRouterProvider() {
}
@Override
- public List updateHealthChecks(Network network, List lbrules) {
+ public List updateHealthChecks(final Network network, final List lbrules) {
// TODO Auto-generated method stub
return null;
}
- private boolean canHandleLbRules(List rules) {
+ private boolean canHandleLbRules(final List rules) {
Map lbCaps = getCapabilities().get(Service.Lb);
if (!lbCaps.isEmpty()) {
String schemeCaps = lbCaps.get(Capability.LbSchemes);
@@ -1065,14 +1135,22 @@ private boolean canHandleLbRules(List rules) {
}
@Override
- public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
+ public boolean prepareMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context) {
if (nic.getBroadcastType() != Networks.BroadcastDomainType.Pvlan) {
return true;
}
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();
@@ -1082,14 +1160,22 @@ public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineP
}
@Override
- public void rollbackMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+ public void rollbackMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
if (nic.getBroadcastType() != Networks.BroadcastDomainType.Pvlan) {
return;
}
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();
@@ -1098,14 +1184,22 @@ public void rollbackMigration(NicProfile nic, Network network, VirtualMachinePro
}
@Override
- public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
+ public void commitMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
if (nic.getBroadcastType() != Networks.BroadcastDomainType.Pvlan) {
return;
}
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();
@@ -1114,10 +1208,10 @@ public void commitMigration(NicProfile nic, Network network, VirtualMachineProfi
}
@Override
- public boolean prepareAggregatedExecution(Network network, DeployDestination dest) throws ResourceUnavailableException {
+ public boolean prepareAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException {
List routers = getRouters(network, dest);
- if ((routers == null) || (routers.size() == 0)) {
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
@@ -1125,10 +1219,10 @@ public boolean prepareAggregatedExecution(Network network, DeployDestination des
}
@Override
- public boolean completeAggregatedExecution(Network network, DeployDestination dest) throws ResourceUnavailableException {
+ public boolean completeAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException {
List routers = getRouters(network, dest);
- if ((routers == null) || (routers.size() == 0)) {
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
@@ -1136,7 +1230,7 @@ public boolean completeAggregatedExecution(Network network, DeployDestination de
}
@Override
- public boolean cleanupAggregatedExecution(Network network, DeployDestination dest) throws ResourceUnavailableException {
+ public boolean cleanupAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException {
// The VR code already cleansup in the Finish routine using finally, lets not waste another command
return true;
}
diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
index d583383add9e..f7d82885010b 100644
--- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
@@ -24,9 +24,13 @@
import javax.ejb.Local;
import javax.inject.Inject;
+import org.apache.cloudstack.network.topology.NetworkTopology;
import org.apache.log4j.Logger;
+import org.cloud.network.router.deployment.RouterDeploymentDefinition;
+import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder;
import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenterVO;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@@ -69,8 +73,8 @@
import com.cloud.vm.VirtualMachineProfile;
@Local(value = {NetworkElement.class, FirewallServiceProvider.class, DhcpServiceProvider.class, UserDataServiceProvider.class, StaticNatServiceProvider.class,
- LoadBalancingServiceProvider.class, PortForwardingServiceProvider.class, IpDeployer.class, VpcProvider.class, Site2SiteVpnServiceProvider.class,
- NetworkACLServiceProvider.class})
+ LoadBalancingServiceProvider.class, PortForwardingServiceProvider.class, IpDeployer.class, VpcProvider.class, Site2SiteVpnServiceProvider.class,
+ NetworkACLServiceProvider.class})
public class VpcVirtualRouterElement extends VirtualRouterElement implements VpcProvider, Site2SiteVpnServiceProvider, NetworkACLServiceProvider {
private static final Logger s_logger = Logger.getLogger(VpcVirtualRouterElement.class);
@Inject
@@ -92,10 +96,13 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
@Inject
EntityManager _entityMgr;
+ @Inject
+ private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
+
private static final Map> capabilities = setCapabilities();
@Override
- protected boolean canHandle(Network network, Service service) {
+ protected boolean canHandle(final Network network, final Service service) {
Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network);
if (physicalNetworkId == null) {
return false;
@@ -125,33 +132,41 @@ protected boolean canHandle(Network network, Service service) {
}
@Override
- public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException,
- InsufficientCapacityException {
+ public boolean implementVpc(final Vpc vpc, final DeployDestination dest, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException,
+ InsufficientCapacityException {
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ routerDeploymentDefinitionBuilder.create()
+ .setVpc(vpc)
+ .setDeployDestination(dest)
+ .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId()))
+ .setParams(params)
+ .build();
+
+ routerDeploymentDefinition.deployVirtualRouter();
return true;
}
@Override
- public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean shutdownVpc(final Vpc vpc, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
List routers = _routerDao.listByVpcId(vpc.getId());
if (routers == null || routers.isEmpty()) {
return true;
}
boolean result = true;
for (DomainRouterVO router : routers) {
- result = result && (_routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null);
+ result = result && _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
}
return result;
}
@Override
- public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException,
- ConcurrentOperationException, InsufficientCapacityException {
+ public boolean implement(final Network network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context) throws ResourceUnavailableException,
+ ConcurrentOperationException, InsufficientCapacityException {
Long vpcId = network.getVpcId();
if (vpcId == null) {
@@ -168,8 +183,17 @@ public boolean implement(Network network, NetworkOffering offering, DeployDestin
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- List routers = _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
- if ((routers == null) || (routers.size() == 0)) {
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ routerDeploymentDefinitionBuilder.create()
+ .setVpc(vpc)
+ .setDeployDestination(dest)
+ .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId()))
+ .setParams(params)
+ .build();
+
+ List routers = routerDeploymentDefinition.deployVirtualRouter();
+
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
@@ -195,8 +219,8 @@ public boolean implement(Network network, NetworkOffering offering, DeployDestin
}
@Override
- public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
- throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
+ public boolean prepare(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
+ throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
Long vpcId = network.getVpcId();
if (vpcId == null) {
@@ -213,8 +237,17 @@ public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm
if (vm.getType() == VirtualMachine.Type.User) {
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- List routers = _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
- if ((routers == null) || (routers.size() == 0)) {
+
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ routerDeploymentDefinitionBuilder.create()
+ .setVpc(vpc)
+ .setDeployDestination(dest)
+ .setAccountOwner(_accountMgr.getAccount(vpc.getAccountId()))
+ .setParams(params)
+ .build();
+ List routers = routerDeploymentDefinition.deployVirtualRouter();
+
+ if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
@@ -242,7 +275,7 @@ public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm
}
@Override
- public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean shutdown(final Network network, final ReservationContext context, final boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
boolean success = true;
Long vpcId = network.getVpcId();
if (vpcId == null) {
@@ -270,7 +303,7 @@ public boolean shutdown(Network network, ReservationContext context, boolean cle
}
@Override
- public boolean destroy(Network config, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean destroy(final Network config, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
boolean success = true;
Long vpcId = config.getVpcId();
if (vpcId == null) {
@@ -333,7 +366,7 @@ public Map> getCapabilities() {
}
@Override
- public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean createPrivateGateway(final PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
if (gateway.getType() != VpcGateway.Type.Private) {
s_logger.warn("Type of vpc gateway is not " + VpcGateway.Type.Private);
return false;
@@ -342,7 +375,7 @@ public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOpe
List routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId());
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to create Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" +
- gateway.getVpcId());
+ gateway.getVpcId());
return true;
}
@@ -352,7 +385,10 @@ public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOpe
VirtualRouter router = routers.get(0);
- if (_vpcRouterMgr.setupPrivateGateway(gateway, router)) {
+ DataCenterVO dcVO = _dcDao.findById(gateway.getZoneId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ if (networkTopology.setupPrivateGateway(gateway, router)) {
try {
List rules = _networkACLItemDao.listByACL(gateway.getNetworkACLId());
if (!applyACLItemsToPrivateGw(gateway, rules)) {
@@ -371,7 +407,7 @@ public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOpe
}
@Override
- public boolean deletePrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean deletePrivateGateway(final PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
if (gateway.getType() != VpcGateway.Type.Private) {
s_logger.warn("Type of vpc gateway is not " + VpcGateway.Type.Private);
return false;
@@ -380,7 +416,7 @@ public boolean deletePrivateGateway(PrivateGateway gateway) throws ConcurrentOpe
List routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId());
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to delete Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" +
- gateway.getVpcId());
+ gateway.getVpcId());
return true;
}
@@ -394,7 +430,7 @@ public boolean deletePrivateGateway(PrivateGateway gateway) throws ConcurrentOpe
}
@Override
- public boolean applyIps(Network network, List extends PublicIpAddress> ipAddress, Set services) throws ResourceUnavailableException {
+ public boolean applyIps(final Network network, final List extends PublicIpAddress> ipAddress, final Set services) throws ResourceUnavailableException {
boolean canHandle = true;
for (Service service : services) {
if (!canHandle(network, service)) {
@@ -406,34 +442,40 @@ public boolean applyIps(Network network, List extends PublicIpAddress> ipAddre
List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to associate ip addresses on the backend; VPC virtual " + "router doesn't exist in the network " +
- network.getId());
+ network.getId());
return true;
}
- return _vpcRouterMgr.associatePublicIP(network, ipAddress, routers);
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
}
}
@Override
- public boolean applyNetworkACLs(Network config, List extends NetworkACLItem> rules) throws ResourceUnavailableException {
- if (canHandle(config, Service.NetworkACL)) {
- List routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
+ public boolean applyNetworkACLs(final Network network, final List extends NetworkACLItem> rules) throws ResourceUnavailableException {
+ if (canHandle(network, Service.NetworkACL)) {
+ List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " +
- config.getId());
+ network.getId());
return true;
}
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
try {
- if (!_vpcRouterMgr.applyNetworkACLs(config, rules, routers, false)) {
+ if (!networkTopology.applyNetworkACLs(network, rules, routers, false)) {
return false;
} else {
return true;
}
} catch (Exception ex) {
- s_logger.debug("Failed to apply network acl in network " + config.getId());
+ s_logger.debug("Failed to apply network acl in network " + network.getId());
return false;
}
} else {
@@ -447,14 +489,17 @@ protected Type getVirtualRouterProvider() {
}
@Override
- public boolean applyStaticRoutes(Vpc vpc, List routes) throws ResourceUnavailableException {
+ public boolean applyStaticRoutes(final Vpc vpc, final List routes) throws ResourceUnavailableException {
List routers = _routerDao.listByVpcId(vpc.getId());
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to static routes on the backend; virtual " + "router doesn't exist in the vpc " + vpc);
return true;
}
- if (!_vpcRouterMgr.applyStaticRoutes(routes, routers)) {
+ DataCenterVO dcVO = _dcDao.findById(vpc.getZoneId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ if (!networkTopology.applyStaticRoutes(routes, routers)) {
throw new CloudRuntimeException("Failed to apply static routes in vpc " + vpc);
} else {
s_logger.debug("Applied static routes on vpc " + vpc);
@@ -463,26 +508,29 @@ public boolean applyStaticRoutes(Vpc vpc, List routes) throw
}
@Override
- public boolean applyACLItemsToPrivateGw(PrivateGateway gateway, List extends NetworkACLItem> rules) throws ResourceUnavailableException {
- Network config = _networkDao.findById(gateway.getNetworkId());
+ public boolean applyACLItemsToPrivateGw(final PrivateGateway gateway, final List extends NetworkACLItem> rules) throws ResourceUnavailableException {
+ Network network = _networkDao.findById(gateway.getNetworkId());
boolean isPrivateGateway = true;
List routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId());
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router element doesn't need to apply network acl rules on the backend; virtual " + "router doesn't exist in the network " +
- config.getId());
+ network.getId());
return true;
}
- if (!_vpcRouterMgr.applyNetworkACLs(config, rules, routers, isPrivateGateway)) {
- throw new CloudRuntimeException("Failed to apply network acl in network " + config.getId());
+ DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ if (!networkTopology.applyNetworkACLs(network, rules, routers, isPrivateGateway)) {
+ throw new CloudRuntimeException("Failed to apply network acl in network " + network.getId());
} else {
return true;
}
}
@Override
- public boolean startSite2SiteVpn(Site2SiteVpnConnection conn) throws ResourceUnavailableException {
+ public boolean startSite2SiteVpn(final Site2SiteVpnConnection conn) throws ResourceUnavailableException {
Site2SiteVpnGateway vpnGw = _vpnGatewayDao.findById(conn.getVpnGatewayId());
IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId());
@@ -502,14 +550,14 @@ public boolean startSite2SiteVpn(Site2SiteVpnConnection conn) throws ResourceUna
List routers = _vpcRouterMgr.getVpcRouters(ip.getVpcId());
if (routers == null || routers.size() != 1) {
throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(),
- DataCenter.class, vpc.getZoneId());
+ DataCenter.class, vpc.getZoneId());
}
return _vpcRouterMgr.startSite2SiteVpn(conn, routers.get(0));
}
@Override
- public boolean stopSite2SiteVpn(Site2SiteVpnConnection conn) throws ResourceUnavailableException {
+ public boolean stopSite2SiteVpn(final Site2SiteVpnConnection conn) throws ResourceUnavailableException {
Site2SiteVpnGateway vpnGw = _vpnGatewayDao.findById(conn.getVpnGatewayId());
IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId());
@@ -529,14 +577,14 @@ public boolean stopSite2SiteVpn(Site2SiteVpnConnection conn) throws ResourceUnav
List routers = _vpcRouterMgr.getVpcRouters(ip.getVpcId());
if (routers == null || routers.size() != 1) {
throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(),
- DataCenter.class, vpc.getZoneId());
+ DataCenter.class, vpc.getZoneId());
}
return _vpcRouterMgr.stopSite2SiteVpn(conn, routers.get(0));
}
@Override
- public String[] applyVpnUsers(RemoteAccessVpn vpn, List extends VpnUser> users) throws ResourceUnavailableException {
+ public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List extends VpnUser> users) throws ResourceUnavailableException {
if (vpn.getVpcId() == null) {
return null;
}
@@ -546,11 +594,16 @@ public String[] applyVpnUsers(RemoteAccessVpn vpn, List extends VpnUser> users
s_logger.debug("Cannot apply vpn users on the backend; virtual router doesn't exist in the network " + vpn.getVpcId());
return null;
}
- return _vpcRouterMgr.applyVpnUsers(vpn, users, routers.get(0));
+
+ Vpc vpc = _entityMgr.findById(Vpc.class, vpn.getVpcId());
+ DataCenterVO dcVO = _dcDao.findById(vpc.getZoneId());
+ NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
+
+ return networkTopology.applyVpnUsers(vpn, users, routers.get(0));
}
@Override
- public boolean startVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
+ public boolean startVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getVpcId() == null) {
return false;
}
@@ -564,7 +617,7 @@ public boolean startVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException
}
@Override
- public boolean stopVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
+ public boolean stopVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getVpcId() == null) {
return false;
}
diff --git a/server/src/com/cloud/network/router/CommandSetupHelper.java b/server/src/com/cloud/network/router/CommandSetupHelper.java
new file mode 100644
index 000000000000..df5ad48a1f4e
--- /dev/null
+++ b/server/src/com/cloud/network/router/CommandSetupHelper.java
@@ -0,0 +1,1020 @@
+// 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.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+
+import com.cloud.agent.api.SetupGuestNetworkCommand;
+import com.cloud.agent.api.routing.CreateIpAliasCommand;
+import com.cloud.agent.api.routing.DeleteIpAliasCommand;
+import com.cloud.agent.api.routing.DhcpEntryCommand;
+import com.cloud.agent.api.routing.DnsMasqConfigCommand;
+import com.cloud.agent.api.routing.IpAliasTO;
+import com.cloud.agent.api.routing.IpAssocCommand;
+import com.cloud.agent.api.routing.IpAssocVpcCommand;
+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.SetNetworkACLCommand;
+import com.cloud.agent.api.routing.SetPortForwardingRulesCommand;
+import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
+import com.cloud.agent.api.routing.SetSourceNatCommand;
+import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
+import com.cloud.agent.api.routing.SetStaticRouteCommand;
+import com.cloud.agent.api.routing.Site2SiteVpnCfgCommand;
+import com.cloud.agent.api.routing.VmDataCommand;
+import com.cloud.agent.api.routing.VpnUsersCfgCommand;
+import com.cloud.agent.api.to.DhcpTO;
+import com.cloud.agent.api.to.FirewallRuleTO;
+import com.cloud.agent.api.to.IpAddressTO;
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.agent.api.to.NetworkACLTO;
+import com.cloud.agent.api.to.PortForwardingRuleTO;
+import com.cloud.agent.api.to.StaticNatRuleTO;
+import com.cloud.agent.manager.Commands;
+import com.cloud.configuration.Config;
+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.dc.dao.VlanDao;
+import com.cloud.network.IpAddress;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PublicIpAddress;
+import com.cloud.network.RemoteAccessVpn;
+import com.cloud.network.Site2SiteVpnConnection;
+import com.cloud.network.VpnUser;
+import com.cloud.network.VpnUserVO;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
+import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
+import com.cloud.network.dao.Site2SiteVpnGatewayDao;
+import com.cloud.network.dao.Site2SiteVpnGatewayVO;
+import com.cloud.network.dao.VpnUserDao;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.PortForwardingRule;
+import com.cloud.network.rules.StaticNat;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.network.vpc.NetworkACLItem;
+import com.cloud.network.vpc.PrivateIpAddress;
+import com.cloud.network.vpc.StaticRouteProfile;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.network.vpc.VpcGateway;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.user.Account;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.Pair;
+import com.cloud.utils.PasswordGenerator;
+import com.cloud.utils.StringUtils;
+import com.cloud.utils.db.EntityManager;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.Nic;
+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.VirtualMachine.State;
+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.NicIpAliasVO;
+import com.cloud.vm.dao.UserVmDao;
+
+public class CommandSetupHelper {
+
+ private static final Logger s_logger = Logger.getLogger(CommandSetupHelper.class);
+
+ @Inject
+ private EntityManager _entityMgr;
+
+ @Inject
+ private NicDao _nicDao;
+ @Inject
+ private NetworkDao _networkDao;
+ @Inject
+ private DomainRouterDao _routerDao;
+ @Inject
+ private NetworkModel _networkModel;
+ @Inject
+ private VirtualMachineManager _itMgr;
+ @Inject
+ private DataCenterDao _dcDao;
+ @Inject
+ private NicIpAliasDao _nicIpAliasDao;
+ @Inject
+ private FirewallRulesDao _rulesDao;
+ @Inject
+ private NetworkOfferingDao _networkOfferingDao;
+ @Inject
+ private ConfigurationDao _configDao;
+ @Inject
+ private ServiceOfferingDao _serviceOfferingDao;
+ @Inject
+ private UserVmDao _userVmDao;
+ @Inject
+ private VpnUserDao _vpnUsersDao;
+ @Inject
+ private Site2SiteCustomerGatewayDao _s2sCustomerGatewayDao;
+ @Inject
+ private Site2SiteVpnGatewayDao _s2sVpnGatewayDao;
+ @Inject
+ private VpcDao _vpcDao;
+ @Inject
+ private VlanDao _vlanDao;
+ @Inject
+ private IPAddressDao _ipAddressDao;
+
+ @Inject
+ private RouterControlHelper _routerControlHelper;
+
+ @Autowired
+ @Qualifier("networkHelper")
+ protected NetworkHelper _networkHelper;
+
+ private final String _dnsBasicZoneUpdates = "all";
+
+ public void createVmDataCommand(final VirtualRouter router, final UserVm vm, final NicVO nic, final String publicKey, final Commands cmds) {
+ final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText();
+ final String zoneName = _dcDao.findById(router.getDataCenterId()).getName();
+ cmds.addCommand(
+ "vmdata",
+ generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(),
+ vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId()));
+ }
+
+ public void createApplyVpnUsersCommand(final List extends VpnUser> users, final VirtualRouter router, final Commands cmds) {
+ final List addUsers = new ArrayList();
+ final List removeUsers = new ArrayList();
+ for (final VpnUser user : users) {
+ if (user.getState() == VpnUser.State.Add || user.getState() == VpnUser.State.Active) {
+ addUsers.add(user);
+ } else if (user.getState() == VpnUser.State.Revoke) {
+ removeUsers.add(user);
+ }
+ }
+
+ final VpnUsersCfgCommand cmd = new VpnUsersCfgCommand(addUsers, removeUsers);
+ cmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, String.valueOf(router.getAccountId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("users", cmd);
+ }
+
+ public void createDhcpEntryCommand(final VirtualRouter router, final UserVm vm, final NicVO nic, final Commands cmds) {
+ final DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getHostName(), nic.getIp6Address(),
+ _networkModel.getExecuteInSeqNtwkElmtCmd());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ final Nic defaultNic = findGatewayIp(vm.getId());
+ String gatewayIp = defaultNic.getGateway();
+ if (gatewayIp != null && !gatewayIp.equals(nic.getGateway())) {
+ gatewayIp = "0.0.0.0";
+ }
+ dhcpCommand.setDefaultRouter(gatewayIp);
+ dhcpCommand.setIp6Gateway(nic.getIp6Gateway());
+ String ipaddress = null;
+ final NicVO domrDefaultNic = findDefaultDnsIp(vm.getId());
+ if (domrDefaultNic != null) {
+ ipaddress = domrDefaultNic.getIp4Address();
+ }
+ dhcpCommand.setDefaultDns(ipaddress);
+ dhcpCommand.setDuid(NetUtils.getDuidLL(nic.getMacAddress()));
+ dhcpCommand.setDefault(nic.isDefaultNic());
+
+ dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(nic.getNetworkId(), router.getId()));
+ dhcpCommand.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("dhcp", dhcpCommand);
+ }
+
+ 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);
+ }
+
+ public void createApplyLoadBalancingRulesCommands(final List rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
+ final LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()];
+ int i = 0;
+ // We don't support VR to be inline currently
+ final boolean inline = false;
+ for (final LoadBalancingRule rule : rules) {
+ final boolean revoked = rule.getState().equals(FirewallRule.State.Revoke);
+ final String protocol = rule.getProtocol();
+ final String algorithm = rule.getAlgorithm();
+ final String uuid = rule.getUuid();
+
+ final String srcIp = rule.getSourceIp().addr();
+ final int srcPort = rule.getSourcePortStart();
+ final List destinations = rule.getDestinations();
+ final List stickinessPolicies = rule.getStickinessPolicies();
+ final LoadBalancerTO lb = new LoadBalancerTO(uuid, srcIp, srcPort, protocol, algorithm, revoked, false, inline, destinations, stickinessPolicies);
+ lbs[i++] = lb;
+ }
+ String routerPublicIp = null;
+
+ if (router instanceof DomainRouterVO) {
+ final DomainRouterVO domr = _routerDao.findById(router.getId());
+ routerPublicIp = domr.getPublicIpAddress();
+ if (routerPublicIp == null) {
+ routerPublicIp = router.getPublicIpAddress();
+ }
+ }
+
+ final Network guestNetwork = _networkModel.getNetwork(guestNetworkId);
+ final Nic nic = _nicDao.findByNtwkIdAndInstanceId(guestNetwork.getId(), router.getId());
+ final NicProfile nicProfile = new NicProfile(nic, guestNetwork, nic.getBroadcastUri(), nic.getIsolationUri(), _networkModel.getNetworkRate(guestNetwork.getId(),
+ router.getId()), _networkModel.isSecurityGroupSupportedInNetwork(guestNetwork), _networkModel.getNetworkTag(router.getHypervisorType(), guestNetwork));
+ final NetworkOffering offering = _networkOfferingDao.findById(guestNetwork.getNetworkOfferingId());
+ String maxconn = null;
+ if (offering.getConcurrentConnections() == null) {
+ maxconn = _configDao.getValue(Config.NetworkLBHaproxyMaxConn.key());
+ } else {
+ maxconn = offering.getConcurrentConnections().toString();
+ }
+
+ final LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs, routerPublicIp, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()),
+ router.getPrivateIpAddress(), _itMgr.toNicTO(nicProfile, router.getHypervisorType()), router.getVpcId(), maxconn, offering.isKeepAliveEnabled());
+
+ cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key());
+ cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key());
+ cmd.lbStatsAuth = _configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key());
+ cmd.lbStatsPort = _configDao.getValue(Config.NetworkLBHaproxyStatsPort.key());
+
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand(cmd);
+ }
+
+ public void createApplyPortForwardingRulesCommands(final List extends PortForwardingRule> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
+ final List rulesTO = new ArrayList();
+ if (rules != null) {
+ for (final PortForwardingRule rule : rules) {
+ final IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
+ final PortForwardingRuleTO ruleTO = new PortForwardingRuleTO(rule, null, sourceIp.getAddress().addr());
+ rulesTO.add(ruleTO);
+ }
+ }
+
+ SetPortForwardingRulesCommand cmd = null;
+
+ if (router.getVpcId() != null) {
+ cmd = new SetPortForwardingRulesVpcCommand(rulesTO);
+ } else {
+ cmd = new SetPortForwardingRulesCommand(rulesTO);
+ }
+
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand(cmd);
+ }
+
+ public void createApplyStaticNatRulesCommands(final List extends StaticNatRule> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
+ final List rulesTO = new ArrayList();
+ if (rules != null) {
+ for (final StaticNatRule rule : rules) {
+ final IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
+ final StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, null, sourceIp.getAddress().addr(), rule.getDestIpAddress());
+ rulesTO.add(ruleTO);
+ }
+ }
+
+ final SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, router.getVpcId());
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand(cmd);
+ }
+
+ public void createApplyFirewallRulesCommands(final List extends FirewallRule> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
+ final List rulesTO = new ArrayList();
+ String systemRule = null;
+ Boolean defaultEgressPolicy = false;
+ if (rules != null) {
+ if (rules.size() > 0) {
+ if (rules.get(0).getTrafficType() == FirewallRule.TrafficType.Egress && rules.get(0).getType() == FirewallRule.FirewallRuleType.System) {
+ systemRule = String.valueOf(FirewallRule.FirewallRuleType.System);
+ }
+ }
+ for (final FirewallRule rule : rules) {
+ _rulesDao.loadSourceCidrs((FirewallRuleVO) rule);
+ final FirewallRule.TrafficType traffictype = rule.getTrafficType();
+ if (traffictype == FirewallRule.TrafficType.Ingress) {
+ final IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
+ final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, sourceIp.getAddress().addr(), Purpose.Firewall, traffictype);
+ rulesTO.add(ruleTO);
+ } else if (rule.getTrafficType() == FirewallRule.TrafficType.Egress) {
+ final NetworkVO network = _networkDao.findById(guestNetworkId);
+ final NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
+ defaultEgressPolicy = offering.getEgressDefaultPolicy();
+ assert rule.getSourceIpAddressId() == null : "ipAddressId should be null for egress firewall rule. ";
+ final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, "", Purpose.Firewall, traffictype, defaultEgressPolicy);
+ rulesTO.add(ruleTO);
+ }
+ }
+ }
+
+ final SetFirewallRulesCommand cmd = new SetFirewallRulesCommand(rulesTO);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ if (systemRule != null) {
+ cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, systemRule);
+ } else {
+ cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, String.valueOf(defaultEgressPolicy));
+ }
+
+ cmds.addCommand(cmd);
+ }
+
+ public void createFirewallRulesCommands(final List extends FirewallRule> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
+ final List rulesTO = new ArrayList();
+ String systemRule = null;
+ Boolean defaultEgressPolicy = false;
+ if (rules != null) {
+ if (rules.size() > 0) {
+ if (rules.get(0).getTrafficType() == FirewallRule.TrafficType.Egress && rules.get(0).getType() == FirewallRule.FirewallRuleType.System) {
+ systemRule = String.valueOf(FirewallRule.FirewallRuleType.System);
+ }
+ }
+ for (final FirewallRule rule : rules) {
+ _rulesDao.loadSourceCidrs((FirewallRuleVO) rule);
+ final FirewallRule.TrafficType traffictype = rule.getTrafficType();
+ if (traffictype == FirewallRule.TrafficType.Ingress) {
+ final IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
+ final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, sourceIp.getAddress().addr(), Purpose.Firewall, traffictype);
+ rulesTO.add(ruleTO);
+ } else if (rule.getTrafficType() == FirewallRule.TrafficType.Egress) {
+ final NetworkVO network = _networkDao.findById(guestNetworkId);
+ final NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
+ defaultEgressPolicy = offering.getEgressDefaultPolicy();
+ assert rule.getSourceIpAddressId() == null : "ipAddressId should be null for egress firewall rule. ";
+ final FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, "", Purpose.Firewall, traffictype, defaultEgressPolicy);
+ rulesTO.add(ruleTO);
+ }
+ }
+ }
+
+ final SetFirewallRulesCommand cmd = new SetFirewallRulesCommand(rulesTO);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ if (systemRule != null) {
+ cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, systemRule);
+ } else {
+ cmd.setAccessDetail(NetworkElementCommand.FIREWALL_EGRESS_DEFAULT, String.valueOf(defaultEgressPolicy));
+ }
+
+ cmds.addCommand(cmd);
+ }
+
+ public void createAssociateIPCommands(final VirtualRouter router, final List extends PublicIpAddress> ips, final Commands cmds, final long vmId) {
+
+ // Ensure that in multiple vlans case we first send all ip addresses of
+ // vlan1, then all ip addresses of vlan2, etc..
+ final Map> vlanIpMap = new HashMap>();
+ for (final PublicIpAddress ipAddress : ips) {
+ final String vlanTag = ipAddress.getVlanTag();
+ ArrayList ipList = vlanIpMap.get(vlanTag);
+ if (ipList == null) {
+ ipList = new ArrayList();
+ }
+ // domR doesn't support release for sourceNat IP address; so reset
+ // the state
+ if (ipAddress.isSourceNat() && ipAddress.getState() == IpAddress.State.Releasing) {
+ ipAddress.setState(IpAddress.State.Allocated);
+ }
+ ipList.add(ipAddress);
+ vlanIpMap.put(vlanTag, ipList);
+ }
+
+ final List nics = _nicDao.listByVmId(router.getId());
+ String baseMac = null;
+ for (final NicVO nic : nics) {
+ final NetworkVO nw = _networkDao.findById(nic.getNetworkId());
+ if (nw.getTrafficType() == TrafficType.Public) {
+ baseMac = nic.getMacAddress();
+ break;
+ }
+ }
+
+ for (final Map.Entry> vlanAndIp : vlanIpMap.entrySet()) {
+ final List ipAddrList = vlanAndIp.getValue();
+ // Source nat ip address should always be sent first
+ Collections.sort(ipAddrList, new Comparator() {
+ @Override
+ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) {
+ final boolean s1 = o1.isSourceNat();
+ final boolean s2 = o2.isSourceNat();
+ return s1 ^ s2 ? s1 ^ true ? 1 : -1 : 0;
+ }
+ });
+
+ // Get network rate - required for IpAssoc
+ final Integer networkRate = _networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
+ final Network network = _networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
+
+ final IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
+ int i = 0;
+ boolean firstIP = true;
+
+ for (final PublicIpAddress ipAddr : ipAddrList) {
+
+ final boolean add = ipAddr.getState() == IpAddress.State.Releasing ? false : true;
+ boolean sourceNat = ipAddr.isSourceNat();
+ /* enable sourceNAT for the first ip of the public interface */
+ if (firstIP) {
+ sourceNat = true;
+ }
+ final String vlanId = ipAddr.getVlanTag();
+ final String vlanGateway = ipAddr.getGateway();
+ final String vlanNetmask = ipAddr.getNetmask();
+ String vifMacAddress = null;
+ // For non-source nat IP, set the mac to be something based on
+ // first public nic's MAC
+ // We cannot depends on first ip because we need to deal with
+ // first ip of other nics
+ if (!ipAddr.isSourceNat() && ipAddr.getVlanId() != 0) {
+ vifMacAddress = NetUtils.generateMacOnIncrease(baseMac, ipAddr.getVlanId());
+ } else {
+ vifMacAddress = ipAddr.getMacAddress();
+ }
+
+ final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask,
+ vifMacAddress, networkRate, ipAddr.isOneToOneNat());
+
+ ip.setTrafficType(network.getTrafficType());
+ ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
+ ipsToSend[i++] = ip;
+ /*
+ * send the firstIP = true for the first Add, this is to create
+ * primary on interface
+ */
+ if (!firstIP || add) {
+ firstIP = false;
+ }
+ }
+ final IpAssocCommand cmd = new IpAssocCommand(ipsToSend);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getAssociatedWithNetworkId(), router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("IPAssocCommand", cmd);
+ }
+ }
+
+ public void createNetworkACLsCommands(final List extends NetworkACLItem> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId,
+ final boolean privateGateway) {
+ final List rulesTO = new ArrayList();
+ String guestVlan = null;
+ final Network guestNtwk = _networkDao.findById(guestNetworkId);
+ final URI uri = guestNtwk.getBroadcastUri();
+ if (uri != null) {
+ guestVlan = BroadcastDomainType.getValue(uri);
+ }
+
+ if (rules != null) {
+ for (final NetworkACLItem rule : rules) {
+ final NetworkACLTO ruleTO = new NetworkACLTO(rule, guestVlan, rule.getTrafficType());
+ rulesTO.add(ruleTO);
+ }
+ }
+
+ final SetNetworkACLCommand cmd = new SetNetworkACLCommand(rulesTO, _networkHelper.getNicTO(router, guestNetworkId, null));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, guestVlan);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ if (privateGateway) {
+ cmd.setAccessDetail(NetworkElementCommand.VPC_PRIVATE_GATEWAY, String.valueOf(VpcGateway.Type.Private));
+ }
+
+ cmds.addCommand(cmd);
+ }
+
+ 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 void createApplyStaticNatCommands(final List extends StaticNat> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
+ final List rulesTO = new ArrayList();
+ if (rules != null) {
+ for (final StaticNat rule : rules) {
+ final IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
+ final StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(),
+ false);
+ rulesTO.add(ruleTO);
+ }
+ }
+
+ final SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, router.getVpcId());
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand(cmd);
+ }
+
+ public void createStaticRouteCommands(final List staticRoutes, final VirtualRouter router, final Commands cmds) {
+ SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand(cmd);
+ }
+
+ public void createApplyVpnCommands(final boolean isCreate, final RemoteAccessVpn vpn, final VirtualRouter router, final Commands cmds) {
+ final List vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
+
+ createApplyVpnUsersCommand(vpnUsers, router, cmds);
+
+ final IpAddress ip = _networkModel.getIp(vpn.getServerAddressId());
+
+ // This block is needed due to the line 206 of the
+ // RemoteAccessVpnManagenerImpl:
+ // TODO: assumes one virtual network / domr per account per zone
+ final String cidr;
+ final Network network = _networkDao.findById(vpn.getNetworkId());
+ if (network == null) {
+ Vpc vpc = _vpcDao.findById(vpn.getVpcId());
+ cidr = vpc.getCidr();
+ } else {
+ cidr = network.getCidr();
+ }
+
+ final RemoteAccessVpnCfgCommand startVpnCmd = new RemoteAccessVpnCfgCommand(isCreate, ip.getAddress().addr(), vpn.getLocalIp(), vpn.getIpRange(),
+ vpn.getIpsecPresharedKey(), vpn.getVpcId() != null);
+ startVpnCmd.setLocalCidr(cidr);
+ startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ startVpnCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("startVpn", startVpnCmd);
+ }
+
+ public void createVmDataCommandForVMs(final DomainRouterVO router, final Commands cmds, final long guestNetworkId) {
+ final List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, State.Migrating, State.Stopping);
+ final DataCenterVO dc = _dcDao.findById(router.getDataCenterId());
+ for (final UserVmVO vm : vms) {
+ boolean createVmData = true;
+ if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) {
+ createVmData = false;
+ }
+
+ if (createVmData) {
+ final NicVO nic = _nicDao.findByNtwkIdAndInstanceId(guestNetworkId, vm.getId());
+ if (nic != null) {
+ s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router);
+ createVmDataCommand(router, vm, nic, null, cmds);
+ }
+ }
+ }
+ }
+
+ public void createDhcpEntryCommandsForVMs(final DomainRouterVO router, final Commands cmds, final long guestNetworkId) {
+ final List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, State.Migrating, State.Stopping);
+ final DataCenterVO dc = _dcDao.findById(router.getDataCenterId());
+ for (final UserVmVO vm : vms) {
+ boolean createDhcp = true;
+ if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()
+ && _dnsBasicZoneUpdates.equalsIgnoreCase("pod")) {
+ createDhcp = false;
+ }
+ if (createDhcp) {
+ final NicVO nic = _nicDao.findByNtwkIdAndInstanceId(guestNetworkId, vm.getId());
+ if (nic != null) {
+ s_logger.debug("Creating dhcp entry for vm " + vm + " on domR " + router + ".");
+ createDhcpEntryCommand(router, vm, nic, cmds);
+ }
+ }
+ }
+ }
+
+ public void createDeleteIpAliasCommand(final DomainRouterVO router, final List deleteIpAliasTOs, final List createIpAliasTos, final long networkId,
+ final Commands cmds) {
+ final String routerip = _routerControlHelper.getRouterIpInNetwork(networkId, router.getId());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ final DeleteIpAliasCommand deleteIpaliasCmd = new DeleteIpAliasCommand(routerip, deleteIpAliasTOs, createIpAliasTos);
+ deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, routerip);
+ deleteIpaliasCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("deleteIpalias", deleteIpaliasCmd);
+ }
+
+ public void createVpcAssociatePublicIPCommands(final VirtualRouter router, final List extends PublicIpAddress> ips, final Commands cmds,
+ final Map vlanMacAddress) {
+
+ Pair sourceNatIpAdd = null;
+ Boolean addSourceNat = null;
+ // Ensure that in multiple vlans case we first send all ip addresses of
+ // vlan1, then all ip addresses of vlan2, etc..
+ final Map> vlanIpMap = new HashMap>();
+ for (final PublicIpAddress ipAddress : ips) {
+ final String vlanTag = ipAddress.getVlanTag();
+ ArrayList ipList = vlanIpMap.get(vlanTag);
+ if (ipList == null) {
+ ipList = new ArrayList();
+ }
+ // VR doesn't support release for sourceNat IP address; so reset the
+ // state
+ if (ipAddress.isSourceNat() && ipAddress.getState() == IpAddress.State.Releasing) {
+ ipAddress.setState(IpAddress.State.Allocated);
+ }
+ ipList.add(ipAddress);
+ vlanIpMap.put(vlanTag, ipList);
+ }
+
+ for (final Map.Entry> vlanAndIp : vlanIpMap.entrySet()) {
+ final List ipAddrList = vlanAndIp.getValue();
+
+ // Get network rate - required for IpAssoc
+ final Integer networkRate = _networkModel.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId());
+ final Network network = _networkModel.getNetwork(ipAddrList.get(0).getNetworkId());
+
+ final IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
+ int i = 0;
+
+ for (final PublicIpAddress ipAddr : ipAddrList) {
+ final boolean add = ipAddr.getState() == IpAddress.State.Releasing ? false : true;
+
+ final String macAddress = vlanMacAddress.get(BroadcastDomainType.getValue(BroadcastDomainType.fromString(ipAddr.getVlanTag())));
+
+ final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, false, ipAddr.isSourceNat(), ipAddr.getVlanTag(),
+ ipAddr.getGateway(), ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat());
+
+ ip.setTrafficType(network.getTrafficType());
+ ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
+ ipsToSend[i++] = ip;
+ if (ipAddr.isSourceNat()) {
+ sourceNatIpAdd = new Pair(ip, ipAddr.getNetworkId());
+ addSourceNat = add;
+ }
+ }
+ final IpAssocVpcCommand cmd = new IpAssocVpcCommand(ipsToSend);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("IPAssocVpcCommand", cmd);
+ }
+
+ // set source nat ip
+ if (sourceNatIpAdd != null) {
+ final IpAddressTO sourceNatIp = sourceNatIpAdd.first();
+ final SetSourceNatCommand cmd = new SetSourceNatCommand(sourceNatIp, addSourceNat);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand("SetSourceNatCommand", cmd);
+ }
+ }
+
+ public void createStaticRouteCommands(final List staticRoutes, final DomainRouterVO router, final Commands cmds) {
+ final SetStaticRouteCommand cmd = new SetStaticRouteCommand(staticRoutes);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand(cmd);
+ }
+
+ public void createSite2SiteVpnCfgCommands(final Site2SiteVpnConnection conn, final boolean isCreate, final VirtualRouter router, final Commands cmds) {
+ final Site2SiteCustomerGatewayVO gw = _s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId());
+ final Site2SiteVpnGatewayVO vpnGw = _s2sVpnGatewayDao.findById(conn.getVpnGatewayId());
+ final IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId());
+ final Vpc vpc = _vpcDao.findById(ip.getVpcId());
+ final String localPublicIp = ip.getAddress().toString();
+ final String localGuestCidr = vpc.getCidr();
+ final String localPublicGateway = _vlanDao.findById(ip.getVlanId()).getVlanGateway();
+ final String peerGatewayIp = gw.getGatewayIp();
+ final String peerGuestCidrList = gw.getGuestCidrList();
+ final String ipsecPsk = gw.getIpsecPsk();
+ final String ikePolicy = gw.getIkePolicy();
+ final String espPolicy = gw.getEspPolicy();
+ final Long ikeLifetime = gw.getIkeLifetime();
+ final Long espLifetime = gw.getEspLifetime();
+ final Boolean dpd = gw.getDpd();
+
+ final Site2SiteVpnCfgCommand cmd = new Site2SiteVpnCfgCommand(isCreate, localPublicIp, localPublicGateway, localGuestCidr, peerGatewayIp, peerGuestCidrList, ikePolicy,
+ espPolicy, ipsecPsk, ikeLifetime, espLifetime, dpd, conn.isPassive());
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+ cmds.addCommand("applyS2SVpn", cmd);
+ }
+
+ public void createVpcAssociatePrivateIPCommands(final VirtualRouter router, final List ips, final Commands cmds, final boolean add) {
+
+ // Ensure that in multiple vlans case we first send all ip addresses of
+ // vlan1, then all ip addresses of vlan2, etc..
+ final Map> vlanIpMap = new HashMap>();
+ for (final PrivateIpAddress ipAddress : ips) {
+ final String vlanTag = ipAddress.getBroadcastUri();
+ ArrayList ipList = vlanIpMap.get(vlanTag);
+ if (ipList == null) {
+ ipList = new ArrayList();
+ }
+
+ ipList.add(ipAddress);
+ vlanIpMap.put(vlanTag, ipList);
+ }
+
+ for (final Map.Entry> vlanAndIp : vlanIpMap.entrySet()) {
+ final List ipAddrList = vlanAndIp.getValue();
+ final IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
+ int i = 0;
+
+ for (final PrivateIpAddress ipAddr : ipAddrList) {
+ final Network network = _networkModel.getNetwork(ipAddr.getNetworkId());
+ final IpAddressTO ip = new IpAddressTO(Account.ACCOUNT_ID_SYSTEM, ipAddr.getIpAddress(), add, false, ipAddr.getSourceNat(), ipAddr.getBroadcastUri(),
+ ipAddr.getGateway(), ipAddr.getNetmask(), ipAddr.getMacAddress(), null, false);
+
+ ip.setTrafficType(network.getTrafficType());
+ ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
+ ipsToSend[i++] = ip;
+
+ }
+ final IpAssocVpcCommand cmd = new IpAssocVpcCommand(ipsToSend);
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmds.addCommand("IPAssocVpcCommand", cmd);
+ }
+ }
+
+ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final VirtualRouter router, final boolean add, final NicProfile guestNic) {
+ final Network network = _networkModel.getNetwork(guestNic.getNetworkId());
+
+ String defaultDns1 = null;
+ String defaultDns2 = null;
+
+ final boolean dnsProvided = _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, Provider.VPCVirtualRouter);
+ final boolean dhcpProvided = _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, Provider.VPCVirtualRouter);
+
+ final boolean setupDns = dnsProvided || dhcpProvided;
+
+ if (setupDns) {
+ defaultDns1 = guestNic.getDns1();
+ defaultDns2 = guestNic.getDns2();
+ }
+
+ final Nic nic = _nicDao.findByNtwkIdAndInstanceId(network.getId(), router.getId());
+ final String networkDomain = network.getNetworkDomain();
+ final String dhcpRange = getGuestDhcpRange(guestNic, network, _entityMgr.findById(DataCenter.class, network.getDataCenterId()));
+
+ final NicProfile nicProfile = _networkModel.getNicProfile(router, nic.getNetworkId(), null);
+
+ final SetupGuestNetworkCommand setupCmd = new SetupGuestNetworkCommand(dhcpRange, networkDomain, false, null, defaultDns1, defaultDns2, add, _itMgr.toNicTO(nicProfile,
+ router.getHypervisorType()));
+
+ final String brd = NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIp4Address()) | ~NetUtils.ip2Long(guestNic.getNetmask()));
+ setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId()));
+
+ setupCmd.setAccessDetail(NetworkElementCommand.GUEST_NETWORK_GATEWAY, network.getGateway());
+ setupCmd.setAccessDetail(NetworkElementCommand.GUEST_BRIDGE, brd);
+ setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+
+ if (network.getBroadcastDomainType() == BroadcastDomainType.Vlan) {
+ final long guestVlanTag = Long.parseLong(BroadcastDomainType.Vlan.getValueFrom(network.getBroadcastUri()));
+ setupCmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag));
+ }
+
+ return setupCmd;
+ }
+
+ private VmDataCommand generateVmDataCommand(final VirtualRouter router, final String vmPrivateIpAddress, final String userData, final String serviceOffering,
+ final String zoneName, final String guestIpAddress, final String vmName, final String vmInstanceName, final long vmId, final String vmUuid, final String publicKey,
+ final long guestNetworkId) {
+ final VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName, _networkModel.getExecuteInSeqNtwkElmtCmd());
+
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
+ cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+
+ final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
+ cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+
+ cmd.addVmData("userdata", "user-data", userData);
+ cmd.addVmData("metadata", "service-offering", StringUtils.unicodeEscape(serviceOffering));
+ cmd.addVmData("metadata", "availability-zone", StringUtils.unicodeEscape(zoneName));
+ cmd.addVmData("metadata", "local-ipv4", guestIpAddress);
+ cmd.addVmData("metadata", "local-hostname", StringUtils.unicodeEscape(vmName));
+ if (dcVo.getNetworkType() == NetworkType.Basic) {
+ cmd.addVmData("metadata", "public-ipv4", guestIpAddress);
+ cmd.addVmData("metadata", "public-hostname", StringUtils.unicodeEscape(vmName));
+ } else {
+ if (router.getPublicIpAddress() == null) {
+ cmd.addVmData("metadata", "public-ipv4", guestIpAddress);
+ } else {
+ cmd.addVmData("metadata", "public-ipv4", router.getPublicIpAddress());
+ }
+ cmd.addVmData("metadata", "public-hostname", router.getPublicIpAddress());
+ }
+ if (vmUuid == null) {
+ cmd.addVmData("metadata", "instance-id", vmInstanceName);
+ cmd.addVmData("metadata", "vm-id", String.valueOf(vmId));
+ } else {
+ cmd.addVmData("metadata", "instance-id", vmUuid);
+ cmd.addVmData("metadata", "vm-id", vmUuid);
+ }
+ cmd.addVmData("metadata", "public-keys", publicKey);
+
+ String cloudIdentifier = _configDao.getValue("cloud.identifier");
+ if (cloudIdentifier == null) {
+ cloudIdentifier = "";
+ } else {
+ cloudIdentifier = "CloudStack-{" + cloudIdentifier + "}";
+ }
+ cmd.addVmData("metadata", "cloud-identifier", cloudIdentifier);
+
+ return cmd;
+ }
+
+ private NicVO findGatewayIp(final long userVmId) {
+ final NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId);
+ return defaultNic;
+ }
+
+ private NicVO findDefaultDnsIp(final long userVmId) {
+ final NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId);
+
+ // check if DNS provider is the domR
+ if (!_networkModel.isProviderSupportServiceInNetwork(defaultNic.getNetworkId(), Service.Dns, Provider.VirtualRouter)) {
+ return null;
+ }
+
+ final NetworkOffering offering = _networkOfferingDao.findById(_networkDao.findById(defaultNic.getNetworkId()).getNetworkOfferingId());
+ if (offering.getRedundantRouter()) {
+ return findGatewayIp(userVmId);
+ }
+
+ final DataCenter dc = _dcDao.findById(_networkModel.getNetwork(defaultNic.getNetworkId()).getDataCenterId());
+ final boolean isZoneBasic = dc.getNetworkType() == NetworkType.Basic;
+
+ // find domR's nic in the network
+ NicVO domrDefaultNic;
+ if (isZoneBasic) {
+ domrDefaultNic = _nicDao.findByNetworkIdTypeAndGateway(defaultNic.getNetworkId(), VirtualMachine.Type.DomainRouter, defaultNic.getGateway());
+ } else {
+ domrDefaultNic = _nicDao.findByNetworkIdAndType(defaultNic.getNetworkId(), VirtualMachine.Type.DomainRouter);
+ }
+ return domrDefaultNic;
+ }
+
+ protected String getGuestDhcpRange(final NicProfile guestNic, final Network guestNetwork, final DataCenter dc) {
+ String dhcpRange = null;
+ // setup dhcp range
+ if (dc.getNetworkType() == NetworkType.Basic) {
+ final long cidrSize = NetUtils.getCidrSize(guestNic.getNetmask());
+ final String cidr = NetUtils.getCidrSubNet(guestNic.getGateway(), cidrSize);
+ if (cidr != null) {
+ dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize);
+ }
+ } else if (dc.getNetworkType() == NetworkType.Advanced) {
+ final String cidr = guestNetwork.getCidr();
+ if (cidr != null) {
+ dhcpRange = NetUtils.getDhcpRange(cidr);
+ }
+ }
+ return dhcpRange;
+ }
+}
\ No newline at end of file
diff --git a/server/src/com/cloud/network/router/NetworkHelper.java b/server/src/com/cloud/network/router/NetworkHelper.java
new file mode 100644
index 000000000000..711c02df86ee
--- /dev/null
+++ b/server/src/com/cloud/network/router/NetworkHelper.java
@@ -0,0 +1,81 @@
+// 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 org.cloud.network.router.deployment.RouterDeploymentDefinition;
+
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.manager.Commands;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientServerCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.user.Account;
+import com.cloud.user.User;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.VirtualMachineProfile.Param;
+
+public interface NetworkHelper {
+
+ public abstract boolean sendCommandsToRouter(VirtualRouter router,
+ Commands cmds) throws AgentUnavailableException;
+
+ public abstract void handleSingleWorkingRedundantRouter(
+ List extends VirtualRouter> connectedRouters,
+ List extends VirtualRouter> disconnectedRouters, String reason)
+ throws ResourceUnavailableException;
+
+ public abstract int getRealPriority(DomainRouterVO router);
+
+ public abstract NicTO getNicTO(VirtualRouter router, Long networkId,
+ String broadcastUri);
+
+ public abstract VirtualRouter destroyRouter(long routerId, Account caller,
+ Long callerUserId) throws ResourceUnavailableException,
+ ConcurrentOperationException;
+
+ /**
+ * Checks if the router is at the required version. Compares MS version and router version.
+ *
+ * @param router
+ * @return
+ */
+ public abstract boolean checkRouterVersion(VirtualRouter router);
+
+ public abstract List startRouters(
+ RouterDeploymentDefinition routerDeploymentDefinition)
+ throws StorageUnavailableException, InsufficientCapacityException,
+ ConcurrentOperationException, ResourceUnavailableException;
+
+ public abstract DomainRouterVO startVirtualRouter(DomainRouterVO router,
+ User user, Account caller, Map params)
+ throws StorageUnavailableException, InsufficientCapacityException,
+ ConcurrentOperationException, ResourceUnavailableException;
+
+ public abstract DomainRouterVO deployRouter(
+ RouterDeploymentDefinition routerDeploymentDefinition,
+ boolean startRouter)
+ throws InsufficientAddressCapacityException,
+ InsufficientServerCapacityException, InsufficientCapacityException,
+ StorageUnavailableException, ResourceUnavailableException;
+}
\ No newline at end of file
diff --git a/server/src/com/cloud/network/router/NetworkHelperImpl.java b/server/src/com/cloud/network/router/NetworkHelperImpl.java
new file mode 100644
index 000000000000..23726fe394e1
--- /dev/null
+++ b/server/src/com/cloud/network/router/NetworkHelperImpl.java
@@ -0,0 +1,767 @@
+// 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.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
+import org.cloud.network.router.deployment.RouterDeploymentDefinition;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.BumpUpPriorityCommand;
+import com.cloud.agent.api.routing.NetworkElementCommand;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.manager.Commands;
+import com.cloud.alert.AlertManager;
+import com.cloud.configuration.Config;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.Pod;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.deploy.DataCenterDeployment;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientServerCapacityException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.maint.Version;
+import com.cloud.network.IpAddressManager;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.IsolationType;
+import com.cloud.network.VirtualNetworkApplianceService;
+import com.cloud.network.addr.PublicIp;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.UserIpv6AddressDao;
+import com.cloud.network.router.VirtualRouter.RedundantState;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.network.vpn.Site2SiteVpnManager;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.resource.ResourceManager;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.User;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.VirtualMachineName;
+import com.cloud.vm.VirtualMachineProfile.Param;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+
+@Local(value = { NetworkHelper.class })
+public class NetworkHelperImpl implements NetworkHelper {
+
+ private static final Logger s_logger = Logger.getLogger(NetworkHelperImpl.class);
+
+ protected static Account s_systemAccount;
+ protected static String s_vmInstanceName;
+
+ @Inject
+ protected NicDao _nicDao;
+ @Inject
+ private NetworkDao _networkDao;
+ @Inject
+ protected DomainRouterDao _routerDao;
+ @Inject
+ private AgentManager _agentMgr;
+ @Inject
+ private AlertManager _alertMgr;
+ @Inject
+ protected NetworkModel _networkModel;
+ @Inject
+ private VirtualMachineManager _itMgr;
+ @Inject
+ private AccountManager _accountMgr;
+ @Inject
+ private Site2SiteVpnManager _s2sVpnMgr;
+ @Inject
+ private HostDao _hostDao;
+ @Inject
+ private VolumeDao _volumeDao;
+ @Inject
+ private ServiceOfferingDao _serviceOfferingDao;
+ @Inject
+ private VMTemplateDao _templateDao;
+ @Inject
+ private ResourceManager _resourceMgr;
+ @Inject
+ private ClusterDao _clusterDao;
+ @Inject
+ protected IPAddressDao _ipAddressDao;
+ @Inject
+ private IpAddressManager _ipAddrMgr;
+ @Inject
+ private UserIpv6AddressDao _ipv6Dao;
+ @Inject
+ private RouterControlHelper _routerControlHelper;
+ @Inject
+ private ConfigurationDao _configDao;
+ @Inject
+ protected NetworkOrchestrationService _networkMgr;
+
+ protected final Map> hypervisorsMap = new HashMap<>();
+
+ @PostConstruct
+ protected void setupHypervisorsMap() {
+ hypervisorsMap.put(HypervisorType.XenServer, VirtualNetworkApplianceManager.RouterTemplateXen);
+ hypervisorsMap.put(HypervisorType.KVM, VirtualNetworkApplianceManager.RouterTemplateKvm);
+ hypervisorsMap.put(HypervisorType.VMware, VirtualNetworkApplianceManager.RouterTemplateVmware);
+ hypervisorsMap.put(HypervisorType.Hyperv, VirtualNetworkApplianceManager.RouterTemplateHyperV);
+ hypervisorsMap.put(HypervisorType.LXC, VirtualNetworkApplianceManager.RouterTemplateLxc);
+ }
+
+ @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 : " + VirtualNetworkApplianceService.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 || answers.length != cmds.size()) {
+ return false;
+ }
+
+ // FIXME: Have to return state for individual command in the future
+ boolean result = true;
+ for (final Answer answer : answers) {
+ if (!answer.getResult()) {
+ result = false;
+ break;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public void handleSingleWorkingRedundantRouter(final List extends VirtualRouter> connectedRouters, final List extends VirtualRouter> disconnectedRouters,
+ final String reason) throws ResourceUnavailableException {
+ if (connectedRouters.isEmpty() || disconnectedRouters.isEmpty()) {
+ return;
+ }
+ if (connectedRouters.size() != 1 || disconnectedRouters.size() != 1) {
+ s_logger.warn("How many redundant routers do we have?? ");
+ return;
+ }
+ if (!connectedRouters.get(0).getIsRedundantRouter()) {
+ throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", DataCenter.class, connectedRouters.get(0)
+ .getDataCenterId());
+ }
+ if (!disconnectedRouters.get(0).getIsRedundantRouter()) {
+ throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", DataCenter.class, disconnectedRouters.get(0)
+ .getDataCenterId());
+ }
+
+ final DomainRouterVO connectedRouter = (DomainRouterVO) connectedRouters.get(0);
+ DomainRouterVO disconnectedRouter = (DomainRouterVO) disconnectedRouters.get(0);
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("About to stop the router " + disconnectedRouter.getInstanceName() + " due to: " + reason);
+ }
+ final String title = "Virtual router " + disconnectedRouter.getInstanceName() + " would be stopped after connecting back, due to " + reason;
+ final String context = "Virtual router (name: " + disconnectedRouter.getInstanceName() + ", id: " + disconnectedRouter.getId()
+ + ") would be stopped after connecting back, due to: " + reason;
+ _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, disconnectedRouter.getDataCenterId(), disconnectedRouter.getPodIdToDeployIn(), title, context);
+ disconnectedRouter.setStopPending(true);
+ disconnectedRouter = _routerDao.persist(disconnectedRouter);
+
+ final int connRouterPR = getRealPriority(connectedRouter);
+ final int disconnRouterPR = getRealPriority(disconnectedRouter);
+ if (connRouterPR < disconnRouterPR) {
+ // connRouterPR < disconnRouterPR, they won't equal at any time
+ if (!connectedRouter.getIsPriorityBumpUp()) {
+ final BumpUpPriorityCommand command = new BumpUpPriorityCommand();
+ command.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(connectedRouter.getId()));
+ command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, connectedRouter.getInstanceName());
+ final Answer answer = _agentMgr.easySend(connectedRouter.getHostId(), command);
+ if (!answer.getResult()) {
+ s_logger.error("Failed to bump up " + connectedRouter.getInstanceName() + "'s priority! " + answer.getDetails());
+ }
+ } else {
+ final String t = "Can't bump up virtual router " + connectedRouter.getInstanceName() + "'s priority due to it's already bumped up!";
+ _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, connectedRouter.getDataCenterId(), connectedRouter.getPodIdToDeployIn(), t, t);
+ }
+ }
+ }
+
+ @Override
+ public int getRealPriority(final DomainRouterVO router) {
+ int priority = router.getPriority();
+ if (router.getIsPriorityBumpUp()) {
+ priority += VirtualNetworkApplianceManager.DEFAULT_DELTA;
+ }
+ return priority;
+ }
+
+ @Override
+ public NicTO getNicTO(final VirtualRouter router, final Long networkId, final String broadcastUri) {
+ NicProfile nicProfile = _networkModel.getNicProfile(router, networkId, broadcastUri);
+
+ return _itMgr.toNicTO(nicProfile, router.getHypervisorType());
+ }
+
+ @Override
+ public VirtualRouter destroyRouter(final long routerId, final Account caller, final Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Attempting to destroy router " + routerId);
+ }
+
+ final DomainRouterVO router = _routerDao.findById(routerId);
+ if (router == null) {
+ return null;
+ }
+
+ _accountMgr.checkAccess(caller, null, true, router);
+
+ _itMgr.expunge(router.getUuid());
+ _routerDao.remove(router.getId());
+ return router;
+ }
+
+ @Override
+ public boolean checkRouterVersion(final VirtualRouter router) {
+ if (!VirtualNetworkApplianceManagerImpl.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, VirtualNetworkApplianceService.MinVRVersion) >= 0;
+ }
+
+ protected DomainRouterVO start(DomainRouterVO router, final User user, final Account caller, final Map params, final DeploymentPlan planToDeploy)
+ throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+ s_logger.debug("Starting router " + router);
+ try {
+ _itMgr.advanceStart(router.getUuid(), params, planToDeploy, null);
+ } catch (final OperationTimedoutException e) {
+ throw new ResourceUnavailableException("Starting router " + router + " failed! " + e.toString(), DataCenter.class, router.getDataCenterId());
+ }
+ if (router.isStopPending()) {
+ s_logger.info("Clear the stop pending flag of router " + router.getHostName() + " after start router successfully!");
+ router.setStopPending(false);
+ router = _routerDao.persist(router);
+ }
+ // We don't want the failure of VPN Connection affect the status of
+ // router, so we try to make connection
+ // only after router start successfully
+ final Long vpcId = router.getVpcId();
+ if (vpcId != null) {
+ _s2sVpnMgr.reconnectDisconnectedVpnByVpc(vpcId);
+ }
+ return _routerDao.findById(router.getId());
+ }
+
+ protected DomainRouterVO waitRouter(final DomainRouterVO router) {
+ DomainRouterVO vm = _routerDao.findById(router.getId());
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Router " + router.getInstanceName() + " is not fully up yet, we will wait");
+ }
+ while (vm.getState() == State.Starting) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ }
+
+ // reload to get the latest state info
+ vm = _routerDao.findById(router.getId());
+ }
+
+ if (vm.getState() == State.Running) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Router " + router.getInstanceName() + " is now fully up");
+ }
+
+ return router;
+ }
+
+ s_logger.warn("Router " + router.getInstanceName() + " failed to start. current state: " + vm.getState());
+ return null;
+ }
+
+ @Override
+ public List startRouters(final RouterDeploymentDefinition routerDeploymentDefinition) throws StorageUnavailableException, InsufficientCapacityException,
+ ConcurrentOperationException, ResourceUnavailableException {
+
+ List runningRouters = new ArrayList();
+
+ for (DomainRouterVO router : routerDeploymentDefinition.getRouters()) {
+ boolean skip = false;
+ final State state = router.getState();
+ if (router.getHostId() != null && state != State.Running) {
+ final HostVO host = _hostDao.findById(router.getHostId());
+ if (host == null || host.getState() != Status.Up) {
+ skip = true;
+ }
+ }
+ if (!skip) {
+ if (state != State.Running) {
+ router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), routerDeploymentDefinition.getParams());
+ }
+ if (router != null) {
+ runningRouters.add(router);
+ }
+ }
+ }
+ return runningRouters;
+ }
+
+ @Override
+ public DomainRouterVO startVirtualRouter(final DomainRouterVO router, final User user, final Account caller, final Map params)
+ throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+
+ if (router.getRole() != Role.VIRTUAL_ROUTER || !router.getIsRedundantRouter()) {
+ return start(router, user, caller, params, null);
+ }
+
+ if (router.getState() == State.Running) {
+ s_logger.debug("Redundant router " + router.getInstanceName() + " is already running!");
+ return router;
+ }
+
+ //
+ // If another thread has already requested a VR start, there is a
+ // transition period for VR to transit from
+ // Starting to Running, there exist a race conditioning window here
+ // We will wait until VR is up or fail
+ if (router.getState() == State.Starting) {
+ return waitRouter(router);
+ }
+
+ DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null);
+ DomainRouterVO result = null;
+ assert router.getIsRedundantRouter();
+ final List networkIds = _routerDao.getRouterNetworks(router.getId());
+ // Not support VPC now
+ if (networkIds.size() > 1) {
+ throw new ResourceUnavailableException("Unable to support more than one guest network for redundant router now!", DataCenter.class, router.getDataCenterId());
+ }
+ DomainRouterVO routerToBeAvoid = null;
+ if (networkIds.size() != 0) {
+ final List routerList = _routerDao.findByNetwork(networkIds.get(0));
+ for (final DomainRouterVO rrouter : routerList) {
+ if (rrouter.getHostId() != null && rrouter.getIsRedundantRouter() && rrouter.getState() == State.Running) {
+ if (routerToBeAvoid != null) {
+ throw new ResourceUnavailableException("Try to start router " + router.getInstanceName() + "(" + router.getId() + ")"
+ + ", but there are already two redundant routers with IP " + router.getPublicIpAddress() + ", they are " + rrouter.getInstanceName() + "("
+ + rrouter.getId() + ") and " + routerToBeAvoid.getInstanceName() + "(" + routerToBeAvoid.getId() + ")", DataCenter.class,
+ rrouter.getDataCenterId());
+ }
+ routerToBeAvoid = rrouter;
+ }
+ }
+ }
+ if (routerToBeAvoid == null) {
+ return start(router, user, caller, params, null);
+ }
+ // We would try best to deploy the router to another place
+ final int retryIndex = 5;
+ final ExcludeList[] avoids = new ExcludeList[5];
+ avoids[0] = new ExcludeList();
+ avoids[0].addPod(routerToBeAvoid.getPodIdToDeployIn());
+ avoids[1] = new ExcludeList();
+ avoids[1].addCluster(_hostDao.findById(routerToBeAvoid.getHostId()).getClusterId());
+ avoids[2] = new ExcludeList();
+ final List volumes = _volumeDao.findByInstanceAndType(routerToBeAvoid.getId(), Volume.Type.ROOT);
+ if (volumes != null && volumes.size() != 0) {
+ avoids[2].addPool(volumes.get(0).getPoolId());
+ }
+ avoids[2].addHost(routerToBeAvoid.getHostId());
+ avoids[3] = new ExcludeList();
+ avoids[3].addHost(routerToBeAvoid.getHostId());
+ avoids[4] = new ExcludeList();
+
+ for (int i = 0; i < retryIndex; i++) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Try to deploy redundant virtual router:" + router.getHostName() + ", for " + i + " time");
+ }
+ plan.setAvoids(avoids[i]);
+ try {
+ result = start(router, user, caller, params, plan);
+ } catch (final InsufficientServerCapacityException ex) {
+ result = null;
+ }
+ if (result != null) {
+ break;
+ }
+ }
+ return result;
+ }
+
+ protected String retrieveTemplateName(HypervisorType hType, final long datacenterId) {
+ if (hType == HypervisorType.BareMetal) {
+ String peerHvType = _configDao.getValue(Config.BaremetalPeerHypervisorType.key());
+ if (peerHvType == null) {
+ throw new CloudRuntimeException(String.format("To use baremetal in advanced networking, you must set %s to type of hypervisor(e.g XenServer)"
+ + " that exists in the same zone with baremetal host. That hyperivsor is used to spring up virtual router for baremetal instance",
+ Config.BaremetalPeerHypervisorType.key()));
+ }
+
+ hType = HypervisorType.getType(peerHvType);
+ if (HypervisorType.XenServer != hType && HypervisorType.KVM != hType && HypervisorType.VMware != hType) {
+ throw new CloudRuntimeException(String.format("Baremetal only supports peer hypervisor(XenServer/KVM/VMWare) right now, you specified %s", peerHvType));
+ }
+ }
+
+ // Returning NULL is fine because the simulator will need it when being
+ // used instead of a real hypervisor.
+ // The hypervisorsMap contains only real hypervisors.
+ String templateName = null;
+ ConfigKey hypervisorConfigKey = hypervisorsMap.get(hType);
+
+ if (hypervisorConfigKey != null) {
+ templateName = hypervisorConfigKey.valueIn(datacenterId);
+ }
+ return templateName;
+ }
+
+ @Override
+ public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition, final boolean startRouter) throws InsufficientAddressCapacityException,
+ InsufficientServerCapacityException, InsufficientCapacityException, StorageUnavailableException, ResourceUnavailableException {
+
+ final ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(routerDeploymentDefinition.getOfferingId());
+ final Account owner = routerDeploymentDefinition.getOwner();
+
+ // Router is the network element, we don't know the hypervisor type yet.
+ // Try to allocate the domR twice using diff hypervisors, and when
+ // failed both times, throw the exception up
+ final List hypervisors = getHypervisors(routerDeploymentDefinition);
+
+ int allocateRetry = 0;
+ int startRetry = 0;
+ DomainRouterVO router = null;
+ for (final Iterator iter = hypervisors.iterator(); iter.hasNext();) {
+ final HypervisorType hType = iter.next();
+ try {
+ final long id = _routerDao.getNextInSequence(Long.class, "id");
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug(String.format("Allocating the VR with id=%s in datacenter %s with the hypervisor type %s", id, routerDeploymentDefinition.getDest()
+ .getDataCenter(), hType));
+ }
+
+ String templateName = retrieveTemplateName(hType, routerDeploymentDefinition.getDest().getDataCenter().getId());
+ final VMTemplateVO template = _templateDao.findRoutingTemplate(hType, templateName);
+
+ if (template == null) {
+ s_logger.debug(hType + " won't support system vm, skip it");
+ continue;
+ }
+
+ boolean offerHA = routerOffering.getOfferHA();
+ /*
+ * We don't provide HA to redundant router VMs, admin should own
+ * it all, and redundant router themselves are HA
+ */
+ if (routerDeploymentDefinition.isRedundant()) {
+ offerHA = false;
+ }
+
+ // routerDeploymentDefinition.getVpc().getId() ==> do not use
+ // VPC because it is not a VPC offering.
+ Long vpcId = routerDeploymentDefinition.getVpc() != null ? routerDeploymentDefinition.getVpc().getId() : null;
+
+ router = new DomainRouterVO(id, routerOffering.getId(), routerDeploymentDefinition.getVirtualProvider().getId(), VirtualMachineName.getRouterName(id,
+ s_vmInstanceName), template.getId(), template.getHypervisorType(), template.getGuestOSId(), owner.getDomainId(), owner.getId(),
+ routerDeploymentDefinition.isRedundant(), 0, false, RedundantState.UNKNOWN, offerHA, false, vpcId);
+
+ router.setDynamicallyScalable(template.isDynamicallyScalable());
+ router.setRole(Role.VIRTUAL_ROUTER);
+ router = _routerDao.persist(router);
+ LinkedHashMap> networks = createRouterNetworks(routerDeploymentDefinition);
+ _itMgr.allocate(router.getInstanceName(), template, routerOffering, networks, routerDeploymentDefinition.getPlan(), null);
+ router = _routerDao.findById(router.getId());
+ } catch (final InsufficientCapacityException ex) {
+ if (allocateRetry < 2 && iter.hasNext()) {
+ s_logger.debug("Failed to allocate the VR with hypervisor type " + hType + ", retrying one more time");
+ continue;
+ } else {
+ throw ex;
+ }
+ } finally {
+ allocateRetry++;
+ }
+
+ if (startRouter) {
+ try {
+ router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), routerDeploymentDefinition.getParams());
+ break;
+ } catch (final InsufficientCapacityException ex) {
+ if (startRetry < 2 && iter.hasNext()) {
+ s_logger.debug("Failed to start the VR " + router + " with hypervisor type " + hType + ", " + "destroying it and recreating one more time");
+ // destroy the router
+ destroyRouter(router.getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM);
+ continue;
+ } else {
+ throw ex;
+ }
+ } finally {
+ startRetry++;
+ }
+ } else {
+ // return stopped router
+ return router;
+ }
+ }
+
+ return router;
+ }
+
+ protected void filterSupportedHypervisors(final List hypervisors) {
+ // For non vpc we keep them all assuming all types in the list are
+ // supported
+ }
+
+ protected String getNoHypervisorsErrMsgDetails() {
+ return "";
+ }
+
+ protected List getHypervisors(final RouterDeploymentDefinition routerDeploymentDefinition) throws InsufficientServerCapacityException {
+ final DeployDestination dest = routerDeploymentDefinition.getDest();
+ List hypervisors = new ArrayList();
+
+ if (dest.getCluster() != null) {
+ if (dest.getCluster().getHypervisorType() == HypervisorType.Ovm) {
+ hypervisors.add(getClusterToStartDomainRouterForOvm(dest.getCluster().getPodId()));
+ } else {
+ hypervisors.add(dest.getCluster().getHypervisorType());
+ }
+ } else {
+ final HypervisorType defaults = _resourceMgr.getDefaultHypervisor(dest.getDataCenter().getId());
+ if (defaults != HypervisorType.None) {
+ hypervisors.add(defaults);
+ } else {
+ // if there is no default hypervisor, get it from the cluster
+ hypervisors = _resourceMgr.getSupportedHypervisorTypes(dest.getDataCenter().getId(), true, routerDeploymentDefinition.getPlan().getPodId());
+ }
+ }
+
+ filterSupportedHypervisors(hypervisors);
+
+ if (hypervisors.isEmpty()) {
+ if (routerDeploymentDefinition.getPodId() != null) {
+ throw new InsufficientServerCapacityException("Unable to create virtual router, there are no clusters in the pod." + getNoHypervisorsErrMsgDetails(), Pod.class,
+ routerDeploymentDefinition.getPodId());
+ }
+ throw new InsufficientServerCapacityException("Unable to create virtual router, there are no clusters in the zone." + getNoHypervisorsErrMsgDetails(),
+ DataCenter.class, dest.getDataCenter().getId());
+ }
+ return hypervisors;
+ }
+
+ /*
+ * Ovm won't support any system. So we have to choose a partner cluster in
+ * the same pod to start domain router for us
+ */
+ protected HypervisorType getClusterToStartDomainRouterForOvm(final long podId) {
+ final List clusters = _clusterDao.listByPodId(podId);
+ for (final ClusterVO cv : clusters) {
+ if (cv.getHypervisorType() == HypervisorType.Ovm || cv.getHypervisorType() == HypervisorType.BareMetal) {
+ continue;
+ }
+
+ final List hosts = _resourceMgr.listAllHostsInCluster(cv.getId());
+ if (hosts == null || hosts.isEmpty()) {
+ continue;
+ }
+
+ for (final HostVO h : hosts) {
+ if (h.getState() == Status.Up) {
+ s_logger.debug("Pick up host that has hypervisor type " + h.getHypervisorType() + " in cluster " + cv.getId() + " to start domain router for OVM");
+ return h.getHypervisorType();
+ }
+ }
+ }
+
+ final String errMsg = new StringBuilder("Cannot find an available cluster in Pod ").append(podId)
+ .append(" to start domain router for Ovm. \n Ovm won't support any system vm including domain router, ")
+ .append("please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod")
+ .append(" with Ovm cluster. And there is at least one host in UP status in that cluster.").toString();
+ throw new CloudRuntimeException(errMsg);
+ }
+
+ public LinkedHashMap> createRouterNetworks(final RouterDeploymentDefinition routerDeploymentDefinition)
+ throws ConcurrentOperationException, InsufficientAddressCapacityException {
+
+ // Form networks
+ LinkedHashMap> networks = new LinkedHashMap>(3);
+ // 1) Guest network
+ boolean hasGuestNetwork = false;
+ if (routerDeploymentDefinition.getGuestNetwork() != null) {
+ s_logger.debug("Adding nic for Virtual Router in Guest network " + routerDeploymentDefinition.getGuestNetwork());
+ String defaultNetworkStartIp = null, defaultNetworkStartIpv6 = null;
+ if (!routerDeploymentDefinition.isPublicNetwork()) {
+ final Nic placeholder = _networkModel.getPlaceholderNicForRouter(routerDeploymentDefinition.getGuestNetwork(), routerDeploymentDefinition.getPodId());
+ if (routerDeploymentDefinition.getGuestNetwork().getCidr() != null) {
+ if (placeholder != null && placeholder.getIp4Address() != null) {
+ s_logger.debug("Requesting ipv4 address " + placeholder.getIp4Address() + " stored in placeholder nic for the network "
+ + routerDeploymentDefinition.getGuestNetwork());
+ defaultNetworkStartIp = placeholder.getIp4Address();
+ } else {
+ final String startIp = _networkModel.getStartIpAddress(routerDeploymentDefinition.getGuestNetwork().getId());
+ if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(routerDeploymentDefinition.getGuestNetwork().getId(), startIp).getAllocatedTime() == null) {
+ defaultNetworkStartIp = startIp;
+ } else if (s_logger.isDebugEnabled()) {
+ s_logger.debug("First ipv4 " + startIp + " in network id=" + routerDeploymentDefinition.getGuestNetwork().getId()
+ + " is already allocated, can't use it for domain router; will get random ip address from the range");
+ }
+ }
+ }
+
+ if (routerDeploymentDefinition.getGuestNetwork().getIp6Cidr() != null) {
+ if (placeholder != null && placeholder.getIp6Address() != null) {
+ s_logger.debug("Requesting ipv6 address " + placeholder.getIp6Address() + " stored in placeholder nic for the network "
+ + routerDeploymentDefinition.getGuestNetwork());
+ defaultNetworkStartIpv6 = placeholder.getIp6Address();
+ } else {
+ final String startIpv6 = _networkModel.getStartIpv6Address(routerDeploymentDefinition.getGuestNetwork().getId());
+ if (startIpv6 != null && _ipv6Dao.findByNetworkIdAndIp(routerDeploymentDefinition.getGuestNetwork().getId(), startIpv6) == null) {
+ defaultNetworkStartIpv6 = startIpv6;
+ } else if (s_logger.isDebugEnabled()) {
+ s_logger.debug("First ipv6 " + startIpv6 + " in network id=" + routerDeploymentDefinition.getGuestNetwork().getId()
+ + " is already allocated, can't use it for domain router; will get random ipv6 address from the range");
+ }
+ }
+ }
+ }
+
+ final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6);
+ if (routerDeploymentDefinition.isPublicNetwork()) {
+ if (routerDeploymentDefinition.isRedundant()) {
+ gatewayNic.setIp4Address(_ipAddrMgr.acquireGuestIpAddress(routerDeploymentDefinition.getGuestNetwork(), null));
+ } else {
+ gatewayNic.setIp4Address(routerDeploymentDefinition.getGuestNetwork().getGateway());
+ }
+ gatewayNic.setBroadcastUri(routerDeploymentDefinition.getGuestNetwork().getBroadcastUri());
+ gatewayNic.setBroadcastType(routerDeploymentDefinition.getGuestNetwork().getBroadcastDomainType());
+ gatewayNic.setIsolationUri(routerDeploymentDefinition.getGuestNetwork().getBroadcastUri());
+ gatewayNic.setMode(routerDeploymentDefinition.getGuestNetwork().getMode());
+ final String gatewayCidr = routerDeploymentDefinition.getGuestNetwork().getCidr();
+ gatewayNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
+ } else {
+ gatewayNic.setDefaultNic(true);
+ }
+
+ networks.put(routerDeploymentDefinition.getGuestNetwork(), new ArrayList(Arrays.asList(gatewayNic)));
+ hasGuestNetwork = true;
+ }
+
+ // 2) Control network
+ s_logger.debug("Adding nic for Virtual Router in Control network ");
+ List extends NetworkOffering> offerings = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
+ NetworkOffering controlOffering = offerings.get(0);
+ Network controlConfig = _networkMgr.setupNetwork(s_systemAccount, controlOffering, routerDeploymentDefinition.getPlan(), null, null, false).get(0);
+ networks.put(controlConfig, new ArrayList());
+ // 3) Public network
+ if (routerDeploymentDefinition.isPublicNetwork()) {
+ s_logger.debug("Adding nic for Virtual Router in Public network ");
+ // if source nat service is supported by the network, get the source
+ // nat ip address
+ final NicProfile defaultNic = new NicProfile();
+ defaultNic.setDefaultNic(true);
+ final PublicIp sourceNatIp = routerDeploymentDefinition.getSourceNatIP();
+ defaultNic.setIp4Address(sourceNatIp.getAddress().addr());
+ defaultNic.setGateway(sourceNatIp.getGateway());
+ defaultNic.setNetmask(sourceNatIp.getNetmask());
+ defaultNic.setMacAddress(sourceNatIp.getMacAddress());
+ // get broadcast from public network
+ final Network pubNet = _networkDao.findById(sourceNatIp.getNetworkId());
+ if (pubNet.getBroadcastDomainType() == BroadcastDomainType.Vxlan) {
+ defaultNic.setBroadcastType(BroadcastDomainType.Vxlan);
+ defaultNic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
+ defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
+ } else {
+ defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
+ defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()));
+ defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()));
+ }
+ if (hasGuestNetwork) {
+ defaultNic.setDeviceId(2);
+ }
+ final NetworkOffering publicOffering = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0);
+ final List extends Network> publicNetworks = _networkMgr.setupNetwork(s_systemAccount, publicOffering, routerDeploymentDefinition.getPlan(), null, null, false);
+ final String publicIp = defaultNic.getIp4Address();
+ // We want to use the identical MAC address for RvR on public
+ // interface if possible
+ final NicVO peerNic = _nicDao.findByIp4AddressAndNetworkId(publicIp, publicNetworks.get(0).getId());
+ if (peerNic != null) {
+ s_logger.info("Use same MAC as previous RvR, the MAC is " + peerNic.getMacAddress());
+ defaultNic.setMacAddress(peerNic.getMacAddress());
+ }
+ networks.put(publicNetworks.get(0), new ArrayList(Arrays.asList(defaultNic)));
+ }
+
+ return networks;
+ }
+
+ public static void setSystemAccount(final Account systemAccount) {
+ s_systemAccount = systemAccount;
+ }
+
+ public static void setVMInstanceName(final String vmInstanceName) {
+ s_vmInstanceName = vmInstanceName;
+ }
+}
diff --git a/server/src/com/cloud/network/router/NicProfileHelper.java b/server/src/com/cloud/network/router/NicProfileHelper.java
new file mode 100644
index 000000000000..12f3038c8c1f
--- /dev/null
+++ b/server/src/com/cloud/network/router/NicProfileHelper.java
@@ -0,0 +1,31 @@
+// 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 com.cloud.network.Network;
+import com.cloud.network.vpc.VpcGateway;
+import com.cloud.vm.NicProfile;
+
+public interface NicProfileHelper {
+
+ public abstract NicProfile createPrivateNicProfileForGateway(
+ VpcGateway privateGateway);
+
+ public abstract NicProfile createGuestNicProfileForVpcRouter(
+ Network guestNetwork);
+
+}
\ No newline at end of file
diff --git a/server/src/com/cloud/network/router/NicProfileHelperImpl.java b/server/src/com/cloud/network/router/NicProfileHelperImpl.java
new file mode 100644
index 000000000000..a06dbffbfef3
--- /dev/null
+++ b/server/src/com/cloud/network/router/NicProfileHelperImpl.java
@@ -0,0 +1,110 @@
+// 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.net.URI;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.AddressFormat;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.vpc.PrivateIpAddress;
+import com.cloud.network.vpc.PrivateIpVO;
+import com.cloud.network.vpc.VpcGateway;
+import com.cloud.network.vpc.VpcManager;
+import com.cloud.network.vpc.dao.PrivateIpDao;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.NicDao;
+import com.cloud.vm.dao.VMInstanceDao;
+
+
+@Local(value = {NicProfileHelper.class})
+public class NicProfileHelperImpl implements NicProfileHelper {
+
+ @Inject
+ private VMInstanceDao _vmDao;
+ @Inject
+ private PrivateIpDao _privateIpDao;
+ @Inject
+ protected NetworkModel _networkModel;
+ @Inject
+ protected VpcManager _vpcMgr;
+ @Inject
+ protected NicDao _nicDao;
+
+
+ @Override
+ @DB
+ public NicProfile createPrivateNicProfileForGateway(VpcGateway privateGateway) {
+ Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
+ PrivateIpVO ipVO = _privateIpDao.allocateIpAddress(privateNetwork.getDataCenterId(), privateNetwork.getId(), privateGateway.getIp4Address());
+ Nic privateNic = _nicDao.findByIp4AddressAndNetworkId(ipVO.getIpAddress(), privateNetwork.getId());
+
+ NicProfile privateNicProfile = new NicProfile();
+
+ if (privateNic != null) {
+ VirtualMachine vm = _vmDao.findById(privateNic.getInstanceId());
+ privateNicProfile =
+ new NicProfile(privateNic, privateNetwork, privateNic.getBroadcastUri(), privateNic.getIsolationUri(), _networkModel.getNetworkRate(
+ privateNetwork.getId(), vm.getId()), _networkModel.isSecurityGroupSupportedInNetwork(privateNetwork), _networkModel.getNetworkTag(
+ vm.getHypervisorType(), privateNetwork));
+ } else {
+ String netmask = NetUtils.getCidrNetmask(privateNetwork.getCidr());
+ PrivateIpAddress ip =
+ new PrivateIpAddress(ipVO, privateNetwork.getBroadcastUri().toString(), privateNetwork.getGateway(), netmask,
+ NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress())));
+
+ URI netUri = BroadcastDomainType.fromString(ip.getBroadcastUri());
+ privateNicProfile.setIp4Address(ip.getIpAddress());
+ privateNicProfile.setGateway(ip.getGateway());
+ privateNicProfile.setNetmask(ip.getNetmask());
+ privateNicProfile.setIsolationUri(netUri);
+ privateNicProfile.setBroadcastUri(netUri);
+ // can we solve this in setBroadcastUri()???
+ // or more plugable construct is desirable
+ privateNicProfile.setBroadcastType(BroadcastDomainType.getSchemeValue(netUri));
+ privateNicProfile.setFormat(AddressFormat.Ip4);
+ privateNicProfile.setReservationId(String.valueOf(ip.getBroadcastUri()));
+ privateNicProfile.setMacAddress(ip.getMacAddress());
+ }
+
+ return privateNicProfile;
+ }
+
+ @Override
+ public NicProfile createGuestNicProfileForVpcRouter(final Network guestNetwork) {
+ NicProfile guestNic = new NicProfile();
+ guestNic.setIp4Address(guestNetwork.getGateway());
+ guestNic.setBroadcastUri(guestNetwork.getBroadcastUri());
+ guestNic.setBroadcastType(guestNetwork.getBroadcastDomainType());
+ guestNic.setIsolationUri(guestNetwork.getBroadcastUri());
+ guestNic.setMode(guestNetwork.getMode());
+ String gatewayCidr = guestNetwork.getCidr();
+ guestNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
+
+ return guestNic;
+ }
+
+}
\ No newline at end of file
diff --git a/server/src/com/cloud/network/router/RouterControlHelper.java b/server/src/com/cloud/network/router/RouterControlHelper.java
new file mode 100644
index 000000000000..68fd6e333ad7
--- /dev/null
+++ b/server/src/com/cloud/network/router/RouterControlHelper.java
@@ -0,0 +1,70 @@
+// 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 javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+
+public class RouterControlHelper {
+
+ private static final Logger logger = Logger.getLogger(RouterControlHelper.class);
+
+ @Inject
+ private DomainRouterDao routerDao;
+
+ @Inject
+ private NetworkDao networkDao;
+
+ @Inject
+ private NicDao nicDao;
+
+ public String getRouterControlIp(final long routerId) {
+ String routerControlIpAddress = null;
+ final List nics = nicDao.listByVmId(routerId);
+ for (final NicVO n : nics) {
+ final NetworkVO nc = networkDao.findById(n.getNetworkId());
+ if (nc != null && nc.getTrafficType() == TrafficType.Control) {
+ routerControlIpAddress = n.getIp4Address();
+ // router will have only one control ip
+ break;
+ }
+ }
+
+ if (routerControlIpAddress == null) {
+ logger.warn("Unable to find router's control ip in its attached NICs!. routerId: " + routerId);
+ final DomainRouterVO router = routerDao.findById(routerId);
+ return router.getPrivateIpAddress();
+ }
+
+ return routerControlIpAddress;
+ }
+
+ public String getRouterIpInNetwork(final long networkId, final long instanceId) {
+ return nicDao.getIpAddress(networkId, instanceId);
+ }
+}
\ 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 85ce8b9dcc8d..8e0aba4a622d 100644
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -17,35 +17,25 @@
package com.cloud.network.router;
import java.util.List;
-import java.util.Map;
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.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
-import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VirtualNetworkApplianceService;
-import com.cloud.network.VpnUser;
-import com.cloud.network.lb.LoadBalancingRule;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.StaticNat;
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";
@@ -55,15 +45,15 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
static final String RouterAlertsCheckIntervalCK = "router.alerts.check.interval";
static final ConfigKey RouterTemplateXen = new ConfigKey(String.class, RouterTemplateXenCK, "Advanced", "SystemVM Template (XenServer)",
- "Name of the default router template on Xenserver.", true, ConfigKey.Scope.Zone, null);
+ "Name of the default router template on Xenserver.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey RouterTemplateKvm = new ConfigKey(String.class, RouterTemplateKvmCK, "Advanced", "SystemVM Template (KVM)",
- "Name of the default router template on KVM.", true, ConfigKey.Scope.Zone, null);
+ "Name of the default router template on KVM.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey RouterTemplateVmware = new ConfigKey(String.class, RouterTemplateVmwareCK, "Advanced", "SystemVM Template (vSphere)",
- "Name of the default router template on Vmware.", true, ConfigKey.Scope.Zone, null);
+ "Name of the default router template on Vmware.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey RouterTemplateHyperV = new ConfigKey(String.class, RouterTemplateHyperVCK, "Advanced", "SystemVM Template (HyperV)",
- "Name of the default router template on Hyperv.", true, ConfigKey.Scope.Zone, null);
+ "Name of the default router template on Hyperv.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey RouterTemplateLxc = new ConfigKey(String.class, RouterTemplateLxcCK, "Advanced", "SystemVM Template (LXC)",
- "Name of the default router template on LXC.", true, ConfigKey.Scope.Zone, null);
+ "Name of the default router template on LXC.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey SetServiceMonitor = new ConfigKey(String.class, SetServiceMonitorCK, "Advanced", "true",
"service monitoring in router enable/disable option, default true", true, ConfigKey.Scope.Zone, null);
@@ -74,6 +64,8 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
public static final int DEFAULT_ROUTER_VM_RAMSIZE = 128; // 128M
public static final int DEFAULT_ROUTER_CPU_MHZ = 500; // 500 MHz
public static final boolean USE_POD_VLAN = false;
+ public static final int DEFAULT_PRIORITY = 100;
+ public static final int DEFAULT_DELTA = 2;
/**
/*
@@ -81,60 +73,24 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
* @param hostId
* @param pubKey
* @param prvKey
- */
- boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey);
-
- /**
- * save a vm password on the router.
- * @param routers TODO
+ *
+ * NOT USED IN THE VIRTUAL NET APPLIANCE
*
*/
- boolean savePasswordToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List extends VirtualRouter> routers)
- throws ResourceUnavailableException;
-
- boolean saveSSHPublicKeyToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List extends VirtualRouter> routers, String sshPublicKey)
- throws ResourceUnavailableException;
-
- boolean saveUserDataToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List extends VirtualRouter> routers)
- throws ResourceUnavailableException;
-
- List deployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, Map params,
- boolean isRedundant) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException;
+ //boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey):
boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean deleteRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List extends VirtualRouter> routers) throws ResourceUnavailableException;
- boolean associatePublicIP(Network network, final List extends PublicIpAddress> ipAddress, List extends VirtualRouter> routers)
- throws ResourceUnavailableException;
-
- boolean applyFirewallRules(Network network, final List extends FirewallRule> rules, List extends VirtualRouter> routers) throws ResourceUnavailableException;
-
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 applyStaticNats(Network network, final List extends StaticNat> rules, List extends VirtualRouter> routers) throws ResourceUnavailableException;
-
- boolean applyDhcpEntry(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, List routers)
- throws ResourceUnavailableException;
-
- boolean applyUserData(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, List routers)
- throws ResourceUnavailableException;
-
- boolean applyLoadBalancingRules(Network network, List extends LoadBalancingRule> rules, List extends VirtualRouter> routers) throws ResourceUnavailableException;
-
- 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 7b8f7fac3b8e..bac2e50e13ba
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -17,12 +17,56 @@
package com.cloud.network.router;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.alert.AlertService;
+import org.apache.cloudstack.alert.AlertService.AlertType;
+import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
+import org.apache.cloudstack.config.ApiServiceConfiguration;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.ConfigDepot;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+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;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+
import com.cloud.agent.AgentManager;
import com.cloud.agent.Listener;
import com.cloud.agent.api.AgentControlAnswer;
import com.cloud.agent.api.AgentControlCommand;
import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.BumpUpPriorityCommand;
import com.cloud.agent.api.CheckRouterAnswer;
import com.cloud.agent.api.CheckRouterCommand;
import com.cloud.agent.api.CheckS2SVpnConnectionsAnswer;
@@ -31,39 +75,17 @@
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;
import com.cloud.agent.api.routing.AggregationControlCommand.Action;
-import com.cloud.agent.api.routing.CreateIpAliasCommand;
-import com.cloud.agent.api.routing.DeleteIpAliasCommand;
-import com.cloud.agent.api.routing.DhcpEntryCommand;
-import com.cloud.agent.api.routing.DnsMasqConfigCommand;
import com.cloud.agent.api.routing.GetRouterAlertsCommand;
import com.cloud.agent.api.routing.IpAliasTO;
-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;
-import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand;
-import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
-import com.cloud.agent.api.routing.VmDataCommand;
-import com.cloud.agent.api.routing.VpnUsersCfgCommand;
-import com.cloud.agent.api.to.DhcpTO;
-import com.cloud.agent.api.to.FirewallRuleTO;
-import com.cloud.agent.api.to.IpAddressTO;
-import com.cloud.agent.api.to.LoadBalancerTO;
import com.cloud.agent.api.to.MonitorServiceTO;
-import com.cloud.agent.api.to.PortForwardingRuleTO;
-import com.cloud.agent.api.to.StaticNatRuleTO;
import com.cloud.agent.manager.Commands;
import com.cloud.alert.AlertManager;
import com.cloud.api.ApiAsyncJobDispatcher;
@@ -73,41 +95,30 @@
import com.cloud.configuration.Config;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.configuration.ZoneConfig;
-import com.cloud.dc.ClusterVO;
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;
import com.cloud.dc.dao.VlanDao;
-import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination;
-import com.cloud.deploy.DeploymentPlan;
-import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.event.ActionEvent;
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.InsufficientServerCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.maint.Version;
import com.cloud.network.IpAddress;
import com.cloud.network.IpAddressManager;
import com.cloud.network.MonitoringService;
@@ -117,10 +128,7 @@
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkModel;
import com.cloud.network.NetworkService;
-import com.cloud.network.Networks.BroadcastDomainType;
-import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.Site2SiteCustomerGateway;
@@ -128,9 +136,6 @@
import com.cloud.network.SshKeysDistriMonitor;
import com.cloud.network.VirtualNetworkApplianceService;
import com.cloud.network.VirtualRouterProvider;
-import com.cloud.network.VirtualRouterProvider.Type;
-import com.cloud.network.VpnUser;
-import com.cloud.network.VpnUserVO;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.IPAddressDao;
@@ -163,7 +168,6 @@
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
-import com.cloud.network.rules.FirewallRuleVO;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.network.rules.PortForwardingRule;
import com.cloud.network.rules.RulesManager;
@@ -174,16 +178,12 @@
import com.cloud.network.vpn.Site2SiteVpnManager;
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.ServiceOffering;
-import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.resource.ResourceManager;
import com.cloud.server.ConfigurationServer;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.Storage.ProvisioningType;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.GuestOSDao;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VolumeDao;
@@ -196,11 +196,7 @@
import com.cloud.user.dao.UserDao;
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.Pair;
-import com.cloud.utils.PasswordGenerator;
-import com.cloud.utils.StringUtils;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
@@ -208,9 +204,7 @@
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
-import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.QueryBuilder;
-import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.TransactionCallbackNoReturn;
@@ -227,13 +221,10 @@
import com.cloud.vm.NicVO;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.ReservationContextImpl;
-import com.cloud.vm.UserVmVO;
-import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.VirtualMachineGuru;
import com.cloud.vm.VirtualMachineManager;
-import com.cloud.vm.VirtualMachineName;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.VirtualMachineProfile.Param;
import com.cloud.vm.dao.DomainRouterDao;
@@ -243,56 +234,14 @@
import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.UserVmDetailsDao;
import com.cloud.vm.dao.VMInstanceDao;
-import org.apache.cloudstack.alert.AlertService;
-import org.apache.cloudstack.alert.AlertService.AlertType;
-import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
-import org.apache.cloudstack.config.ApiServiceConfiguration;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.apache.cloudstack.framework.config.ConfigDepot;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
-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.utils.identity.ManagementServerNode;
-import org.apache.log4j.Logger;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
/**
- * VirtualNetworkApplianceManagerImpl manages the different types of virtual network appliances available in the Cloud Stack.
+ * VirtualNetworkApplianceManagerImpl manages the different types of virtual
+ * network appliances available in the Cloud Stack.
*/
@Local(value = { VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class })
-public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService,
-VirtualMachineGuru, Listener, Configurable, StateListener {
+public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService, VirtualMachineGuru, Listener,
+Configurable, StateListener {
private static final Logger s_logger = Logger.getLogger(VirtualNetworkApplianceManagerImpl.class);
@Inject
@@ -406,16 +355,26 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
@Inject
OpRouterMonitorServiceDao _opRouterMonitorServiceDao;
+ @Inject
+ protected NetworkTopologyContext _networkTopologyContext;
+
+ @Autowired
+ @Qualifier("networkHelper")
+ protected NetworkHelper _nwHelper;
+
+ @Inject
+ protected CommandSetupHelper _commandSetupHelper;
+ @Inject
+ protected RouterDeploymentDefinitionBuilder _routerDeploymentManagerBuilder;
+
int _routerRamSize;
int _routerCpuMHz;
int _retry = 2;
- String _instance;
String _mgmtCidr;
int _routerStatsInterval = 300;
int _routerCheckInterval = 30;
int _rvrStatusUpdatePoolSize = 10;
- protected ServiceOfferingVO _offering;
private String _dnsBasicZoneUpdates = "all";
private final Set _guestOSNeedGatewayOnNonDefaultNetwork = new HashSet();
@@ -424,8 +383,11 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
private int _usageAggregationRange = 1440;
private String _usageTimeZone = "GMT";
private final long mgmtSrvrId = MacAddress.getMacAddress().toLong();
- private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5 seconds
- private static final int USAGE_AGGREGATION_RANGE_MIN = 10; // 10 minutes, same as com.cloud.usage.UsageManagerImpl.USAGE_AGGREGATION_RANGE_MIN
+ private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5
+ // seconds
+ private static final int USAGE_AGGREGATION_RANGE_MIN = 10; // 10 minutes,
+ // same as
+ // com.cloud.usage.UsageManagerImpl.USAGE_AGGREGATION_RANGE_MIN
private boolean _dailyOrHourly = false;
ScheduledExecutorService _executor;
@@ -433,39 +395,11 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
ScheduledExecutorService _networkStatsUpdateExecutor;
ExecutorService _rvrStatusUpdateExecutor;
- Account _systemAcct;
-
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 {
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Attempting to destroy router " + routerId);
- }
-
- final DomainRouterVO router = _routerDao.findById(routerId);
- if (router == null) {
- return null;
- }
-
- _accountMgr.checkAccess(caller, null, true, router);
-
- _itMgr.expunge(router.getUuid());
- _routerDao.remove(router.getId());
- return router;
+ return _nwHelper.destroyRouter(routerId, caller, callerUserId);
}
@Override
@@ -492,7 +426,8 @@ public VirtualRouter upgradeRouter(final UpgradeRouterCmd cmd) {
throw new InvalidParameterValueException("Unable to find service offering with id " + serviceOfferingId);
}
- // check if it is a system service offering, if yes return with error as it cannot be used for user vms
+ // check if it is a system service offering, if yes return with error as
+ // it cannot be used for user vms
if (!newServiceOffering.getSystemUse()) {
throw new InvalidParameterValueException("Cannot upgrade router vm to a non system service offering " + serviceOfferingId);
}
@@ -500,17 +435,18 @@ public VirtualRouter upgradeRouter(final UpgradeRouterCmd cmd) {
// Check that the router is stopped
if (!router.getState().equals(State.Stopped)) {
s_logger.warn("Unable to upgrade router " + router.toString() + " in state " + router.getState());
- throw new InvalidParameterValueException("Unable to upgrade router " + router.toString() + " in state " + router.getState() +
- "; make sure the router is stopped and not in an error state before upgrading.");
+ throw new InvalidParameterValueException("Unable to upgrade router " + router.toString() + " in state " + router.getState()
+ + "; make sure the router is stopped and not in an error state before upgrading.");
}
final ServiceOfferingVO currentServiceOffering = _serviceOfferingDao.findById(router.getServiceOfferingId());
- // Check that the service offering being upgraded to has the same storage pool preference as the VM's current service
+ // Check that the service offering being upgraded to has the same
+ // storage pool preference as the VM's current service
// offering
if (currentServiceOffering.getUseLocalStorage() != newServiceOffering.getUseLocalStorage()) {
- throw new InvalidParameterValueException("Can't upgrade, due to new local storage status : " + newServiceOffering.getUseLocalStorage() +
- " is different from " + "curruent local storage status: " + currentServiceOffering.getUseLocalStorage());
+ throw new InvalidParameterValueException("Can't upgrade, due to new local storage status : " + newServiceOffering.getUseLocalStorage() + " is different from "
+ + "curruent local storage status: " + currentServiceOffering.getUseLocalStorage());
}
router.setServiceOfferingId(serviceOfferingId);
@@ -522,75 +458,14 @@ public VirtualRouter upgradeRouter(final UpgradeRouterCmd cmd) {
}
- @Override
- public boolean savePasswordToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List extends VirtualRouter> routers)
- throws ResourceUnavailableException {
- _userVmDao.loadDetails((UserVmVO)profile.getVirtualMachine());
-
- final VirtualMachineProfile updatedProfile = profile;
-
- return applyRules(network, routers, "save password entry", false, null, false, new RuleApplier() {
- @Override
- public boolean execute(final Network network, final VirtualRouter router) throws ResourceUnavailableException {
- // for basic zone, send vm data/password information only to the router in the same pod
- final Commands cmds = new Commands(Command.OnError.Stop);
- final NicVO nicVo = _nicDao.findById(nic.getId());
- createPasswordCommand(router, updatedProfile, nicVo, cmds);
- return sendCommandsToRouter(router, cmds);
- }
- });
- }
-
- @Override
- public boolean saveSSHPublicKeyToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List extends VirtualRouter> routers,
- final String sshPublicKey) throws ResourceUnavailableException {
- final UserVmVO vm = _userVmDao.findById(profile.getVirtualMachine().getId());
- _userVmDao.loadDetails(vm);
-
- final VirtualMachineProfile updatedProfile = profile;
-
- return applyRules(network, routers, "save SSHkey entry", false, null, false, new RuleApplier() {
- @Override
- public boolean execute(final Network network, final VirtualRouter router) throws ResourceUnavailableException {
- // for basic zone, send vm data/password information only to the router in the same pod
- final Commands cmds = new Commands(Command.OnError.Stop);
- final NicVO nicVo = _nicDao.findById(nic.getId());
- final VMTemplateVO template = _templateDao.findByIdIncludingRemoved(updatedProfile.getTemplateId());
- if (template != null && template.getEnablePassword()) {
- createPasswordCommand(router, updatedProfile, nicVo, cmds);
- }
- createVmDataCommand(router, vm, nicVo, sshPublicKey, cmds);
- return sendCommandsToRouter(router, cmds);
- }
- });
- }
-
- @Override
- public boolean saveUserDataToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List extends VirtualRouter> routers)
- throws ResourceUnavailableException {
- final UserVmVO vm = _userVmDao.findById(profile.getVirtualMachine().getId());
- _userVmDao.loadDetails(vm);
-
- return applyRules(network, routers, "save userdata entry", false, null, false, new RuleApplier() {
- @Override
- public boolean execute(final Network network, final VirtualRouter router) throws ResourceUnavailableException {
- // for basic zone, send vm data/password information only to the router in the same pod
- final Commands cmds = new Commands(Command.OnError.Stop);
- final NicVO nicVo = _nicDao.findById(nic.getId());
- createVmDataCommand(router, vm, nicVo, null, cmds);
- return sendCommandsToRouter(router, cmds);
- }
- });
- }
-
- @Override
@ActionEvent(eventType = EventTypes.EVENT_ROUTER_STOP, eventDescription = "stopping router Vm", async = true)
+ @Override
public VirtualRouter stopRouter(final long routerId, final boolean forced) throws ResourceUnavailableException, ConcurrentOperationException {
final CallContext context = CallContext.current();
final Account account = context.getCallingAccount();
// verify parameters
- DomainRouterVO router = _routerDao.findById(routerId);
+ final DomainRouterVO router = _routerDao.findById(routerId);
if (router == null) {
throw new InvalidParameterValueException("Unable to find router by id " + routerId + ".");
}
@@ -619,11 +494,12 @@ public void processStopOrRebootAnswer(final DomainRouterVO router, final Answer
Transaction.execute(new TransactionCallbackNoReturn() {
@Override
public void doInTransactionWithoutResult(final TransactionStatus status) {
- //FIXME!!! - UserStats command should grab bytesSent/Received for all guest interfaces of the VR
+ // FIXME!!! - UserStats command should grab bytesSent/Received
+ // for all guest interfaces of the VR
final List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId());
for (final Long guestNtwkId : routerGuestNtwkIds) {
- final UserStatisticsVO userStats =
- _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(), guestNtwkId, null, router.getId(), router.getType().toString());
+ final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(), guestNtwkId, null, router.getId(), router.getType()
+ .toString());
if (userStats != null) {
final long currentBytesRcvd = userStats.getCurrentBytesReceived();
userStats.setCurrentBytesReceived(0);
@@ -657,7 +533,7 @@ public VirtualRouter rebootRouter(final long routerId, final boolean reprogramNe
_accountMgr.checkAccess(caller, null, true, router);
// Can reboot domain router only in Running state
- if (router == null || router.getState() != State.Running) {
+ if ((router == null) || (router.getState() != State.Running)) {
s_logger.warn("Unable to reboot, virtual router is not in the right state " + router.getState());
throw new ResourceUnavailableException("Unable to reboot domR, it is not in right state " + router.getState(), DataCenter.class, router.getDataCenterId());
}
@@ -678,7 +554,6 @@ public VirtualRouter rebootRouter(final long routerId, final boolean reprogramNe
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);
-
@Override
public boolean configure(final String name, final Map params) throws ConfigurationException {
@@ -716,20 +591,24 @@ public boolean configure(final String name, final Map params) th
_rvrStatusUpdatePoolSize = NumbersUtil.parseInt(value, 10);
/*
- * We assume that one thread can handle 20 requests in 1 minute in normal situation, so here we give the queue size up to 50 minutes.
- * It's mostly for buffer, since each time CheckRouterTask running, it would add all the redundant networks in the queue immediately
+ * We assume that one thread can handle 20 requests in 1 minute in
+ * normal situation, so here we give the queue size up to 50 minutes.
+ * It's mostly for buffer, since each time CheckRouterTask running, it
+ * would add all the redundant networks in the queue immediately
*/
_vrUpdateQueue = new LinkedBlockingQueue(_rvrStatusUpdatePoolSize * 1000);
_rvrStatusUpdateExecutor = Executors.newFixedThreadPool(_rvrStatusUpdatePoolSize, new NamedThreadFactory("RedundantRouterStatusMonitor"));
- _instance = configs.get("instance.name");
- if (_instance == null) {
- _instance = "DEFAULT";
+ String instance = configs.get("instance.name");
+ if (instance == null) {
+ instance = "DEFAULT";
}
+ NetworkHelperImpl.setVMInstanceName(instance);
+
final String rpValue = configs.get("network.disable.rpfilter");
- if (rpValue != null && rpValue.equalsIgnoreCase("true")) {
+ if ((rpValue != null) && rpValue.equalsIgnoreCase("true")) {
_disableRpFilter = true;
}
@@ -740,19 +619,14 @@ public boolean configure(final String name, final Map params) th
_agentMgr.registerForHostEvents(new SshKeysDistriMonitor(_agentMgr, _hostDao, _configDao), true, false, false);
final boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key()));
- _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, _routerCpuMHz, null,
- null, true, null, ProvisioningType.THIN, useLocalStorage, true, null, true, VirtualMachine.Type.DomainRouter, true);
- _offering.setUniqueName(ServiceOffering.routerDefaultOffUniqueName);
- _offering = _serviceOfferingDao.persistSystemServiceOffering(_offering);
-
- // this can sometimes happen, if DB is manually or programmatically manipulated
- if (_offering == null) {
- final String msg = "Data integrity problem : System Offering For Software router VM has been removed?";
- s_logger.error(msg);
- throw new ConfigurationException(msg);
- }
- _systemAcct = _accountMgr.getSystemAccount();
+ ServiceOfferingVO offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, _routerCpuMHz, null, null, true, null, ProvisioningType.THIN,
+ useLocalStorage, true, null, true, VirtualMachine.Type.DomainRouter, true);
+ offering.setUniqueName(ServiceOffering.routerDefaultOffUniqueName);
+ offering = _serviceOfferingDao.persistSystemServiceOffering(offering);
+ _routerDeploymentManagerBuilder.setOfferingId(offering.getId());
+
+ NetworkHelperImpl.setSystemAccount(_accountMgr.getSystemAccount());
final String aggregationRange = configs.get("usage.stats.job.aggregation.range");
_usageAggregationRange = NumbersUtil.parseInt(aggregationRange, 1440);
@@ -776,7 +650,7 @@ public boolean start() {
s_logger.debug("router.stats.interval - " + _routerStatsInterval + " so not scheduling the router stats thread");
}
- //Schedule Network stats update task
+ // Schedule Network stats update task
final TimeZone usageTimezone = TimeZone.getTimeZone(_usageTimeZone);
final Calendar cal = Calendar.getInstance(usageTimezone);
cal.setTime(new Date());
@@ -812,7 +686,7 @@ public boolean start() {
_usageAggregationRange = USAGE_AGGREGATION_RANGE_MIN;
}
- _networkStatsUpdateExecutor.scheduleAtFixedRate(new NetworkStatsUpdateTask(), (endDate - System.currentTimeMillis()), (_usageAggregationRange * 60 * 1000),
+ _networkStatsUpdateExecutor.scheduleAtFixedRate(new NetworkStatsUpdateTask(), endDate - System.currentTimeMillis(), _usageAggregationRange * 60 * 1000,
TimeUnit.MILLISECONDS);
if (_routerCheckInterval > 0) {
@@ -842,61 +716,6 @@ public boolean stop() {
protected VirtualNetworkApplianceManagerImpl() {
}
- private VmDataCommand generateVmDataCommand(final VirtualRouter router, final String vmPrivateIpAddress, final String userData, final String serviceOffering, final String zoneName,
- final String guestIpAddress, final String vmName, final String vmInstanceName, final long vmId, final String vmUuid, final String publicKey, final long guestNetworkId) {
- final VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName, _networkModel.getExecuteInSeqNtwkElmtCmd());
-
- cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId()));
- cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId()));
- cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
-
- final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
- cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
- // if you add new metadata files, also edit systemvm/patches/debian/config/var/www/html/latest/.htaccess
- cmd.addVmData("userdata", "user-data", userData);
- cmd.addVmData("metadata", "service-offering", StringUtils.unicodeEscape(serviceOffering));
- cmd.addVmData("metadata", "availability-zone", StringUtils.unicodeEscape(zoneName));
- cmd.addVmData("metadata", "local-ipv4", guestIpAddress);
- cmd.addVmData("metadata", "local-hostname", StringUtils.unicodeEscape(vmName));
- if (dcVo.getNetworkType() == NetworkType.Basic) {
- cmd.addVmData("metadata", "public-ipv4", guestIpAddress);
- cmd.addVmData("metadata", "public-hostname", StringUtils.unicodeEscape(vmName));
- } else {
- if (router.getPublicIpAddress() == null) {
- cmd.addVmData("metadata", "public-ipv4", guestIpAddress);
- } else {
- cmd.addVmData("metadata", "public-ipv4", router.getPublicIpAddress());
- }
- cmd.addVmData("metadata", "public-hostname", router.getPublicIpAddress());
- }
- if (vmUuid == null) {
- setVmInstanceId(vmInstanceName, vmId, cmd);
- } else {
- setVmInstanceId(vmUuid, cmd);
- }
- cmd.addVmData("metadata", "public-keys", publicKey);
-
- String cloudIdentifier = _configDao.getValue("cloud.identifier");
- if (cloudIdentifier == null) {
- cloudIdentifier = "";
- } else {
- cloudIdentifier = "CloudStack-{" + cloudIdentifier + "}";
- }
- cmd.addVmData("metadata", "cloud-identifier", cloudIdentifier);
-
- return cmd;
- }
-
- private void setVmInstanceId(final String vmUuid, final VmDataCommand cmd) {
- cmd.addVmData("metadata", "instance-id", vmUuid);
- cmd.addVmData("metadata", "vm-id", vmUuid);
- }
-
- private void setVmInstanceId(final String vmInstanceName, final long vmId, final VmDataCommand cmd) {
- cmd.addVmData("metadata", "instance-id", vmInstanceName);
- cmd.addVmData("metadata", "vm-id", String.valueOf(vmId));
- }
-
protected class NetworkUsageTask extends ManagedContextRunnable {
public NetworkUsageTask() {
@@ -916,28 +735,28 @@ protected void runInContext() {
final List extends Nic> routerNics = _nicDao.listByVmId(router.getId());
for (final Nic routerNic : routerNics) {
final Network network = _networkModel.getNetwork(routerNic.getNetworkId());
- //Send network usage command for public nic in VPC VR
- //Send network usage command for isolated guest nic of non VPC VR
- if ((forVpc && network.getTrafficType() == TrafficType.Public) ||
- (!forVpc && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Isolated)) {
+ // Send network usage command for public nic in VPC
+ // VR
+ // Send network usage command for isolated guest nic
+ // of non VPC VR
+ if ((forVpc && (network.getTrafficType() == TrafficType.Public))
+ || (!forVpc && (network.getTrafficType() == TrafficType.Guest) && (network.getGuestType() == Network.GuestType.Isolated))) {
final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), forVpc, routerNic.getIp4Address());
final String routerType = router.getType().toString();
- final UserStatisticsVO previousStats =
- _userStatsDao.findBy(router.getAccountId(), router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null),
- router.getId(), routerType);
+ final UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(), router.getDataCenterId(), network.getId(),
+ forVpc ? routerNic.getIp4Address() : null, router.getId(), routerType);
NetworkUsageAnswer answer = null;
try {
- answer = (NetworkUsageAnswer)_agentMgr.easySend(router.getHostId(), usageCmd);
+ answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd);
} catch (final Exception e) {
- s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId(),
- e);
+ s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId(), e);
continue;
}
if (answer != null) {
if (!answer.getResult()) {
- s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " +
- router.getHostId() + "; details: " + answer.getDetails());
+ s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId()
+ + "; details: " + answer.getDetails());
continue;
}
try {
@@ -949,42 +768,41 @@ protected void runInContext() {
Transaction.execute(new TransactionCallbackNoReturn() {
@Override
public void doInTransactionWithoutResult(final TransactionStatus status) {
- final UserStatisticsVO stats =
- _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(), network.getId(),
- (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
+ final UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(), network.getId(),
+ forVpc ? routerNic.getIp4Address() : null, router.getId(), routerType);
if (stats == null) {
s_logger.warn("unable to find stats for account: " + router.getAccountId());
return;
}
- if (previousStats != null &&
- ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))) {
- s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
- "Ignoring current answer. Router: " + answerFinal.getRouterName() + " Rcvd: " + answerFinal.getBytesReceived() +
- "Sent: " + answerFinal.getBytesSent());
+ if ((previousStats != null)
+ && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) || (previousStats.getCurrentBytesSent() != stats
+ .getCurrentBytesSent()))) {
+ s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + "Ignoring current answer. Router: "
+ + answerFinal.getRouterName() + " Rcvd: " + answerFinal.getBytesReceived() + "Sent: " + answerFinal.getBytesSent());
return;
}
if (stats.getCurrentBytesReceived() > answerFinal.getBytesReceived()) {
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Received # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Router: " + answerFinal.getRouterName() + " Reported: " +
- answerFinal.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived());
+ s_logger.debug("Received # of bytes that's less than the last one. "
+ + "Assuming something went wrong and persisting it. Router: " + answerFinal.getRouterName() + " Reported: "
+ + answerFinal.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived());
}
stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
}
stats.setCurrentBytesReceived(answerFinal.getBytesReceived());
if (stats.getCurrentBytesSent() > answerFinal.getBytesSent()) {
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Received # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Router: " + answerFinal.getRouterName() + " Reported: " +
- answerFinal.getBytesSent() + " Stored: " + stats.getCurrentBytesSent());
+ s_logger.debug("Received # of bytes that's less than the last one. "
+ + "Assuming something went wrong and persisting it. Router: " + answerFinal.getRouterName() + " Reported: "
+ + answerFinal.getBytesSent() + " Stored: " + stats.getCurrentBytesSent());
}
stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
}
stats.setCurrentBytesSent(answerFinal.getBytesSent());
if (!_dailyOrHourly) {
- //update agg bytes
+ // update agg bytes
stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
}
@@ -993,8 +811,8 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
});
} catch (final Exception e) {
- s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + answer.getBytesReceived() +
- "; Tx: " + answer.getBytesSent());
+ s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + answer.getBytesReceived() + "; Tx: "
+ + answer.getBytesSent());
}
}
}
@@ -1017,10 +835,10 @@ protected void runInContext() {
final GlobalLock scanLock = GlobalLock.getInternLock("network.stats");
try {
if (scanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) {
- //Check for ownership
- //msHost in UP state with min id should run the job
+ // Check for ownership
+ // msHost in UP state with min id should run the job
final ManagementServerHostVO msHost = _msHostDao.findOneInUpState(new Filter(ManagementServerHostVO.class, "id", true, 0L, 1L));
- if (msHost == null || (msHost.getMsid() != mgmtSrvrId)) {
+ if ((msHost == null) || (msHost.getMsid() != mgmtSrvrId)) {
s_logger.debug("Skipping aggregate network stats update");
scanLock.unlock();
return;
@@ -1029,18 +847,17 @@ protected void runInContext() {
Transaction.execute(new TransactionCallbackNoReturn() {
@Override
public void doInTransactionWithoutResult(final TransactionStatus status) {
- //get all stats with delta > 0
+ // get all stats with delta > 0
final List updatedStats = _userStatsDao.listUpdatedStats();
final Date updatedTime = new Date();
for (final UserStatisticsVO stat : updatedStats) {
- //update agg bytes
+ // update agg bytes
stat.setAggBytesReceived(stat.getCurrentBytesReceived() + stat.getNetBytesReceived());
stat.setAggBytesSent(stat.getCurrentBytesSent() + stat.getNetBytesSent());
_userStatsDao.update(stat.getId(), stat);
- //insert into op_user_stats_log
- final UserStatsLogVO statsLog =
- new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat.getCurrentBytesReceived(),
- stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime);
+ // insert into op_user_stats_log
+ final UserStatsLogVO statsLog = new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat
+ .getCurrentBytesReceived(), stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime);
_userStatsLogDao.persist(statsLog);
}
s_logger.debug("Successfully updated aggregate network stats");
@@ -1064,7 +881,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
protected void updateSite2SiteVpnConnectionState(final List routers) {
for (final DomainRouterVO router : routers) {
final List conns = _s2sVpnMgr.getConnectionsForRouter(router);
- if (conns == null || conns.isEmpty()) {
+ if ((conns == null) || conns.isEmpty()) {
continue;
}
if (router.getState() != State.Running) {
@@ -1078,7 +895,7 @@ protected void updateSite2SiteVpnConnectionState(final List rout
}
final List ipList = new ArrayList();
for (final Site2SiteVpnConnectionVO conn : conns) {
- if (conn.getState() != Site2SiteVpnConnection.State.Connected && conn.getState() != Site2SiteVpnConnection.State.Disconnected) {
+ if ((conn.getState() != Site2SiteVpnConnection.State.Connected) && (conn.getState() != Site2SiteVpnConnection.State.Disconnected)) {
continue;
}
final Site2SiteCustomerGateway gw = _s2sCustomerGatewayDao.findById(conn.getCustomerGatewayId());
@@ -1086,7 +903,7 @@ protected void updateSite2SiteVpnConnectionState(final List rout
}
final String privateIP = router.getPrivateIpAddress();
final HostVO host = _hostDao.findById(router.getHostId());
- if (host == null || host.getState() != Status.Up) {
+ if ((host == null) || (host.getState() != Status.Up)) {
continue;
} else if (host.getManagementServerId() != ManagementServerNode.getManagementServerId()) {
/* Only cover hosts managed by this management server */
@@ -1099,7 +916,7 @@ protected void updateSite2SiteVpnConnectionState(final List rout
final Answer origAnswer = _agentMgr.easySend(router.getHostId(), command);
CheckS2SVpnConnectionsAnswer answer = null;
if (origAnswer instanceof CheckS2SVpnConnectionsAnswer) {
- answer = (CheckS2SVpnConnectionsAnswer)origAnswer;
+ answer = (CheckS2SVpnConnectionsAnswer) origAnswer;
} else {
s_logger.warn("Unable to update router " + router.getHostName() + "'s VPN connection status");
continue;
@@ -1114,7 +931,7 @@ protected void updateSite2SiteVpnConnectionState(final List rout
throw new CloudRuntimeException("Unable to acquire lock on " + lock);
}
try {
- if (conn.getState() != Site2SiteVpnConnection.State.Connected && conn.getState() != Site2SiteVpnConnection.State.Disconnected) {
+ if ((conn.getState() != Site2SiteVpnConnection.State.Connected) && (conn.getState() != Site2SiteVpnConnection.State.Disconnected)) {
continue;
}
final Site2SiteVpnConnection.State oldState = conn.getState();
@@ -1127,9 +944,8 @@ protected void updateSite2SiteVpnConnectionState(final List rout
_s2sVpnConnectionDao.persist(conn);
if (oldState != conn.getState()) {
final String title = "Site-to-site Vpn Connection to " + gw.getName() + " just switch from " + oldState + " to " + conn.getState();
- final String context =
- "Site-to-site Vpn Connection to " + gw.getName() + " on router " + router.getHostName() + "(id: " + router.getId() + ") " +
- " just switch from " + oldState + " to " + conn.getState();
+ final String context = "Site-to-site Vpn Connection to " + gw.getName() + " on router " + router.getHostName() + "(id: " + router.getId() + ") "
+ + " just switch from " + oldState + " to " + conn.getState();
s_logger.info(context);
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), title, context);
}
@@ -1156,7 +972,7 @@ protected void updateRoutersRedundantState(final List routers) {
} else {
final String privateIP = router.getPrivateIpAddress();
final HostVO host = _hostDao.findById(router.getHostId());
- if (host == null || host.getState() != Status.Up) {
+ if ((host == null) || (host.getState() != Status.Up)) {
router.setRedundantState(RedundantState.UNKNOWN);
updated = true;
} else if (privateIP != null) {
@@ -1167,13 +983,13 @@ protected void updateRoutersRedundantState(final List routers) {
final Answer origAnswer = _agentMgr.easySend(router.getHostId(), command);
CheckRouterAnswer answer = null;
if (origAnswer instanceof CheckRouterAnswer) {
- answer = (CheckRouterAnswer)origAnswer;
+ answer = (CheckRouterAnswer) origAnswer;
} else {
s_logger.warn("Unable to update router " + router.getHostName() + "'s status");
}
RedundantState state = RedundantState.UNKNOWN;
boolean isBumped = router.getIsPriorityBumpUp();
- if (answer != null && answer.getResult()) {
+ if ((answer != null) && answer.getResult()) {
state = answer.getState();
isBumped = answer.isBumped();
}
@@ -1188,8 +1004,8 @@ protected void updateRoutersRedundantState(final List routers) {
final RedundantState currState = router.getRedundantState();
if (prevState != currState) {
final String title = "Redundant virtual router " + router.getInstanceName() + " just switch from " + prevState + " to " + currState;
- final String context =
- "Redundant virtual router (name: " + router.getHostName() + ", id: " + router.getId() + ") " + " just switch from " + prevState + " to " + currState;
+ final String context = "Redundant virtual router (name: " + router.getHostName() + ", id: " + router.getId() + ") " + " just switch from " + prevState + " to "
+ + currState;
s_logger.info(context);
if (currState == RedundantState.MASTER) {
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), title, context);
@@ -1198,12 +1014,13 @@ protected void updateRoutersRedundantState(final List routers) {
}
}
- //Ensure router status is update to date before execute this function. The function would try best to recover all routers except MASTER
+ // Ensure router status is update to date before execute this function. The
+ // function would try best to recover all routers except MASTER
protected void recoverRedundantNetwork(final DomainRouterVO masterRouter, final DomainRouterVO backupRouter) {
- if (masterRouter.getState() == State.Running && backupRouter.getState() == State.Running) {
+ if ((masterRouter.getState() == State.Running) && (backupRouter.getState() == State.Running)) {
final HostVO masterHost = _hostDao.findById(masterRouter.getHostId());
final HostVO backupHost = _hostDao.findById(backupRouter.getHostId());
- if (masterHost.getState() == Status.Up && backupHost.getState() == Status.Up) {
+ if ((masterHost.getState() == Status.Up) && (backupHost.getState() == Status.Up)) {
final String title = "Reboot " + backupRouter.getInstanceName() + " to ensure redundant virtual routers work";
if (s_logger.isDebugEnabled()) {
s_logger.debug(title);
@@ -1222,14 +1039,6 @@ protected void recoverRedundantNetwork(final DomainRouterVO masterRouter, final
}
}
- private int getRealPriority(final DomainRouterVO router) {
- int priority = router.getPriority();
- if (router.getIsPriorityBumpUp()) {
- priority += DEFAULT_DELTA;
- }
- return priority;
- }
-
protected class RvRStatusUpdateTask extends ManagedContextRunnable {
public RvRStatusUpdateTask() {
@@ -1237,8 +1046,8 @@ public RvRStatusUpdateTask() {
/*
* In order to make fail-over works well at any time, we have to ensure:
- * 1. Backup router's priority = Master's priority - DELTA + 1
- * 2. Backup router's priority hasn't been bumped up.
+ * 1. Backup router's priority = Master's priority - DELTA + 1 2. Backup
+ * router's priority hasn't been bumped up.
*/
private void checkSanity(final List routers) {
final Set checkedNetwork = new HashSet();
@@ -1265,7 +1074,8 @@ private void checkSanity(final List routers) {
if (masterRouter == null) {
masterRouter = r;
} else {
- //Duplicate master! We give up, until the admin fix duplicate MASTER issue
+ // Duplicate master! We give up, until the admin
+ // fix duplicate MASTER issue
break;
}
} else if (r.getRedundantState() == RedundantState.BACKUP) {
@@ -1276,8 +1086,8 @@ private void checkSanity(final List routers) {
}
}
}
- if (masterRouter != null && backupRouter != null) {
- if (getRealPriority(masterRouter) - DEFAULT_DELTA + 1 != getRealPriority(backupRouter) || backupRouter.getIsPriorityBumpUp()) {
+ if ((masterRouter != null) && (backupRouter != null)) {
+ if ((((_nwHelper.getRealPriority(masterRouter) - DEFAULT_DELTA) + 1) != _nwHelper.getRealPriority(backupRouter)) || backupRouter.getIsPriorityBumpUp()) {
recoverRedundantNetwork(masterRouter, backupRouter);
}
}
@@ -1294,14 +1104,12 @@ private void checkDuplicateMaster(final List routers) {
if (router.getRedundantState() == RedundantState.MASTER) {
if (networkRouterMaps.containsKey(routerGuestNtwkId)) {
final DomainRouterVO dupRouter = networkRouterMaps.get(routerGuestNtwkId);
- final String title =
- "More than one redundant virtual router is in MASTER state! Router " + router.getHostName() + " and router " + dupRouter.getHostName();
- final String context =
- "Virtual router (name: " + router.getHostName() + ", id: " + router.getId() + " and router (name: " + dupRouter.getHostName() + ", id: " +
- router.getId() + ") are both in MASTER state! If the problem persist, restart both of routers. ";
+ final String title = "More than one redundant virtual router is in MASTER state! Router " + router.getHostName() + " and router "
+ + dupRouter.getHostName();
+ final String context = "Virtual router (name: " + router.getHostName() + ", id: " + router.getId() + " and router (name: " + dupRouter.getHostName()
+ + ", id: " + router.getId() + ") are both in MASTER state! If the problem persist, restart both of routers. ";
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), title, context);
- _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, dupRouter.getDataCenterId(), dupRouter.getPodIdToDeployIn(), title,
- context);
+ _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, dupRouter.getDataCenterId(), dupRouter.getPodIdToDeployIn(), title, context);
s_logger.warn(context);
} else {
networkRouterMaps.put(routerGuestNtwkId, router);
@@ -1315,20 +1123,29 @@ private void checkDuplicateMaster(final List routers) {
protected void runInContext() {
while (true) {
try {
- final Long networkId = _vrUpdateQueue.take(); // This is a blocking call so this thread won't run all the time if no work item in queue.
+ final Long networkId = _vrUpdateQueue.take(); // This is a
+ // blocking
+ // call so
+ // this thread
+ // won't run
+ // all the
+ // time if no
+ // work item
+ // in queue.
final List routers = _routerDao.listByNetworkAndRole(networkId, Role.VIRTUAL_ROUTER);
if (routers.size() != 2) {
continue;
}
/*
- * We update the router pair which the lower id router owned by this mgmt server, in order
- * to prevent duplicate update of router status from cluster mgmt servers
+ * We update the router pair which the lower id router owned
+ * by this mgmt server, in order to prevent duplicate update
+ * of router status from cluster mgmt servers
*/
final DomainRouterVO router0 = routers.get(0);
final DomainRouterVO router1 = routers.get(1);
DomainRouterVO router = router0;
- if ((router0.getId() < router1.getId()) && router0.getHostId() != null) {
+ if ((router0.getId() < router1.getId()) && (router0.getHostId() != null)) {
router = router0;
} else {
router = router1;
@@ -1338,7 +1155,7 @@ protected void runInContext() {
continue;
}
final HostVO host = _hostDao.findById(router.getHostId());
- if (host == null || host.getManagementServerId() == null || host.getManagementServerId() != ManagementServerNode.getManagementServerId()) {
+ if ((host == null) || (host.getManagementServerId() == null) || (host.getManagementServerId() != ManagementServerNode.getManagementServerId())) {
s_logger.debug("Skip router pair (" + router0.getInstanceName() + "," + router1.getInstanceName() + ") due to not belong to this mgmt server");
continue;
}
@@ -1394,26 +1211,31 @@ protected void runInContext() {
}
protected void getRouterAlerts() {
- try{
- List routers = _routerDao.listByStateAndManagementServer(State.Running, mgmtSrvrId);
+ try {
+ final List routers = _routerDao.listByStateAndManagementServer(State.Running, mgmtSrvrId);
s_logger.debug("Found " + routers.size() + " running routers. ");
for (final DomainRouterVO router : routers) {
- String serviceMonitoringFlag = SetServiceMonitor.valueIn(router.getDataCenterId());
- // Skip the routers in VPC network or skip the routers where Monitor service is not enabled in the corresponding Zone
- if ( !Boolean.parseBoolean(serviceMonitoringFlag) || router.getVpcId() != null) {
+ final String serviceMonitoringFlag = SetServiceMonitor.valueIn(router.getDataCenterId());
+ // Skip the routers in VPC network or skip the routers where
+ // Monitor service is not enabled in the corresponding Zone
+ if (!Boolean.parseBoolean(serviceMonitoringFlag) || (router.getVpcId() != null)) {
continue;
}
- String privateIP = router.getPrivateIpAddress();
+ final String privateIP = router.getPrivateIpAddress();
if (privateIP != null) {
OpRouterMonitorServiceVO opRouterMonitorServiceVO = _opRouterMonitorServiceDao.findById(router.getId());
GetRouterAlertsCommand command = null;
if (opRouterMonitorServiceVO == null) {
- command = new GetRouterAlertsCommand(new String("1970-01-01 00:00:00")); // To avoid sending null value
+ command = new GetRouterAlertsCommand(new String("1970-01-01 00:00:00")); // To
+ // avoid
+ // sending
+ // null
+ // value
} else {
command = new GetRouterAlertsCommand(opRouterMonitorServiceVO.getLastAlertTimestamp());
}
@@ -1429,7 +1251,7 @@ protected void getRouterAlerts() {
continue;
}
if (origAnswer instanceof GetRouterAlertsAnswer) {
- answer = (GetRouterAlertsAnswer)origAnswer;
+ answer = (GetRouterAlertsAnswer) origAnswer;
} else {
s_logger.warn("Unable to get alerts from router " + router.getHostName());
continue;
@@ -1439,22 +1261,20 @@ protected void getRouterAlerts() {
continue;
}
- String alerts[] = answer.getAlerts();
+ final String alerts[] = answer.getAlerts();
if (alerts != null) {
- String lastAlertTimeStamp = answer.getTimeStamp();
- SimpleDateFormat sdfrmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ final String lastAlertTimeStamp = answer.getTimeStamp();
+ final SimpleDateFormat sdfrmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
sdfrmt.setLenient(false);
- try
- {
+ try {
sdfrmt.parse(lastAlertTimeStamp);
- }
- catch (ParseException e)
- {
+ } catch (final ParseException e) {
s_logger.warn("Invalid last alert timestamp received while collecting alerts from router: " + router.getInstanceName());
continue;
}
- for (String alert: alerts) {
- _alertMgr.sendAlert(AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), "Monitoring Service on VR " + router.getInstanceName(), alert);
+ for (final String alert : alerts) {
+ _alertMgr.sendAlert(AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), "Monitoring Service on VR "
+ + router.getInstanceName(), alert);
}
if (opRouterMonitorServiceVO == null) {
opRouterMonitorServiceVO = new OpRouterMonitorServiceVO(router.getId(), router.getHostName(), lastAlertTimeStamp);
@@ -1464,20 +1284,17 @@ protected void getRouterAlerts() {
_opRouterMonitorServiceDao.update(opRouterMonitorServiceVO.getId(), opRouterMonitorServiceVO);
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("Error while collecting alerts from router: " + router.getInstanceName(), e);
continue;
}
}
}
- } catch (Exception e) {
+ } catch (final Exception e) {
s_logger.warn("Error while collecting alerts from router", e);
}
}
- private final static int DEFAULT_PRIORITY = 100;
- private final static int DEFAULT_DELTA = 2;
-
protected int getUpdatedPriority(final Network guestNetwork, final List routers, final DomainRouterVO exclude)
throws InsufficientVirtualNetworkCapacityException {
int priority;
@@ -1489,9 +1306,10 @@ protected int getUpdatedPriority(final Network guestNetwork, final List maxPriority) {
- maxPriority = getRealPriority(r);
+ // FIXME Assume the maxPriority one should be running or just
+ // created.
+ if ((r.getId() != exclude.getId()) && (_nwHelper.getRealPriority(r) > maxPriority)) {
+ maxPriority = _nwHelper.getRealPriority(r);
}
}
if (maxPriority == 0) {
@@ -1505,728 +1323,83 @@ protected int getUpdatedPriority(final Network guestNetwork, final List clusters = _clusterDao.listByPodId(podId);
- for (final ClusterVO cv : clusters) {
- if (cv.getHypervisorType() == HypervisorType.Ovm || cv.getHypervisorType() == HypervisorType.BareMetal) {
- continue;
- }
-
- final List hosts = _resourceMgr.listAllHostsInCluster(cv.getId());
- if (hosts == null || hosts.isEmpty()) {
- continue;
- }
-
- for (final HostVO h : hosts) {
- if (h.getState() == Status.Up) {
- s_logger.debug("Pick up host that has hypervisor type " + h.getHypervisorType() + " in cluster " + cv.getId() + " to start domain router for OVM");
- return h.getHypervisorType();
- }
- }
- }
-
- final String errMsg =
- "Cannot find an available cluster in Pod " + podId + " to start domain router for Ovm. \n Ovm won't support any system vm including domain router, " +
- "please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod" +
- " with Ovm cluster. And there is at least one host in UP status in that cluster.";
- throw new CloudRuntimeException(errMsg);
- }
+ @Override
+ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile, final DeployDestination dest, final ReservationContext context) {
- private void checkAndResetPriorityOfRedundantRouter(final List routers) {
- boolean allStopped = true;
- for (final DomainRouterVO router : routers) {
- if (!router.getIsRedundantRouter() || router.getState() != VirtualMachine.State.Stopped) {
- allStopped = false;
- break;
- }
- }
- if (!allStopped) {
- return;
- }
+ boolean dnsProvided = true;
+ boolean dhcpProvided = true;
+ boolean publicNetwork = false;
+ final DataCenterVO dc = _dcDao.findById(dest.getDataCenter().getId());
+ _dcDao.loadDetails(dc);
- for (final DomainRouterVO router : routers) {
- // getUpdatedPriority() would update the value later
- router.setPriority(0);
- router.setIsPriorityBumpUp(false);
- _routerDao.update(router.getId(), router);
- }
- }
+ // 1) Set router details
+ final DomainRouterVO router = _routerDao.findById(profile.getVirtualMachine().getId());
+ final Map details = _vmDetailsDao.listDetailsKeyPairs(router.getId());
+ router.setDetails(details);
- @DB
- protected List findOrDeployVirtualRouterInGuestNetwork(final Network guestNetwork, final DeployDestination dest, Account owner, final boolean isRedundant,
- final Map