You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mu...@apache.org on 2013/07/01 15:36:18 UTC
git commit: updated refs/heads/4.2 to 1032d5c
Updated Branches:
refs/heads/4.2 c814cfbb8 -> 1032d5c26
CLOUDSTACK-3282:[GSLB] Unable to add multiple LB rules to same GSLB rule
-fixing regression due to adding GSLB monitor for GSLB service
-code to add/delete GSLB monitor and GSLB service-monitor binding is
made idempotenet so as to succeed if the resource exists.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1032d5c2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1032d5c2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1032d5c2
Branch: refs/heads/4.2
Commit: 1032d5c26a3f5573e5cdb695038be2cce1c19fa3
Parents: c814cfb
Author: Murali Reddy <mu...@gmail.com>
Authored: Mon Jul 1 18:59:14 2013 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Mon Jul 1 19:01:48 2013 +0530
----------------------------------------------------------------------
.../network/resource/NetscalerResource.java | 121 ++++++++++++++-----
.../GlobalLoadBalancingRulesServiceImpl.java | 5 +-
2 files changed, 92 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1032d5c2/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetscalerResource.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetscalerResource.java b/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetscalerResource.java
index 263e13b..d25d416 100644
--- a/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetscalerResource.java
+++ b/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetscalerResource.java
@@ -905,46 +905,27 @@ public class NetscalerResource implements ServerResource {
GSLB.createVserverServiceBinding(_netscalerService, serviceName, vserverName);
// create a monitor for the service running on the site
- lbmonitor newmonitor = new lbmonitor();
- String monitorName = GSLB.generateGslbServiceMonitorName(servicePublicIp);
- newmonitor.set_type("TCP");
- newmonitor.set_servicename(serviceName);
- newmonitor.set_monitorname(monitorName);
- newmonitor.set_state("ENABLED");
- lbmonitor.add(_netscalerService, newmonitor);
+ GSLB.createGslbServiceMonitor(_netscalerService, servicePublicIp, serviceName);
- // bind the monitor to the GSLB servie
- try {
- gslbservice_lbmonitor_binding monitorBinding = new gslbservice_lbmonitor_binding();
- monitorBinding.set_monitor_name(monitorName);
- monitorBinding.set_servicename(serviceName);
- gslbservice_lbmonitor_binding.add(_netscalerService, monitorBinding);
- } catch (Exception e) {
- // TODO: Nitro API version 10.* is not compatible for NetScalers 9.*, so may fail
- // against NetScaler version lesser than 10 hence ignore the exception
- s_logger.warn("Failed to bind monitor to GSLB service due to " + e.getMessage());
- }
+ // bind the monitor to the GSLB service
+ GSLB.createGslbServiceGslbMonitorBinding(_netscalerService, servicePublicIp, serviceName);
} else {
+
+ String monitorName = GSLB.generateGslbServiceMonitorName(servicePublicIp);
+
+ // delete GSLB service and GSLB monitor binding
+ GSLB.deleteGslbServiceGslbMonitorBinding(_netscalerService, monitorName, serviceName);
+
+ // delete the GSLB service monitor
+ GSLB.deleteGslbServiceMonitor(_netscalerService, monitorName);
+
// Unbind GSLB service with GSLB virtual server
GSLB.deleteVserverServiceBinding(_netscalerService, serviceName, vserverName);
// delete 'gslbservice' object
gslbservice service = GSLB.getServiceObject(_netscalerService, serviceName);
GSLB.deleteService(_netscalerService, serviceName);
-
- // delete the GSLB service monitor
- String monitorName = GSLB.generateGslbServiceMonitorName(servicePublicIp);
- try {
- lbmonitor serviceMonitor = lbmonitor.get(_netscalerService, monitorName);
- if (serviceMonitor != null) {
- lbmonitor.delete(_netscalerService, serviceMonitor);
- }
- } catch (nitro_exception ne) {
- if (ne.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) {
- s_logger.warn("Failed to delete monitor "+ monitorName + " for GSLB service due to " + ne.getMessage());
- }
- }
}
if (site.forRevoke()) { // delete the site if its for revoke
@@ -969,9 +950,16 @@ public class NetscalerResource implements ServerResource {
String servicePublicIp = site.getServicePublicIp();
String servicePublicPort = site.getServicePort();
String siteName = GSLB.generateUniqueSiteName(sitePrivateIP, sitePublicIP, site.getDataCenterId());
+ String serviceName = GSLB.generateUniqueServiceName(siteName, servicePublicIp, servicePublicPort);
+ String monitorName = GSLB.generateGslbServiceMonitorName(servicePublicIp);
+
+ // delete GSLB service and GSLB monitor binding
+ GSLB.deleteGslbServiceGslbMonitorBinding(_netscalerService, servicePublicIp, serviceName);
+
+ // delete the GSLB service monitor
+ GSLB.deleteGslbServiceMonitor(_netscalerService, monitorName);
// remove binding between virtual server and services
- String serviceName = GSLB.generateUniqueServiceName(siteName, servicePublicIp, servicePublicPort);
GSLB.deleteVserverServiceBinding(_netscalerService, serviceName, vserverName);
// delete service object
@@ -1460,6 +1448,75 @@ public class NetscalerResource implements ServerResource {
}
}
+ private static void createGslbServiceMonitor(nitro_service nsService, String servicePublicIp,
+ String serviceName) throws ExecutionException {
+ try {
+ lbmonitor newmonitor = new lbmonitor();
+ String monitorName = generateGslbServiceMonitorName(servicePublicIp);
+ newmonitor.set_type("TCP");
+ newmonitor.set_servicename(serviceName);
+ newmonitor.set_monitorname(monitorName);
+ newmonitor.set_state("ENABLED");
+ lbmonitor.add(nsService, newmonitor);
+ } catch (nitro_exception ne) {
+ if (ne.getErrorCode() == NitroError.NS_RESOURCE_EXISTS) {
+ return;
+ }
+ } catch (Exception e) {
+ String errMsg = "Failed to create GSLB monitor for service public ip" + servicePublicIp;
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug(errMsg);
+ }
+ throw new ExecutionException(errMsg);
+ }
+ }
+
+ private static void deleteGslbServiceMonitor(nitro_service nsService, String monitorName)
+ throws ExecutionException {
+ try {
+ lbmonitor serviceMonitor = lbmonitor.get(nsService, monitorName);
+ if (serviceMonitor != null) {
+ lbmonitor.delete(nsService, serviceMonitor);
+ }
+ } catch (nitro_exception ne) {
+ if (ne.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) {
+ String errMsg = "Failed to delete monitor "+ monitorName + " for GSLB service due to " + ne.getMessage();
+ s_logger.debug(errMsg);
+ throw new com.cloud.utils.exception.ExecutionException(errMsg);
+ }
+ } catch (Exception e) {
+ String errMsg = "Failed to delete monitor "+ monitorName + " for GSLB service due to " + e.getMessage();
+ s_logger.debug(errMsg);
+ throw new com.cloud.utils.exception.ExecutionException(errMsg);
+ }
+ }
+
+ private static void createGslbServiceGslbMonitorBinding(nitro_service nsService, String servicePublicIp,
+ String serviceName) {
+ try {
+ String monitorName = GSLB.generateGslbServiceMonitorName(servicePublicIp);
+ gslbservice_lbmonitor_binding monitorBinding = new gslbservice_lbmonitor_binding();
+ monitorBinding.set_monitor_name(monitorName);
+ monitorBinding.set_servicename(serviceName);
+ gslbservice_lbmonitor_binding.add(nsService, monitorBinding);
+ } catch (Exception e) {
+ // TODO: Nitro API version 10.* is not compatible for NetScalers 9.*, so may fail
+ // against NetScaler version lesser than 10 hence ignore the exception
+ s_logger.warn("Failed to bind monitor to GSLB service due to " + e.getMessage());
+ }
+ }
+
+ private static void deleteGslbServiceGslbMonitorBinding(nitro_service nsService, String monitorName,
+ String serviceName) {
+ try {
+ gslbservice_lbmonitor_binding[] monitorBindings = gslbservice_lbmonitor_binding.get(nsService, serviceName);
+ gslbservice_lbmonitor_binding.delete(nsService, monitorBindings);
+ } catch (Exception e) {
+ s_logger.warn("Failed to delet GSLB monitor " + monitorName + "and GSLB service " + serviceName +
+ " binding due to " + e.getMessage());
+ }
+ }
+
// get 'gslbsite' object corresponding to a site name
private static gslbsite getSiteObject(nitro_service client, String siteName) {
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1032d5c2/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 483c19a..0642390 100644
--- a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
+++ b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
@@ -648,8 +648,9 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
try {
_gslbProvider.applyGlobalLoadBalancerRule(zoneId.first(), zoneId.second(), gslbConfigCmd);
} catch (ResourceUnavailableException e) {
- s_logger.warn("Failed to configure GSLB rul in the zone " + zoneId + " due to " + e.getMessage());
- throw new CloudRuntimeException("Failed to configure GSLB rul in the zone");
+ String msg = "Failed to configure GSLB rule in the zone " + zoneId.first() + " due to " + e.getMessage();
+ s_logger.warn(msg);
+ throw new CloudRuntimeException(msg);
}
}