CLOUDSTACK-7144: No GSLB provider is available during assigning load balancing rule
this fix ensures any bean implementing GslbProvider interface are injected into GlobalLoadBalancingRulesServiceImpl. (cherry picked from commit 9dc322d46fa5cfb9abd87c408988abad1219d607) Signed-off-by: Rohit Yadav <[email protected]> Conflicts: server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java Conflicts: server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6455a69a Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6455a69a Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6455a69a Branch: refs/heads/4.4 Commit: 6455a69a4b9037253fdbde6be0059737707320b7 Parents: 908ee8e Author: Murali Reddy <[email protected]> Authored: Mon Jul 21 16:48:28 2014 +0530 Committer: Rohit Yadav <[email protected]> Committed: Thu Dec 11 20:40:13 2014 +0530 ---------------------------------------------------------------------- .../core/spring-core-registry-core-context.xml | 5 +++++ ...re-lifecycle-network-context-inheritable.xml | 8 +++++-- .../spring-server-core-managers-context.xml | 5 +++-- .../GlobalLoadBalancingRulesServiceImpl.java | 23 ++++++++++++-------- ...GlobalLoadBalancingRulesServiceImplTest.java | 4 +++- 5 files changed, 31 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6455a69a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml ---------------------------------------------------------------------- diff --git a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml index 819fb83..0a82eb9 100644 --- a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml +++ b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml @@ -232,6 +232,11 @@ </property> </bean> + <bean id="gslbServiceProvidersRegistry" + class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry"> + <property name="excludeKey" value="gslb.service.provider.exclude" /> + </bean> + <bean id="affinityProcessorsRegistry" class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry"> <property name="orderConfigKey" value="affinity.processors.order" /> http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6455a69a/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml ---------------------------------------------------------------------- diff --git a/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml b/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml index a54d588..76cdfe3 100644 --- a/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml @@ -96,5 +96,9 @@ <property name="typeClass" value="com.cloud.network.element.RemoteAccessVPNServiceProvider" /> </bean> - -</beans> \ No newline at end of file + <bean class="org.apache.cloudstack.spring.lifecycle.registry.RegistryLifecycle"> + <property name="registry" ref="gslbServiceProvidersRegistry" /> + <property name="typeClass" + value="org.apache.cloudstack.region.gslb.GslbServiceProvider" /> + </bean> +</beans> http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6455a69a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml ---------------------------------------------------------------------- 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 fc1c7e2..1eba0b2 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 @@ -224,7 +224,8 @@ <bean id="PlannerHostReservationDaoImpl" class="com.cloud.deploy.dao.PlannerHostReservationDaoImpl" /> <bean id="GlobalLoadBalancingRulesServiceImpl" - class="org.apache.cloudstack.region.gslb.GlobalLoadBalancingRulesServiceImpl" /> - + class="org.apache.cloudstack.region.gslb.GlobalLoadBalancingRulesServiceImpl" > + <property name="gslbServiceProviders" value="#{gslbServiceProvidersRegistry.registered}" /> + </bean> <bean id="certServiceImpl" class="org.apache.cloudstack.network.lb.CertServiceImpl" /> </beans> http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6455a69a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java ---------------------------------------------------------------------- diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java index c84fea2..25e8d89 100644 --- a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java +++ b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java @@ -95,10 +95,10 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR @Inject AgentManager _agentMgr; - protected GslbServiceProvider _gslbProvider = null; + protected List<GslbServiceProvider> _gslbProviders; - public void setGslbServiceProvider(GslbServiceProvider provider) { - _gslbProvider = provider; + public void setGslbServiceProviders(List<GslbServiceProvider> providers) { + _gslbProviders = providers; } @Override @@ -656,8 +656,8 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR new SiteLoadBalancerConfig(gslbLbMapVo.isRevoke(), serviceType, ip.getAddress().addr(), Integer.toString(loadBalancer.getDefaultPortStart()), dataCenterId); - siteLb.setGslbProviderPublicIp(_gslbProvider.getZoneGslbProviderPublicIp(dataCenterId, physicalNetworkId)); - siteLb.setGslbProviderPrivateIp(_gslbProvider.getZoneGslbProviderPrivateIp(dataCenterId, physicalNetworkId)); + siteLb.setGslbProviderPublicIp(lookupGslbServiceProvider().getZoneGslbProviderPublicIp(dataCenterId, physicalNetworkId)); + siteLb.setGslbProviderPrivateIp(lookupGslbServiceProvider().getZoneGslbProviderPrivateIp(dataCenterId, physicalNetworkId)); siteLb.setWeight(gslbLbMapVo.getWeight()); zoneSiteLoadbalancerMap.put(network.getDataCenterId(), siteLb); @@ -686,7 +686,7 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR } try { - _gslbProvider.applyGlobalLoadBalancerRule(zoneId.first(), zoneId.second(), gslbConfigCmd); + lookupGslbServiceProvider().applyGlobalLoadBalancerRule(zoneId.first(), zoneId.second(), gslbConfigCmd); } catch (ResourceUnavailableException e) { String msg = "Failed to configure GSLB rule in the zone " + zoneId.first() + " due to " + e.getMessage(); s_logger.warn(msg); @@ -711,15 +711,20 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR private boolean checkGslbServiceEnabledInZone(long zoneId, long physicalNetworkId) { - if (_gslbProvider == null) { + GslbServiceProvider gslbProvider = lookupGslbServiceProvider(); + if (gslbProvider == null) { throw new CloudRuntimeException("No GSLB provider is available"); } - return _gslbProvider.isServiceEnabledInZone(zoneId, physicalNetworkId); + return gslbProvider.isServiceEnabledInZone(zoneId, physicalNetworkId); + } + + protected GslbServiceProvider lookupGslbServiceProvider() { + return _gslbProviders.size() == 0 ? null : _gslbProviders.get(0); } @Override public GlobalLoadBalancerRule findById(long gslbRuleId) { return _gslbRuleDao.findById(gslbRuleId); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6455a69a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java ---------------------------------------------------------------------- diff --git a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java index d152c66..94bc3c7 100644 --- a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java +++ b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java @@ -720,7 +720,9 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase { gslbServiceImpl._globalConfigDao = Mockito.mock(ConfigurationDao.class); gslbServiceImpl._ipAddressDao = Mockito.mock(IPAddressDao.class); gslbServiceImpl._agentMgr = Mockito.mock(AgentManager.class); - gslbServiceImpl._gslbProvider = Mockito.mock(GslbServiceProvider.class); + List<GslbServiceProvider> mockGslbProviders = new ArrayList<GslbServiceProvider>(); + mockGslbProviders.add(Mockito.mock(GslbServiceProvider.class)); + gslbServiceImpl._gslbProviders = mockGslbProviders; RemoveFromGlobalLoadBalancerRuleCmd removeFromGslbCmd = new RemoveFromGlobalLoadBalancerRuleCmdExtn(); Class<?> _class = removeFromGslbCmd.getClass().getSuperclass();
