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; } }
