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 9dc322d46f)
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>

Conflicts:
	server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
	server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
This commit is contained in:
Murali Reddy 2014-07-21 16:48:28 +05:30 committed by Rohit Yadav
parent 816eb63e97
commit b8a28dfae3
5 changed files with 32 additions and 14 deletions

View File

@ -229,6 +229,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" />

View File

@ -96,5 +96,9 @@
<property name="typeClass"
value="com.cloud.network.element.RemoteAccessVPNServiceProvider" />
</bean>
</beans>
<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>

View File

@ -231,7 +231,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>

View File

@ -85,9 +85,10 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
@Inject
AgentManager _agentMgr;
protected GslbServiceProvider _gslbProvider=null;
public void setGslbServiceProvider(GslbServiceProvider provider) {
this._gslbProvider = provider;
protected List<GslbServiceProvider> _gslbProviders;
public void setGslbServiceProviders(List<GslbServiceProvider> providers) {
_gslbProviders = providers;
}
@Override
@ -663,8 +664,8 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
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);
@ -693,7 +694,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);
@ -719,15 +720,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);
}
}
}

View File

@ -726,7 +726,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();