Updated Branches:
  refs/heads/gslb-wip [created] e0ded1aa2

NetScaler server reource code changes to interpret
GlobalLoadBalancerConfigCommand and set up appropriate 'gslbvserver',
'gslbsite', 'gslbservice', 'gslb_vserver_service_binding',
gslb_vserver_domain_binding objects on NetScaler device


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

Branch: refs/heads/gslb-wip
Commit: e0ded1aa2b6dfb200d1c40d3de7c5723833ce47e
Parents: 44e3e5e
Author: Murali Reddy <[email protected]>
Authored: Fri Feb 15 18:13:34 2013 +0530
Committer: Murali Reddy <[email protected]>
Committed: Fri Feb 15 18:13:34 2013 +0530

----------------------------------------------------------------------
 .../routing/GlobalLoadBalancerConfigAnswer.java    |    2 +-
 .../routing/GlobalLoadBalancerConfigCommand.java   |  127 ++++-
 .../cloud/network/resource/NetscalerResource.java  |  565 ++++++++++++---
 3 files changed, 598 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e0ded1aa/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java
----------------------------------------------------------------------
diff --git 
a/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java 
b/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java
index dbf57aa..4b17357 100644
--- a/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java
+++ b/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java
@@ -20,7 +20,7 @@ import com.cloud.agent.api.Answer;
 
 public class GlobalLoadBalancerConfigAnswer extends Answer{
 
-    protected GlobalLoadBalancerConfigAnswer() {
+    public GlobalLoadBalancerConfigAnswer() {
         super();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e0ded1aa/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java
----------------------------------------------------------------------
diff --git 
a/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java 
b/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java
index ac18d2c..90d39a3 100644
--- a/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java
+++ b/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java
@@ -17,9 +17,134 @@
 
 package com.cloud.agent.api.routing;
 
+import com.cloud.agent.api.Command;
+
 /**
  * GlobalLoadBalancerConfigCommand used for sending the GSLB configuration to 
GSLB service provider
  */
-public class GlobalLoadBalancerConfigCommand extends NetworkElementCommand {
+public class GlobalLoadBalancerConfigCommand extends Command {
+
+    // FQDN that represents the globally load balanced service
+    String domainName;
+
+    // type of the globally load balanced service
+    String serviceType;
+
+    // load balancing method to distribute traffic across the sites 
participating in global service load balancing
+    String lbMethod;
+
+    // session persistence type
+    String persistenceType;
+
+    // true if global load balancer rule is being deleted
+    boolean revoked;
+
+    // list of the site details that are participating in the GSLB service
+    SiteLoadBalancer[] siteLoadBalancers;
+
+    public  void GlobalLoadBalancerConfigCommand(SiteLoadBalancer[] slbs,
+                                                 String domainName,
+                                                 String lbMethod,
+                                                 String persistenceType,
+                                                 String serviceType,
+                                                 boolean revoked) {
+        this.domainName = domainName;
+        this.serviceType = serviceType;
+        this.lbMethod = lbMethod;
+        this.persistenceType = persistenceType;
+        this.revoked = revoked;
+        this.siteLoadBalancers = slbs;
+    }
+
+    public SiteLoadBalancer[] getSiteDetails() {
+        return siteLoadBalancers;
+    }
+
+    public String getServiceType() {
+        return serviceType;
+    }
+
+    public String getLoadBalancerMethod() {
+        return lbMethod;
+    }
+
+    public String getPersistenceType() {
+        return persistenceType;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public boolean isForRevoke() {
+        return revoked;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    // details of site participating in the GLSB service
+    public class SiteLoadBalancer {
+        // true if the site is local (GSLB provider receiving 
GlobalLoadBalancerConfigCommand is in same site)
+        boolean local;
+
+        // true if the sire needs to be removed from GSLB service
+        boolean revoked;
+
+        // service type of the 'site load balanced' service
+        String serviceType;
+
+        // public IP corresponding to the site load balanced service
+        String servicePublicIp;
+
+        // port corresponding to the site load balanced service
+        String port;
+
+        // IP corresponding to the GSLB service provider in the site.
+        String gslbProviderIp;
+
+        // Public IP corresponding to the GSLB service provider in the site.
+        String gslbProviderPublicIp;
+
+        public void SiteLoadBalancer(String gslbProviderIp, String 
gslbProviderPublicIP, boolean local, boolean revoked,
+                                     String serviceType, String 
servicePublicIp, String port) {
+            this.gslbProviderIp = gslbProviderIp;
+            this.gslbProviderPublicIp = gslbProviderPublicIP;
+            this.local = local;
+            this.revoked = revoked;
+            this.serviceType = serviceType;
+            this.servicePublicIp = servicePublicIp;
+            this.port = port;
+        }
+
+        public String getServiceType() {
+            return  serviceType;
+        }
+
+        public String getServicePublicIp() {
+            return servicePublicIp;
+        }
+
+        public String getPublicPort() {
+            return port;
+        }
+
+        public String getGslbProviderPrivateIp() {
+            return gslbProviderIp;
+        }
+
+        public String getGslbProviderPublicIp() {
+            return gslbProviderPublicIp;
+        }
+
+        public boolean isLocal() {
+            return local;
+        }
 
+        public boolean forRevoke() {
+            return revoked;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e0ded1aa/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 ae79d9e..3a88738 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
@@ -17,16 +17,6 @@
 
 package com.cloud.network.resource;
 
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.naming.ConfigurationException;
-
-import org.apache.log4j.Logger;
-
 import com.citrix.netscaler.nitro.exception.nitro_exception;
 import com.citrix.netscaler.nitro.resource.base.base_response;
 import com.citrix.netscaler.nitro.resource.config.autoscale.autoscalepolicy;
@@ -34,23 +24,10 @@ import 
com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile;
 import com.citrix.netscaler.nitro.resource.config.basic.server_service_binding;
 import com.citrix.netscaler.nitro.resource.config.basic.servicegroup;
 import 
com.citrix.netscaler.nitro.resource.config.basic.servicegroup_lbmonitor_binding;
-import com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable;
-import 
com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable_metric_binding;
-import com.citrix.netscaler.nitro.resource.config.lb.lbmonitor;
-import com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_metric_binding;
-import com.citrix.netscaler.nitro.resource.config.lb.lbvserver;
-import com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding;
-import 
com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding;
-import com.citrix.netscaler.nitro.resource.config.network.Interface;
-import com.citrix.netscaler.nitro.resource.config.network.inat;
-import com.citrix.netscaler.nitro.resource.config.network.vlan;
-import 
com.citrix.netscaler.nitro.resource.config.network.vlan_interface_binding;
-import com.citrix.netscaler.nitro.resource.config.network.vlan_nsip_binding;
-import com.citrix.netscaler.nitro.resource.config.ns.nsconfig;
-import com.citrix.netscaler.nitro.resource.config.ns.nshardware;
-import com.citrix.netscaler.nitro.resource.config.ns.nsip;
-import com.citrix.netscaler.nitro.resource.config.ns.nstimer;
-import 
com.citrix.netscaler.nitro.resource.config.ns.nstimer_autoscalepolicy_binding;
+import com.citrix.netscaler.nitro.resource.config.gslb.*;
+import com.citrix.netscaler.nitro.resource.config.lb.*;
+import com.citrix.netscaler.nitro.resource.config.network.*;
+import com.citrix.netscaler.nitro.resource.config.ns.*;
 import com.citrix.netscaler.nitro.resource.stat.lb.lbvserver_stats;
 import com.citrix.netscaler.nitro.service.nitro_service;
 import com.citrix.netscaler.nitro.util.filtervalue;
@@ -59,35 +36,12 @@ import com.citrix.sdx.nitro.resource.config.mps;
 import com.citrix.sdx.nitro.resource.config.ns;
 import com.citrix.sdx.nitro.resource.config.xen_vpx_image;
 import com.cloud.agent.IAgentControl;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer;
-import com.cloud.agent.api.ExternalNetworkResourceUsageCommand;
-import com.cloud.agent.api.MaintainAnswer;
-import com.cloud.agent.api.MaintainCommand;
-import com.cloud.agent.api.PingCommand;
-import com.cloud.agent.api.ReadyAnswer;
-import com.cloud.agent.api.ReadyCommand;
-import com.cloud.agent.api.StartupCommand;
-import com.cloud.agent.api.StartupExternalLoadBalancerCommand;
-import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand;
-import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand;
-import com.cloud.agent.api.routing.IpAssocAnswer;
-import com.cloud.agent.api.routing.IpAssocCommand;
-import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
-import com.cloud.agent.api.routing.SetStaticNatRulesAnswer;
-import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
+import com.cloud.agent.api.*;
+import com.cloud.agent.api.routing.*;
 import com.cloud.agent.api.to.IpAddressTO;
 import com.cloud.agent.api.to.LoadBalancerTO;
-import com.cloud.agent.api.to.LoadBalancerTO.AutoScalePolicyTO;
-import com.cloud.agent.api.to.LoadBalancerTO.AutoScaleVmGroupTO;
-import com.cloud.agent.api.to.LoadBalancerTO.AutoScaleVmProfileTO;
-import com.cloud.agent.api.to.LoadBalancerTO.ConditionTO;
-import com.cloud.agent.api.to.LoadBalancerTO.CounterTO;
-import com.cloud.agent.api.to.LoadBalancerTO.DestinationTO;
-import com.cloud.agent.api.to.LoadBalancerTO.StickinessPolicyTO;
+import com.cloud.agent.api.to.LoadBalancerTO.*;
 import com.cloud.agent.api.to.StaticNatRuleTO;
-import org.apache.cloudstack.api.ApiConstants;
 import com.cloud.host.Host;
 import com.cloud.host.Host.Type;
 import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
@@ -98,6 +52,11 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.exception.ExecutionException;
 import com.cloud.utils.net.NetUtils;
 import com.google.gson.Gson;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.log4j.Logger;
+
+import javax.naming.ConfigurationException;
+import java.util.*;
 
 class NitroError {
     static final int NS_RESOURCE_EXISTS = 273;
@@ -790,97 +749,515 @@ public class NetscalerResource implements ServerResource 
{
         }
     }
 
-    private void execute(GlobalLoadBalancerConfigCommand cmd, numRetries) {
-        /*
-         *  1. domain name for which NetScale will act as authoritative DNS 
server
-         *  2. DNS record type
-         *  3. service type, virtual server name
-         *  4. Configure GSLB method
-         *  5. Configure Persistence
-         *  6.
-         */
+    private Answer execute(GlobalLoadBalancerConfigCommand gslbCmd, int 
numRetries) {
+
+        String lbMethod = gslbCmd.getLoadBalancerMethod();
+        String persistenceType = gslbCmd.getPersistenceType();
+        String serviceType = gslbCmd.getServiceType();
+        boolean forRevoke = gslbCmd.isForRevoke();
+        GlobalLoadBalancerConfigCommand.SiteLoadBalancer[] sites = 
gslbCmd.getSiteDetails();
+
+        String domainName = gslbCmd.getDomainName();
+        String vserverName = GSLB.generateVirtualServerName(domainName);
+
+        try {
+
+            if (!forRevoke) { //check if the global load balancer rule is 
being added
+
+                // Add a GSLB virtual server
+                GSLB.createVirtualServer(_netscalerService, vserverName, 
lbMethod, persistenceType, serviceType);
+
+                if (sites != null) { // check if there are any sites that are 
participating in global load balancing
+                    for (GlobalLoadBalancerConfigCommand.SiteLoadBalancer site 
: sites) {
+
+                        String sitePrivateIP = site.getGslbProviderPrivateIp();
+                        String sitePublicIP =  site.getGslbProviderPublicIp();
+                        String sitePublicPort = site.getPublicPort();
+                        String siteName = 
GSLB.generateUniqueSiteName(sitePrivateIP, sitePublicIP);
+
+                        // Add/Delete GSLB local and remote sites that are 
part of GSLB virtual server
+                        if (!site.forRevoke()) {
+                            String siteType = (site.isLocal()) ? "LOCAL" : 
"REMOTE";
+                            if (GSLB.getSiteObject(_netscalerService, 
siteName) != null) {
+                                GSLB.updateSite(_netscalerService, siteType, 
siteName, site.getGslbProviderPrivateIp(),
+                                        site.getGslbProviderPublicIp());
+                            } else {
+                                GSLB.createSite(_netscalerService, siteType, 
siteName, site.getGslbProviderPrivateIp(),
+                                        site.getGslbProviderPublicIp());
+                            }
+                        }
+
+                        // Add/Delete GSLB service corresponding the service 
running on each site
+                        String serviceName = 
GSLB.generateUniqueServiceName(siteName, sitePublicIP, sitePublicPort);
+                        if (!site.forRevoke()) {
+                            // create a 'gslbservice' object
+                            GSLB.createService(_netscalerService, serviceName, 
site.getServiceType(),
+                                    sitePublicIP, sitePublicPort, siteName);
+
+                            // Bind 'gslbservice' service object to GSLB 
virtual server
+                            
GSLB.createVserverServiceBinding(_netscalerService, serviceName, vserverName);
+
+                        } else {
+                            // 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);
+                        }
+
+                        if (site.forRevoke()) { // delete the site if its for 
revoke
+                            //TODO: check if any services are bound to side 
before deleting
+                            GSLB.deleteSite(_netscalerService, siteName);
+                        }
+                    }
+                }
+
+                // Bind GSLB vserver to domain
+                GSLB.createVserverDomainBinding(_netscalerService, 
vserverName, domainName);
+
+            } else {  // global load balancer rule is being deleted, so clean 
up all objects created
+
+                // remove binding between virtual server and the domain name
+                GSLB.createVserverDomainBinding(_netscalerService, 
vserverName, domainName);
+
+                if (sites != null) {
+                    for (GlobalLoadBalancerConfigCommand.SiteLoadBalancer site 
: sites) {
+
+                        String sitePrivateIP = site.getGslbProviderPrivateIp();
+                        String sitePublicIP =  site.getGslbProviderPublicIp();
+                        String sitePublicPort = site.getPublicPort();
+                        String siteName = 
GSLB.generateUniqueSiteName(sitePrivateIP, sitePublicIP);
+
+                        // remove binding between virtual server and services
+                        String serviceName = 
GSLB.generateUniqueServiceName(siteName, sitePublicIP, sitePublicPort);
+                        GSLB.deleteVserverServiceBinding(_netscalerService, 
serviceName, vserverName);
+
+                        // delete service object
+                        GSLB.deleteService(_netscalerService, serviceName);
+
+                        // delete GSLB site object
+                        //TODO: check if any services are bound to side before 
deleting
+                        GSLB.deleteSite(_netscalerService, siteName);
+                    }
+                }
+
+                // delete GSLB virtual server
+                GSLB.deleteVirtualServer(_netscalerService, vserverName);
+            }
+        } catch (Exception e) {
+            if (shouldRetry(numRetries)) {
+                return retry(gslbCmd, numRetries);
+            }
+        }
+
         return new GlobalLoadBalancerConfigAnswer();
     }
 
     /*
-     * convineance class for GSLB functionality that includes methods to
-     *   - create, delete, update, get the GSLB sites
-     *   - create, delete, update, get the GSLB services
-     *   - create, delete, update, get the GSLB virtual servers
-     *   - create, delete GSLB virtual server and GSLB service bindings
+     * convenience class to create/update/delete/get the GSLB specific 
NetScaler objects
+     * gslbsite, gslbvserver, gslbservice, vserver-service binding, 
vserver-domain bindings
      */
     private static class GSLB {
 
-        private void createSite() {
-
-        }
+        // create a 'gslbsite' object representing a site
+        private static void createSite(nitro_service client, String siteName,
+                                       String siteType, String siteIP, String 
sitePublicIP) {
+            try {
+                gslbsite site;
+                site = getSiteObject(client, siteName);
 
-        private void deleteSite() {
+                boolean isUpdateSite = false;
+                if (site == null) {
+                    site = new gslbsite();
+                } else {
+                    isUpdateSite = true;
+                }
 
+                assert("LOCAL".equalsIgnoreCase(siteType) || 
"REMOTE".equalsIgnoreCase(siteType));
+                site.set_sitetype(siteType);
+                site.set_sitename(siteName);
+                site.set_siteipaddress(siteIP);
+                site.set_publicip(sitePublicIP);
+                site.set_metricexchange("ENABLED");
+                site.set_nwmetricexchange("ENABLED");
+                site.set_sessionexchange("ENABLED");
+                if (isUpdateSite) {
+                    gslbsite.update(client, site);
+                } else {
+                    gslbsite.add(client, site);
+                }
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Successfully created GSLB site: " + 
siteName);
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to create GSLB site: " + siteName + 
" due to " + e.getMessage());
+                }
+            }
         }
 
-        private gslbsite getSite() {
-
+        // delete 'gslbsite' object representing a site
+        private static void deleteSite(nitro_service client, String siteName) {
+            try {
+                gslbsite site = getSiteObject(client, siteName);
+                if (site != null) {
+                    gslbsite.delete(client, siteName);
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Successfully deleted GSLB site: " + 
siteName);
+                    }
+                } else {
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.warn("Ignoring delete request for non 
existing  GSLB site: " + siteName);
+                    }
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to delete GSLB site: " + siteName + 
" due to " + e.getMessage());
+                }
+            }
         }
 
-        private boolean checkSiteExists() {
-            return true;
-        }
+        // update 'gslbsite' object representing a site
+        private static void updateSite(nitro_service client, String siteType, 
String siteName,
+                                       String siteIP, String sitePublicIP) {
+            try {
+                gslbsite site;
+                site = getSiteObject(client, siteName);
+                if (site == null) {
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.warn("Ignoring update request for non 
existing  GSLB site: " + siteName);
+                    }
+                    return;
+                }
+                assert ("LOCAL".equalsIgnoreCase(siteType) || 
"REMOTE".equalsIgnoreCase(siteType));
+                site.set_sitetype(siteType);
+                site.set_sitename(siteName);
+                site.set_siteipaddress(siteIP);
+                site.set_publicip(sitePublicIP);
+                site.set_metricexchange("ENABLED");
+                site.set_nwmetricexchange("ENABLED");
+                site.set_sessionexchange("ENABLED");
+                gslbsite.update(client, site);
 
-        private void createService() {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Successfully updated GSLB site: " + 
siteName);
+                }
 
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to update GSLB site: " + siteName + 
" due to " + e.getMessage());
+                }
+            }
         }
 
-        private void deleteService() {
+        // create a 'gslbvserver' object representing a globally load balanced 
service
+        private static void createVirtualServer(nitro_service client, String 
vserverName, String lbMethod,
+                                         String persistenceType, String 
serviceType) {
+            try {
+                gslbvserver vserver;
+                vserver = getVserverObject(client, vserverName);
 
-        }
+                boolean isUpdateSite = false;
+                if (vserver == null) {
+                    vserver = new gslbvserver();
+                } else {
+                    isUpdateSite = true;
+                }
 
-        private void getService() {
+                vserver.set_name(vserverName);
+                vserver.set_lbmethod(lbMethod);
+                vserver.set_persistencetype(persistenceType);
+                vserver.set_servicetype(serviceType);
+                if (isUpdateSite) {
+                    gslbvserver.update(client, vserver);
+                } else {
+                    gslbvserver.add(client, vserver);
+                }
 
-        }
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Successfully added GSLB virtual server: " 
+ vserverName);
+                }
 
-        private boolean checkServiceExists() {
-            return true;
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to add GSLB virtual server: " + 
vserverName + " due to " + e.getMessage());
+                }
+            }
         }
 
