Updated Branches:
  refs/heads/master 402cc917b -> 6a92f3b8a

CLOUDSTACK-2741: [GSLB] GSLB service doesn't come up if the LB rule
mapped to it is serviced by VR

For remote LB services that are not running on NetScaler, there needs to
be a LB monitor bound to GSLB service. Otherwise service is shown down.
This fix binds a LB monitor with GSLB services.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6a92f3b8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6a92f3b8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6a92f3b8

Branch: refs/heads/master
Commit: 6a92f3b8ac2f5623c2b7ec27711bc2e91791e050
Parents: 402cc91
Author: Murali Reddy <muralimmre...@gmail.com>
Authored: Wed Jun 5 12:10:36 2013 +0530
Committer: Murali Reddy <muralimmre...@gmail.com>
Committed: Wed Jun 5 12:10:36 2013 +0530

----------------------------------------------------------------------
 .../cloud/network/resource/NetscalerResource.java  |   38 +++++++++++++++
 1 files changed, 38 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6a92f3b8/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 c0d4599..263e13b 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
@@ -904,6 +904,27 @@ public class NetscalerResource implements ServerResource {
                             // Bind 'gslbservice' service object to GSLB 
virtual server
                             
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);
+
+                            // 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());
+                            }
+
                         } else {
                             // Unbind GSLB service with GSLB virtual server
                             
GSLB.deleteVserverServiceBinding(_netscalerService, serviceName, vserverName);
@@ -911,6 +932,19 @@ public class NetscalerResource implements ServerResource {
                             // 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
@@ -1469,6 +1503,10 @@ public class NetscalerResource implements ServerResource 
{
             return "cloud-gslb-service-" + siteName + "-" + publicIp + "-" + 
publicPort;
         }
 
+        private static String generateGslbServiceMonitorName(String publicIp) {
+            return "cloud-monitor-" + publicIp;
+        }
+
         private static boolean gslbServerExists(nitro_service client, String 
serverName) throws ExecutionException {
             try {
                 if 
(com.citrix.netscaler.nitro.resource.config.basic.server.get(client, 
serverName) != null) {

Reply via email to