diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java index 6edbb4400b11..26b2045e13a3 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java @@ -44,6 +44,7 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA static final String RouterTemplateOvm3CK = "router.template.ovm3"; static final String SetServiceMonitorCK = "network.router.EnableServiceMonitoring"; static final String RouterAlertsCheckIntervalCK = "router.alerts.check.interval"; + static final String VirtualRouterServiceOfferingCK = "router.service.offering"; static final String RouterHealthChecksConfigRefreshIntervalCK = "router.health.checks.config.refresh.interval"; static final String RouterHealthChecksResultFetchIntervalCK = "router.health.checks.results.fetch.interval"; @@ -74,6 +75,9 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA static final ConfigKey ExposeDnsAndBootpServer = new ConfigKey(Boolean.class, "expose.dns.externally", "Advanced", "true", "open dns, dhcp and bootp on the public interface", true, ConfigKey.Scope.Zone, null); + static final ConfigKey VirtualRouterServiceOffering = new ConfigKey(String.class, VirtualRouterServiceOfferingCK, "Advanced", "", + "Uuid of the service offering used by virtual routers; if NULL - system offering will be used", true, ConfigKey.Scope.Account, null); + // Health checks static final ConfigKey RouterHealthChecksEnabled = new ConfigKey(Boolean.class, "router.health.checks.enabled", "Advanced", "true", "If true, router health checks are allowed to be executed and read. If false, all scheduled checks and API calls for on demand checks are disabled.", diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index c895307b95ef..72bf48bdadee 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -3245,6 +3245,7 @@ public ConfigKey[] getConfigKeys() { UseExternalDnsServers, RouterVersionCheckEnabled, SetServiceMonitor, + VirtualRouterServiceOffering, RouterAlertsCheckInterval, RouterHealthChecksEnabled, RouterHealthChecksBasicInterval, diff --git a/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java b/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java index 4ff5fa2dc28a..24bc501ca73a 100644 --- a/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java +++ b/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java @@ -54,6 +54,7 @@ import com.cloud.network.dao.UserIpv6AddressDao; import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.router.NetworkHelper; +import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.vpc.Vpc; import com.cloud.offering.ServiceOffering; @@ -389,8 +390,34 @@ protected void findDefaultServiceOfferingId() { serviceOfferingId = serviceOffering.getId(); } + protected void findAccountServiceOfferingId(long accountId) { + String accountRouterOffering = VirtualNetworkApplianceManager.VirtualRouterServiceOffering.valueIn(accountId); + String globalRouterOffering = VirtualNetworkApplianceManager.VirtualRouterServiceOffering.value(); + if (accountRouterOffering != null) { + verifyServiceOfferingByUuid(accountRouterOffering); + } + if (serviceOfferingId == null && globalRouterOffering != accountRouterOffering) { + verifyServiceOfferingByUuid(globalRouterOffering); + } + } + + private void verifyServiceOfferingByUuid(String offeringUuid) { + logger.debug("Verifying router service offering with uuid : " + offeringUuid); + ServiceOfferingVO serviceOffering = serviceOfferingDao.findByUuid(offeringUuid); + if (serviceOffering != null && serviceOffering.isSystemUse()) { + boolean isLocalStorage = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dest.getDataCenter().getId()); + if (isLocalStorage == serviceOffering.isUseLocalStorage()) { + logger.debug(String.format("Service offering %s (uuid: %s) will be used on virtual router", serviceOffering.getName(), serviceOffering.getUuid())); + serviceOfferingId = serviceOffering.getId(); + } + } + } + protected void findServiceOfferingId() { serviceOfferingId = networkOfferingDao.findById(guestNetwork.getNetworkOfferingId()).getServiceOfferingId(); + if (serviceOfferingId == null) { + findAccountServiceOfferingId(guestNetwork.getAccountId()); + } if (serviceOfferingId == null) { findDefaultServiceOfferingId(); } @@ -482,4 +509,4 @@ protected boolean routersNeedReset() { return needReset; } -} \ No newline at end of file +} diff --git a/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java b/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java index f58491894239..91efecee9f53 100644 --- a/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java +++ b/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java @@ -159,6 +159,9 @@ protected void findVirtualProvider() { @Override protected void findServiceOfferingId() { serviceOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId(); + if (serviceOfferingId == null) { + findAccountServiceOfferingId(vpc.getAccountId()); + } if (serviceOfferingId == null) { findDefaultServiceOfferingId(); }