-        private void createVirtualServer() {
+        // delete 'gslbvserver' object representing a globally load balanced 
service
+        private static void deleteVirtualServer(nitro_service client, String 
vserverName) {
+            try {
+                gslbvserver vserver = getVserverObject(client, vserverName);
+                if (vserver != null) {
+                    gslbvserver.delete(client, vserver);
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Successfully deleted GSLB virtual 
server: " + vserverName);
+                    }
+                } else {
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.warn("Ignoring delete request for non 
existing  GSLB virtual server: " + vserverName);
+                    }
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to delete GSLB virtual server: " + 
vserverName + " due to " + e.getMessage());
+                }
+            }
+        }
 
+        // enable 'gslbvserver' object representing a globally load balanced 
service
+        private static void enableVirtualServer(nitro_service client, String 
vserverName) {
+            try {
+                gslbvserver vserver = getVserverObject(client, vserverName);
+                if (vserver != null) {
+                    gslbvserver.enable(client, vserver);
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to enable GSLB virtual server: " + 
vserverName + " due to " + e.getMessage());
+                }
+            }
         }
 
-        private void deleteVirtualServer() {
+        // disable 'gslbvserver' object representing a globally load balanced 
service
+        private static void disableVirtualServer(nitro_service client, String 
vserverName) {
+            try {
+                gslbvserver vserver = getVserverObject(client, vserverName);
+                if (vserver != null) {
+                    gslbvserver.disable(client, vserver);
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to disable GSLB virtual server: " + 
vserverName + " due to " + e.getMessage());
+                }
+            }
+        }
 
+        // update 'gslbvserver' object representing a globally load balanced 
service
+        private static void updateVirtualServer(nitro_service client, String 
vserverName, String lbMethod,
+                                                String persistenceType, String 
serviceType) {
+            try {
+                gslbvserver vServer = getVserverObject(client, vserverName);
+                if (vServer != null) {
+                    vServer.set_lbmethod(lbMethod);
+                    vServer.set_persistencetype(persistenceType);
+                    vServer.set_servicetype(serviceType);
+                    gslbvserver.update(client, vServer);
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Successfully updated GSLB virtual 
server: " + vserverName);
+                    }
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to update GSLB virtual server: " + 
vserverName + " due to " + e.getMessage());
+                }
+            }
         }
 
-        private void enableVirtualServer() {
+        // create, delete, update, get the GSLB services
+        private static void createService(nitro_service client, String 
serviceName, String serviceType, String publicIp,
+                                   String publicPort, String siteName) {
+            try {
+                gslbservice service;
+                service = getServiceObject(client, serviceName);
 
+                boolean isUpdateSite = false;
+                if (service == null) {
+                    service = new gslbservice();
+                } else {
+                    isUpdateSite = true;
+                }
+
+                service.set_sitename(siteName);
+                service.set_publicip(publicIp);
+                service.set_publicport(Integer.getInteger(publicPort));
+                service.set_servicename(serviceName);
+                service.set_servicetype(serviceType);
+                if (isUpdateSite) {
+                    gslbservice.update(client, service);
+                } else {
+                    gslbservice.add(client, service);
+                }
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Successfully created service: " + 
serviceName + " at site: " + siteName);
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to created service: " + serviceName 
+ " at site: " + siteName);
+                }
+            }
         }
 
-        private void disableVirtualServer() {
+        private static void deleteService(nitro_service client, String 
serviceName) {
+            try {
+                gslbservice service = getServiceObject(client, serviceName);
+                if (service != null) {
+                    gslbservice.delete(client, serviceName);
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Successfully deleted service: " + 
serviceName);
+                    }
+                } else {
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.warn("Ignoring delete request for non 
existing  service: " + serviceName);
+                    }
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to delete service: " + serviceName 
+ " due to " + e.getMessage());
+                }
+            }
+        }
 
+        private static void updateService(nitro_service client, String 
serviceName, String serviceType, String publicIp,
+                                          String publicPort, String siteName) {
+            try {
+                gslbservice service;
+                service = getServiceObject(client, serviceName);
+
+                if (service != null) {
+                    service.set_sitename(siteName);
+                    service.set_publicip(publicIp);
+                    service.set_publicport(Integer.getInteger(publicPort));
+                    service.set_servicename(serviceName);
+                    service.set_servicetype(serviceType);
+                    gslbservice.update(client, service);
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Successfully updated service: " + 
serviceName + " at site: " + siteName);
+                    }
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to update service: " + serviceName 
+ " at site: " + siteName);
+                }
+            }
         }
 
-        private void createVserverServiceBinding() {
+        private static void createVserverServiceBinding(nitro_service client, 
String serviceName, String vserverName) {
+            try {
+                gslbvserver_gslbservice_binding binding = new 
gslbvserver_gslbservice_binding();
+                binding.set_name(vserverName);
+                binding.set_servicename(serviceName);
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Successfully created service: " + 
serviceName + " and virtual server: "
+                            + vserverName + " binding");
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to create service: " + serviceName 
+ " and virtual server: "
+                            + vserverName + " binding due to " + 
e.getMessage());
+                }
+            }
+        }
 
+        private static void deleteVserverServiceBinding(nitro_service client, 
String serviceName, String vserverName) {
+            try {
+                gslbvserver_gslbservice_binding[] bindings = 
gslbvserver_gslbservice_binding.get(client, serviceName);
+                if (bindings != null) {
+                    for (gslbvserver_gslbservice_binding binding: bindings) {
+                        if 
(binding.get_servicename().equalsIgnoreCase(serviceName) &&
+                                binding.get_name().equals(vserverName)) {
+                            gslbvserver_gslbservice_binding.delete(client, 
binding);
+                            if (s_logger.isDebugEnabled()) {
+                                s_logger.debug("Successfully deleted service: 
" + serviceName + " and virtual server: "
+                                        + vserverName + " binding");
+                            }
+                            break;
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to create service: " + serviceName 
+ " and virtual server: "
+                            + vserverName + " binding due to " + 
e.getMessage());
+                }
+            }
         }
 
-        private void deleteVserverServiceBinding() {
+        // create, delete GSLB virtual server and domain bindings
+        private static void createVserverDomainBinding(nitro_service client, 
String vserverName, String domainName) {
+            try {
+                gslbvserver_domain_binding binding = new 
gslbvserver_domain_binding();
+                binding.set_domainname(domainName);
+                binding.set_name(vserverName);
+                gslbvserver_domain_binding.add(client, binding);
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Successfully added virtual server: "
+                            + vserverName + " domain name: " + domainName + " 
binding");
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to create virtual server: "
+                            + vserverName + " domain name: " + domainName + " 
binding");
+                }
+            }
+        }
 
+        private static void deleteVserverDomainBinding(nitro_service client, 
String vserverName, String domainName) {
+            try {
+                gslbvserver_domain_binding[] bindings = 
gslbvserver_domain_binding.get(client, vserverName);
+                if (bindings != null) {
+                    for (gslbvserver_domain_binding binding: bindings) {
+                        if 
(binding.get_domainname().equalsIgnoreCase(domainName)) {
+                            gslbvserver_domain_binding.delete(client, binding);
+                            if (s_logger.isDebugEnabled()) {
+                                s_logger.debug("Successfully deleted virtual 
server: " + vserverName + " and "
+                                        + " domain: " + domainName + " 
binding");
+                            }
+                            break;
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Failed to delete virtual server: "
+                            + vserverName + " and domain " + domainName +" 
binding due to " + e.getMessage());
+                }
+            }
         }
 
-        private void updateVserverServiceBinding() {
+        // get 'gslbsite' object corresponding to a site name
+        private static gslbsite getSiteObject(nitro_service client, String 
siteName) {
+            try {
+                gslbsite site = gslbsite.get(client, siteName);
+                if (site != null) {
+                    return site;
+                }
+            } catch (Exception e) {
 
+            }
+            return null;
         }
 
-        private void createVserverDomainBinding() {
-
+        private static gslbvserver getVserverObject(nitro_service client, 
String vserverName) {
+            try {
+                gslbvserver vserver = gslbvserver.get(client, vserverName);
+                return vserver;
+            } catch (Exception e) {
+                return null;
+            }
         }
 
-        private void deleteVserverDomainBinding() {
+        private static gslbservice getServiceObject(nitro_service client, 
String serviceName) {
+            try {
+                gslbservice service = gslbservice.get(client, serviceName);
+                return service;
+            } catch (Exception e) {
+                return null;
+            }
+        }
 
+        private static String generateUniqueSiteName(String sitePrivateIp, 
String sitePublicIP) {
+            return "cloud-site-" + sitePrivateIp + "-" + sitePublicIP;
         }
 
-        private void updateVserverDomainBinding() {
+        private static String generateVirtualServerName(String domainName) {
+            return "cloud-gslb-vserver-" + domainName;
+        }
 
+        private static String generateUniqueServiceName(String siteName, 
String publicIp, String publicPort) {
+            return "cloud-gslb-service-" + siteName + "-" + publicIp + "-" + 
publicPort;
         }
     }
 

Reply via email to