From b2b422c7d7a19efec8037044fe9dbf014742daaf Mon Sep 17 00:00:00 2001 From: Nitin Kumar Maharana Date: Fri, 7 Aug 2015 17:10:13 +0530 Subject: [PATCH] CLOUDSTACK-8672 : NCC Integration with CloudStack. --- .../cloud/agent/api/to/LoadBalancerTO.java | 53 +- api/src/com/cloud/event/EventTypes.java | 7 + api/src/com/cloud/network/NetworkService.java | 7 + .../cloud/network/VirtualRouterProvider.java | 2 +- .../cloud/network/router/VirtualRouter.java | 2 +- .../com/cloud/offering/NetworkOffering.java | 4 +- api/src/com/cloud/vm/VirtualMachine.java | 1 + .../admin/address/AcquirePodIpCmdByAdmin.java | 30 +- .../network/CreateNetworkOfferingCmd.java | 15 +- .../UpdateLoadBalancerRuleCmd.java | 7 + .../user/loadbalancer/UploadSslCertCmd.java | 8 + .../response/AcquireIPAddressResponse.java | 5 - .../api/response/SslCertResponse.java | 8 + .../api/response/SystemVmResponse.java | 25 +- .../cloudstack/network/tls/SslCert.java | 2 +- .../ExternalNetworkResourceUsageCommand.java | 9 + .../api/NetScalerImplementNetworkCommand.java | 8 +- .../routing/HealthCheckLBConfigCommand.java | 8 +- .../com/cloud/network/IpAddressManager.java | 2 +- .../cloud/vm/VirtualMachineManagerImpl.java | 3 +- .../orchestration/NetworkOrchestrator.java | 18 +- .../dc/dao/DataCenterIpAddressDaoImpl.java | 3 - .../src/com/cloud/network/dao/NetworkDao.java | 2 + .../com/cloud/network/dao/NetworkDaoImpl.java | 16 +- .../src/com/cloud/network/dao/SslCertVO.java | 11 +- .../cloud/offerings/NetworkOfferingVO.java | 12 + .../offerings/dao/NetworkOfferingDao.java | 3 + .../offerings/dao/NetworkOfferingDaoImpl.java | 30 + .../com/cloud/hypervisor/guru/VMwareGuru.java | 4 + .../vmware/resource/VmwareResource.java | 10 + .../resource/CitrixResourceBase.java | 16 +- .../xenbase/CitrixStartCommandWrapper.java | 1 - .../netscaler/spring-netscaler-context.xml | 2 +- .../DeleteNetscalerControlCenterCmd.java | 97 + .../DeleteNetscalerLoadBalancerCmd.java | 2 +- .../DeleteServicePackageOfferingCmd.java | 5 +- .../api/commands/DeployNetscalerVpxCmd.java | 148 + .../ListNetscalerControlCenterCmd.java | 93 + .../RegisterNetscalerControlCenterCmd.java | 11 +- .../commands/RegisterServicePackageCmd.java | 9 - .../api/commands/StopNetScalerVMCmd.java | 132 + .../NetscalerControlCenterResponse.java | 98 + .../network/NetScalerControlCenterVO.java | 7 +- .../network/NetScalerServicePackageVO.java | 6 +- .../dao/NetScalerServicePackageDao.java | 2 + .../dao/NetScalerServicePackageDaoImpl.java | 9 +- .../network/element/NetscalerElement.java | 274 +- .../NetscalerLoadBalancerElementService.java | 11 +- .../NetScalerControlCenterResource.java | 3253 +---------------- .../cloud/network/vm/NetScalerVMManager.java | 41 + .../network/vm/NetScalerVMManagerImpl.java | 448 +++ .../src/com/cloud/alert/AlertManagerImpl.java | 200 +- .../src/com/cloud/api/ApiResponseHelper.java | 6 +- .../ConfigurationManagerImpl.java | 39 +- .../cloud/hypervisor/HypervisorGuruBase.java | 4 + .../ExternalDeviceUsageManagerImpl.java | 40 +- ...ExternalLoadBalancerDeviceManagerImpl.java | 55 +- .../cloud/network/IpAddressManagerImpl.java | 57 +- .../com/cloud/network/NetworkServiceImpl.java | 25 + .../lb/LoadBalancingRulesManagerImpl.java | 14 +- .../cloud/server/ManagementServerImpl.java | 5 + .../network/ssl/CertServiceImpl.java | 7 +- ...rnalLoadBalancerDeviceManagerImplTest.java | 19 +- .../com/cloud/vpc/MockNetworkManagerImpl.java | 24 +- .../com/cloud/vpc/dao/MockNetworkDaoImpl.java | 6 + tools/apidoc/gen_toc.py | 10 + ui/index.html | 1 + ui/l10n/en.js | 24 + ui/scripts/accounts.js | 193 + ui/scripts/configuration.js | 93 +- ui/scripts/docs.js | 4 + ui/scripts/lbCertificatePolicy.js | 183 + ui/scripts/network.js | 347 +- ui/scripts/regions.js | 222 ++ ui/scripts/system.js | 63 +- 75 files changed, 2893 insertions(+), 3728 deletions(-) create mode 100644 plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerControlCenterCmd.java create mode 100644 plugins/network-elements/netscaler/src/com/cloud/api/commands/DeployNetscalerVpxCmd.java create mode 100644 plugins/network-elements/netscaler/src/com/cloud/api/commands/ListNetscalerControlCenterCmd.java create mode 100644 plugins/network-elements/netscaler/src/com/cloud/api/commands/StopNetScalerVMCmd.java create mode 100644 plugins/network-elements/netscaler/src/com/cloud/api/response/NetscalerControlCenterResponse.java create mode 100644 plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManager.java create mode 100644 plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManagerImpl.java create mode 100644 ui/scripts/lbCertificatePolicy.js mode change 100755 => 100644 ui/scripts/network.js mode change 100644 => 100755 ui/scripts/system.js diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index aabff2fabc5..3a3dfa47502 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -46,6 +46,8 @@ public class LoadBalancerTO { boolean alreadyAdded; boolean inline; String srcIpVlan; + String srcIpGateway; + String srcIpNetmask; Long networkId; DestinationTO[] destinations; private StickinessPolicyTO[] stickinessPolicies; @@ -84,6 +86,15 @@ public class LoadBalancerTO { this(id, srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, inline, argDestinations, stickinessPolicies, null, null, null); } + public LoadBalancerTO(String id, List destinations) { + this.uuid = id; + int i = 0; + this.destinations = new DestinationTO[destinations.size()]; + for (DestinationTO destination : destinations) { + this.destinations[i++] = new DestinationTO(destination.getDestIp(), destination.getDestPort(), destination.getMonitorState()); + } + } + public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, boolean inline, List argDestinations, List stickinessPolicies, List healthCheckPolicies, LbSslCert sslCert, String lbProtocol) { @@ -212,21 +223,37 @@ public class LoadBalancerTO { this.networkId = id; } + public String getSrcIpGateway() { + return srcIpGateway; + } + + public void setSrcIpGateway(String srcIpGateway) { + this.srcIpGateway = srcIpGateway; + } + + public String getSrcIpNetmask() { + return srcIpNetmask; + } + + public void setSrcIpNetmask(String srcIpNetmask) { + this.srcIpNetmask = srcIpNetmask; + } + public static class StickinessPolicyTO { - private String _methodName; - private List> _paramsList; + private String methodName; + private List> params; public String getMethodName() { - return _methodName; + return methodName; } public List> getParams() { - return _paramsList; + return params; } public StickinessPolicyTO(String methodName, List> paramsList) { - this._methodName = methodName; - this._paramsList = paramsList; + this.methodName = methodName; + this.params = paramsList; } } @@ -237,7 +264,7 @@ public class LoadBalancerTO { private int healthcheckInterval; private int healthcheckThresshold; private int unhealthThresshold; - private boolean revoke = false; + private boolean revoked = false; public HealthCheckPolicyTO(String pingPath, String description, int responseTime, int healthcheckInterval, int healthcheckThresshold, int unhealthThresshold, boolean revoke) { @@ -248,7 +275,7 @@ public class LoadBalancerTO { this.healthcheckInterval = healthcheckInterval; this.healthcheckThresshold = healthcheckThresshold; this.unhealthThresshold = unhealthThresshold; - this.revoke = revoke; + this.revoked = revoke; } public HealthCheckPolicyTO() { @@ -280,11 +307,11 @@ public class LoadBalancerTO { } public void setRevoke(boolean revoke) { - this.revoke = revoke; + this.revoked = revoke; } public boolean isRevoked() { - return revoke; + return revoked; } } @@ -303,6 +330,12 @@ public class LoadBalancerTO { this.alreadyAdded = alreadyAdded; } + public DestinationTO(String destIp, int destPort, String monitorState) { + this.destIp = destIp; + this.destPort = destPort; + this.monitorState = monitorState; + } + protected DestinationTO() { } diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index b46b3524768..32a3138172f 100644 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -391,6 +391,10 @@ public class EventTypes { public static final String EVENT_EXTERNAL_LB_DEVICE_DELETE = "PHYSICAL.LOADBALANCER.DELETE"; public static final String EVENT_EXTERNAL_LB_DEVICE_CONFIGURE = "PHYSICAL.LOADBALANCER.CONFIGURE"; + // external NCC device events + public static final String EVENT_EXTERNAL_NCC_DEVICE_ADD = "PHYSICAL.NCC.ADD"; + public static final String EVENT_EXTERNAL_NCC_DEVICE_DELETE = "PHYSICAL.NCC.DELETE"; + // external switch management device events (E.g.: Cisco Nexus 1000v Virtual Supervisor Module. public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ADD = "SWITCH.MGMT.ADD"; public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DELETE = "SWITCH.MGMT.DELETE"; @@ -549,6 +553,9 @@ public class EventTypes { public static final String EVENT_NETSCALER_SERVICEPACKAGE_ADD = "NETSCALER.SERVICEPACKAGE.ADD"; public static final String EVENT_NETSCALER_SERVICEPACKAGE_DELETE = "NETSCALER.SERVICEPACKAGE.DELETE"; + public static final String EVENT_NETSCALER_VM_START = "NETSCALERVM.START"; + public static final String EVENT_NETSCALER_VM_STOP = "NETSCALERVM.STOP"; + static { diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 598b77fc5e3..0ad42b5acdd 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -19,6 +19,7 @@ package com.cloud.network; import java.util.List; import java.util.Map; +import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; @@ -26,6 +27,7 @@ import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; import org.apache.cloudstack.api.command.user.vm.ListNicsCmd; +import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; @@ -38,6 +40,7 @@ import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.Pair; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.Nic; import com.cloud.vm.NicSecondaryIp; @@ -182,4 +185,8 @@ public interface NetworkService { boolean configureNicSecondaryIp(NicSecondaryIp secIp, boolean isZoneSgEnabled); List listVmNicSecondaryIps(ListNicsCmd listNicsCmd); + + AcquirePodIpCmdResponse allocatePodIp(Account account, String zoneId, String podId) throws ResourceAllocationException, ConcurrentOperationException; + + boolean releasePodIp(ReleasePodIpCmdByAdmin ip) throws CloudRuntimeException; } diff --git a/api/src/com/cloud/network/VirtualRouterProvider.java b/api/src/com/cloud/network/VirtualRouterProvider.java index 8e2fa70d891..aca526b1832 100644 --- a/api/src/com/cloud/network/VirtualRouterProvider.java +++ b/api/src/com/cloud/network/VirtualRouterProvider.java @@ -21,7 +21,7 @@ import org.apache.cloudstack.api.InternalIdentity; public interface VirtualRouterProvider extends InternalIdentity, Identity { public enum Type { - VirtualRouter, ElasticLoadBalancerVm, VPCVirtualRouter, InternalLbVm + VirtualRouter, ElasticLoadBalancerVm, VPCVirtualRouter, InternalLbVm, NetScalerVm } public Type getType(); diff --git a/api/src/com/cloud/network/router/VirtualRouter.java b/api/src/com/cloud/network/router/VirtualRouter.java index 060ef0fa141..84c85ce6675 100644 --- a/api/src/com/cloud/network/router/VirtualRouter.java +++ b/api/src/com/cloud/network/router/VirtualRouter.java @@ -23,7 +23,7 @@ import com.cloud.vm.VirtualMachine; */ public interface VirtualRouter extends VirtualMachine { public enum Role { - VIRTUAL_ROUTER, LB, INTERNAL_LB_VM + VIRTUAL_ROUTER, LB, INTERNAL_LB_VM, NETSCALER_VM } public enum UpdateState { diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java index 5eab98ab293..59045dccd97 100644 --- a/api/src/com/cloud/offering/NetworkOffering.java +++ b/api/src/com/cloud/offering/NetworkOffering.java @@ -38,7 +38,7 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity, } public enum Detail { - InternalLbProvider, PublicLbProvider + InternalLbProvider, PublicLbProvider, servicepackageuuid, servicepackagedescription } public final static String SystemPublicNetwork = "System-Public-Network"; @@ -133,4 +133,6 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity, boolean getSupportsStrechedL2(); boolean getSupportsPublicAccess(); + + String getServicePackage(); } diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java index b45ac7c9be9..c70197a6c81 100644 --- a/api/src/com/cloud/vm/VirtualMachine.java +++ b/api/src/com/cloud/vm/VirtualMachine.java @@ -214,6 +214,7 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I public enum Type { User(false), DomainRouter(true), ConsoleProxy(true), SecondaryStorageVm(true), ElasticIpVm(true), ElasticLoadBalancerVm(true), InternalLoadBalancerVm(true), + NetScalerVm(true), /* * UserBareMetal is only used for selecting VirtualMachineGuru, there is no diff --git a/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java index a4613670d66..eba41b48a87 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java +++ b/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java @@ -32,7 +32,7 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; -@APICommand(name = "acquirePodIpAddresses", description = "Allocates IP addresses in respective Pod of a Zone", responseObject = AcquirePodIpCmdResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +@APICommand(name = "acquirePodIpAddress", description = "Allocates IP addresses in respective Pod of a Zone", responseObject = AcquirePodIpCmdResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class AcquirePodIpCmdByAdmin extends BaseCmd { public static final Logger s_logger = Logger.getLogger(AcquirePodIpCmdByAdmin.class.getName()); @@ -42,28 +42,30 @@ public class AcquirePodIpCmdByAdmin extends BaseCmd { //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// - @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of the zone in which your pod lies") - private Long zoneId; + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = true, description = "the ID of the zone") + private String zoneId; - @Parameter(name = ApiConstants.GUEST_CIDR_ADDRESS, type = CommandType.STRING, entityType = ZoneResponse.class, required = false, description = "CIDR for finding Pod") - private String cidr; + @Parameter(name = ApiConstants.POD_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = false, description = "Pod ID") + private String podId; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// - private long getZoneId() { + private String getZoneId() { return zoneId; } - private String getCidr() { - return cidr; + public String getPodId() { + return podId; } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// + @Override public String getCommandName() { return s_name; @@ -71,12 +73,12 @@ public class AcquirePodIpCmdByAdmin extends BaseCmd { @Override public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException { - AcquirePodIpCmdResponse pod_ip = null; - pod_ip = _networkService.allocatePodIp(_accountService.getAccount(getEntityOwnerId()), getZoneId(), getCidr()); - if (pod_ip != null) { - pod_ip.setResponseName(getCommandName()); - pod_ip.setObjectName(getCommandName()); - setResponseObject(pod_ip); + AcquirePodIpCmdResponse podIp = null; + podIp = _networkService.allocatePodIp(_accountService.getAccount(getEntityOwnerId()), getZoneId(), getPodId()); + if (podIp != null) { + podIp.setResponseName(getCommandName()); + podIp.setObjectName(getCommandName()); + setResponseObject(podIp); } else { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to assign IP address"); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java index a09c9797b68..d1a34185eed 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java @@ -273,10 +273,23 @@ public class CreateNetworkOfferingCmd extends BaseCmd { } Collection paramsCollection = details.values(); - Map params = (Map)(paramsCollection.toArray())[0]; + Object objlist[]= paramsCollection.toArray(); + Map params = (Map)(objlist[0]); + for(int i=1; i< objlist.length; i++) + { + params.putAll((Map)(objlist[i])); + } + return params; } + public String getServicePackageId() { + Map data = getDetails(); + if (data == null) + return null; + return data.get(NetworkOffering.Detail.servicepackageuuid+ ""); + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java index 6b1e0fddd54..6ee277a354c 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java @@ -64,6 +64,9 @@ public class UpdateLoadBalancerRuleCmd extends BaseAsyncCustomIdCmd { @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the rule to the end user or not", since = "4.4", authorized = {RoleType.Admin}) private Boolean display; + @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, description = "The protocol for the LB") + private String lbProtocol; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -88,6 +91,10 @@ public class UpdateLoadBalancerRuleCmd extends BaseAsyncCustomIdCmd { return display; } + public String getLbProtocol() { + return lbProtocol; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java index a6d71c76175..309e43fcbbe 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java @@ -73,6 +73,9 @@ public class UploadSslCertCmd extends BaseCmd { @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain ID of the account owning the SSL certificate") private Long domainId; + @Parameter(name = ApiConstants.NAME , type = CommandType.STRING, required = true, description = "Name for the uploaded certificate") + private String name; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -105,10 +108,15 @@ public class UploadSslCertCmd extends BaseCmd { return projectId; } + public String getName() { + return name; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// + @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { diff --git a/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java b/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java index 6d6a035aba5..70cbd7ffe05 100644 --- a/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java @@ -150,11 +150,6 @@ public class AcquireIPAddressResponse extends BaseResponse implements Controlle @Param(description = "is public ip for display to the regular user", since = "4.4", authorized = {RoleType.Admin}) private Boolean forDisplay; - /* - @SerializedName(ApiConstants.JOB_ID) @Param(description="shows the current pending asynchronous job ID. This tag is not returned if no current pending jobs are acting on the volume") - private IdentityProxy jobId = new IdentityProxy("async_job"); - */ - public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } diff --git a/api/src/org/apache/cloudstack/api/response/SslCertResponse.java b/api/src/org/apache/cloudstack/api/response/SslCertResponse.java index d722e9845de..aa729f123b4 100644 --- a/api/src/org/apache/cloudstack/api/response/SslCertResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SslCertResponse.java @@ -72,6 +72,10 @@ public class SslCertResponse extends BaseResponse { @Param(description = "List of loabalancers this certificate is bound to") List lbIds; + @SerializedName(ApiConstants.NAME) + @Param(description = "name") + private String name; + public SslCertResponse() { } @@ -83,6 +87,10 @@ public class SslCertResponse extends BaseResponse { this.certificate = cert; } + public void setName(String name) { + this.name = name; + } + public void setAccountName(String accountName) { this.accountName = accountName; } diff --git a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java index 9e20b49dfde..49ab473a37a 100644 --- a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.response; import java.util.Date; +import java.util.List; import com.google.gson.annotations.SerializedName; @@ -141,7 +142,13 @@ public class SystemVmResponse extends BaseResponse { @Param(description = "the number of active console sessions for the console proxy system vm") private Integer activeViewerSessions; - // private Long objectId; + @SerializedName("guestvlan") + @Param(description = "guest vlan range") + private String guestVlan; + + @SerializedName("publicvlan") + @Param(description = "public vlan range") + private List publicVlan; @Override public String getObjectId() { @@ -355,4 +362,20 @@ public class SystemVmResponse extends BaseResponse { public void setLinkLocalNetmask(String linkLocalNetmask) { this.linkLocalNetmask = linkLocalNetmask; } + + public String getGuestVlan() { + return guestVlan; + } + + public void setGuestVlan(String guestVlan) { + this.guestVlan = guestVlan; + } + + public List getPublicVlan() { + return publicVlan; + } + + public void setPublicVlan(List publicVlan) { + this.publicVlan = publicVlan; + } } diff --git a/api/src/org/apache/cloudstack/network/tls/SslCert.java b/api/src/org/apache/cloudstack/network/tls/SslCert.java index fb1590c539a..074bba6c111 100644 --- a/api/src/org/apache/cloudstack/network/tls/SslCert.java +++ b/api/src/org/apache/cloudstack/network/tls/SslCert.java @@ -31,5 +31,5 @@ public interface SslCert extends InternalIdentity, Identity, ControlledEntity { public String getPassword(); public String getFingerPrint(); - + public String getName(); } diff --git a/core/src/com/cloud/agent/api/ExternalNetworkResourceUsageCommand.java b/core/src/com/cloud/agent/api/ExternalNetworkResourceUsageCommand.java index 09dc80b7bb0..6986c406c93 100644 --- a/core/src/com/cloud/agent/api/ExternalNetworkResourceUsageCommand.java +++ b/core/src/com/cloud/agent/api/ExternalNetworkResourceUsageCommand.java @@ -20,12 +20,21 @@ package com.cloud.agent.api; public class ExternalNetworkResourceUsageCommand extends Command { + Long networkid; public ExternalNetworkResourceUsageCommand() { } + public ExternalNetworkResourceUsageCommand(Long networkid) { + this.networkid = networkid; + } + @Override public boolean executeInSequence() { return false; } + + public Long getNetworkid() { + return networkid; + } } diff --git a/core/src/com/cloud/agent/api/NetScalerImplementNetworkCommand.java b/core/src/com/cloud/agent/api/NetScalerImplementNetworkCommand.java index ea6afa15e5b..06e4eb84f1b 100644 --- a/core/src/com/cloud/agent/api/NetScalerImplementNetworkCommand.java +++ b/core/src/com/cloud/agent/api/NetScalerImplementNetworkCommand.java @@ -26,15 +26,15 @@ public class NetScalerImplementNetworkCommand extends Command { super(); } - private Long dcId; + private String dcId; private Long hostId; - public NetScalerImplementNetworkCommand(Long dcId) { + public NetScalerImplementNetworkCommand(String dcId) { super(); this.dcId = dcId; } - public NetScalerImplementNetworkCommand(Long dcId, Long hostId, String networkDetails) { + public NetScalerImplementNetworkCommand(String dcId, Long hostId, String networkDetails) { this(dcId); this.hostId = hostId; this._networkDetails = networkDetails; @@ -48,7 +48,7 @@ public class NetScalerImplementNetworkCommand extends Command { return _networkDetails; } - public Long getDataCenterId() { + public String getDataCenterId() { return dcId; } diff --git a/core/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java b/core/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java index d30fed4bdfb..ee401f64da0 100644 --- a/core/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java +++ b/core/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java @@ -26,16 +26,20 @@ import com.cloud.agent.api.to.LoadBalancerTO; */ public class HealthCheckLBConfigCommand extends NetworkElementCommand { LoadBalancerTO[] loadBalancers; - + long networkId; protected HealthCheckLBConfigCommand() { } - public HealthCheckLBConfigCommand(LoadBalancerTO[] loadBalancers) { + public HealthCheckLBConfigCommand(LoadBalancerTO[] loadBalancers, long networkid) { this.loadBalancers = loadBalancers; + this.networkId = networkid; } public LoadBalancerTO[] getLoadBalancers() { return loadBalancers; } + public long getNetworkId() { + return networkId; + } } diff --git a/engine/components-api/src/com/cloud/network/IpAddressManager.java b/engine/components-api/src/com/cloud/network/IpAddressManager.java index bf97b34181f..30976e5c757 100644 --- a/engine/components-api/src/com/cloud/network/IpAddressManager.java +++ b/engine/components-api/src/com/cloud/network/IpAddressManager.java @@ -183,7 +183,7 @@ public interface IpAddressManager { String allocatePublicIpForGuestNic(Network network, Long podId, Account ipOwner, String requestedIp) throws InsufficientAddressCapacityException; - public AcquirePodIpCmdResponse allocatePodIp(Long zoneId, String cidr) throws ConcurrentOperationException, + public AcquirePodIpCmdResponse allocatePodIp(String zoneId, String podId) throws ConcurrentOperationException, ResourceAllocationException; public void releasePodIp(Long id) throws CloudRuntimeException; diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 8cc8de12433..f370111207f 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -404,7 +404,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } try { - _networkMgr.allocate(vmProfile, auxiliaryNetworks); + if (!vmProfile.getBootArgs().contains("ExternalLoadBalancerVm")) + _networkMgr.allocate(vmProfile, auxiliaryNetworks); } catch (final ConcurrentOperationException e) { throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e); } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 7f43b52e5e7..37f53302455 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -442,7 +442,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true, Availability.Optional, null, new HashMap>(), true, Network.GuestType.Shared, false, null, true, null, true, - false, null, false, null, true, null); + false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -451,7 +451,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks", TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, - null, true, false, null, false, null, true, null); + null, true, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -460,7 +460,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, - null, true, null); + null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -470,7 +470,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService, "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null, defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null, - true, null); + true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); @@ -480,7 +480,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks, "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, - defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, null); + defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -491,7 +491,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra defaultVPCOffProviders.remove(Service.Lb); offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB, "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, - null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, null); + null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -500,7 +500,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service", TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, - true, null, true, false, null, false, null, true, null); + true, null, true, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -524,7 +524,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB, "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, - true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, null); + true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); offering.setInternalLb(true); offering.setPublicLb(false); @@ -556,7 +556,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering, "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, - netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true, null); + netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); offering.setDedicatedLB(false); _networkOfferingDao.update(offering.getId(), offering); diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java index 1feb6ad177c..e840a4d91b0 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java @@ -181,15 +181,12 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase, StateDao listByAclId(long aclId); int getNonSystemNetworkCountByVpcId(long vpcId); + + List listNetworkVO(List idset); } diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java index 29d0e8f1718..49a5944f838 100644 --- a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -24,9 +24,10 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.persistence.TableGenerator; -import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.springframework.stereotype.Component; +import org.apache.cloudstack.acl.ControlledEntity.ACLType; + import com.cloud.network.Network; import com.cloud.network.Network.Event; import com.cloud.network.Network.GuestType; @@ -42,6 +43,7 @@ import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.tags.dao.ResourceTagDao; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder; @@ -56,7 +58,7 @@ import com.cloud.utils.net.NetUtils; @Component @DB() -public class NetworkDaoImpl extends GenericDaoBase implements NetworkDao { +public class NetworkDaoImpl extends GenericDaoBaseimplements NetworkDao { SearchBuilder AllFieldsSearch; SearchBuilder AccountSearch; SearchBuilder RelatedConfigSearch; @@ -275,7 +277,6 @@ public class NetworkDaoImpl extends GenericDaoBase implements N return listBy(sc, null); } - public List findBy(final TrafficType trafficType, final Mode mode, final BroadcastDomainType broadcastType, final long networkOfferingId, final long dataCenterId) { final SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("trafficType", trafficType); @@ -680,4 +681,13 @@ public class NetworkDaoImpl extends GenericDaoBase implements N final List results = customSearch(sc, null); return results.get(0); } + + @Override + public List listNetworkVO(List idset) { + final SearchCriteria sc_2 = createSearchCriteria(); + final Filter searchFilter_2 = new Filter(NetworkVO.class, "id", false, null, null); + sc_2.addAnd("networkOfferingId", SearchCriteria.Op.IN, idset); + sc_2.addAnd("removed", SearchCriteria.Op.EQ, null); + return this.search(sc_2, searchFilter_2); + } } diff --git a/engine/schema/src/com/cloud/network/dao/SslCertVO.java b/engine/schema/src/com/cloud/network/dao/SslCertVO.java index 1d72180a107..2aaa6a2fd56 100644 --- a/engine/schema/src/com/cloud/network/dao/SslCertVO.java +++ b/engine/schema/src/com/cloud/network/dao/SslCertVO.java @@ -60,11 +60,14 @@ public class SslCertVO implements SslCert { @Column(name = "fingerprint") String fingerPrint; + @Column(name = "name") + String name; + public SslCertVO() { uuid = UUID.randomUUID().toString(); } - public SslCertVO(String cert, String key, String password, String chain, Long accountId, Long domainId, String fingerPrint) { + public SslCertVO(String cert, String key, String password, String chain, Long accountId, Long domainId, String fingerPrint, String name) { certificate = cert; this.key = key; this.chain = chain; @@ -73,6 +76,7 @@ public class SslCertVO implements SslCert { this.domainId = domainId; this.fingerPrint = fingerPrint; uuid = UUID.randomUUID().toString(); + this.name = name; } // Getters @@ -121,6 +125,11 @@ public class SslCertVO implements SslCert { return fingerPrint; } + @Override + public String getName() { + return name; + } + @Override public Class getEntityType() { return SslCert.class; diff --git a/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java b/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java index 4325287b273..f40f71092e0 100644 --- a/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java +++ b/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java @@ -156,6 +156,9 @@ public class NetworkOfferingVO implements NetworkOffering { @Column(name = "public_lb") boolean publicLb; + @Column(name="service_package_id") + String servicePackageUuid = null; + @Override public boolean isKeepAliveEnabled() { return keepAliveEnabled; @@ -500,8 +503,17 @@ public class NetworkOfferingVO implements NetworkOffering { return supportsStrechedL2; } + public void setServicePackage(String servicePackageUuid) { + this.servicePackageUuid = servicePackageUuid; + } + @Override public boolean getSupportsPublicAccess() { return supportsPublicAccess; } + + @Override + public String getServicePackage() { + return servicePackageUuid; + } } diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java index b7aa94bbaa8..19beddd1001 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java @@ -61,4 +61,7 @@ public interface NetworkOfferingDao extends GenericDao NetworkOfferingVO persist(NetworkOfferingVO off, Map details); + List listNetworkOfferingID(); + + boolean isUsingServicePackage(String uuid); } diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java index 5a6092ec243..c7298f25529 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.offerings.dao; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -32,6 +33,7 @@ import com.cloud.offering.NetworkOffering.Detail; import com.cloud.offerings.NetworkOfferingDetailsVO; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; @@ -189,4 +191,32 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase listNetworkOfferingID() { + final SearchCriteria sc_1 = createSearchCriteria(); + final Filter searchFilter_1 = new Filter(NetworkOfferingVO.class, "created", false, null, null); + sc_1.addAnd("servicePackageUuid", SearchCriteria.Op.NEQ, null); + sc_1.addAnd("removed", SearchCriteria.Op.EQ, null); + List set_of_servicePackageUuid = this.search(sc_1, searchFilter_1); + List id_set = new ArrayList(); + for (NetworkOfferingVO node : set_of_servicePackageUuid) { + if (node.getServicePackage() != null && !node.getServicePackage().isEmpty()) { + id_set.add(node.getId()); + } + } + return id_set; + } + + @Override + public boolean isUsingServicePackage(String uuid) { + final SearchCriteria sc = createSearchCriteria(); + final Filter searchFilter= new Filter(NetworkOfferingVO.class, "created", false, null, null); + sc.addAnd("state", SearchCriteria.Op.EQ, NetworkOffering.State.Enabled); + sc.addAnd("servicePackageUuid", SearchCriteria.Op.EQ, uuid); + List list = this.search(sc, searchFilter); + if(list!=null && !list.isEmpty()) + return true; + + return false; + } } diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java index 64ca4067cee..668f4acc454 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java @@ -216,6 +216,10 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co } } + if (vm.getType() == VirtualMachine.Type.NetScalerVm) { + details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, "scsi"); + } + List nicProfiles = vm.getNics(); for (NicProfile nicProfile : nicProfiles) { diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 5c873099fd6..8b78534f218 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -2022,6 +2022,16 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa configNvpExtraOption(extraOptions, vmSpec, nicUuidToDvSwitchUuid); configCustomExtraOption(extraOptions, vmSpec); + // config for NCC + VirtualMachine.Type vmType = cmd.getVirtualMachine().getType(); + if (vmType.equals(VirtualMachine.Type.NetScalerVm)) { + NicTO mgmtNic = vmSpec.getNics()[0]; + OptionValue option = new OptionValue(); + option.setKey("machine.id"); + option.setValue("ip=" + mgmtNic.getIp() + "&netmask=" + mgmtNic.getNetmask() + "&gateway=" + mgmtNic.getGateway()); + extraOptions.add(option); + } + // config VNC String keyboardLayout = null; if (vmSpec.getDetails() != null) diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index ccb18a2e55c..10c43075835 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -86,6 +86,7 @@ import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.Script; import com.cloud.utils.ssh.SSHCmdHelper; import com.cloud.utils.ssh.SshHelper; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.PowerState; import com.trilead.ssh2.SCPClient; import com.xensource.xenapi.Bond; @@ -1319,6 +1320,18 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vmr.VCPUsAtStartup = (long) vmSpec.getCpus(); vmr.consoles.clear(); + vmr.xenstoreData.clear(); + //Add xenstore data for the NetscalerVM + if(vmSpec.getType()== VirtualMachine.Type.NetScalerVm) { + NicTO mgmtNic = vmSpec.getNics()[0]; + if(mgmtNic != null ) { + Map xenstoreData = new HashMap(3); + xenstoreData.put("vm-data/ip", mgmtNic.getIp().toString().trim()); + xenstoreData.put("vm-data/gateway", mgmtNic.getGateway().toString().trim()); + xenstoreData.put("vm-data/netmask", mgmtNic.getNetmask().toString().trim()); + vmr.xenstoreData = xenstoreData; + } + } final VM vm = VM.create(conn, vmr); if (s_logger.isDebugEnabled()) { @@ -1329,8 +1342,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe final Integer speed = vmSpec.getMinSpeed(); if (speed != null) { - - int cpuWeight = _maxWeight; // cpu_weight + int cpuWeight = _maxWeight; // cpu_weight int utilization = 0; // max CPU cap, default is unlimited // weight based allocation, CPU weight is calculated per VCPU diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java index 073f00096b0..5d8d0e744db 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java @@ -87,7 +87,6 @@ public final class CitrixStartCommandWrapper extends CommandWrapper - + diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerControlCenterCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerControlCenterCmd.java new file mode 100644 index 00000000000..00d4b32a63c --- /dev/null +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerControlCenterCmd.java @@ -0,0 +1,97 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import javax.inject.Inject; +import javax.persistence.EntityExistsException; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.api.response.NetscalerControlCenterResponse; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.network.element.NetscalerLoadBalancerElementService; +import com.cloud.utils.exception.CloudRuntimeException; + +@APICommand(name = "deleteNetscalerControlCenter", responseObject = SuccessResponse.class, description = "Delete Netscaler Control Center") +public class DeleteNetscalerControlCenterCmd extends BaseCmd { + + public static final Logger s_logger = Logger.getLogger(DeleteServicePackageOfferingCmd.class.getName()); + private static final String s_name = "deleteNetscalerControlCenter"; + @Inject + NetscalerLoadBalancerElementService _netsclarLbService; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ID, type = CommandType.STRING, entityType = NetscalerControlCenterResponse.class, required = true, description = "Netscaler Control Center ID") + private String ID; + + @Override + public void execute() throws ServerApiException, ConcurrentOperationException, EntityExistsException { + SuccessResponse response = new SuccessResponse(); + try { + boolean result = _netsclarLbService.deleteNetscalerControlCenter(this); + if (response != null && result) { + response.setDisplayText("Netscaler Control Center Deleted Successfully"); + response.setSuccess(result); + response.setResponseName(getCommandName()); + setResponseObject(response); + } + } catch (CloudRuntimeException runtimeExcp) { + response.setDisplayText(runtimeExcp.getMessage()); + response.setSuccess(false); + response.setResponseName(getCommandName()); + setResponseObject(response); + return; + } catch (Exception e) { + e.printStackTrace(); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage()); + } + } + + public String setId(String iD) { + return ID = iD; + } + + public String getId() { + return ID; + } + + @Override + public String getCommandName() { + // TODO Auto-generated method stub + return s_name; + } + + @Override + public long getEntityOwnerId() { + // TODO Auto-generated method stub + return CallContext.current().getCallingAccount().getId(); + } + +} diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerLoadBalancerCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerLoadBalancerCmd.java index 1baa7b05d54..16990c56251 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerLoadBalancerCmd.java +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteNetscalerLoadBalancerCmd.java @@ -96,7 +96,7 @@ public class DeleteNetscalerLoadBalancerCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_LOAD_BALANCER_DELETE; + return EventTypes.EVENT_EXTERNAL_NCC_DEVICE_DELETE; } @Override diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteServicePackageOfferingCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteServicePackageOfferingCmd.java index 1fbd899edaf..96cd16e4f51 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteServicePackageOfferingCmd.java +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeleteServicePackageOfferingCmd.java @@ -34,15 +34,14 @@ import org.apache.cloudstack.api.response.SuccessResponse; import com.cloud.api.response.NetScalerServicePackageResponse; import com.cloud.exception.ConcurrentOperationException; -//import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.element.NetscalerLoadBalancerElementService; import com.cloud.utils.exception.CloudRuntimeException; -@APICommand(name = "deleteServicePackageOffering", responseObject = SuccessResponse.class, description = "Delete Service Package Offering") +@APICommand(name = "deleteServicePackageOffering", responseObject = SuccessResponse.class, description = "Delete Service Package") public class DeleteServicePackageOfferingCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(DeleteServicePackageOfferingCmd.class.getName()); - private static final String s_name = "deleteServicePackageOffering"; + private static final String s_name = "deleteServicePackage"; @Inject NetscalerLoadBalancerElementService _netsclarLbService; diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeployNetscalerVpxCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeployNetscalerVpxCmd.java new file mode 100644 index 00000000000..8089599d50b --- /dev/null +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/DeployNetscalerVpxCmd.java @@ -0,0 +1,148 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.cloud.api.commands; + +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.api.ACL; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.NetworkResponse; +import org.apache.cloudstack.api.response.ServiceOfferingResponse; +import org.apache.cloudstack.api.response.SystemVmResponse; +import org.apache.cloudstack.api.response.TemplateResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.api.response.NetscalerLoadBalancerResponse; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.element.NetscalerLoadBalancerElementService; +import com.cloud.user.Account; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.VirtualMachine; + +@APICommand(name = "deployNetscalerVpx", responseObject = NetscalerLoadBalancerResponse.class, description = "Creates new NS Vpx", + requestHasSensitiveInfo = true, responseHasSensitiveInfo = false) +public class DeployNetscalerVpxCmd extends BaseAsyncCmd { + + public static final Logger s_logger = Logger.getLogger(DeployNetscalerVpxCmd.class.getName()); + private static final String s_name = "deployNetscalerVpx"; + @Inject + NetscalerLoadBalancerElementService _netsclarLbService; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "availability zone for the virtual machine") + private Long zoneId; + + @ACL + @Parameter(name = ApiConstants.SERVICE_OFFERING_ID, type = CommandType.UUID, entityType = ServiceOfferingResponse.class, required = true, description = "the ID of the service offering for the virtual machine") + private Long serviceOfferingId; + + @ACL + @Parameter(name = ApiConstants.TEMPLATE_ID, type = CommandType.UUID, entityType = TemplateResponse.class, required = true, description = "the ID of the template for the virtual machine") + private Long templateId; + + @Parameter(name = ApiConstants.NETWORK_ID, + type = CommandType.UUID, + entityType = NetworkResponse.class, required=false, + description = "The network this ip address should be associated to.") + private Long networkId; + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, + ResourceAllocationException { + try { + Map resp = _netsclarLbService.deployNetscalerServiceVm(this); + if (resp.size() > 0) { + SystemVmResponse response = _responseGenerator.createSystemVmResponse((VirtualMachine)resp.get("vm")); + response.setGuestVlan((String)resp.get("guestvlan")); + response.setPublicVlan((List)resp.get("publicvlan")); + response.setResponseName(getCommandName()); + setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Fail to start system vm"); + } + + } catch (InvalidParameterValueException invalidParamExcp) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage()); + } catch (CloudRuntimeException runtimeExcp) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage()); + } + } + + public Long getServiceOfferingId() { + return serviceOfferingId; + } + + public Long getTemplateId() { + return templateId; + } + + @Override + public String getEventDescription() { + return "Adding a netscaler load balancer device"; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_NETSCALER_VM_START; + } + + @Override + public String getCommandName() { + return s_name; + } + + public Long getZoneId() { + return zoneId; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } + public Account getAccount(){ + return _accountService.getActiveAccountById(getEntityOwnerId()); + } + public void getReservationContext() { + } +} diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/ListNetscalerControlCenterCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/ListNetscalerControlCenterCmd.java new file mode 100644 index 00000000000..1ff119a1b79 --- /dev/null +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/ListNetscalerControlCenterCmd.java @@ -0,0 +1,93 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import com.cloud.api.response.NetscalerControlCenterResponse; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.NetScalerControlCenterVO; +import com.cloud.network.element.NetscalerLoadBalancerElementService; +import com.cloud.utils.exception.CloudRuntimeException; + +@APICommand(name = "listNetscalerControlCenter", responseObject = NetscalerControlCenterResponse.class, description = "list control center", requestHasSensitiveInfo = true, responseHasSensitiveInfo = false) +public class ListNetscalerControlCenterCmd extends BaseListCmd { + + public static final Logger s_logger = Logger.getLogger(ListNetscalerControlCenterCmd.class.getName()); + private static final String s_name = "listNetscalerControlCenter"; + + @Inject + NetscalerLoadBalancerElementService _netsclarLbService; + + public static String getsName() { + return s_name; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException { + try { + List lncCenters = _netsclarLbService.listNetscalerControlCenter(this); + if (lncCenters != null) { + ListResponse response = new ListResponse(); + List lncCentersResponse = new ArrayList(); + if (lncCenters != null && !lncCenters.isEmpty()) { + for (NetScalerControlCenterVO lncCentersVO : lncCenters) { + NetscalerControlCenterResponse lncCentreResponse = _netsclarLbService + .createNetscalerControlCenterResponse(lncCentersVO); + lncCentersResponse.add(lncCentreResponse); + } + } + + response.setResponses(lncCentersResponse); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, + "Failed to list Net scalar Control Center due to some internal error."); + } + } catch (InvalidParameterValueException invalidParamExcp) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage()); + } catch (CloudRuntimeException runtimeExcp) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage()); + } + } + + @Override + public String getCommandName() { + return s_name; + } +} \ No newline at end of file diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterNetscalerControlCenterCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterNetscalerControlCenterCmd.java index 8887736bbb3..fe98a7a5fba 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterNetscalerControlCenterCmd.java +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterNetscalerControlCenterCmd.java @@ -27,6 +27,7 @@ import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.context.CallContext; +import com.cloud.api.response.NetscalerControlCenterResponse; import com.cloud.api.response.NetscalerLoadBalancerResponse; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; @@ -43,7 +44,7 @@ import com.cloud.utils.exception.CloudRuntimeException; public class RegisterNetscalerControlCenterCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(RegisterNetscalerControlCenterCmd.class.getName()); - private static final String s_name = "registernetscalercontrolcenterrresponse"; + private static final String s_name = "registernetscalercontrolcenterresponse"; @Inject NetscalerLoadBalancerElementService _netsclarLbService; @@ -108,10 +109,10 @@ public class RegisterNetscalerControlCenterCmd extends BaseAsyncCmd { try { NetScalerControlCenterVO nccVO = _netsclarLbService.registerNetscalerControlCenter(this); if (nccVO != null) { - /*NetscalerLoadBalancerResponse response = _netsclarLbService.createNetscalerLoadBalancerResponse(lbDeviceVO); + NetscalerControlCenterResponse response = _netsclarLbService.createNetscalerControlCenterResponse(nccVO); response.setObjectName("netscalerloadbalancer"); response.setResponseName(getCommandName()); - this.setResponseObject(response);*/ + this.setResponseObject(response); } else { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add netscaler load balancer due to internal error."); } @@ -124,12 +125,12 @@ public class RegisterNetscalerControlCenterCmd extends BaseAsyncCmd { @Override public String getEventDescription() { - return "Adding a netscaler load balancer device"; + return "Adding a Netscaler Control Center Device"; } @Override public String getEventType() { - return EventTypes.EVENT_EXTERNAL_LB_DEVICE_ADD; + return EventTypes.EVENT_EXTERNAL_NCC_DEVICE_ADD; } @Override diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterServicePackageCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterServicePackageCmd.java index 67c1c57b9b9..9fabe8debdf 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterServicePackageCmd.java +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/RegisterServicePackageCmd.java @@ -52,16 +52,7 @@ public class RegisterServicePackageCmd extends BaseCmd { @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, required = true, description = "Description of Service Package") private String description; - /* @Override - public String getEventType() { - return EventTypes.EVENT_NETSCALER_SERVICEPACKAGE_ADD; - } - @Override - public String getEventDescription() { - return "Adding Netscaler Service Package"; - } - */ @Override public void execute() throws ServerApiException, ConcurrentOperationException, EntityExistsException { try { diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/commands/StopNetScalerVMCmd.java b/plugins/network-elements/netscaler/src/com/cloud/api/commands/StopNetScalerVMCmd.java new file mode 100644 index 00000000000..af95255da90 --- /dev/null +++ b/plugins/network-elements/netscaler/src/com/cloud/api/commands/StopNetScalerVMCmd.java @@ -0,0 +1,132 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.api.commands; + +import javax.inject.Inject; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.acl.SecurityChecker.AccessType; +import org.apache.cloudstack.api.ACL; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.DomainRouterResponse; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.element.NetscalerLoadBalancerElementService; +import com.cloud.network.router.VirtualRouter; +import com.cloud.network.router.VirtualRouter.Role; +import com.cloud.vm.VirtualMachine; + +@APICommand(name = "stopNetScalerVpx", description = "Stops a NetScalervm.", responseObject = DomainRouterResponse.class, entityType = {VirtualMachine.class}, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class StopNetScalerVMCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(StopNetScalerVMCmd.class.getName()); + private static final String s_name = "stopNetScalerVmresponse"; + + @Inject + NetscalerLoadBalancerElementService _netsclarLbService; + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + @ACL(accessType = AccessType.OperateEntry) + @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class, required = true, description = "the ID of the NetScaler vm") + private Long id; + + @Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM. The caller knows the VM is stopped.") + private Boolean forced; + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + VirtualRouter vm = _entityMgr.findById(VirtualRouter.class, getId()); + if (vm != null && vm.getRole() == Role.NETSCALER_VM) { + return vm.getAccountId(); + } else { + throw new InvalidParameterValueException("Unable to find NetScaler vm by id"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_NETSCALER_VM_STOP; + } + + @Override + public String getEventDescription() { + return "stopping Netscaler vm: " + getId(); + } + + @Override + public ApiCommandJobType getInstanceType() { + return ApiCommandJobType.DomainRouter; + } + + @Override + public Long getInstanceId() { + return getId(); + } + + public boolean isForced() { + return (forced != null) ? forced : false; + } + + @Override + public void execute() throws ConcurrentOperationException, ResourceUnavailableException { + CallContext.current().setEventDetails("NetScaler vm Id: " + getId()); + VirtualRouter result = null; + VirtualRouter vm = _routerService.findRouter(getId()); + if (vm == null || vm.getRole() != Role.NETSCALER_VM) { + throw new InvalidParameterValueException("Can't find NetScaler lb vm by id"); + } else { + result = _netsclarLbService.stopNetscalerServiceVm(getId(), isForced(), CallContext.current().getCallingAccount(), CallContext.current().getCallingUserId()); + } + + if (result != null) { + DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result); + response.setResponseName(getCommandName()); + setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to stop Netscaler vm"); + } + } +} diff --git a/plugins/network-elements/netscaler/src/com/cloud/api/response/NetscalerControlCenterResponse.java b/plugins/network-elements/netscaler/src/com/cloud/api/response/NetscalerControlCenterResponse.java new file mode 100644 index 00000000000..b4e4446ca13 --- /dev/null +++ b/plugins/network-elements/netscaler/src/com/cloud/api/response/NetscalerControlCenterResponse.java @@ -0,0 +1,98 @@ +//Licensed to the Apache Software Foundation (ASF) under one or more + +//contributor license agreements. See the NOTICE file distributed with +//this work for additional information regarding copyright ownership. +//The ASF licenses this file to You under the Apache License, Version 2.0 +//(the "License"); you may not use this file except in compliance with +//the License. You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package com.cloud.api.response; + +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import com.cloud.network.NetScalerControlCenterVO; +import com.cloud.serializer.Param; + +public class NetscalerControlCenterResponse extends BaseResponse { + + @SerializedName(ApiConstants.ID) + @Param(description = "id") + private String id; + + @SerializedName(ApiConstants.USERNAME) + @Param(description = "username") + private String username; + + @SerializedName(ApiConstants.UUID) + @Param(description = "uuid") + private String uuid; + + @SerializedName(ApiConstants.IP_ADDRESS) + @Param(description = "ncc_ip") + private String nccip; + + @SerializedName(ApiConstants.NUM_RETRIES) + @Param(description = "num_retries") + private String numretries; + + public NetscalerControlCenterResponse() { + } + + public NetscalerControlCenterResponse(NetScalerControlCenterVO controlcenter) { + this.id = controlcenter.getUuid(); + this.username = controlcenter.getUsername(); + this.uuid = controlcenter.getUuid(); + this.username = controlcenter.getUsername(); + this.nccip = controlcenter.getNccip(); + this.numretries = String.valueOf(controlcenter.getNumRetries()); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getNccip() { + return nccip; + } + + public void setNccip(String nccip) { + this.nccip = nccip; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getNumRetries() { + return numretries; + } + + public void setNumRetries(String numRetries) { + this.numretries = numRetries; + } +} diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerControlCenterVO.java b/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerControlCenterVO.java index e1cd13d3c7a..84766bcffbb 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerControlCenterVO.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerControlCenterVO.java @@ -29,10 +29,9 @@ import org.apache.cloudstack.api.InternalIdentity; /** - * NetScalerPodVO contains information about a EIP deployment where on datacenter L3 router a PBR (policy - * based routing) is setup between a POD's subnet IP range to a NetScaler device. This VO object - * represents a mapping between a POD and NetScaler device where PBR is setup. - * + * NetScalerControlCenterVO contains information about a NetScaler Control Center(NCC) such as Username, + * Password used for login, the NCC IP and maximum number of unsuccessful tries a user can make. + * By using this information CloudStack can access the NCC. */ @Entity @Table(name = "external_netscaler_controlcenter") diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerServicePackageVO.java b/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerServicePackageVO.java index 758d5a3013d..82b3fef8507 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerServicePackageVO.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/NetScalerServicePackageVO.java @@ -30,10 +30,8 @@ import org.apache.cloudstack.api.InternalIdentity; import com.cloud.api.commands.RegisterServicePackageCmd; /** - * NetScalerPodVO contains information about a EIP deployment where on datacenter L3 router a PBR (policy - * based routing) is setup between a POD's subnet IP range to a NetScaler device. This VO object - * represents a mapping between a POD and NetScaler device where PBR is setup. - * + * NetScalerServicePackageVO contains information about service packages from NetScaler Control Center(NCC). + * By using the service package, CloudStack can choose the kind of NetScaler offering it wants to use. */ @Entity @Table(name = " netscaler_servicepackages") diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDao.java b/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDao.java index fcda584a465..73fb2634fa5 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDao.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDao.java @@ -26,4 +26,6 @@ public interface NetScalerServicePackageDao extends GenericDao listByNetScalerDeviceId(long netscalerDeviceId); + + public void removeAll(); } diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDaoImpl.java b/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDaoImpl.java index df99b49747a..db3b5c087ba 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDaoImpl.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/dao/NetScalerServicePackageDaoImpl.java @@ -40,11 +40,9 @@ public class NetScalerServicePackageDaoImpl extends GenericDaoBase list_NetScalerServicePackageVO = this.listAll(); + for (NetScalerServicePackageVO row : list_NetScalerServicePackageVO) { + this.remove(row.getId()); + } + } } diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java index 6f5a9a11ecf..3371cf8dbf5 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java @@ -37,8 +37,6 @@ import com.google.gson.Gson; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.command.admin.address.AcquirePodIpCmdByAdmin; -import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice; @@ -61,12 +59,14 @@ import com.cloud.api.commands.ConfigureNetscalerLoadBalancerCmd; import com.cloud.api.commands.DeleteNetscalerControlCenterCmd; import com.cloud.api.commands.DeleteNetscalerLoadBalancerCmd; import com.cloud.api.commands.DeleteServicePackageOfferingCmd; +import com.cloud.api.commands.DeployNetscalerVpxCmd; import com.cloud.api.commands.ListNetscalerControlCenterCmd; import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd; import com.cloud.api.commands.ListNetscalerLoadBalancersCmd; import com.cloud.api.commands.ListRegisteredServicePackageCmd; import com.cloud.api.commands.RegisterNetscalerControlCenterCmd; import com.cloud.api.commands.RegisterServicePackageCmd; +import com.cloud.api.commands.StopNetScalerVMCmd; import com.cloud.api.response.NetScalerServicePackageResponse; import com.cloud.api.response.NetscalerControlCenterResponse; import com.cloud.api.response.NetscalerLoadBalancerResponse; @@ -79,7 +79,11 @@ import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterIpAddressDao; +import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.event.ActionEvent; +import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientNetworkCapacityException; @@ -121,24 +125,26 @@ import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkVO; -//import com.cloud.network.dao.RegisteredServicePackageVO; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.resource.NetScalerControlCenterResource; import com.cloud.network.resource.NetscalerResource; +import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.LbStickinessMethod; import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; import com.cloud.network.rules.LoadBalancerContainer; import com.cloud.network.rules.StaticNat; +import com.cloud.network.vm.NetScalerVMManager; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceState; import com.cloud.resource.ServerResource; +import com.cloud.user.Account; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.DB; -import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionCallbackNoReturn; @@ -149,8 +155,9 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachineProfile; -public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider, NetscalerLoadBalancerElementService, - ExternalLoadBalancerDeviceManager, IpDeployer, StaticNatServiceProvider, GslbServiceProvider { +public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl + implements LoadBalancingServiceProvider, NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, + IpDeployer, StaticNatServiceProvider, GslbServiceProvider { private static final Logger s_logger = Logger.getLogger(NetscalerElement.class); public static final AutoScaleCounterType AutoScaleCounterSnmp = new AutoScaleCounterType("snmp"); @@ -172,10 +179,6 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl DataCenterDao _dcDao; @Inject ExternalLoadBalancerDeviceDao _lbDeviceDao; - - // @Inject - // NetScalerServicePackageDao _lrsPackagesDao; - @Inject NetScalerControlCenterDao _netscalerControlCenterDao; @Inject @@ -206,6 +209,8 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl NetworkOrchestrationService _networkService; @Inject NetworkOfferingDao _networkOfferingDao = null; + @Inject + NetScalerVMManager _netScalerVMManager; private boolean canHandle(Network config, Service service) { DataCenter zone = _dcDao.findById(config.getDataCenterId()); @@ -256,8 +261,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl } else { // if the network offering has service package implement it with // Netscaler Control Center - manageGuestNetworkWithNetscalerControlCenter(true, guestConfig, offering); - return true; + return manageGuestNetworkWithNetscalerControlCenter(true, guestConfig, offering); } } catch (InsufficientCapacityException capacityException) { throw new ResourceUnavailableException( @@ -293,7 +297,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl hostDetails.put("zoneId", Long.toString(guestConfig.getDataCenterId())); hostDetails.put("ip", ipAddress); hostDetails.put("username", nccVO.getUsername()); - hostDetails.put("password", nccVO.getPassword()); + hostDetails.put("password", DBEncryptionUtil.decrypt(nccVO.getPassword())); hostDetails.put("deviceName", "netscaler control center"); hostDetails.put("cmdTimeOut", Long.toString(NumbersUtil.parseInt(_configDao.getValue(Config.NCCCmdTimeOut.key()), 600000))); ServerResource resource = new NetScalerControlCenterResource(); @@ -362,7 +366,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl networkDetails.put("cidr", guestConfig.getCidr()); networkDetails.put("gateway", guestConfig.getGateway()); networkDetails.put("servicepackage_id", offering.getServicePackage()); - networkDetails.put("zone_id", zoneId); + networkDetails.put("zone_id", zone.getUuid()); networkDetails.put("account_id", guestConfig.getAccountId()); networkDetails.put("add", Boolean.toString(add)); selfIp = _ipAddrMgr.acquireGuestIpAddress(guestConfig, null); @@ -381,152 +385,30 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl e.printStackTrace(); } - NetScalerImplementNetworkCommand cmd = new NetScalerImplementNetworkCommand(zoneId, netscalerControlCenter.getId(), networkPayload.toString()); + NetScalerImplementNetworkCommand cmd = new NetScalerImplementNetworkCommand(zone.getUuid(), netscalerControlCenter.getId(), networkPayload.toString()); Answer answer = _agentMgr.easySend(netscalerControlCenter.getId(), cmd); if (add) { //TODO After getting the answer check with the job id and do poll on the job and then save the selfip or acquired guest ip to the Nics table if (answer != null) { - if (add) { - // Insert a new NIC for this guest network to reserve the self IP - _networkService.savePlaceholderNic(guestConfig, selfIp, null, null); + if (answer.getResult() == true) { + if (add) { + // Insert a new NIC for this guest network to reserve the self IP + _networkService.savePlaceholderNic(guestConfig, selfIp, null, null); + } + } else { + return false; } } } else { - // release the self-ip obtained from guest network - /*Nic selfipNic = getPlaceholderNic(guestConfig); - _nicDao.remove(selfipNic.getId());*/ - // release the load balancer allocated for the network - return true; - //write code to remove the self nic or the clean up work - } - // Send a command to the external load balancer to implement or shutdown the guest network - /* long guestVlanTag = Long.parseLong(BroadcastDomainType.getValue(guestConfig.getBroadcastUri())); - String selfIp = null; - String guestVlanNetmask = NetUtils.cidr2Netmask(guestConfig.getCidr()); - Integer networkRate = _networkModel.getNetworkRate(guestConfig.getId(), null); - if (add) { - // on restart network, network could have already been implemented. If already implemented then return - Nic selfipNic = getPlaceholderNic(guestConfig); - if (selfipNic != null) { - return true; - } - // Acquire a self-ip address from the guest network IP address range - selfIp = _ipAddrMgr.acquireGuestIpAddress(guestConfig, null); - if (selfIp == null) { - String msg = "failed to acquire guest IP address so not implementing the network on the external load balancer "; - s_logger.error(msg); - throw new InsufficientNetworkCapacityException(msg, Network.class, guestConfig.getId()); - } - } else { - // get the self-ip used by the load balancer - Nic selfipNic = getPlaceholderNic(guestConfig); - if (selfipNic == null) { - s_logger.warn("Network shutdwon requested on external load balancer element, which did not implement the network." - + " Either network implement failed half way through or already network shutdown is completed. So just returning."); - return true; - } - selfIp = selfipNic.getIp4Address(); - } - */ - // It's a hack, using isOneToOneNat field for indicate if it's inline or not - /* boolean inline = _networkMgr.isNetworkInlineMode(guestConfig); - IpAddressTO ip = - new IpAddressTO(guestConfig.getAccountId(), null, add, false, true, String.valueOf(guestVlanTag), selfIp, guestVlanNetmask, null, networkRate, inline); - IpAddressTO[] ips = new IpAddressTO[1]; - ips[0] = ip; - IpAssocCommand cmd = new IpAssocCommand(ips); - Answer answer = _agentMgr.easySend(netscalerControlCenter.getId(), cmd); - */ - /* if (answer == null || !answer.getResult()) { - String action = add ? "implement" : "shutdown"; - String answerDetails = (answer != null) ? answer.getDetails() : null; - answerDetails = (answerDetails != null) ? " due to " + answerDetails : ""; - String msg = "External load balancer was unable to " + action + " the guest network on the external load balancer in zone " + zone.getName() + answerDetails; - s_logger.error(msg); - throw new ResourceUnavailableException(msg, Network.class, guestConfig.getId()); - } - ======= - NetScalerImplementNetworkCommand cmd = new NetScalerImplementNetworkCommand(zoneId, - netscalerControlCenter.getId(), networkPayload.toString()); - >>>>>>> Stashed changes - if (add) { - Answer answer = _agentMgr.easySend(netscalerControlCenter.getId(), cmd); - // TODO After getting the answer check with the job id and do poll - // on the job and then save the selfip or acquired guest ip to the - // Nics table if (answer != null) { - if (add) { - // Insert a new NIC for this guest network to reserve the - // self IP - _networkService.savePlaceholderNic(guestConfig, selfIp, null, null); + if (answer.getResult() == true) { + return true; + } else { + return false; } } + return false; } - // Send a command to the external load balancer to implement or shutdown - // the guest network - /* - * long guestVlanTag = - * Long.parseLong(BroadcastDomainType.getValue(guestConfig. - * getBroadcastUri())); String selfIp = null; String guestVlanNetmask = - * NetUtils.cidr2Netmask(guestConfig.getCidr()); Integer networkRate = - * _networkModel.getNetworkRate(guestConfig.getId(), null); if (add) { - * // on restart network, network could have already been implemented. - * If already implemented then return Nic selfipNic = - * getPlaceholderNic(guestConfig); if (selfipNic != null) { return true; - * } // Acquire a self-ip address from the guest network IP address - * range selfIp = _ipAddrMgr.acquireGuestIpAddress(guestConfig, null); - * if (selfIp == null) { String msg = - * "failed to acquire guest IP address so not implementing the network on the external load balancer " - * ; s_logger.error(msg); throw new - * InsufficientNetworkCapacityException(msg, Network.class, - * guestConfig.getId()); } } else { // get the self-ip used by the load - * balancer Nic selfipNic = getPlaceholderNic(guestConfig); if - * (selfipNic == null) { s_logger.warn( - * "Network shutdwon requested on external load balancer element, which did not implement the network." - * + - * " Either network implement failed half way through or already network shutdown is completed. So just returning." - * ); return true; } selfIp = selfipNic.getIp4Address(); } - */ - // It's a hack, using isOneToOneNat field for indicate if it's inline or - // not - /* - * boolean inline = _networkMgr.isNetworkInlineMode(guestConfig); - * IpAddressTO ip = new IpAddressTO(guestConfig.getAccountId(), null, - * add, false, true, String.valueOf(guestVlanTag), selfIp, - * guestVlanNetmask, null, networkRate, inline); IpAddressTO[] ips = new - * IpAddressTO[1]; ips[0] = ip; IpAssocCommand cmd = new - * IpAssocCommand(ips); Answer answer = - * _agentMgr.easySend(netscalerControlCenter.getId(), cmd); - */ - /* - * if (answer == null || !answer.getResult()) { String action = add ? - * "implement" : "shutdown"; String answerDetails = (answer != null) ? - * answer.getDetails() : null; answerDetails = (answerDetails != null) ? - * " due to " + answerDetails : ""; String msg = - * "External load balancer was unable to " + action + - * " the guest network on the external load balancer in zone " + - * zone.getName() + answerDetails; s_logger.error(msg); throw new - * ResourceUnavailableException(msg, Network.class, - * guestConfig.getId()); } if (add) { // Insert a new NIC for this guest - * network to reserve the self IP - * _networkMgr.savePlaceholderNic(guestConfig, selfIp, null, null); } - * else { // release the self-ip obtained from guest network Nic - * selfipNic = getPlaceholderNic(guestConfig); - * _nicDao.remove(selfipNic.getId()); // release the load balancer - * allocated for the network boolean releasedLB = - * freeLoadBalancerForNetwork(guestConfig); if (!releasedLB) { String - * msg = - * "Failed to release the external load balancer used for the network: " - * + guestConfig.getId(); s_logger.error(msg); } } if - * (s_logger.isDebugEnabled()) { Account account = - * _accountDao.findByIdIncludingRemoved(guestConfig.getAccountId()); - * String action = add ? "implemented" : "shut down"; s_logger.debug( - * "External load balancer has " + action + - * " the guest network for account " + account.getAccountName() + - * "(id = " + account.getAccountId() + ") with VLAN tag " + - * guestVlanTag); } - */ - return true; } @@ -557,9 +439,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl } else { // if the network offering has service package implement it with Netscaler Control Center return manageGuestNetworkWithNetscalerControlCenter(false, guestConfig, networkOffering); - //return true; } - //return manageGuestNetworkWithExternalLoadBalancer(false, guestConfig); } catch (InsufficientCapacityException capacityException) { // TODO: handle out of capacity exception gracefully in case of // multple providers available @@ -618,7 +498,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl // Specifies that load balancing rules can be made for either TCP or UDP // traffic - lbCapabilities.put(Capability.SupportedProtocols, "tcp,udp"); + lbCapabilities.put(Capability.SupportedProtocols, "tcp,udp,http"); // Specifies that this element can measure network usage on a per public // IP basis @@ -896,8 +776,8 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl cmdList.add(ListNetscalerControlCenterCmd.class); cmdList.add(DeleteServicePackageOfferingCmd.class); cmdList.add(DeleteNetscalerControlCenterCmd.class); - cmdList.add(ReleasePodIpCmdByAdmin.class); - cmdList.add(AcquirePodIpCmdByAdmin.class); + cmdList.add(DeployNetscalerVpxCmd.class); + cmdList.add(StopNetScalerVMCmd.class); return cmdList; } @@ -974,17 +854,25 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl @Override public boolean deleteServicePackageOffering(DeleteServicePackageOfferingCmd cmd) throws CloudRuntimeException { NetScalerServicePackageVO result = null; - boolean flag; + boolean flag=false; try { result = _netscalerServicePackageDao.findByUuid(cmd.getId()); + if (result == null) + throw new CloudRuntimeException("Record does not Exists in the Table"); + + if(_networkOfferingDao.isUsingServicePackage(result.getUuid())) + { + throw new CloudRuntimeException("Network offering is using the service package. First delete the NeworkOffering and then delete ServicePackage"); + } + flag = _netscalerServicePackageDao.remove(result.getId()); + } catch (Exception e) { if (e instanceof InvalidParameterValueException) throw new ServerApiException(ApiErrorCode.PARAM_ERROR, e.getMessage()); - else if (result == null) - throw new CloudRuntimeException("Record does not Exists in the Table"); else - throw new CloudRuntimeException("Network offering is using the service package. First delete the nework offering and then delete ServicePackage"); + throw e; + } return flag; @@ -998,10 +886,13 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl if (result == null) throw new CloudRuntimeException("External Netscaler Control Center Table does not contain record with this ID"); else { - List id_set_1 = _networkOfferingDao.listServicePackageUuid(); - if (id_set_1.size() != 0) { - List id_set_2 = _networkDao.listNetworkOfferingId(id_set_1); - if (id_set_2 != null && id_set_2.size() != 0) + //ID list of Network Offering which are not removed and have service Package Uuid field not null. + List servicePackageId_list = _networkOfferingDao.listNetworkOfferingID(); + + if (servicePackageId_list.size() != 0) { + //VO list of Networks which are using Network Offering. + List networkVO_list = _networkDao.listNetworkVO(servicePackageId_list); + if (networkVO_list != null && networkVO_list.size() != 0) throw new CloudRuntimeException( "ServicePackages published by NetScalerControlCenter are being used by NetworkOfferings. Try deleting NetworkOffering with ServicePackages and then delete NetScalerControlCenter."); } @@ -1016,25 +907,23 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl _netscalerControlCenterDao.remove(result.getId()); //Removal of NCC from Host Table - SearchCriteria sc = _hostDao.createSearchCriteria(); - sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.NetScalerControlCenter); - List ncc_list = _hostDao.search(sc, null); - + List ncc_list = _hostDao.listAll(); if (ncc_list == null) { throw new CloudRuntimeException("Could not find Netscaler Control Center in Database"); } for (HostVO ncc : ncc_list) { - try { - // put the host in maintenance state in order for it to be deleted - ncc.setResourceState(ResourceState.Maintenance); - _hostDao.update(ncc.getId(), ncc); - _resourceMgr.deleteHost(ncc.getId(), false, false); - } catch (Exception e) { - s_logger.debug(e); - return false; + if (ncc.getType().equals(Host.Type.NetScalerControlCenter)) { + try { + // put the host in maintenance state in order for it to be deleted + ncc.setResourceState(ResourceState.Maintenance); + _hostDao.update(ncc.getId(), ncc); + _resourceMgr.deleteHost(ncc.getId(), false, false); + } catch (Exception e) { + s_logger.debug(e); + return false; + } } } - return true; } @@ -1415,7 +1304,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl int numLoadBalancersForCommand = loadBalancersToApply.size(); LoadBalancerTO[] loadBalancersForCommand = loadBalancersToApply .toArray(new LoadBalancerTO[numLoadBalancersForCommand]); - HealthCheckLBConfigCommand cmd = new HealthCheckLBConfigCommand(loadBalancersForCommand); + HealthCheckLBConfigCommand cmd = new HealthCheckLBConfigCommand(loadBalancersForCommand, network.getId()); HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); answer = (HealthCheckLBConfigAnswer)_agentMgr.easySend(externalLoadBalancer.getId(), cmd); return answer.getLoadBalancers(); @@ -1566,6 +1455,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl } @Override + @ActionEvent(eventType = EventTypes.EVENT_NETSCALER_SERVICEPACKAGE_ADD, eventDescription = "Registering NetScaler Service Package") public NetScalerServicePackageResponse registerNetscalerServicePackage(RegisterServicePackageCmd cmd) { NetScalerServicePackageVO servicePackage = new NetScalerServicePackageVO(cmd); NetScalerServicePackageResponse response = null; @@ -1578,6 +1468,9 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl @DB public NetScalerControlCenterVO registerNetscalerControlCenter(RegisterNetscalerControlCenterCmd cmd) { + if (_netscalerControlCenterDao.listAll() != null && _netscalerControlCenterDao.listAll().size() != 0) + throw new CloudRuntimeException("One Netscaler Control Center already exist in the DataBase. At a time only one Netscaler Control Center is allowed"); + final RegisterNetscalerControlCenterCmd cmdinfo = cmd; String ipAddress = cmd.getIpaddress(); Map hostDetails = new HashMap(); @@ -1599,11 +1492,9 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl return Transaction.execute(new TransactionCallback() { @Override public NetScalerControlCenterVO doInTransaction(TransactionStatus status) { - NetScalerControlCenterVO nccVO = new NetScalerControlCenterVO(cmdinfo.getUsername(), cmdinfo.getPassword(), + NetScalerControlCenterVO nccVO = new NetScalerControlCenterVO(cmdinfo.getUsername(), DBEncryptionUtil.encrypt(cmdinfo.getPassword()), cmdinfo.getIpaddress(), cmdinfo.getNumretries()); _netscalerControlCenterDao.persist(nccVO); - /*DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.NETSCALER_CONTROLCENTER_ID , String.valueOf(nccVO.getId())); - _hostDetailDao.persist(hostDetail);*/ return nccVO; } }); @@ -1612,4 +1503,27 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl throw new CloudRuntimeException(e.getMessage()); } } -} + + @Override + public Map deployNetscalerServiceVm(DeployNetscalerVpxCmd cmd) { + DataCenter zone = _dcDao.findById(cmd.getZoneId()); + DeployDestination dest = new DeployDestination(zone, null, null, null); + Map resp = new HashMap(); + Long templateId = cmd.getTemplateId(); + Long serviceOfferingId = cmd.getServiceOfferingId(); + DeploymentPlan plan = new DataCenterDeployment(dest.getDataCenter().getId()); + try { + resp = _netScalerVMManager.deployNsVpx(cmd.getAccount(), dest, plan, serviceOfferingId, templateId); + } catch (InsufficientCapacityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return resp; + } + + @Override + public VirtualRouter stopNetscalerServiceVm(Long id, boolean forced, Account callingAccount, long callingUserId) throws ConcurrentOperationException, + ResourceUnavailableException { + return _netScalerVMManager.stopNetScalerVm(id, forced, callingAccount, callingUserId); + } +} \ No newline at end of file diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerLoadBalancerElementService.java b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerLoadBalancerElementService.java index c635f7832a2..308b56d8073 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerLoadBalancerElementService.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerLoadBalancerElementService.java @@ -17,25 +17,31 @@ package com.cloud.network.element; import java.util.List; +import java.util.Map; import com.cloud.api.commands.AddNetscalerLoadBalancerCmd; import com.cloud.api.commands.ConfigureNetscalerLoadBalancerCmd; import com.cloud.api.commands.DeleteNetscalerControlCenterCmd; import com.cloud.api.commands.DeleteNetscalerLoadBalancerCmd; import com.cloud.api.commands.DeleteServicePackageOfferingCmd; +import com.cloud.api.commands.DeployNetscalerVpxCmd; import com.cloud.api.commands.ListNetscalerControlCenterCmd; import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd; import com.cloud.api.commands.ListNetscalerLoadBalancersCmd; import com.cloud.api.commands.ListRegisteredServicePackageCmd; import com.cloud.api.commands.RegisterNetscalerControlCenterCmd; import com.cloud.api.commands.RegisterServicePackageCmd; -import com.cloud.api.response.NetscalerLoadBalancerResponse; import com.cloud.api.response.NetScalerServicePackageResponse; import com.cloud.api.response.NetscalerControlCenterResponse; +import com.cloud.api.response.NetscalerLoadBalancerResponse; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.NetScalerControlCenterVO; import com.cloud.network.NetScalerServicePackageVO; import com.cloud.network.Network; import com.cloud.network.dao.ExternalLoadBalancerDeviceVO; +import com.cloud.network.router.VirtualRouter; +import com.cloud.user.Account; import com.cloud.utils.component.PluggableService; import com.cloud.utils.exception.CloudRuntimeException; @@ -135,4 +141,7 @@ public interface NetscalerLoadBalancerElementService extends PluggableService { public NetScalerControlCenterVO registerNetscalerControlCenter(RegisterNetscalerControlCenterCmd registerNetscalerControlCenterCmd); + public Map deployNetscalerServiceVm(DeployNetscalerVpxCmd cmd); + + public VirtualRouter stopNetscalerServiceVm(Long id, boolean forced, Account callingAccount, long callingUserId) throws ConcurrentOperationException, ResourceUnavailableException; } \ No newline at end of file diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetScalerControlCenterResource.java b/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetScalerControlCenterResource.java index a8b3fbff0b3..1132b6c82de 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetScalerControlCenterResource.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/resource/NetScalerControlCenterResource.java @@ -27,10 +27,7 @@ import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; -import java.util.Formatter; -import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import javax.naming.ConfigurationException; @@ -53,53 +50,12 @@ import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.BasicClientConnectionManager; import org.apache.http.util.EntityUtils; import org.apache.log4j.Logger; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -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.autoscaleaction; -import com.citrix.netscaler.nitro.resource.config.autoscale.autoscalepolicy; -import com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile; -import com.citrix.netscaler.nitro.resource.config.basic.service_lbmonitor_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.gslb.gslbservice; -import com.citrix.netscaler.nitro.resource.config.gslb.gslbservice_lbmonitor_binding; -import com.citrix.netscaler.nitro.resource.config.gslb.gslbsite; -import com.citrix.netscaler.nitro.resource.config.gslb.gslbsite_gslbservice_binding; -import com.citrix.netscaler.nitro.resource.config.gslb.gslbvserver; -import com.citrix.netscaler.nitro.resource.config.gslb.gslbvserver_domain_binding; -import com.citrix.netscaler.nitro.resource.config.gslb.gslbvserver_gslbservice_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.inat; -import com.citrix.netscaler.nitro.resource.config.network.rnat; -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.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.ssl.sslcertkey; -import com.citrix.netscaler.nitro.resource.config.ssl.sslcertkey_sslvserver_binding; -import com.citrix.netscaler.nitro.resource.config.ssl.sslcertlink; -import com.citrix.netscaler.nitro.resource.config.ssl.sslvserver_sslcertkey_binding; -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; -import com.citrix.sdx.nitro.resource.config.ns.ns; -import com.citrix.sdx.nitro.resource.config.xen.xen_nsvpx_image; import com.google.gson.Gson; -import org.apache.cloudstack.api.ApiConstants; - import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; @@ -114,57 +70,40 @@ import com.cloud.agent.api.ReadyCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupExternalLoadBalancerCommand; import com.cloud.agent.api.UnsupportedAnswer; -import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand; import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand; -import com.cloud.agent.api.routing.GlobalLoadBalancerConfigAnswer; import com.cloud.agent.api.routing.GlobalLoadBalancerConfigCommand; import com.cloud.agent.api.routing.HealthCheckLBConfigAnswer; import com.cloud.agent.api.routing.HealthCheckLBConfigCommand; 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.routing.SiteLoadBalancerConfig; 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.HealthCheckPolicyTO; import com.cloud.agent.api.to.LoadBalancerTO.StickinessPolicyTO; -import com.cloud.agent.api.to.StaticNatRuleTO; import com.cloud.host.Host; import com.cloud.host.Host.Type; import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; import com.cloud.resource.ServerResource; import com.cloud.serializer.GsonHelper; import com.cloud.utils.NumbersUtil; -import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; import com.cloud.utils.exception.ExecutionException; import com.cloud.utils.net.NetUtils; -import com.cloud.utils.ssh.SshHelper; -/*class NitroError { - static final int NS_RESOURCE_EXISTS = 273; - static final int NS_RESOURCE_NOT_EXISTS = 258; - static final int NS_NO_SERIVCE = 344; - static final int NS_OPERATION_NOT_PERMITTED = 257; - static final int NS_INTERFACE_ALREADY_BOUND_TO_VLAN = 2080; - static final int NS_GSLB_DOMAIN_ALREADY_BOUND = 1842; -}*/ +class NccHttpCode { + static final String INTERNAL_ERROR = "INTERNAL ERROR"; + static final String NOT_FOUND = "NOT FOUND"; + static final String JOB_ID = "Job_id"; + static final String UNAUTHORIZED = "UNAUTHORIZED"; +} public class NetScalerControlCenterResource implements ServerResource { - public final static int DEFAULT_SNMP_PORT = 161; // deployment configuration private String _name; private String _zoneId; - private String _physicalNetworkId; private String _ip; private String _username; private String _password; @@ -174,13 +113,7 @@ public class NetScalerControlCenterResource implements ServerResource { private Long _nccCmdTimeout; private String _guid; private boolean _inline; - private boolean _isSdx; - private boolean _cloudManaged; private String _deviceName; - private String _publicIP; - private String _publicIPNetmask; - private String _publicIPGateway; - private String _publicIPVlan; private String _sessionid; public static final int DEFAULT_PORT = 443; private static final Gson s_gson = GsonHelper.getGson(); @@ -189,13 +122,7 @@ public class NetScalerControlCenterResource implements ServerResource { private final String _objectNamePathSep = "-"; final String protocol="https"; private static String nccsession; - // interface to interact with VPX and MPX devices - com.citrix.netscaler.nitro.service.nitro_service _netscalerService; - - // interface to interact with service VM of the SDX appliance - com.citrix.sdx.nitro.service.nitro_service _netscalerSdxService; - - base_response apiCallResult; + private int pingCount = 0; public NetScalerControlCenterResource() { _gson = GsonHelper.getGsonLogger(); @@ -236,7 +163,7 @@ public class NetScalerControlCenterResource implements ServerResource { throw new ConfigurationException("Unable to find username in the configuration parameters"); } - _password = (String)params.get("password"); + _password = (String)params.get("password"); if (_password == null) { throw new ConfigurationException("Unable to find password in the configuration parameters"); } @@ -256,14 +183,6 @@ public class NetScalerControlCenterResource implements ServerResource { // validate device configuration parameters login(); - /*String response = - if(response == null) { - throw new ConfigurationException("No Response Received from the NetScalerControlCenter Device"); - } else { - jsonResponse = new JSONObject(response); - org.json.JSONArray loginResponse = jsonResponse.getJSONArray("login"); - _sessionid = jsonResponse.getJSONArray("login").getJSONObject(0).getString("sessionid"); - }*/ return true; } catch (ConfigurationException e) { @@ -277,25 +196,15 @@ public class NetScalerControlCenterResource implements ServerResource { public void getServicePackages() throws ExecutionException { String result = null; try { - // If a previous session was open, log it out. - //logout(); - //http://10.102.31.78/nitro/v2/config/login URI agentUri = null; - //String url = protocol + "://" + _ip +"/nitro/v2/config/login"; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/admin/v1/servicepackages", null, null); org.json.JSONObject jsonBody = new JSONObject(); org.json.JSONObject jsonCredentials = new JSONObject(); - //String loginBody= "{ \"login\": {\"username\":\"" + _username +"\", \"password\":\"" + _password +"\" }}"; -/* jsonCredentials.put("username", _username); - jsonCredentials.put("password", _password); - jsonBody.put("login", jsonCredentials); -*/ result = getHttpRequest(jsonBody.toString(), agentUri, _sessionid); s_logger.debug("List of Service Packages in NCC:: " + result); - //return result; } catch (URISyntaxException e) { String errMsg = "Could not generate URI for Hyper-V agent"; s_logger.error(errMsg, e); @@ -303,40 +212,18 @@ public class NetScalerControlCenterResource implements ServerResource { } catch (Exception e) { throw new ExecutionException("Failed to log in to NCC device at " + _ip + " due to " + e.getMessage()); } - //return result; - } - - private void logout() throws ExecutionException { - try { - if (!_isSdx) { - if (_netscalerService != null) { - _netscalerService.logout(); - } - } else { - if (_netscalerSdxService != null) { - _netscalerSdxService.logout(); - } - } - } catch (Exception e) { - // Ignore logout exceptions - } } private synchronized String login() throws ExecutionException{// , ConfigurationException { String result = null; JSONObject jsonResponse = null; try { - // If a previous session was open, log it out. - //logout(); - //http://10.102.31.78/nitro/v2/config/login URI agentUri = null; - //String url = protocol + "://" + _ip +"/nitro/v2/config/login"; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/nitro/v2/config/" + "login", null, null); org.json.JSONObject jsonBody = new JSONObject(); org.json.JSONObject jsonCredentials = new JSONObject(); - //String loginBody= "{ \"login\": {\"username\":\"" + _username +"\", \"password\":\"" + _password +"\" }}"; jsonCredentials.put("username", _username); jsonCredentials.put("password", _password); jsonBody.put("login", jsonCredentials); @@ -360,7 +247,6 @@ public class NetScalerControlCenterResource implements ServerResource { } catch (JSONException e) { s_logger.debug("JSON Exception :" + e.getMessage()); - //throw new ConfigurationException("Failed to add the device. Please check the device is NCC and It is reachable from Management Server."); throw new ExecutionException("Failed to log in to NCC device at " + _ip + " due to " + e.getMessage()); } catch (Exception e) { throw new ExecutionException("Failed to log in to NCC device at " + _ip + " due to " + e.getMessage()); @@ -397,14 +283,12 @@ public class NetScalerControlCenterResource implements ServerResource { return execute((LoadBalancerConfigCommand)cmd, numRetries); } else if (cmd instanceof ExternalNetworkResourceUsageCommand) { return execute((ExternalNetworkResourceUsageCommand)cmd, numRetries); - } else if (cmd instanceof CreateLoadBalancerApplianceCommand) { - return execute((CreateLoadBalancerApplianceCommand)cmd, numRetries); } else if (cmd instanceof DestroyLoadBalancerApplianceCommand) { - return execute((DestroyLoadBalancerApplianceCommand)cmd, numRetries); + return Answer.createUnsupportedCommandAnswer(cmd); } else if (cmd instanceof SetStaticNatRulesCommand) { return execute((SetStaticNatRulesCommand)cmd, numRetries); } else if (cmd instanceof GlobalLoadBalancerConfigCommand) { - return execute((GlobalLoadBalancerConfigCommand)cmd, numRetries); + return Answer.createUnsupportedCommandAnswer(cmd); } else if (cmd instanceof HealthCheckLBConfigCommand) { return execute((HealthCheckLBConfigCommand)cmd, numRetries); } else if (cmd instanceof NetScalerImplementNetworkCommand ) { @@ -423,32 +307,25 @@ public class NetScalerControlCenterResource implements ServerResource { return new MaintainAnswer(cmd); } - private String queryAsyncJob(String jobId) { + private void keepSessionAlive() throws ExecutionException { + URI agentUri = null; + try { + agentUri = + new URI("https", null, _ip, DEFAULT_PORT, + "/cs/cca/v1/cloudstacks", null, null); + org.json.JSONObject jsonBody = new JSONObject(); + getHttpRequest(jsonBody.toString(), agentUri, _sessionid); + s_logger.debug("Keeping Session Alive"); + } catch (URISyntaxException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private String queryAsyncJob(String jobId) throws ExecutionException { String result = null; try { - // If a previous session was open, log it out. - //logout(); -/* Polling for async tasks: - URL: http://10.102.31.78/admin/v1/journalcontexts/ - Rwsponse: - - { - "journalcontext": { - "id": "ctxt-6cfd63ba-b4d2-413d-af2d-caa6f1dc5cd9", - "start_time": "2015-07-16T09:47:50.596664", - "end_time": "2015-07-16T09:47:50.636356", - "name": "Update devices", - "service_name": "admin", - "is_default": false, - "scopes": [], - "status": "Finished", - "message": "Done" - } - } -*/ - URI agentUri = null; - //String url = protocol + "://" + _ip +"/nitro/v2/config/login"; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/admin/v1/journalcontexts/" + jobId, null, null); @@ -461,49 +338,40 @@ public class NetScalerControlCenterResource implements ServerResource { JSONObject response = new JSONObject(result); if(response != null ) { s_logger.debug("Job Status result for ["+jobId + "]:: " + result + " Tick and currentTime :" + System.currentTimeMillis() +" -" + startTick + "job cmd timeout :" +_nccCmdTimeout); - String status = response.getJSONObject("journalcontext").getString("status"); + String status = response.getJSONObject("journalcontext").getString("status").toUpperCase(); + String message = response.getJSONObject("journalcontext").getString("message"); s_logger.debug("Job Status Progress Status ["+ jobId + "]:: " + status); switch(status) { - case "Finished": + case "FINISHED": return status; - case "In Progress": + case "IN PROGRESS": break; - case "ERROR, ROLLBACK_IN_PROGRESS": + case "ERROR, ROLLBACK IN PROGRESS": break; - //return status; - case "ERROR, ROLLBACK_COMPLETED": - break; - //return status; - case "ERROR, ROLLBACK_FAILED": - break; - //return status; + case "ERROR, ROLLBACK COMPLETED": + throw new ExecutionException("ERROR, ROLLBACK COMPLETED " + message); + case "ERROR, ROLLBACK FAILED": + throw new ExecutionException("ERROR, ROLLBACK FAILED " + message); } } } - //s_logger.debug("List of Service Packages in NCC:: " + result); - //return result; } catch (URISyntaxException e) { String errMsg = "Could not generate URI for NetScaler ControlCenter"; s_logger.error(errMsg, e); - - } catch (Exception e) { - //throw new ExecutionException("Failed to log in to NCC device at " + _ip + " due to " + e.getMessage()); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } return result; } private synchronized Answer execute(NetScalerImplementNetworkCommand cmd, int numRetries) { String result = null; try { - // If a previous session was open, log it out. - //logout(); - //http://10.102.31.78/nitro/v2/config/login URI agentUri = null; - //String url = protocol + "://" + _ip +"/nitro/v2/config/login"; - //url: /cs/cca/networks agentUri = new URI("https", null, _ip, DEFAULT_PORT, - "/cs/cca/v1/networks", null, null); + "/cs/adcaas/v1/networks", null, null); org.json.JSONObject jsonBody = new JSONObject(cmd.getDetails()); s_logger.debug("Sending Network Implement to NCC:: " + jsonBody); result = postHttpRequest(jsonBody.toString(), agentUri, _sessionid); @@ -515,9 +383,13 @@ public class NetScalerControlCenterResource implements ServerResource { String errMsg = "Could not generate URI for NetScaler ControlCenter "; s_logger.error(errMsg, e); } catch (ExecutionException e) { - if(e.getMessage().equalsIgnoreCase("NOTFOUND")) { + if(e.getMessage().equalsIgnoreCase(NccHttpCode.NOT_FOUND)) { return new Answer(cmd, true, "Successfully unallocated the device"); - } else { + }else if(e.getMessage().startsWith("ERROR, ROLLBACK") ) { + s_logger.error(e.getMessage()); + return new Answer(cmd, false, e.getMessage()); + } + else { if (shouldRetry(numRetries)) { s_logger.debug("Retrying the command NetScalerImplementNetworkCommand retry count: " + numRetries ); return retry(cmd, numRetries); @@ -538,41 +410,12 @@ public class NetScalerControlCenterResource implements ServerResource { } private synchronized Answer execute(IpAssocCommand cmd, int numRetries) { - if (_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } String[] results = new String[cmd.getIpAddresses().length]; int i = 0; - try { - IpAddressTO[] ips = cmd.getIpAddresses(); - for (IpAddressTO ip : ips) { - long guestVlanTag = Long.parseLong(ip.getBroadcastUri()); - String vlanSelfIp = ip.getVlanGateway(); - String vlanNetmask = ip.getVlanNetmask(); - - if (ip.isAdd()) { - // Add a new guest VLAN and its subnet and bind it to private interface - addGuestVlanAndSubnet(guestVlanTag, vlanSelfIp, vlanNetmask, true); - } else { - // Check and delete guest VLAN with this tag, self IP, and netmask - deleteGuestVlan(guestVlanTag, vlanSelfIp, vlanNetmask); - } - - saveConfiguration(); - results[i++] = ip.getPublicIp() + " - success"; - String action = ip.isAdd() ? "associate" : "remove"; - if (s_logger.isDebugEnabled()) { - s_logger.debug("Netscaler load balancer " + _ip + " successfully executed IPAssocCommand to " + action + " IP " + ip); - } - } - } catch (ExecutionException e) { - s_logger.error("Netscaler loadbalancer " + _ip + " failed to execute IPAssocCommand due to " + e.getMessage()); - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } else { - results[i++] = IpAssocAnswer.errorResult; - } + IpAddressTO[] ips = cmd.getIpAddresses(); + for (IpAddressTO ip : ips) { + results[i++] = ip.getPublicIp() + " - success"; } return new IpAssocAnswer(cmd, results); @@ -583,39 +426,29 @@ public class NetScalerControlCenterResource implements ServerResource { List hcLB = new ArrayList(); try { - if (_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - LoadBalancerTO[] loadBalancers = cmd.getLoadBalancers(); if (loadBalancers == null) { return new HealthCheckLBConfigAnswer(hcLB); } - - for (LoadBalancerTO loadBalancer : loadBalancers) { - HealthCheckPolicyTO[] healthCheckPolicies = loadBalancer.getHealthCheckPolicies(); - if ((healthCheckPolicies != null) && (healthCheckPolicies.length > 0) && (healthCheckPolicies[0] != null)) { - String nsVirtualServerName = generateNSVirtualServerName(loadBalancer.getSrcIp(), loadBalancer.getSrcPort()); - - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, nsVirtualServerName); - - if (serviceBindings != null) { - for (DestinationTO destination : loadBalancer.getDestinations()) { - String nsServiceName = generateNSServiceName(destination.getDestIp(), destination.getDestPort()); - for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { - if (nsServiceName.equalsIgnoreCase(binding.get_servicename())) { - destination.setMonitorState(binding.get_curstate()); - break; - } - } - } - hcLB.add(loadBalancer); + String result = getLBHealthChecks(cmd.getNetworkId()); + JSONObject res = new JSONObject(result); + JSONArray lbstatus = res.getJSONArray("lbhealthstatus"); + for(int i=0; i listDestTo = new ArrayList(); + for(int d=0; d= 1)) { - new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip + - " as there are no VPX images on SDX to use for creating VPX.")); - } - String imageName = vpxImages[0].get_file_name(); - ns_obj.set_image_name(imageName); - - String publicIf = _publicInterface; - String privateIf = _privateInterface; - - // enable only the interfaces that will be used by VPX - enableVPXInterfaces(_publicInterface, _privateInterface, ns_obj); - - // create new VPX instance - ns newVpx = ns.add(_netscalerSdxService, ns_obj); - - if (newVpx == null) { - return new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip)); - } - - // wait for VPX instance to start-up - long startTick = System.currentTimeMillis(); - long startWaitMilliSeconds = 600000; - while (!newVpx.get_instance_state().equalsIgnoreCase("up") && System.currentTimeMillis() - startTick < startWaitMilliSeconds) { - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - } - ns refreshNsObj = new ns(); - refreshNsObj.set_id(newVpx.get_id()); - newVpx = ns.get(_netscalerSdxService, refreshNsObj); - } - - // if vpx instance never came up then error out - if (!newVpx.get_instance_state().equalsIgnoreCase("up")) { - return new Answer(cmd, new ExecutionException("Failed to start VPX instance " + vpxName + " created on the netscaler SDX device " + _ip)); - } - - // wait till NS service in side VPX is actually ready - startTick = System.currentTimeMillis(); - boolean nsServiceUp = false; - long nsServiceWaitMilliSeconds = 60000; - while (System.currentTimeMillis() - startTick < nsServiceWaitMilliSeconds) { - try { - nitro_service _netscalerService = new nitro_service(cmd.getLoadBalancerIP(), "https"); - _netscalerService.set_certvalidation(false); - _netscalerService.set_hostnameverification(false); - _netscalerService.set_credential(username, password); - apiCallResult = _netscalerService.login(); - if (apiCallResult.errorcode == 0) { - nsServiceUp = true; - break; - } - } catch (Exception e) { - Thread.sleep(10000); - continue; - } - } - - if (!nsServiceUp) { - return new Answer(cmd, new ExecutionException("Failed to create VPX instance " + vpxName + " on the netscaler SDX device " + _ip)); - } - - if (s_logger.isInfoEnabled()) { - s_logger.info("Successfully provisioned VPX instance " + vpxName + " on the Netscaler SDX device " + _ip); - } - - // physical interfaces on the SDX range from 10/1 to 10/8 & 1/1 to 1/8 of which two different port or same port can be used for public and private interfaces - // However the VPX instances created will have interface range start from 10/1 but will only have as many interfaces enabled while creating the VPX instance - // So due to this, we need to map public & private interface on SDX to correct public & private interface of VPX - - int publicIfnum = Integer.parseInt(_publicInterface.substring(_publicInterface.lastIndexOf("/") + 1)); - int privateIfnum = Integer.parseInt(_privateInterface.substring(_privateInterface.lastIndexOf("/") + 1)); - - if (_publicInterface.startsWith("10/") && _privateInterface.startsWith("10/")) { - if (publicIfnum == privateIfnum) { - publicIf = "10/1"; - privateIf = "10/1"; - } else if (publicIfnum > privateIfnum) { - privateIf = "10/1"; - publicIf = "10/2"; - } else { - publicIf = "10/1"; - privateIf = "10/2"; - } - } else if (_publicInterface.startsWith("1/") && _privateInterface.startsWith("1/")) { - if (publicIfnum == privateIfnum) { - publicIf = "1/1"; - privateIf = "1/1"; - } else if (publicIfnum > privateIfnum) { - privateIf = "1/1"; - publicIf = "1/2"; - } else { - publicIf = "1/1"; - privateIf = "1/2"; - } - } else if (_publicInterface.startsWith("1/") && _privateInterface.startsWith("10/")) { - publicIf = "1/1"; - privateIf = "10/1"; - } else if (_publicInterface.startsWith("10/") && _privateInterface.startsWith("1/")) { - publicIf = "10/1"; - privateIf = "1/1"; - } - - return new CreateLoadBalancerApplianceAnswer(cmd, true, "provisioned VPX instance", "NetscalerVPXLoadBalancer", "Netscaler", new NetScalerControlCenterResource(), - publicIf, privateIf, _username, _password); - } catch (Exception e) { - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } - return new CreateLoadBalancerApplianceAnswer(cmd, false, "failed to provisioned VPX instance due to " + e.getMessage(), null, null, null, null, null, null, - null); - } - } - - private Answer execute(GlobalLoadBalancerConfigCommand gslbCmd, int numRetries) { - - String lbMethod = gslbCmd.getLoadBalancerMethod(); - String persistenceType = gslbCmd.getPersistenceType(); - String serviceType = gslbCmd.getServiceType(); - boolean forRevoke = gslbCmd.isForRevoke(); - long gslbId = gslbCmd.getGslbId(); - List 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, gslbId, serviceType); - - if (sites != null) { // check if there are any sites that are participating in global load balancing - for (SiteLoadBalancerConfig site : sites) { - - String sitePrivateIP = site.getGslbProviderPrivateIp(); - String sitePublicIP = site.getGslbProviderPublicIp(); - String servicePublicIp = site.getServicePublicIp(); - String servicePublicPort = site.getServicePort(); - String siteName = GSLB.generateUniqueSiteName(sitePrivateIP, sitePublicIP, site.getDataCenterId()); - - // 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, siteName, siteType, site.getGslbProviderPrivateIp(), site.getGslbProviderPublicIp()); - } - } - - // Add/Delete GSLB service corresponding the service running on each site - String serviceName = GSLB.generateUniqueServiceName(siteName, servicePublicIp, servicePublicPort); - String monitorName = GSLB.generateGslbServiceMonitorName(servicePublicIp); - if (!site.forRevoke()) { - // create a 'gslbservice' object - GSLB.createService(_netscalerService, serviceName, site.getServiceType(), servicePublicIp, servicePublicPort, siteName); - - // Bind 'gslbservice' service object to GSLB virtual server - GSLB.createVserverServiceBinding(_netscalerService, serviceName, vserverName, site.getWeight()); - - // create a monitor for the service running on the site - GSLB.createGslbServiceMonitor(_netscalerService, servicePublicIp, serviceName); - - // bind the monitor to the GSLB service - GSLB.createGslbServiceGslbMonitorBinding(_netscalerService, monitorName, serviceName); - - } else { - - // delete GSLB service and GSLB monitor binding - GSLB.deleteGslbServiceGslbMonitorBinding(_netscalerService, monitorName, serviceName); - - // Unbind GSLB service with GSLB virtual server - GSLB.deleteVserverServiceBinding(_netscalerService, serviceName, vserverName); - - GSLB.getServiceObject(_netscalerService, serviceName); - GSLB.deleteService(_netscalerService, serviceName); - - // delete the GSLB service monitor - GSLB.deleteGslbServiceMonitor(_netscalerService, monitorName); - } - - if (site.forRevoke()) { // delete the site if its for revoke - 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.deleteVserverDomainBinding(_netscalerService, vserverName, domainName); - - if (sites != null) { - for (SiteLoadBalancerConfig site : sites) { - - String sitePrivateIP = site.getGslbProviderPrivateIp(); - String sitePublicIP = site.getGslbProviderPublicIp(); - 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, monitorName, serviceName); - - // remove binding between virtual server and services - GSLB.deleteVserverServiceBinding(_netscalerService, serviceName, vserverName); - - // delete service object - GSLB.deleteService(_netscalerService, serviceName); - - // delete GSLB site object - GSLB.deleteSite(_netscalerService, siteName); - - // delete the GSLB service monitor - GSLB.deleteGslbServiceMonitor(_netscalerService, monitorName); - } - } - - // delete GSLB virtual server - GSLB.deleteVirtualServer(_netscalerService, vserverName); - } - - saveConfiguration(); - - } catch (Exception e) { - String errMsg = "Failed to apply GSLB configuration due to " + e.getMessage(); - if (shouldRetry(numRetries)) { - return retry(gslbCmd, numRetries); - } - return new GlobalLoadBalancerConfigAnswer(false, errMsg); - } - - return new GlobalLoadBalancerConfigAnswer(true, "Successfully applied GSLB configuration."); - } - - /* - * 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 { - - // create a 'gslbsite' object representing a site - private static void createSite(nitro_service client, String siteName, String siteType, String siteIP, String sitePublicIP) throws ExecutionException { - try { - gslbsite site; - site = getSiteObject(client, siteName); - - 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) { - String errMsg = "Failed to create GSLB site: " + siteName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // delete 'gslbsite' object representing a site - private static void deleteSite(nitro_service client, String siteName) throws ExecutionException { - try { - gslbsite site = getSiteObject(client, siteName); - if (site != null) { - gslbsite_gslbservice_binding[] serviceBindings = gslbsite_gslbservice_binding.get(client, siteName); - if (serviceBindings != null && serviceBindings.length > 0) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("There are services associated with GSLB site: " + siteName + " so ignoring site deletion"); - } - } - 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) { - String errMsg = "Failed to delete GSLB site: " + siteName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // update 'gslbsite' object representing a site - private static void updateSite(nitro_service client, String siteType, String siteName, String siteIP, String sitePublicIP) throws ExecutionException { - 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); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully updated GSLB site: " + siteName); - } - - } catch (Exception e) { - String errMsg = "Failed to update GSLB site: " + siteName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // create a 'gslbvserver' object representing a globally load balanced service - private static void - createVirtualServer(nitro_service client, String vserverName, String lbMethod, String persistenceType, long persistenceId, String serviceType) - throws ExecutionException { - try { - gslbvserver vserver; - vserver = getVserverObject(client, vserverName); - - boolean isUpdateSite = false; - if (vserver == null) { - vserver = new gslbvserver(); - } else { - isUpdateSite = true; - } - - vserver.set_name(vserverName); - if ("RoundRobin".equalsIgnoreCase(lbMethod)) { - vserver.set_lbmethod("ROUNDROBIN"); - } else if ("LeastConn".equalsIgnoreCase(lbMethod)) { - vserver.set_lbmethod("LEASTCONNECTION"); - } else if ("Proximity".equalsIgnoreCase(lbMethod)) { - vserver.set_lbmethod("RTT"); - } else { - throw new ExecutionException("Unsupported LB method"); - } - vserver.set_persistencetype(persistenceType); - if ("SOURCEIP".equalsIgnoreCase(persistenceType)) { - vserver.set_persistenceid(persistenceId); - } - vserver.set_servicetype(serviceType); - vserver.set_state("ENABLED"); - vserver.set_cookietimeout(null); - vserver.set_domainname(null); - if (isUpdateSite) { - // both netmask and LB method can not be specified while update so set to null - vserver.set_netmask(null); - vserver.set_v6netmasklen(null); - gslbvserver.update(client, vserver); - } else { - gslbvserver.add(client, vserver); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully added GSLB virtual server: " + vserverName); - } - - } catch (Exception e) { - String errMsg = "Failed to add GSLB virtual server: " + vserverName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // delete 'gslbvserver' object representing a globally load balanced service - private static void deleteVirtualServer(nitro_service client, String vserverName) throws ExecutionException { - 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) { - String errMsg = "Failed to delete GSLB virtual server: " + vserverName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // enable 'gslbvserver' object representing a globally load balanced service - private static void enableVirtualServer(nitro_service client, String vserverName) throws ExecutionException { - try { - gslbvserver vserver = getVserverObject(client, vserverName); - if (vserver != null) { - gslbvserver.enable(client, vserver); - } - } catch (Exception e) { - String errMsg = "Failed to enable GSLB virtual server: " + vserverName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // disable 'gslbvserver' object representing a globally load balanced service - private static void disableVirtualServer(nitro_service client, String vserverName) throws ExecutionException { - try { - gslbvserver vserver = getVserverObject(client, vserverName); - if (vserver != null) { - gslbvserver.disable(client, vserver); - } - } catch (Exception e) { - String errMsg = "Failed to disable GSLB virtual server: " + vserverName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // update 'gslbvserver' object representing a globally load balanced service - private static void updateVirtualServer(nitro_service client, String vserverName, String lbMethod, String persistenceType, String serviceType) - throws ExecutionException { - 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) { - String errMsg = "Failed to update GSLB virtual server: " + vserverName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // create, delete, update, get the GSLB services - private static void createService(nitro_service client, String serviceName, String serviceType, String serviceIp, String servicePort, String siteName) - throws ExecutionException { - try { - gslbservice service; - service = getServiceObject(client, serviceName); - String gslbServerName = generateGslbServerName(serviceIp); - - if (!gslbServerExists(client, gslbServerName)) { - base_response apiCallResult; - com.citrix.netscaler.nitro.resource.config.basic.server nsServer = new com.citrix.netscaler.nitro.resource.config.basic.server(); - nsServer.set_name(gslbServerName); - nsServer.set_ipaddress(serviceIp); - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.add(client, nsServer); - if ((apiCallResult.errorcode != 0) && (apiCallResult.errorcode != NitroError.NS_RESOURCE_EXISTS)) { - throw new ExecutionException("Failed to add server " + gslbServerName + " due to" + apiCallResult.message); - } - } - - boolean isUpdateSite = false; - if (service == null) { - service = new gslbservice(); - } else { - isUpdateSite = true; - } - - service.set_sitename(siteName); - service.set_servername(gslbServerName); - int port = Integer.parseInt(servicePort); - service.set_port(port); - service.set_servicename(serviceName); - service.set_servicetype(serviceType); - if (isUpdateSite) { - service.set_viewip(null); - service.set_viewname(null); - 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) { - String errMsg = "Failed to created service: " + serviceName + " at site: " + siteName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - private static void deleteService(nitro_service client, String serviceName) throws ExecutionException { - 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) { - String errMsg = "Failed to delete service: " + serviceName + " due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - private static void updateService(nitro_service client, String serviceName, String serviceType, String publicIp, String publicPort, String siteName) - throws ExecutionException { - 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) { - String errMsg = "Failed to update service: " + serviceName + " at site: " + siteName + "due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - private static void createVserverServiceBinding(nitro_service client, String serviceName, String vserverName, long weight) throws ExecutionException { - String errMsg; - try { - assert (weight >= 1 && weight <= 100); - gslbvserver_gslbservice_binding binding = new gslbvserver_gslbservice_binding(); - binding.set_name(vserverName); - binding.set_servicename(serviceName); - binding.set_weight(weight); - gslbvserver_gslbservice_binding.add(client, binding); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully created service: " + serviceName + " and virtual server: " + vserverName + " binding"); - } - } catch (nitro_exception ne) { - if (ne.getErrorCode() == 273) { - return; - } - errMsg = "Failed to create service: " + serviceName + " and virtual server: " + vserverName + " binding due to " + ne.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } catch (Exception e) { - errMsg = "Failed to create service: " + serviceName + " and virtual server: " + vserverName + " binding due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - private static void deleteVserverServiceBinding(nitro_service client, String serviceName, String vserverName) throws ExecutionException { - try { - gslbvserver_gslbservice_binding[] bindings = gslbvserver_gslbservice_binding.get(client, vserverName); - 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) { - String errMsg = "Failed to create service: " + serviceName + " and virtual server: " + vserverName + " binding due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - // create, delete GSLB virtual server and domain bindings - private static void createVserverDomainBinding(nitro_service client, String vserverName, String domainName) throws ExecutionException { - String errMsg; - 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"); - } - return; - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_GSLB_DOMAIN_ALREADY_BOUND) { - return; - } - errMsg = e.getMessage(); - } catch (Exception e) { - errMsg = e.getMessage(); - } - errMsg = "Failed to create virtual server: " + vserverName + " domain name: " + domainName + " binding" + errMsg; - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - - private static void deleteVserverDomainBinding(nitro_service client, String vserverName, String domainName) throws ExecutionException { - 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) { - String errMsg = "Failed to delete virtual server: " + vserverName + " and domain " + domainName + " binding due to " + e.getMessage(); - if (s_logger.isDebugEnabled()) { - s_logger.debug(errMsg); - } - throw new ExecutionException(errMsg); - } - } - - 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 monitorName, String serviceName) { - try { - 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); - if (monitorBindings != null && monitorBindings.length > 0) { - for (gslbservice_lbmonitor_binding binding : monitorBindings) { - if (binding.get_monitor_name().equalsIgnoreCase(monitorName)) { - s_logger.info("Found a binding between monitor " + binding.get_monitor_name() + " and " + binding.get_servicename()); - gslbservice_lbmonitor_binding.delete(nsService, binding); - } - } - } - } catch (Exception e) { - s_logger.debug("Failed to delete GSLB monitor " + monitorName + " and GSLB service " + serviceName + " binding due to " + e.getMessage() + - " but moving on ..., will be cleaned up as part of GSLB " + " service delete any way.."); - } - } - - // 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 static gslbvserver getVserverObject(nitro_service client, String vserverName) { - try { - gslbvserver vserver = gslbvserver.get(client, vserverName); - return vserver; - } catch (Exception e) { - return null; - } - } - - 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, long dataCenterId) { - return "cloudsite" + String.valueOf(dataCenterId); - } - - 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; - } - - 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) { - return true; - } else { - return false; - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; - } else { - throw new ExecutionException("Failed to verify Server " + serverName + " exists on the NetScaler device due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify Server " + serverName + " exists on the NetScaler device due to " + e.getMessage()); - } - } - - private static String generateGslbServerName(String serverIP) { - return genGslbObjectName("Cloud-Server-", serverIP); - } - - private static String genGslbObjectName(Object... args) { - StringBuffer buff = new StringBuffer(); - for (int i = 0; i < args.length; i++) { - buff.append(args[i]); - if (i != args.length - 1) { - buff.append("-"); - } - } - return buff.toString(); - } - } - - /* SSL Termination */ - private static class SSL { - - private static final String SSL_CERT_PATH = "/nsconfig/ssl/"; - private static final int SSH_PORT = 22; - - private static boolean isSslCertKeyPresent(nitro_service ns, String certKeyName) throws ExecutionException { - - String filter = "certkey:" + certKeyName; - - try { - if (sslcertkey.count_filtered(ns, filter) > 0) - return true; - } catch (nitro_exception e) { - throw new ExecutionException("Failed to get certkey " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to get certkey " + e.getMessage()); - } - - return false; - } - - private static void deleteSslCertKey(nitro_service ns, String certKeyName) throws ExecutionException { - try { - - sslcertkey certkey = new sslcertkey(); - certkey.set_certkey(certKeyName); - sslcertkey.delete(ns, certkey); - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to delete certkey " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to delete certkey " + e.getMessage()); - } - - } - - private static void deleteCertFile(String nsIp, String username, String password, String certFilename) throws Exception { - SshHelper.sshExecute(nsIp, SSH_PORT, username, null, password, "shell rm " + SSL_CERT_PATH + certFilename); - } - - private static void deleteKeyFile(String nsIp, String username, String password, String keyFilename) throws Exception { - SshHelper.sshExecute(nsIp, SSH_PORT, username, null, password, "shell rm " + SSL_CERT_PATH + keyFilename); - } - - private static void createSslCertKey(nitro_service ns, String certFilename, String keyFilename, String certKeyName, String password) throws ExecutionException { - s_logger.debug("Adding cert to netscaler"); - try { - sslcertkey certkey = new sslcertkey(); - certkey.set_certkey(certKeyName); - certkey.set_cert(SSL_CERT_PATH + certFilename); - - if (keyFilename != null) - certkey.set_key(SSL_CERT_PATH + keyFilename); - - if (password != null) { - certkey.set_passplain(password); - } - - certkey.perform_operation(ns); - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to add certkey binding " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to add certkey binding " + e.getMessage()); - } - - } - - public static void updateCertKey(nitro_service ns, String certKeyName, String cert, String key, String password) throws ExecutionException { - try { - sslcertkey certkey = sslcertkey.get(ns, certKeyName); - if (cert != null) - certkey.set_cert(cert); - if (key != null) - certkey.set_key(cert); - if (password != null) - certkey.set_passplain(cert); - - sslcertkey.change(ns, certkey); - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to update ssl on load balancer due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to update ssl on load balancer due to " + e.getMessage()); - } - } - - private static void bindCertKeyToVserver(nitro_service ns, String certKeyName, String vserver) throws ExecutionException { - s_logger.debug("Adding cert to netscaler"); - - try { - sslvserver_sslcertkey_binding cert_binding = new sslvserver_sslcertkey_binding(); - cert_binding.set_certkeyname(certKeyName); - cert_binding.set_vservername(vserver); - cert_binding.perform_operation(ns); - } catch (nitro_exception e) { - throw new ExecutionException("Failed to bind certkey to vserver due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to bind certkey to vserver due to " + e.getMessage()); - } - } - - private static void unbindCertKeyFromVserver(nitro_service ns, String certKeyName, String vserver) throws ExecutionException { - try { - - sslvserver_sslcertkey_binding cert_binding = new sslvserver_sslcertkey_binding(); - cert_binding.set_certkeyname(certKeyName); - cert_binding.set_vservername(vserver); - sslvserver_sslcertkey_binding.delete(ns, cert_binding); - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to unbind certkey to vserver due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to unbind certkey to vserver due to " + e.getMessage()); - } - - } - - private static void uploadCert(String nsIp, String user, String password, String certFilename, byte[] certData) throws ExecutionException { - try { - SshHelper.scpTo(nsIp, SSH_PORT, user, null, password, SSL_CERT_PATH, certData, certFilename, null); - } catch (Exception e) { - throw new ExecutionException("Failed to copy private key to device " + e.getMessage()); - } - } - - private static void uploadKey(String nsIp, String user, String password, String keyFilename, byte[] keyData) throws ExecutionException { - try { - SshHelper.scpTo(nsIp, SSH_PORT, user, null, password, SSL_CERT_PATH, keyData, keyFilename, null); - } catch (Exception e) { - throw new ExecutionException("Failed to copy private key to device " + e.getMessage()); - } - } - - private static void enableSslFeature(nitro_service ns, boolean isSdx) throws ExecutionException { - if (isSdx) { - return; - } - try { - base_response result = ns.enable_features(new String[] {"SSL"}); - if (result.errorcode != 0) - throw new ExecutionException("Unable to enable SSL on LB"); - } catch (nitro_exception e) { - throw new ExecutionException("Failed to enable ssl feature on load balancer due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to enable ssl feature on load balancer due to " + e.getMessage()); - } - } - - public static boolean checkSslFeature(nitro_service ns) throws ExecutionException { - try { - String[] features = ns.get_enabled_features(); - if (features != null) { - for (String feature : features) { - if (feature.equalsIgnoreCase("SSL")) { - return true; - } - } - } - return false; - } catch (nitro_exception e) { - throw new ExecutionException("Failed to check ssl feature on load balancer due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to check ssl feature on load balancer due to " + e.getMessage()); - } - } - - public static boolean certLinkExists(nitro_service ns, String userCertName, String caCertName) throws ExecutionException { - try { - // check if there is a link from userCertName to caCertName - - sslcertkey userCert = sslcertkey.get(ns, userCertName); - String nsCaCert = userCert.get_linkcertkeyname(); - - if (nsCaCert != null && nsCaCert.equals(caCertName)) - return true; - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to check cert link on load balancer to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to check cert link on load balancer due to " + e.getMessage()); - } - return false; - } - - public static void linkCerts(nitro_service ns, String userCertName, String caCertName) throws ExecutionException { - try { - - // the assumption is that that both userCertName and caCertName are present on NS - - sslcertkey caCert = sslcertkey.get(ns, caCertName); - sslcertkey userCert = sslcertkey.get(ns, userCertName); - - sslcertkey linkResource = new sslcertkey(); - - // link user cert to CA cert - linkResource.set_certkey(userCert.get_certkey()); - linkResource.set_linkcertkeyname(caCert.get_certkey()); - sslcertkey.link(ns, linkResource); - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to check cert link on load balancer to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to check cert link on load balancer due to " + e.getMessage()); - } - - } - - public static boolean isCaforCerts(nitro_service ns, String caCertName) throws ExecutionException { - // check if this certificate serves as a CA for other certificates - try { - sslcertlink[] childLinks = sslcertlink.get_filtered(ns, "linkcertkeyname:" + caCertName); - if (childLinks != null && childLinks.length > 0) { - return true; - } - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to check cert link on load balancer to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to check cert link on load balancer due to " + e.getMessage()); - } - return false; - - } - - public static boolean isBoundToVserver(nitro_service ns, String certKeyName, String nsVirtualServerName) throws ExecutionException { - try { - - sslcertkey_sslvserver_binding[] cert_vs_binding = sslcertkey_sslvserver_binding.get_filtered(ns, certKeyName, "vservername:" + nsVirtualServerName); - if (cert_vs_binding != null && cert_vs_binding.length > 0) { - return true; - } - - } catch (nitro_exception e) { - throw new ExecutionException("Failed to check cert link on load balancer to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to check cert link on load balancer due to " + e.getMessage()); - } - return false; - - } - } - - private void enableVPXInterfaces(String publicIf, String privateIf, ns nsObj) { - // enable VPX to use 10 gigabit Ethernet interfaces if public/private interface - // on SDX is a 10Gig interface - if (publicIf.equals("10/1") || privateIf.equals("10/1")) { - nsObj.set_if_10_1(new Boolean(true)); - } - - if (publicIf.equals("10/2") || privateIf.equals("10/2")) { - nsObj.set_if_10_2(new Boolean(true)); - } - - if (publicIf.equals("10/3") || privateIf.equals("10/3")) { - nsObj.set_if_10_3(new Boolean(true)); - } - - if (publicIf.equals("10/4") || privateIf.equals("10/4")) { - nsObj.set_if_10_4(new Boolean(true)); - } - - if (publicIf.equals("10/5") || privateIf.equals("10/5")) { - nsObj.set_if_10_5(new Boolean(true)); - } - - if (publicIf.equals("10/6") || privateIf.equals("10/6")) { - nsObj.set_if_10_6(new Boolean(true)); - } - - if (publicIf.equals("10/7") || privateIf.equals("10/7")) { - nsObj.set_if_10_7(new Boolean(true)); - } - - if (publicIf.equals("10/8") || privateIf.equals("10/8")) { - nsObj.set_if_10_8(new Boolean(true)); - } - - // enable VPX to use 1 gigabit Ethernet interfaces if public/private interface - // on SDX is a 1Gig interface - if (publicIf.equals("1/1") || privateIf.equals("1/1")) { - nsObj.set_if_1_1(new Boolean(true)); - } - - if (publicIf.equals("1/2") || privateIf.equals("1/2")) { - nsObj.set_if_1_2(new Boolean(true)); - } - - if (publicIf.equals("1/3") || privateIf.equals("1/3")) { - nsObj.set_if_1_3(new Boolean(true)); - } - - if (publicIf.equals("1/4") || privateIf.equals("1/4")) { - nsObj.set_if_1_4(new Boolean(true)); - } - - if (publicIf.equals("1/5") || privateIf.equals("1/5")) { - nsObj.set_if_1_5(new Boolean(true)); - } - - if (publicIf.equals("1/6") || privateIf.equals("1/6")) { - nsObj.set_if_1_6(new Boolean(true)); - } - - if (publicIf.equals("1/7") || privateIf.equals("1/7")) { - nsObj.set_if_1_7(new Boolean(true)); - } - - if (publicIf.equals("1/8") || privateIf.equals("1/8")) { - nsObj.set_if_1_8(new Boolean(true)); - } - } - - private synchronized Answer execute(DestroyLoadBalancerApplianceCommand cmd, int numRetries) { - String vpxName = "Cloud-VPX-" + cmd.getLoadBalancerIP(); - if (!_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - - try { - ns vpxToDelete = null; - ns[] vpxInstances = ns.get(_netscalerSdxService); - for (ns vpx : vpxInstances) { - if (vpx.get_name().equals(vpxName)) { - vpxToDelete = vpx; - break; - } - } - - if (vpxToDelete == null) { - String msg = "There is no VPX instance " + vpxName + " on the Netscaler SDX device " + _ip + " to delete"; - s_logger.warn(msg); - return new DestroyLoadBalancerApplianceAnswer(cmd, true, msg); - } - - // destroy the VPX instance - ns nsDelObj = new ns(); - nsDelObj.set_id(vpxToDelete.get_id()); - vpxToDelete = ns.delete(_netscalerSdxService, nsDelObj); - String msg = "Deleted VPX instance " + vpxName + " on Netscaler SDX " + _ip + " successfully."; - s_logger.info(msg); - return new DestroyLoadBalancerApplianceAnswer(cmd, true, msg); - } catch (Exception e) { - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } - return new DestroyLoadBalancerApplianceAnswer(cmd, false, "Failed to delete VPX instance " + vpxName + " on Netscaler SDX " + _ip); - } - } - private synchronized Answer execute(SetStaticNatRulesCommand cmd, int numRetries) { - - if (_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - - String[] results = new String[cmd.getRules().length]; - int i = 0; - boolean endResult = true; - - try { - for (StaticNatRuleTO rule : cmd.getRules()) { - String srcIp = rule.getSrcIp(); - String dstIP = rule.getDstIp(); - String iNatRuleName = generateInatRuleName(srcIp, dstIP); - String rNatRuleName = generateRnatRuleName(srcIp, dstIP); - inat iNatRule = null; - rnat rnatRule = null; - - if (!rule.revoked()) { - try { - iNatRule = inat.get(_netscalerService, iNatRuleName); - } catch (nitro_exception e) { - if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) { - throw e; - } - } - - if (iNatRule == null) { - iNatRule = new inat(); - iNatRule.set_name(iNatRuleName); - iNatRule.set_publicip(srcIp); - iNatRule.set_privateip(dstIP); - iNatRule.set_usnip("OFF"); - iNatRule.set_usip("ON"); - try { - apiCallResult = inat.add(_netscalerService, iNatRule); - } catch (nitro_exception e) { - if (e.getErrorCode() != NitroError.NS_RESOURCE_EXISTS) { - throw e; - } - } - s_logger.debug("Created Inat rule on the Netscaler device " + _ip + " to enable static NAT from " + srcIp + " to " + dstIP); - } - try { - rnat[] rnatRules = rnat.get(_netscalerService); - if (rnatRules != null) { - for (rnat rantrule : rnatRules) { - if (rantrule.get_network().equalsIgnoreCase(rNatRuleName)) { - rnatRule = rantrule; - break; - } - } - } - } catch (nitro_exception e) { - throw e; - } - - if (rnatRule == null) { - rnatRule = new rnat(); - rnatRule.set_natip(srcIp); - rnatRule.set_network(dstIP); - rnatRule.set_netmask("255.255.255.255"); - try { - apiCallResult = rnat.update(_netscalerService, rnatRule); - } catch (nitro_exception e) { - if (e.getErrorCode() != NitroError.NS_RESOURCE_EXISTS) { - throw e; - } - } - s_logger.debug("Created Rnat rule on the Netscaler device " + _ip + " to enable revese static NAT from " + dstIP + " to " + srcIp); - } - } else { - try { - inat.delete(_netscalerService, iNatRuleName); - rnat[] rnatRules = rnat.get(_netscalerService); - if (rnatRules != null) { - for (rnat rantrule : rnatRules) { - if (rantrule.get_network().equalsIgnoreCase(dstIP)) { - rnatRule = rantrule; - rnat.clear(_netscalerService, rnatRule); - break; - } - } - } - } catch (nitro_exception e) { - if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) { - throw e; - } - } - s_logger.debug("Deleted Inat rule on the Netscaler device " + _ip + " to remove static NAT from " + srcIp + " to " + dstIP); - } - - saveConfiguration(); - results[i++] = "Static nat rule from " + srcIp + " to " + dstIP + " successfully " + (rule.revoked() ? " revoked." : " created."); - } - } catch (Exception e) { - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } - results[i++] = "Configuring static nat rule failed due to " + e.getMessage(); - endResult = false; - return new SetStaticNatRulesAnswer(cmd, results, endResult); - } - - return new SetStaticNatRulesAnswer(cmd, results, endResult); + return Answer.createUnsupportedCommandAnswer(cmd); } private synchronized Answer execute(ExternalNetworkResourceUsageCommand cmd, int numRetries) { try { - if (!_isSdx) { - return getPublicIpBytesSentAndReceived(cmd); - } else { - return Answer.createUnsupportedCommandAnswer(cmd); - } + + return getPublicIpBytesSentAndReceived(cmd); + } catch (ExecutionException e) { if (shouldRetry(numRetries)) { return retry(cmd, numRetries); @@ -2047,439 +550,6 @@ public class NetScalerControlCenterResource implements ServerResource { } } - private void addSubnetIP(String snip, String netmask) throws ExecutionException { - try { - nsip selfIp = new nsip(); - selfIp.set_ipaddress(snip); - selfIp.set_netmask(netmask); - selfIp.set_type("SNIP"); - apiCallResult = nsip.add(_netscalerService, selfIp); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to " + e.getMessage()); - } - } - - private void addGuestVlanAndSubnet(long vlanTag, String vlanSelfIp, String vlanNetmask, boolean guestVlan) throws ExecutionException { - try { - // add vlan object for guest VLAN - if (!nsVlanExists(vlanTag)) { - try { - vlan vlanObj = new vlan(); - vlanObj.set_id(vlanTag); - apiCallResult = vlan.add(_netscalerService, vlanObj); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to add new vlan with tag:" + vlanTag + "on the NetScaler device due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to add new vlan with tag:" + vlanTag + "on the NetScaler device due to " + e.getMessage()); - } - } - - // add subnet IP object for this guest network - if (!nsSnipExists(vlanSelfIp)) { - try { - nsip selfIp = new nsip(); - selfIp.set_ipaddress(vlanSelfIp); - selfIp.set_netmask(vlanNetmask); - selfIp.set_type("SNIP"); - apiCallResult = nsip.add(_netscalerService, selfIp); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to add SNIP object for the guest network on the Netscaler device due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to add SNIP object for the guest network on the Netscaler device due to " + e.getMessage()); - } - } - - // bind the vlan object to subnet IP object - if (!nsVlanNsipBindingExists(vlanTag, vlanSelfIp)) { - try { - vlan_nsip_binding ipVlanBinding = new vlan_nsip_binding(); - ipVlanBinding.set_id(vlanTag); - ipVlanBinding.set_ipaddress(vlanSelfIp); - ipVlanBinding.set_netmask(vlanNetmask); - apiCallResult = vlan_nsip_binding.add(_netscalerService, ipVlanBinding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to bind VLAN with tag:" + vlanTag + " to the subnet due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to bind VLAN with tage:" + vlanTag + " to the subnet due to " + e.getMessage()); - } - } - - // bind vlan object to the private interface - try { - vlan_interface_binding vlanBinding = new vlan_interface_binding(); - if (guestVlan) { - vlanBinding.set_ifnum(_privateInterface); - } else { - vlanBinding.set_ifnum(_publicInterface); - } - vlanBinding.set_tagged(true); - vlanBinding.set_id(vlanTag); - apiCallResult = vlan_interface_binding.add(_netscalerService, vlanBinding); - if (apiCallResult.errorcode != 0) { - String vlanInterface = guestVlan ? _privateInterface : _publicInterface; - throw new ExecutionException("Failed to bind vlan with tag:" + vlanTag + " with the interface " + vlanInterface + " due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - if (!(e.getErrorCode() == NitroError.NS_INTERFACE_ALREADY_BOUND_TO_VLAN)) { - throw new ExecutionException("Failed to bind VLAN " + vlanTag + " with interface on the Netscaler device due to " + e.getMessage()); - } - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to implement guest network on the Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to implement guest network on the Netscaler device due to " + e.getMessage()); - } - } - - private void deleteGuestVlan(long vlanTag, String vlanSelfIp, String vlanNetmask) throws ExecutionException { - try { - - // Delete all servers and associated services from this guest VLAN - deleteServersInGuestVlan(vlanTag, vlanSelfIp, vlanNetmask); - - // unbind vlan to the private interface - try { - vlan_interface_binding vlanIfBinding = new vlan_interface_binding(); - vlanIfBinding.set_id(vlanTag); - vlanIfBinding.set_ifnum(_privateInterface); - vlanIfBinding.set_tagged(true); - apiCallResult = vlan_interface_binding.delete(_netscalerService, vlanIfBinding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the private interface due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - // if Vlan to interface binding does not exist then ignore the exception and proceed - if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { - throw new ExecutionException("Failed to unbind vlan from the interface while shutdown of guest network on the Netscaler device due to " + - e.getMessage()); - } - } - - // unbind the vlan to subnet - try { - vlan_nsip_binding vlanSnipBinding = new vlan_nsip_binding(); - vlanSnipBinding.set_netmask(vlanNetmask); - vlanSnipBinding.set_ipaddress(vlanSelfIp); - vlanSnipBinding.set_id(vlanTag); - apiCallResult = vlan_nsip_binding.delete(_netscalerService, vlanSnipBinding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the subnet due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - // if Vlan to subnet binding does not exist then ignore the exception and proceed - if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { - throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the subnet due to " + e.getMessage()); - } - } - - // remove subnet IP - try { - nsip _vlanSelfIp = new nsip(); - _vlanSelfIp.set_ipaddress(vlanSelfIp); - - nsip subnetIp = nsip.get(_netscalerService, _vlanSelfIp); - apiCallResult = nsip.delete(_netscalerService, subnetIp); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove subnet ip:" + vlanSelfIp + " from the NetScaler device due to" + apiCallResult.message); - } - } catch (nitro_exception e) { - // if subnet SNIP does not exist then ignore the exception and proceed - if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { - throw new ExecutionException("Failed to remove subnet ip:" + vlanSelfIp + " from the NetScaler device due to" + e.getMessage()); - } - } - - // remove the vlan from the NetScaler device - if (nsVlanExists(vlanTag)) { - // remove vlan - apiCallResult = com.citrix.netscaler.nitro.resource.config.network.vlan.delete(_netscalerService, vlanTag); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove vlan with tag:" + vlanTag + "due to" + apiCallResult.message); - } - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to delete guest vlan network on the Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to delete guest vlan network on the Netscaler device due to " + e.getMessage()); - } - } - - private boolean nsVlanExists(long vlanTag) throws ExecutionException { - try { - if (vlan.get(_netscalerService, new Long(vlanTag)) != null) { - return true; - } else { - return false; - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; - } else { - throw new ExecutionException("Failed to verify VLAN exists on the NetScaler device due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify VLAN exists on the NetScaler device due to " + e.getMessage()); - } - } - - private boolean nsSnipExists(String subnetIp) throws ExecutionException { - try { - nsip _subnetIp = new nsip(); - _subnetIp.set_ipaddress(subnetIp); - - nsip snip = nsip.get(_netscalerService, _subnetIp); - return (snip != null); - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; - } else { - throw new ExecutionException("Failed to verify if SNIP exists on the NetScaler device due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify if SNIP exists on the NetScaler device due to " + e.getMessage()); - } - } - - private boolean nsServerExists(String serverName) throws ExecutionException { - try { - if (com.citrix.netscaler.nitro.resource.config.basic.server.get(_netscalerService, serverName) != null) { - return true; - } else { - return false; - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; - } else { - throw new ExecutionException("Failed to verify Server " + serverName + " exists on the NetScaler device due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify Server " + serverName + " exists on the NetScaler device due to " + e.getMessage()); - } - } - - private boolean nsVirtualServerExists(String vserverName) throws ExecutionException { - try { - if (com.citrix.netscaler.nitro.resource.config.lb.lbvserver.get(_netscalerService, vserverName) != null) { - return true; - } else { - return false; - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; - } else { - throw new ExecutionException("Failed to verify VServer " + vserverName + " exists on the NetScaler device due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify VServer " + vserverName + " exists on the NetScaler device due to " + e.getMessage()); - } - } - - private boolean nsVlanNsipBindingExists(long vlanTag, String vlanSelfIp) throws ExecutionException { - try { - vlan_nsip_binding[] vlanNsipBindings = vlan_nsip_binding.get(_netscalerService, vlanTag); - if (vlanNsipBindings != null && vlanNsipBindings[0] != null && vlanNsipBindings[0].get_ipaddress().equalsIgnoreCase(vlanSelfIp)) { - return true; - } else { - return false; - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; - } else { - throw new ExecutionException("Failed to verify Vlan " + vlanTag + " to SNIP " + vlanSelfIp + " binding exists due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify Vlan " + vlanTag + " to SNIP " + vlanSelfIp + " binding exists due to " + e.getMessage()); - } - } - - private lbvserver getVirtualServerIfExisits(String lbVServerName) throws ExecutionException { - try { - return lbvserver.get(_netscalerService, lbVServerName); - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return null; - } else { - throw new ExecutionException(e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException(e.getMessage()); - } - } - - private lbmonitor getMonitorIfExisits(String lbMonitorName) throws ExecutionException { - try { - return lbmonitor.get(_netscalerService, lbMonitorName); - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return null; - } else { - throw new ExecutionException(e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException(e.getMessage()); - } - } - - private boolean isServiceBoundToVirtualServer(String serviceName) throws ExecutionException { - try { - lbvserver[] lbservers = lbvserver.get(_netscalerService); - for (lbvserver vserver : lbservers) { - filtervalue[] filter = new filtervalue[1]; - filter[0] = new filtervalue("servicename", serviceName); - lbvserver_service_binding[] result = lbvserver_service_binding.get_filtered(_netscalerService, vserver.get_name(), filter); - if (result != null && result.length > 0) { - return true; - } - } - return false; - } catch (Exception e) { - throw new ExecutionException("Failed to verify service " + serviceName + " is bound to any virtual server due to " + e.getMessage()); - } - } - - private boolean isServiceBoundToMonitor(String nsServiceName, String nsMonitorName) throws ExecutionException { - - filtervalue[] filter = new filtervalue[1]; - filter[0] = new filtervalue("monitor_name", nsMonitorName); - service_lbmonitor_binding[] result; - try { - result = service_lbmonitor_binding.get_filtered(_netscalerService, nsServiceName, filter); - if (result != null && result.length > 0) { - return true; - } - - } catch (Exception e) { - throw new ExecutionException("Failed to verify service " + nsServiceName + " is bound to any monitor due to " + e.getMessage()); - } - return false; - } - - private boolean nsMonitorExist(String nsMonitorname) throws ExecutionException { - if (getMonitorIfExisits(nsMonitorname) != null) - return true; - else - return false; - } - - private boolean nsServiceExists(String serviceName) throws ExecutionException { - try { - if (com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService, serviceName) != null) { - return true; - } else { - return false; - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_NO_SERIVCE) { - return false; - } else { - throw new ExecutionException("Failed to verify service " + serviceName + " exists due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify service " + serviceName + " exists due to " + e.getMessage()); - } - } - - private boolean nsServiceBindingExists(String lbVirtualServer, String serviceName) throws ExecutionException { - try { - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, lbVirtualServer); - if (serviceBindings != null) { - for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { - if (serviceName.equalsIgnoreCase(binding.get_servicename())) { - return true; - } - } - } - return false; - } catch (nitro_exception e) { - throw new ExecutionException("Failed to verify lb vserver " + lbVirtualServer + "and service " + serviceName + " binding exists due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to verify lb vserver " + lbVirtualServer + "and service " + serviceName + " binding exists due to " + e.getMessage()); - } - } - - private boolean isServiceGroupBoundToVirtualServer(String nsVirtualServerName, String serviceGroupName) throws ExecutionException { - - new lbvserver_servicegroup_binding(); - - try { - lbvserver_servicegroup_binding[] result = - lbvserver_servicegroup_binding.get_filtered(_netscalerService, nsVirtualServerName, "servicegroupname:" + serviceGroupName); - if (result != null && result.length > 0) { - return true; - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify lb vserver " + nsVirtualServerName + "and servicegrop " + serviceGroupName + " binding exists due to " + - e.getMessage()); - } - return false; - - } - - private boolean nsServiceGroupExists(String lbVServerName) throws ExecutionException { - try { - return servicegroup.get(_netscalerService, lbVServerName) != null; - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; // service group does not exist - } else { - throw new ExecutionException(e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException(e.getMessage()); - } - } - - private void deleteServersInGuestVlan(long vlanTag, String vlanSelfIp, String vlanNetmask) throws ExecutionException { - try { - com.citrix.netscaler.nitro.resource.config.basic.server[] serverList = com.citrix.netscaler.nitro.resource.config.basic.server.get(_netscalerService); - - if (serverList == null) { - return; - } - - // remove the server and services associated with guest vlan - for (com.citrix.netscaler.nitro.resource.config.basic.server server : serverList) { - // check if server belong to same subnet as one associated with vlan - if (NetUtils.sameSubnet(vlanSelfIp, server.get_ipaddress(), vlanNetmask)) { - // first remove services associated with this server - com.citrix.netscaler.nitro.resource.config.basic.service serveicesList[] = - com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService); - if (serveicesList != null) { - for (com.citrix.netscaler.nitro.resource.config.basic.service svc : serveicesList) { - if (svc.get_servername().equals(server.get_ipaddress())) { - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.delete(_netscalerService, svc.get_name()); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove service:" + svc.get_name()); - } - } - } - } - // remove the server - // don't delete server which has no ip address (these servers are created by NS for autoscale - if (server.get_ipaddress() != null) { - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.delete(_netscalerService, server.get_name()); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove server:" + server.get_name()); - } - } - } - } - } catch (Exception e) { - throw new ExecutionException("Failed to delete server and services in the guest vlan:" + vlanTag + " on the Netscaler device due to: " + e.getMessage()); - } - } private String getNetScalerProtocol(LoadBalancerTO loadBalancer) throws ExecutionException { String port = Integer.toString(loadBalancer.getSrcPort()); @@ -2513,938 +583,50 @@ public class NetScalerControlCenterResource implements ServerResource { return nsProtocol; } - private void addLBVirtualServer(String virtualServerName, String publicIp, int publicPort, String lbAlgorithm, String protocol, StickinessPolicyTO[] stickyPolicies, - AutoScaleVmGroupTO vmGroupTO) throws ExecutionException { - try { - String lbMethod; - if ("roundrobin".equalsIgnoreCase(lbAlgorithm)) { - lbMethod = "ROUNDROBIN"; - } else if ("leastconn".equalsIgnoreCase(lbAlgorithm)) { - lbMethod = "LEASTCONNECTION"; - } else if ("source".equalsIgnoreCase(lbAlgorithm)) { - lbMethod = "SOURCEIPHASH"; - } else { - throw new ExecutionException("Got invalid load balancing algorithm: " + lbAlgorithm + " in the load balancing rule"); - } - - boolean vserverExisis = false; - lbvserver vserver = getVirtualServerIfExisits(virtualServerName); - if (vserver != null) { - if (!vserver.get_servicetype().equalsIgnoreCase(protocol)) { - throw new ExecutionException("Can not update virtual server:" + virtualServerName + " as current protocol:" + vserver.get_servicetype() + - " of virtual server is different from the " + " intended protocol:" + protocol); - } - vserverExisis = true; - } - // Use new vserver always for configuration - vserver = new lbvserver(); - vserver.set_name(virtualServerName); - vserver.set_ipv46(publicIp); - vserver.set_port(publicPort); - vserver.set_servicetype(protocol); - vserver.set_lbmethod(lbMethod); - - // netmask can only be set for source IP load balancer algorithm - if (!lbMethod.equalsIgnoreCase("SOURCEIPHASH")) { - vserver.set_netmask(null); - vserver.set_v6netmasklen(null); - } - - if ((stickyPolicies != null) && (stickyPolicies.length > 0) && (stickyPolicies[0] != null)) { - long timeout = 2;// netscaler default 2 min - String cookieName = null; - StickinessPolicyTO stickinessPolicy = stickyPolicies[0]; - - // get the session persistence parameters - List> paramsList = stickinessPolicy.getParams(); - for (Pair param : paramsList) { - if ("holdtime".equalsIgnoreCase(param.first())) { - timeout = Long.parseLong(param.second()); - } else if ("name".equalsIgnoreCase(param.first())) { - cookieName = param.second(); - } - } - - // configure virtual server based on the persistence method - if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - vserver.set_persistencetype("COOKIEINSERT"); - } else if (StickinessMethodType.SourceBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - vserver.set_persistencetype("SOURCEIP"); - } else if (StickinessMethodType.AppCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - vserver.set_persistencetype("RULE"); - vserver.set_rule("HTTP.REQ.HEADER(\"COOKIE\").VALUE(0).typecast_nvlist_t('=',';').value(\"" + cookieName + "\")"); - vserver.set_resrule("HTTP.RES.HEADER(\"SET-COOKIE\").VALUE(0).typecast_nvlist_t('=',';').value(\"" + cookieName + "\")"); - } else { - throw new ExecutionException("Got invalid session persistence method: " + stickinessPolicy.getMethodName() + " in the load balancing rule"); - } - - // set session persistence timeout - vserver.set_timeout(timeout); - } else { - // delete the LB stickyness policy - vserver.set_persistencetype("NONE"); - } - - if (vserverExisis) { - apiCallResult = lbvserver.update(_netscalerService, vserver); - } else { - apiCallResult = lbvserver.add(_netscalerService, vserver); - } - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to create new load balancing virtual server:" + virtualServerName + " due to " + apiCallResult.message); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Created load balancing virtual server " + virtualServerName + " on the Netscaler device"); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to create new virtual server:" + virtualServerName + " due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to create new virtual server:" + virtualServerName + " due to " + e.getMessage()); - } - } - - private void removeLBVirtualServer(String virtualServerName) throws ExecutionException { - try { - lbvserver vserver = lbvserver.get(_netscalerService, virtualServerName); - if (vserver == null) { - return; - } - apiCallResult = lbvserver.delete(_netscalerService, vserver); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to delete virtual server:" + virtualServerName + " due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return; - } else { - throw new ExecutionException("Failed remove virtual server:" + virtualServerName + " due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to remove virtual server:" + virtualServerName + " due to " + e.getMessage()); - } - } - - // Monitor related methods - private void addLBMonitor(String nsMonitorName, String lbProtocol, HealthCheckPolicyTO hcp) throws ExecutionException { - try { - // check if the monitor exists - boolean csMonitorExisis = false; - lbmonitor csMonitor = getMonitorIfExisits(nsMonitorName); - if (csMonitor != null) { - if (!csMonitor.get_type().equalsIgnoreCase(lbProtocol)) { - throw new ExecutionException("Can not update monitor :" + nsMonitorName + " as current protocol:" + csMonitor.get_type() + - " of monitor is different from the " + " intended protocol:" + lbProtocol); - } - csMonitorExisis = true; - } - if (!csMonitorExisis) { - lbmonitor csMon = new lbmonitor(); - csMon.set_monitorname(nsMonitorName); - csMon.set_type(lbProtocol); - if (lbProtocol.equalsIgnoreCase("HTTP")) { - csMon.set_httprequest(hcp.getpingPath()); - s_logger.trace("LB Protocol is HTTP, Applying ping path on HealthCheck Policy"); - } else { - s_logger.debug("LB Protocol is not HTTP, Skipping to apply ping path on HealthCheck Policy"); - } - - csMon.set_interval(hcp.getHealthcheckInterval()); - csMon.set_retries(Math.max(hcp.getHealthcheckThresshold(), hcp.getUnhealthThresshold()) + 1); - csMon.set_resptimeout(hcp.getResponseTime()); - csMon.set_failureretries(hcp.getUnhealthThresshold()); - csMon.set_successretries(hcp.getHealthcheckThresshold()); - s_logger.debug("Monitor properites going to get created :interval :: " + csMon.get_interval() + "respTimeOUt:: " + csMon.get_resptimeout() + - "failure retires(unhealththresshold) :: " + csMon.get_failureretries() + "successtries(healththresshold) ::" + csMon.get_successretries()); - lbmonitor.add(_netscalerService, csMon); - } else { - s_logger.debug("Monitor :" + nsMonitorName + " is already existing. Skipping to delete and create it"); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to create new monitor :" + nsMonitorName + " due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to create new monitor :" + nsMonitorName + " due to " + e.getMessage()); - } - } - - private void bindServiceToMonitor(String nsServiceName, String nsMonitorName) throws ExecutionException { - - try { - com.citrix.netscaler.nitro.resource.config.basic.service serviceObject = new com.citrix.netscaler.nitro.resource.config.basic.service(); - serviceObject = com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService, nsServiceName); - if (serviceObject != null) { - com.citrix.netscaler.nitro.resource.config.basic.service_lbmonitor_binding serviceMonitor = - new com.citrix.netscaler.nitro.resource.config.basic.service_lbmonitor_binding(); - serviceMonitor.set_monitor_name(nsMonitorName); - serviceMonitor.set_name(nsServiceName); - serviceMonitor.set_monstate("ENABLED"); - s_logger.debug("Trying to bind the monitor :" + nsMonitorName + " to the service :" + nsServiceName); - com.citrix.netscaler.nitro.resource.config.basic.service_lbmonitor_binding.add(_netscalerService, serviceMonitor); - s_logger.debug("Successfully binded the monitor :" + nsMonitorName + " to the service :" + nsServiceName); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to create new monitor :" + nsMonitorName + " due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to create new monitor :" + nsMonitorName + " due to " + e.getMessage()); - } - } - - private void unBindServiceToMonitor(String nsServiceName, String nsMonitorName) throws ExecutionException { - - try { - com.citrix.netscaler.nitro.resource.config.basic.service serviceObject = new com.citrix.netscaler.nitro.resource.config.basic.service(); - serviceObject = com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService, nsServiceName); - - if (serviceObject != null) { - com.citrix.netscaler.nitro.resource.config.basic.service_lbmonitor_binding serviceMonitor = - new com.citrix.netscaler.nitro.resource.config.basic.service_lbmonitor_binding(); - serviceMonitor.set_monitor_name(nsMonitorName); - serviceMonitor.set_name(nsServiceName); - s_logger.debug("Trying to unbind the monitor :" + nsMonitorName + " from the service :" + nsServiceName); - service_lbmonitor_binding.delete(_netscalerService, serviceMonitor); - s_logger.debug("Successfully unbinded the monitor :" + nsMonitorName + " from the service :" + nsServiceName); - } - - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return; - } else { - throw new ExecutionException("Failed to unbind monitor :" + nsMonitorName + "from the service :" + nsServiceName + "due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to unbind monitor :" + nsMonitorName + "from the service :" + nsServiceName + "due to " + e.getMessage()); - } - - } - - private void removeLBMonitor(String nsMonitorName) throws ExecutionException { - - try { - if (nsMonitorExist(nsMonitorName)) { - lbmonitor monitorObj = lbmonitor.get(_netscalerService, nsMonitorName); - monitorObj.set_respcode(null); - lbmonitor.delete(_netscalerService, monitorObj); - s_logger.info("Successfully deleted monitor : " + nsMonitorName); - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return; - } else { - throw new ExecutionException("Failed to delete monitor :" + nsMonitorName + " due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to delete monitor :" + nsMonitorName + " due to " + e.getMessage()); - } - - } - - public synchronized void applyAutoScaleConfig(LoadBalancerTO loadBalancer) throws Exception, ExecutionException { - - AutoScaleVmGroupTO vmGroupTO = loadBalancer.getAutoScaleVmGroupTO(); - if (!isAutoScaleSupportedInNetScaler()) { - throw new ExecutionException("AutoScale not supported in this version of NetScaler"); - } - if (loadBalancer.isRevoked() || vmGroupTO.getState().equals("revoke")) { - removeAutoScaleConfig(loadBalancer); - } else { - createAutoScaleConfig(loadBalancer); - } - // AutoScale APIs are successful executed, now save the configuration. - saveConfiguration(); - if (s_logger.isInfoEnabled()) { - s_logger.info("Successfully executed resource AutoScaleConfig"); - } - } - - @SuppressWarnings("static-access") - private synchronized boolean createAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws ExecutionException, Exception { - - String srcIp = loadBalancerTO.getSrcIp(); - int srcPort = loadBalancerTO.getSrcPort(); - String lbProtocol = getNetScalerProtocol(loadBalancerTO); - String lbAlgorithm = loadBalancerTO.getAlgorithm(); - generateAutoScaleVmGroupIdentifier(loadBalancerTO); - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Created load balancing virtual server " + nsVirtualServerName + " on the Netscaler device"); - } - addLBVirtualServer(nsVirtualServerName, srcIp, srcPort, lbAlgorithm, lbProtocol, loadBalancerTO.getStickinessPolicies(), vmGroupTO); - - String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); - if (!nsServiceGroupExists(serviceGroupName)) { - // add servicegroup lb_autoscaleGroup -autoscale POLICY -memberPort 80 - int memberPort = vmGroupTO.getMemberPort(); - try { - servicegroup serviceGroup = new servicegroup(); - serviceGroup.set_servicegroupname(serviceGroupName); - serviceGroup.set_servicetype(lbProtocol); - serviceGroup.set_autoscale("POLICY"); - serviceGroup.set_memberport(memberPort); - servicegroup.add(_netscalerService, serviceGroup); - } catch (Exception e) { - throw e; - } - } - - if (!isServiceGroupBoundToVirtualServer(nsVirtualServerName, serviceGroupName)) { - // Bind autoscale service group - // bind lb vserver lb lb_autoscaleGroup - lbvserver_servicegroup_binding vserver_servicegroup_binding = new lbvserver_servicegroup_binding(); - - try { - vserver_servicegroup_binding.set_name(nsVirtualServerName); - vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); - lbvserver_servicegroup_binding.add(_netscalerService, vserver_servicegroup_binding); - } catch (Exception e) { - throw e; - } - } - - // Create the autoscale config - if (!loadBalancerTO.getAutoScaleVmGroupTO().getState().equals("disabled")) { - // on restart of network, there might be vmgrps in disabled state, no need to create autoscale config for them - enableAutoScaleConfig(loadBalancerTO, false); - } else if (loadBalancerTO.getAutoScaleVmGroupTO().getState().equals("disabled")) { - disableAutoScaleConfig(loadBalancerTO, false); - } - - return true; - } - - @SuppressWarnings("static-access") - private synchronized boolean removeAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception, ExecutionException { - String srcIp = loadBalancerTO.getSrcIp(); - int srcPort = loadBalancerTO.getSrcPort(); - generateAutoScaleVmGroupIdentifier(loadBalancerTO); - - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); - - if (loadBalancerTO.getAutoScaleVmGroupTO().getCurrentState().equals("enabled")) { - disableAutoScaleConfig(loadBalancerTO, false); - } - - if (isServiceGroupBoundToVirtualServer(nsVirtualServerName, serviceGroupName)) { - // UnBind autoscale service group - // unbind lb vserver lb lb_autoscaleGroup - lbvserver_servicegroup_binding vserver_servicegroup_binding = new lbvserver_servicegroup_binding(); - try { - vserver_servicegroup_binding.set_name(nsVirtualServerName); - vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); - lbvserver_servicegroup_binding.delete(_netscalerService, vserver_servicegroup_binding); - } catch (Exception e) { - throw e; - } - } - - if (nsServiceGroupExists(serviceGroupName)) { - // Remove autoscale service group - com.citrix.netscaler.nitro.resource.config.basic.servicegroup serviceGroup = new com.citrix.netscaler.nitro.resource.config.basic.servicegroup(); - try { - serviceGroup.set_servicegroupname(serviceGroupName); - servicegroup.delete(_netscalerService, serviceGroup); - } catch (Exception e) { - throw e; - } - } - - removeLBVirtualServer(nsVirtualServerName); - - return true; - } - - @SuppressWarnings("static-access") - private synchronized boolean enableAutoScaleConfig(LoadBalancerTO loadBalancerTO, boolean isCleanUp) throws Exception { - String vmGroupIdentifier = generateAutoScaleVmGroupIdentifier(loadBalancerTO); - String srcIp = loadBalancerTO.getSrcIp(); - int srcPort = loadBalancerTO.getSrcPort(); - - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); - String profileName = generateAutoScaleProfileName(vmGroupIdentifier); - String timerName = generateAutoScaleTimerName(vmGroupIdentifier); - String scaleDownActionName = generateAutoScaleScaleDownActionName(vmGroupIdentifier); - String scaleUpActionName = generateAutoScaleScaleUpActionName(vmGroupIdentifier); - String mtName = generateSnmpMetricTableName(vmGroupIdentifier); - String monitorName = generateSnmpMonitorName(vmGroupIdentifier); - AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); - AutoScaleVmProfileTO profileTO = vmGroupTO.getProfile(); - List policies = vmGroupTO.getPolicies(); - int interval = vmGroupTO.getInterval(); - profileTO.getCounterParamList(); - String snmpCommunity = null; - int snmpPort = DEFAULT_SNMP_PORT; - long cur_prirotiy = 1; - - // get the session persistence parameters - List> paramsList = profileTO.getCounterParamList(); - for (Pair param : paramsList) { - if ("snmpcommunity".equalsIgnoreCase(param.first())) { - snmpCommunity = param.second(); - } else if ("snmpport".equalsIgnoreCase(param.first())) { - snmpPort = Integer.parseInt(param.second()); - } - } - - try { - // Set min and max autoscale members; - // add lb vserver lb http 10.102.31.100 80 -minAutoscaleMinMembers 3 -maxAutoscaleMembers 10 - int minAutoScaleMembers = vmGroupTO.getMinMembers(); - int maxAutoScaleMembers = vmGroupTO.getMaxMembers(); - lbvserver vserver = new lbvserver(); - try { - vserver.set_name(nsVirtualServerName); - vserver.set_minautoscalemembers(minAutoScaleMembers); - vserver.set_maxautoscalemembers(maxAutoScaleMembers); - lbvserver.update(_netscalerService, vserver); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - /* AutoScale Config */ - // Add AutoScale Profile - // add autoscale profile lb_asprofile CLOUDSTACK -url -http:// 10.102.31.34:8080/client/api- -apiKey abcdef - // -sharedSecret xyzabc - String apiKey = profileTO.getAutoScaleUserApiKey(); - String secretKey = profileTO.getAutoScaleUserSecretKey(); - String url = profileTO.getCloudStackApiUrl(); - - autoscaleprofile autoscaleProfile = new autoscaleprofile(); - try { - autoscaleProfile.set_name(profileName); - autoscaleProfile.set_type("CLOUDSTACK"); - autoscaleProfile.set_apikey(apiKey); - autoscaleProfile.set_sharedsecret(secretKey); - autoscaleProfile.set_url(url); - autoscaleprofile.add(_netscalerService, autoscaleProfile); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Add Timer - nstimer timer = new nstimer(); - try { - timer.set_name(timerName); - timer.set_interval(interval); - nstimer.add(_netscalerService, timer); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // AutoScale Actions - Integer scaleUpQuietTime = null; - Integer scaleDownQuietTime = null; - for (AutoScalePolicyTO autoScalePolicyTO : policies) { - if (scaleUpQuietTime == null) { - if (isScaleUpPolicy(autoScalePolicyTO)) { - scaleUpQuietTime = autoScalePolicyTO.getQuietTime(); - if (scaleDownQuietTime != null) { - break; - } - } - } - if (scaleDownQuietTime == null) { - if (isScaleDownPolicy(autoScalePolicyTO)) { - scaleDownQuietTime = autoScalePolicyTO.getQuietTime(); - if (scaleUpQuietTime != null) { - break; - } - } - } - } - - // Add AutoScale ScaleUp action - // add autoscale action lb_scaleUpAction provision -vserver lb -profilename lb_asprofile -params - // -lbruleid=1234&command=deployvm&zoneid=10&templateid=5&serviceofferingid=3- -quiettime 300 - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = - new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - try { - scaleUpAction.set_name(scaleUpActionName); - scaleUpAction.set_type("SCALE_UP"); // TODO: will this be called provision? - scaleUpAction.set_vserver(nsVirtualServerName); // Actions Vserver, the one that is autoscaled, with CS - // now both are same. Not exposed in API. - scaleUpAction.set_profilename(profileName); - if(scaleUpQuietTime != null) { - scaleUpAction.set_quiettime(scaleUpQuietTime); - } - String scaleUpParameters = - "command=deployVirtualMachine" + "&" + ApiConstants.ZONE_ID + "=" + profileTO.getZoneId() + "&" + ApiConstants.SERVICE_OFFERING_ID + "=" + - profileTO.getServiceOfferingId() + "&" + ApiConstants.TEMPLATE_ID + "=" + profileTO.getTemplateId() + "&" + ApiConstants.DISPLAY_NAME + "=" + - profileTO.getVmName() + "&" + ((profileTO.getNetworkId() == null) ? "" : (ApiConstants.NETWORK_IDS + "=" + profileTO.getNetworkId() + "&")) + - ((profileTO.getOtherDeployParams() == null) ? "" : (profileTO.getOtherDeployParams() + "&")) + "lbruleid=" + loadBalancerTO.getUuid(); - scaleUpAction.set_parameters(scaleUpParameters); - autoscaleaction.add(_netscalerService, scaleUpAction); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = - new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - Integer destroyVmGracePeriod = profileTO.getDestroyVmGraceperiod(); - try { - scaleDownAction.set_name(scaleDownActionName); - scaleDownAction.set_type("SCALE_DOWN"); // TODO: will this be called de-provision? - scaleDownAction.set_vserver(nsVirtualServerName); // TODO: no global option as of now through Nitro. - // Testing cannot be done. - scaleDownAction.set_profilename(profileName); - scaleDownAction.set_quiettime(scaleDownQuietTime); - String scaleDownParameters = "command=destroyVirtualMachine" + "&" + "lbruleid=" + loadBalancerTO.getUuid(); - scaleDownAction.set_parameters(scaleDownParameters); - scaleDownAction.set_vmdestroygraceperiod(destroyVmGracePeriod); - autoscaleaction.add(_netscalerService, scaleDownAction); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - /* Create min member policy */ - String minMemberPolicyName = generateAutoScaleMinPolicyName(vmGroupIdentifier); - String minMemberPolicyExp = - "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.LT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MINAUTOSCALEMEMBERS)"; - addAutoScalePolicy(timerName, minMemberPolicyName, cur_prirotiy++, minMemberPolicyExp, scaleUpActionName, interval, interval, isCleanUp); - - /* Create max member policy */ - String maxMemberPolicyName = generateAutoScaleMaxPolicyName(vmGroupIdentifier); - String maxMemberPolicyExp = - "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.GT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MAXAUTOSCALEMEMBERS)"; - addAutoScalePolicy(timerName, maxMemberPolicyName, cur_prirotiy++, maxMemberPolicyExp, scaleDownActionName, interval, interval, isCleanUp); - - /* Create Counters */ - HashMap snmpMetrics = new HashMap(); - for (AutoScalePolicyTO autoScalePolicyTO : policies) { - List conditions = autoScalePolicyTO.getConditions(); - String policyExpression = ""; - int snmpCounterNumber = 0; - for (ConditionTO conditionTO : conditions) { - CounterTO counterTO = conditionTO.getCounter(); - String counterName = counterTO.getName(); - String operator = conditionTO.getRelationalOperator(); - long threshold = conditionTO.getThreshold(); - - StringBuilder conditionExpression = new StringBuilder(); - Formatter formatter = new Formatter(conditionExpression, Locale.US); - - if (counterTO.getSource().equals("snmp")) { - counterName = generateSnmpMetricName(counterName); - if (snmpMetrics.size() == 0) { - // Create Metric Table - //add lb metricTable lb_metric_table - lbmetrictable metricTable = new lbmetrictable(); - try { - metricTable.set_metrictable(mtName); - lbmetrictable.add(_netscalerService, metricTable); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Create Monitor - // add lb monitor lb_metric_table_mon LOAD -destPort 161 -snmpCommunity public -metricTable - // lb_metric_table -interval - lbmonitor monitor = new lbmonitor(); - try { - monitor.set_monitorname(monitorName); - monitor.set_type("LOAD"); - monitor.set_destport(snmpPort); - monitor.set_snmpcommunity(snmpCommunity); - monitor.set_metrictable(mtName); - monitor.set_interval((int)(interval * 0.8)); - lbmonitor.add(_netscalerService, monitor); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Bind monitor to servicegroup. - // bind lb monitor lb_metric_table_mon lb_autoscaleGroup -passive - servicegroup_lbmonitor_binding servicegroup_monitor_binding = new servicegroup_lbmonitor_binding(); - try { - servicegroup_monitor_binding.set_servicegroupname(serviceGroupName); - servicegroup_monitor_binding.set_monitor_name(monitorName); - - // Use the monitor for autoscaling purpose only. - // Don't mark service members down when metric breaches threshold - servicegroup_monitor_binding.set_passive(true); - - servicegroup_lbmonitor_binding.add(_netscalerService, servicegroup_monitor_binding); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - } - - boolean newMetric = !snmpMetrics.containsKey(counterName); - if (newMetric) { - snmpMetrics.put(counterName, snmpCounterNumber++); - } - - if (newMetric) { - // bind lb metricTable lb_metric_table mem 1.3.6.1.4.1.2021.11.9.0 - String counterOid = counterTO.getValue(); - lbmetrictable_metric_binding metrictable_metric_binding = new lbmetrictable_metric_binding(); - try { - metrictable_metric_binding.set_metrictable(mtName); - metrictable_metric_binding.set_metric(counterName); - metrictable_metric_binding.set_Snmpoid(counterOid); - lbmetrictable_metric_binding.add(_netscalerService, metrictable_metric_binding); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // bind lb monitor lb_metric_table_mon -metric cpu -metricThreshold 1 - lbmonitor_metric_binding monitor_metric_binding = new lbmonitor_metric_binding(); - ; - try { - monitor_metric_binding.set_monitorname(monitorName); - monitor_metric_binding.set_metric(counterName); - /* - * Setting it to max to make sure traffic is not affected due to 'LOAD' monitoring. - * For Ex. if CPU is tracked and CPU is greater than 80, it is still < than Integer.MAX_VALUE - * so traffic will continue to flow. - */ - monitor_metric_binding.set_metricthreshold(Integer.MAX_VALUE); - lbmonitor_metric_binding.add(_netscalerService, monitor_metric_binding); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - } - // SYS.VSERVER("abcd").SNMP_TABLE(0).AVERAGE_VALUE.GT(80) - int counterIndex = snmpMetrics.get(counterName); // TODO: temporary fix. later on counter name - // will be added as a param to SNMP_TABLE. - formatter.format("SYS.VSERVER(\"%s\").SNMP_TABLE(%d).AVERAGE_VALUE.%s(%d)", nsVirtualServerName, counterIndex, operator, threshold); - } else if (counterTO.getSource().equals("netscaler")) { - //SYS.VSERVER("abcd").RESPTIME.GT(10) - formatter.format("SYS.VSERVER(\"%s\").%s.%s(%d)", nsVirtualServerName, counterTO.getValue(), operator, threshold); - } - if (policyExpression.length() != 0) { - policyExpression += " && "; - } - policyExpression += conditionExpression; - } - policyExpression = "(" + policyExpression + ")"; - - String policyId = Long.toString(autoScalePolicyTO.getId()); - String policyName = generateAutoScalePolicyName(vmGroupIdentifier, policyId); - String action = null; - if (isScaleUpPolicy(autoScalePolicyTO)) { - action = scaleUpActionName; - String scaleUpCondition = - "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.LT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MAXAUTOSCALEMEMBERS)"; - policyExpression = scaleUpCondition + " && " + policyExpression; - } else { - action = scaleDownActionName; - String scaleDownCondition = - "SYS.VSERVER(\"" + nsVirtualServerName + "\").ACTIVESERVICES.GT(SYS.VSERVER(\"" + nsVirtualServerName + "\").MINAUTOSCALEMEMBERS)"; - policyExpression = scaleDownCondition + " && " + policyExpression; - } - - addAutoScalePolicy(timerName, policyName, cur_prirotiy++, policyExpression, action, autoScalePolicyTO.getDuration(), interval, isCleanUp); - - } - } catch (Exception ex) { - if (!isCleanUp) { - // Normal course, exception has occurred - disableAutoScaleConfig(loadBalancerTO, true); - throw ex; - - } else { - // Programming error. Exception should never be thrown afterall. - throw ex; - } - } - - return true; - } - - @SuppressWarnings("static-access") - private synchronized boolean disableAutoScaleConfig(LoadBalancerTO loadBalancerTO, boolean isCleanUp) throws Exception { - - String vmGroupIdentifier = generateAutoScaleVmGroupIdentifier(loadBalancerTO); - - String profileName = generateAutoScaleProfileName(vmGroupIdentifier); - String timerName = generateAutoScaleTimerName(vmGroupIdentifier); - String scaleDownActionName = generateAutoScaleScaleDownActionName(vmGroupIdentifier); - String scaleUpActionName = generateAutoScaleScaleUpActionName(vmGroupIdentifier); - String mtName = generateSnmpMetricTableName(vmGroupIdentifier); - String monitorName = generateSnmpMonitorName(vmGroupIdentifier); - String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); - AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); - List policies = vmGroupTO.getPolicies(); - String minMemberPolicyName = generateAutoScaleMinPolicyName(vmGroupIdentifier); - String maxMemberPolicyName = generateAutoScaleMaxPolicyName(vmGroupIdentifier); - - try { - - /* Delete min/max member policies */ - - removeAutoScalePolicy(timerName, minMemberPolicyName, isCleanUp); - - removeAutoScalePolicy(timerName, maxMemberPolicyName, isCleanUp); - - boolean isSnmp = false; - /* Create Counters */ - for (AutoScalePolicyTO autoScalePolicyTO : policies) { - List conditions = autoScalePolicyTO.getConditions(); - for (ConditionTO conditionTO : conditions) { - CounterTO counterTO = conditionTO.getCounter(); - if (counterTO.getSource().equals("snmp")) { - isSnmp = true; - break; - } - } - String policyId = Long.toString(autoScalePolicyTO.getId()); - String policyName = generateAutoScalePolicyName(vmGroupIdentifier, policyId); - - // Removing Timer policy - removeAutoScalePolicy(timerName, policyName, isCleanUp); - } - - /* Delete AutoScale Config */ - // Delete AutoScale ScaleDown action - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = - new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - try { - scaleDownAction.set_name(scaleDownActionName); - autoscaleaction.delete(_netscalerService, scaleDownAction); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Delete AutoScale ScaleUp action - com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = - new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); - try { - scaleUpAction.set_name(scaleUpActionName); - autoscaleaction.delete(_netscalerService, scaleUpAction); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Delete Timer - nstimer timer = new nstimer(); - try { - timer.set_name(timerName); - nstimer.delete(_netscalerService, timer); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Delete AutoScale Profile - autoscaleprofile autoscaleProfile = new autoscaleprofile(); - try { - autoscaleProfile.set_name(profileName); - autoscaleprofile.delete(_netscalerService, autoscaleProfile); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - if (isSnmp) { - servicegroup_lbmonitor_binding servicegroup_monitor_binding = new servicegroup_lbmonitor_binding(); - try { - servicegroup_monitor_binding.set_monitor_name(monitorName); - servicegroup_monitor_binding.set_servicegroupname(serviceGroupName); - servicegroup_lbmonitor_binding.delete(_netscalerService, servicegroup_monitor_binding); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Delete Monitor - // rm lb monitor lb_metric_table_mon - com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); - try { - monitor.set_monitorname(monitorName); - monitor.set_type("LOAD"); - lbmonitor.delete(_netscalerService, monitor); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Delete Metric Table - com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); - try { - metricTable.set_metrictable(mtName); - lbmetrictable.delete(_netscalerService, metricTable); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - } - } catch (Exception ex) { - if (!isCleanUp) { - // Normal course, exception has occurred - enableAutoScaleConfig(loadBalancerTO, true); - throw ex; - } else { - // Programming error - throw ex; - } - } - - return true; - } - - private synchronized void addAutoScalePolicy(String timerName, String policyName, long priority, String policyExpression, String action, int duration, int interval, - boolean isCleanUp) throws Exception { - // Adding a autoscale policy - // add timer policy lb_policy_scaleUp_cpu_mem -rule - (SYS.CUR_VSERVER.METRIC_TABLE(cpu).AVG_VAL.GT(80)- - // -action lb_scaleUpAction - autoscalepolicy timerPolicy = new autoscalepolicy(); - try { - timerPolicy.set_name(policyName); - timerPolicy.set_action(action); - timerPolicy.set_rule(policyExpression); - autoscalepolicy.add(_netscalerService, timerPolicy); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // bind timer policy - // For now it is bound globally. - // bind timer trigger lb_astimer -policyName lb_policy_scaleUp -vserver lb -priority 1 -samplesize 5 - // TODO: later bind to lbvserver. bind timer trigger lb_astimer -policyName lb_policy_scaleUp -vserver lb - // -priority 1 -samplesize 5 - // -thresholdsize 5 - nstimer_autoscalepolicy_binding timer_policy_binding = new nstimer_autoscalepolicy_binding(); - int sampleSize = duration / interval; - try { - timer_policy_binding.set_name(timerName); - timer_policy_binding.set_policyname(policyName); - timer_policy_binding.set_samplesize(sampleSize); - timer_policy_binding.set_threshold(sampleSize); // We are not exposing this parameter as of now. - // i.e. n(m) is not exposed to CS user. So thresholdSize == sampleSize - timer_policy_binding.set_priority(priority); - nstimer_autoscalepolicy_binding.add(_netscalerService, timer_policy_binding); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - } - - private void removeAutoScalePolicy(String timerName, String policyName, boolean isCleanUp) throws Exception { - // unbind timer policy - // unbbind timer trigger lb_astimer -policyName lb_policy_scaleUp - nstimer_autoscalepolicy_binding timer_policy_binding = new nstimer_autoscalepolicy_binding(); - try { - timer_policy_binding.set_name(timerName); - timer_policy_binding.set_policyname(policyName); - nstimer_autoscalepolicy_binding.delete(_netscalerService, timer_policy_binding); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - // Removing Timer policy - // rm timer policy lb_policy_scaleUp_cpu_mem - autoscalepolicy timerPolicy = new autoscalepolicy(); - try { - timerPolicy.set_name(policyName); - autoscalepolicy.delete(_netscalerService, timerPolicy); - } catch (Exception e) { - // Ignore Exception on cleanup - if (!isCleanUp) - throw e; - } - - } - - private boolean isAutoScaleSupportedInNetScaler() throws ExecutionException { - new autoscaleprofile(); - try { - autoscaleprofile.get(_netscalerService); - } catch (Exception ex) { - // Looks like autoscale is not supported in this netscaler. - // TODO: Config team has introduce a new command to check - // the list of entities supported in a NetScaler. Can use that - // once it is present in AutoScale branch. - s_logger.warn("AutoScale is not supported in NetScaler"); - return false; - } - return true; - } - - private boolean isScaleUpPolicy(AutoScalePolicyTO autoScalePolicyTO) { - return autoScalePolicyTO.getAction().equals("scaleup"); - } - - private boolean isScaleDownPolicy(AutoScalePolicyTO autoScalePolicyTO) { - return autoScalePolicyTO.getAction().equals("scaledown"); - } - - private void saveConfiguration() throws ExecutionException { - try { - apiCallResult = nsconfig.save(_netscalerService); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Error occured while saving configuration changes to Netscaler device due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to save configuration changes to Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to save configuration changes to Netscaler device due to " + e.getMessage()); - } - } private ExternalNetworkResourceUsageAnswer getPublicIpBytesSentAndReceived(ExternalNetworkResourceUsageCommand cmd) throws ExecutionException { ExternalNetworkResourceUsageAnswer answer = new ExternalNetworkResourceUsageAnswer(cmd); - + long networkid = cmd.getNetworkid(); try { - lbvserver_stats[] stats = lbvserver_stats.get(_netscalerService); + //TODO send GET cmd to get the network stats - if (stats == null || stats.length == 0) { - return answer; - } + URI agentUri = null; + String response = null; + try { + agentUri = + new URI("https", null, _ip, DEFAULT_PORT, + "/cs/adcaas/v1/networks/"+ networkid +"/ipStats", null, null); + org.json.JSONObject jsonBody = new JSONObject(); + response = getHttpRequest(jsonBody.toString(), agentUri, _sessionid); + JSONArray statsIPList = null; + if(response !=null ) { + statsIPList = new JSONObject(response).getJSONObject("stats") .getJSONArray("ipBytes"); + } + if(statsIPList != null) { + for(int i=0; i= 0 && bytesSentAndReceived[1] >= 0) { - answer.ipBytes.put(lbVirtualServerIp, bytesSentAndReceived); + if (bytesSentAndReceived[0] >= 0 && bytesSentAndReceived[1] >= 0) { + answer.ipBytes.put(ipstat.getString("ip"), bytesSentAndReceived); + } + } } } + s_logger.debug("IPStats Response :" + response); + } catch (URISyntaxException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + s_logger.debug("Seesion Alive" + e.getMessage()); + e.printStackTrace(); } + } catch (Exception e) { s_logger.error("Failed to get bytes sent and recived statistics due to " + e); throw new ExecutionException(e.getMessage()); @@ -3460,135 +642,18 @@ public class NetScalerControlCenterResource implements ServerResource { } private boolean shouldRetry(int numRetries) { - //JSONObject jsonResponse = null; try { if (numRetries > 0) { login(); - /*if (response == null) { - throw new ConfigurationException("No Response Received from the NetScalerControlCenter Device"); - } else { - jsonResponse = new JSONObject(response); - org.json.JSONArray loginResponse = jsonResponse.getJSONArray("login"); - _sessionid = jsonResponse.getJSONArray("login").getJSONObject(0).getString("sessionid"); - }*/ return true; } } catch (Exception e) { s_logger.error("Failed to log in to Netscaler ControlCenter device at " + _ip + " due to " + e.getMessage()); return false; - //throw new ConfigurationException("No Response Received from the NetScalerControlCenter Device"); } return false; } - private String generateInatRuleName(String srcIp, String dstIP) { - return genObjectName("Cloud-Inat", srcIp); - } - - private String generateRnatRuleName(String srcIp, String dstIP) { - return genObjectName("Cloud-Rnat", srcIp); - } - - private String generateNSVirtualServerName(String srcIp, long srcPort) { - return genObjectName("Cloud-VirtualServer", srcIp, srcPort); - } - - private String generateNSMonitorName(String srcIp, long srcPort) { - // maximum length supported by NS is 31 - return genObjectName("Cloud-Hc", srcIp, srcPort); - } - - private String generateNSServerName(String serverIP) { - return genObjectName("Cloud-Server-", serverIP); - } - - private String generateNSServiceName(String ip, long port) { - return genObjectName("Cloud-Service", ip, port); - } - - private String generateAutoScaleVmGroupIdentifier(LoadBalancerTO lbTO) { - return lbTO.getSrcIp() + "-" + lbTO.getSrcPort(); - } - - private String generateAutoScaleServiceGroupName(LoadBalancerTO lbTO) { - /* - * ServiceGroup name in NetScaler wont support long names. Providing special name. - * Need for introducing uuid because every vmgroup creation should be distinguished. - * Ex. (1) create a vm group, delete a vmgroup, create a vmgroup on same lb ip and port - * This will reuse all vms from the original vm group in step (1) - */ - - return "Cloud" + lbTO.getAutoScaleVmGroupTO().getUuid().replace("-", ""); - } - - private String generateAutoScaleTimerName(String vmGroupIdentifier) { - return genObjectName("Cloud-AutoScale-Timer", vmGroupIdentifier); - } - - private String generateAutoScaleProfileName(String vmGroupIdentifier) { - return genObjectName("Cloud-AutoScale-Profile", vmGroupIdentifier); - } - - private String generateAutoScaleScaleUpActionName(String vmGroupIdentifier) { - return genObjectName("Cloud-AutoScale-ScaleUpAction", vmGroupIdentifier); - } - - private String generateAutoScaleScaleDownActionName(String vmGroupIdentifier) { - return genObjectName("Cloud-AutoScale-ScaleDownAction", vmGroupIdentifier); - } - - private String generateAutoScalePolicyName(String vmGroupIdentifier, String poilcyId) { - return genObjectName("Cloud-AutoScale-Policy", vmGroupIdentifier, poilcyId); - } - - private String generateAutoScaleMinPolicyName(String vmGroupIdentifier) { - return genObjectName("Cloud-AutoScale-Policy-Min", vmGroupIdentifier); - } - - private String generateAutoScaleMaxPolicyName(String vmGroupIdentifier) { - return genObjectName("Cloud-AutoScale-Policy-Max", vmGroupIdentifier); - } - - private String generateSnmpMetricTableName(String vmGroupIdentifier) { - return genObjectName("Cloud-MTbl", vmGroupIdentifier); - } - - private String generateSnmpMonitorName(String vmGroupIdentifier) { - return genObjectName("Cloud-Mon", vmGroupIdentifier); - } - - private String generateSnmpMetricName(String counterName) { - return counterName.replace(' ', '_'); - } - - private String generateSslCertName(String fingerPrint) { - // maximum length supported by NS is 31 - // the first 20 characters of the SHA-1 checksum are the unique id - String uniqueId = fingerPrint.replace(":", "").substring(0, 20); - - return genObjectName("Cloud-Cert", uniqueId); - } - - private String generateSslKeyName(String fingerPrint) { - String uniqueId = fingerPrint.replace(":", "").substring(0, 20); - return genObjectName("Cloud-Key", uniqueId); - } - - private String generateSslCertKeyName(String fingerPrint) { - String uniqueId = fingerPrint.replace(":", "").substring(0, 20); - return genObjectName("Cloud-Cert", uniqueId); - } - - private String genObjectName(Object... args) { - StringBuffer buff = new StringBuffer(); - for (int i = 0; i < args.length; i++) { - buff.append(args[i]); - if (i != args.length - 1) { - buff.append(_objectNamePathSep); - } - } - return buff.toString(); - } @Override public IAgentControl getAgentControl() { @@ -3598,19 +663,20 @@ public class NetScalerControlCenterResource implements ServerResource { private boolean refreshNCCConnection() { boolean ret = false; try { - login(); + keepSessionAlive(); return true; } catch (ExecutionException ex) { - s_logger.error("Login to NCC failed", ex); + s_logger.debug("Failed to keep up the session alive ", ex); } return ret; } @Override public PingCommand getCurrentStatus(long id) { - /*if (!refreshNCCConnection()) { - return null; - }*/ + pingCount++; + if (pingCount > 10 && refreshNCCConnection()) { + pingCount = 0; + } return new PingCommand(Host.Type.NetScalerControlCenter, id); } @@ -3741,7 +807,6 @@ public class NetScalerControlCenterResource implements ServerResource { // TODO: are there timeout settings and worker thread settings to tweak? try { - //HttpPost request = new HttpPost(agentUri); HttpGet request = new HttpGet(agentUri); // JSON encode command @@ -3750,7 +815,6 @@ public class NetScalerControlCenterResource implements ServerResource { StringEntity cmdJson = new StringEntity(jsonCmd); request.addHeader("content-type", "application/json"); request.addHeader("Cookie", "SessId=" + sessionID); - //request.setEntity(cmdJson); s_logger.debug("Sending cmd to " + agentUri.toString() + " cmd data:" + logMessage); HttpResponse response = httpClient.execute(request); @@ -3767,7 +831,6 @@ public class NetScalerControlCenterResource implements ServerResource { String errMsg = "Failed send to " + agentUri.toString() + " : HTTP error code : " + response.getStatusLine().getStatusCode(); s_logger.error(errMsg); throw new ExecutionException("UNAUTHORIZED"); - //return null; } else { result = EntityUtils.toString(response.getEntity()); String logResult = cleanPassword(StringEscapeUtils.unescapeJava(result)); @@ -3841,31 +904,25 @@ public class NetScalerControlCenterResource implements ServerResource { // Unsupported commands will not route. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND) { - String errMsg = "Failed to send : HTTP error code : " + response.getStatusLine().getStatusCode(); - throw new ExecutionException("NOT_FOUND"); - /*s_logger.error(errMsg); - String unsupportMsg = "Unsupported command " + agentUri.getPath() + ". Are you sure you got the right type of" + " server?"; - Answer ans = new UnsupportedAnswer(null, unsupportMsg); - s_logger.error(ans);*/ - //result = s_gson.toJson(new Answer[] {ans}); + String errMsg = "Failed : HTTP error code : " + response.getStatusLine().getStatusCode(); + throw new ExecutionException(NccHttpCode.NOT_FOUND); } else if ((response.getStatusLine().getStatusCode() != HttpStatus.SC_OK ) && (response.getStatusLine().getStatusCode() != HttpStatus.SC_CREATED )) { - String errMsg = "Failed send to " + agentUri.toString() + " : HTTP error code : " + response.getStatusLine().getStatusCode(); + String errMsg = "Command Not Success " + agentUri.toString() + " : HTTP error code : " + response.getStatusLine().getStatusCode(); s_logger.error(errMsg); - throw new ExecutionException("UNAUTHORIZED"); - //return null; + throw new ExecutionException(NccHttpCode.INTERNAL_ERROR + " " + errMsg); } else if (response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { //Successfully created the resource in the NCC, Now get the Job ID and send to the response // make login request and store new session id - throw new ExecutionException("UNAUTHORIZED"); + throw new ExecutionException(NccHttpCode.UNAUTHORIZED); } else if (response.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED) { //Successfully created the resource in the NCC, Now get the Job ID and send to the response - result = response.getFirstHeader("Job_id").getValue(); - //"jobid : " + + result = response.getFirstHeader(NccHttpCode.JOB_ID).getValue(); } else { result = EntityUtils.toString(response.getEntity()); String logResult = cleanPassword(StringEscapeUtils.unescapeJava(result)); s_logger.debug("POST response is " + logResult); } + } catch (ClientProtocolException protocolEx) { // Problem with HTTP message exchange s_logger.error(protocolEx); diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManager.java b/plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManager.java new file mode 100644 index 00000000000..ae1c9dac9c1 --- /dev/null +++ b/plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManager.java @@ -0,0 +1,41 @@ +//Licensed to the Apache Software Foundation (ASF) under one +//or more contributor license agreements. See the NOTICE file +//distributed with this work for additional information +//regarding copyright ownership. The ASF licenses this file +//to you under the Apache License, Version 2.0 (the +//"License"); you may not use this file except in compliance +//with the License. You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, +//software distributed under the License is distributed on an +//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +//KIND, either express or implied. See the License for the +//specific language governing permissions and limitations +//under the License. +package com.cloud.network.vm; +import java.util.Map; + +import com.cloud.api.commands.DeployNetscalerVpxCmd; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.router.VirtualRouter; +import com.cloud.user.Account; + +public interface NetScalerVMManager { + + //RAM/CPU for the system offering used by Internal LB VMs + public static final int DEFAULT_NETSCALER_VM_RAMSIZE = 2048; // 2048 MB + public static final int DEFAULT_NETSCALER_VM_CPU_MHZ = 1024; // 1024 MHz + + public Map deployNetscalerServiceVm(DeployNetscalerVpxCmd cmd); + + public VirtualRouter stopNetscalerServiceVm(Long id, boolean forced, Account callingAccount, long callingUserId) throws ConcurrentOperationException, ResourceUnavailableException; + public Map deployNsVpx(Account owner, DeployDestination dest, DeploymentPlan plan, long svcOffId, long templateId) throws InsufficientCapacityException; + + public VirtualRouter stopNetScalerVm(Long id, boolean forced, Account callingAccount, long callingUserId); +} \ No newline at end of file diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManagerImpl.java b/plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManagerImpl.java new file mode 100644 index 00000000000..63574ad4343 --- /dev/null +++ b/plugins/network-elements/netscaler/src/com/cloud/network/vm/NetScalerVMManagerImpl.java @@ -0,0 +1,448 @@ +//Licensed to the Apache Software Foundation (ASF) under one +//or more contributor license agreements. See the NOTICE file +//distributed with this work for additional information +//regarding copyright ownership. The ASF licenses this file +//to you under the Apache License, Version 2.0 (the +//"License"); you may not use this file except in compliance +//with the License. You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, +//software distributed under the License is distributed on an +//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +//KIND, either express or implied. See the License for the +//specific language governing permissions and limitations +//under the License. +package com.cloud.network.vm; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.manager.Commands; +import com.cloud.api.commands.DeployNetscalerVpxCmd; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DataCenterDeployment; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.exception.StorageUnavailableException; +import com.cloud.network.IpAddressManager; +import com.cloud.network.Network; +import com.cloud.network.Network.Provider; +import com.cloud.network.NetworkModel; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.VirtualRouterProvider; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.dao.VirtualRouterProviderDao; +import com.cloud.network.element.VirtualRouterProviderVO; +import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.router.VirtualRouter; +import com.cloud.network.router.VirtualRouter.RedundantState; +import com.cloud.network.router.VirtualRouter.Role; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.resource.ResourceManager; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineGuru; +import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachineProfile.Param; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.VMInstanceDao; + +@Local(value = {NetScalerVMManager.class}) +public class NetScalerVMManagerImpl extends ManagerBase implements NetScalerVMManager, VirtualMachineGuru { + private static final Logger s_logger = Logger.getLogger(NetScalerVMManagerImpl.class); + static final private String NetScalerLbVmNamePrefix = "NS"; + + @Inject + IpAddressManager _ipAddrMgr; + @Inject + VirtualMachineManager _itMgr; + @Inject + DomainRouterDao _internalLbVmDao; + @Inject + ConfigurationDao _configDao; + @Inject + AgentManager _agentMgr; + @Inject + DataCenterDao _dcDao; + @Inject + VirtualRouterProviderDao _vrProviderDao; + @Inject + ApplicationLoadBalancerRuleDao _lbDao; + @Inject + NetworkModel _ntwkModel; + @Inject + LoadBalancingRulesManager _lbMgr; + @Inject + NicDao _nicDao; + @Inject + AccountManager _accountMgr; + @Inject + NetworkDao _networkDao; + @Inject + NetworkOrchestrationService _networkMgr; + @Inject + ServiceOfferingDao _serviceOfferingDao; + @Inject + PhysicalNetworkServiceProviderDao _physicalProviderDao; + @Inject + NetworkOfferingDao _networkOfferingDao; + @Inject + VMTemplateDao _templateDao; + @Inject + ResourceManager _resourceMgr; + @Inject + VMInstanceDao _vmDao; + @Inject + NetworkModel _networkModel; + @Inject + PhysicalNetworkDao _physicalNetworkDao; + @Inject + VlanDao _vlanDao; + @Inject + DomainRouterDao _routerDao; + + @Override + public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { + + //NetScalerLB vm starts up with 3 Nics + //Nic #1 - NS IP + //Nic #2 - locallink(guest network) + //Nic #3 - public nic + + for (final NicProfile nic : profile.getNics()) { + if(nic.getTrafficType() == TrafficType.Control) { + nic.setTrafficType(TrafficType.Guest); + } + } + return true; + } + + @Override + public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) + throws ResourceUnavailableException { + return true; + } + + @Override + public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) { + return true; + } + + @Override + public boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile profile) { + return true; + } + + @Override + public void finalizeStop(VirtualMachineProfile profile, Answer answer) { + } + + @Override + public void finalizeExpunge(VirtualMachine vm) { + } + + @Override + public void prepareStop(VirtualMachineProfile profile) { + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + + _itMgr.registerGuru(VirtualMachine.Type.NetScalerVm, this); + if (s_logger.isInfoEnabled()) { + s_logger.info(getName() + " has been configured"); + } + return true; + } + + @Override + public String getName() { + return _name; + } + + protected VirtualRouter stopInternalLbVm(DomainRouterVO internalLbVm, boolean forced, Account caller, long callerUserId) throws ResourceUnavailableException, + ConcurrentOperationException { + s_logger.debug("Stopping internal lb vm " + internalLbVm); + try { + _itMgr.advanceStop(internalLbVm.getUuid(), forced); + return _internalLbVmDao.findById(internalLbVm.getId()); + } catch (OperationTimedoutException e) { + throw new CloudRuntimeException("Unable to stop " + internalLbVm, e); + } + } + + public VirtualRouterProvider addNetScalerLoadBalancerElement(long ntwkSvcProviderId) { + VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(ntwkSvcProviderId, com.cloud.network.VirtualRouterProvider.Type.NetScalerVm); + if (element != null) { + s_logger.debug("There is already an " + getName() + " with service provider id " + ntwkSvcProviderId); + return element; + } + + PhysicalNetworkServiceProvider provider = _physicalProviderDao.findById(ntwkSvcProviderId); + if (provider == null || !provider.getProviderName().equalsIgnoreCase(getName())) { + throw new InvalidParameterValueException("Invalid network service provider is specified"); + } + + element = new VirtualRouterProviderVO(ntwkSvcProviderId, com.cloud.network.VirtualRouterProvider.Type.NetScalerVm); + element.setEnabled(true); + element = _vrProviderDao.persist(element); + return element; + } + + protected long getNetScalerLbProviderId(long physicalNetworkId) { + //final long physicalNetworkId = _ntwkModel.getPhysicalNetworkId(guestNetwork); + + final PhysicalNetworkServiceProvider provider = _physicalProviderDao.findByServiceProvider(physicalNetworkId, "Netscaler"); + if (provider == null) { + throw new CloudRuntimeException("Cannot find service provider " + Provider.Netscaler.toString() + " in physical network " + physicalNetworkId); + } + + //TODO: get from type + VirtualRouterProvider netScalerLbProvider = _vrProviderDao.findByNspIdAndType(provider.getId(), com.cloud.network.VirtualRouterProvider.Type.NetScalerVm); + if (netScalerLbProvider == null) { + //create the vrp for netscalerVM. + netScalerLbProvider = addNetScalerLoadBalancerElement(provider.getId()); + } + + return netScalerLbProvider.getId(); + } + @Override + public Map deployNsVpx(Account owner, DeployDestination dest, DeploymentPlan plan, long svcOffId, long templateId) throws InsufficientCapacityException { + + VMTemplateVO template = _templateDao.findById(templateId) ; + long id = _vmDao.getNextInSequence(Long.class, "id"); + Account systemAcct = _accountMgr.getSystemAccount(); + + if (template == null) { + s_logger.error(" Unable to find the NS VPX template"); + throw new CloudRuntimeException("Unable to find the Template" + templateId); + } + long dataCenterId = dest.getDataCenter().getId(); + DataCenterVO dc = _dcDao.findById(dest.getDataCenter().getId()); + + String nxVpxName = VirtualMachineName.getSystemVmName(id, "Vpx", NetScalerLbVmNamePrefix); + + ServiceOfferingVO vpxOffering = _serviceOfferingDao.findById(svcOffId); //using 2GB and 2CPU offering + if(vpxOffering.getRamSize() < 2048 && vpxOffering.getCpu() <2 ) { + throw new InvalidParameterValueException("Specified Service Offering :" + vpxOffering.getUuid() + " NS Vpx cannot be deployed. Min 2GB Ram and 2 CPU are required"); + } + + long userId = CallContext.current().getCallingUserId(); + //TODO change the os bits from 142 103 to the actual guest of bits + if(template.getGuestOSId() != 103 ) { + throw new InvalidParameterValueException("Specified Template " + template.getUuid()+ " not suitable for NS VPX Deployment. Please register the template with guest os type as unknow(64-bit)"); + } + NetworkVO defaultNetwork = null; + NetworkVO defaultPublicNetwork = null; + if (dc.getNetworkType() == NetworkType.Advanced && dc.isSecurityGroupEnabled()) { + List networks = _networkDao.listByZoneSecurityGroup(dataCenterId); + if (networks == null || networks.size() == 0) { + throw new CloudRuntimeException("Can not found security enabled network in SG Zone " + dc); + } + defaultNetwork = networks.get(0); + } else { + TrafficType defaultTrafficType = TrafficType.Management; + List defaultNetworks = _networkDao.listByZoneAndTrafficType(dataCenterId, defaultTrafficType); + + TrafficType publicTrafficType = TrafficType.Public; + List publicNetworks = _networkDao.listByZoneAndTrafficType(dataCenterId, publicTrafficType); + + // api should never allow this situation to happen + if (defaultNetworks.size() != 1) { + throw new CloudRuntimeException("Found " + defaultNetworks.size() + " networks of type " + defaultTrafficType + " when expect to find 1"); + } + + if (publicNetworks.size() != 1) { + throw new CloudRuntimeException("Found " + defaultNetworks.size() + " networks of type " + defaultTrafficType + " when expect to find 1"); + } + defaultPublicNetwork = publicNetworks.get(0); + defaultNetwork = defaultNetworks.get(0); + } + + LinkedHashMap> networks = new LinkedHashMap>(4); + NicProfile defaultNic = new NicProfile(); + defaultNic.setDefaultNic(true); + defaultNic.setDeviceId(0); + + networks.put(_networkMgr.setupNetwork(_accountMgr.getSystemAccount() , _networkOfferingDao.findById(defaultNetwork.getNetworkOfferingId()), plan, null, null, false).get(0), + new ArrayList()); + + NicProfile defaultNic1 = new NicProfile(); + defaultNic1.setDefaultNic(false); + defaultNic1.setDeviceId(1); + + NicProfile defaultNic2 = new NicProfile(); + defaultNic2.setDefaultNic(false); + defaultNic2.setDeviceId(2); + defaultNic2.setIPv4Address(""); + defaultNic2.setIPv4Gateway(""); + defaultNic2.setIPv4Netmask(""); + String macAddress = _networkDao.getNextAvailableMacAddress(defaultPublicNetwork.getId()); + defaultNic2.setMacAddress(macAddress); + + networks.put(_networkMgr.setupNetwork(_accountMgr.getSystemAccount(), _networkOfferingDao.findByUniqueName(NetworkOffering.SystemPublicNetwork), plan, null, null, false).get(0), + new ArrayList(Arrays.asList(defaultNic2))); + + networks.put(_networkMgr.setupNetwork(_accountMgr.getSystemAccount(), _networkOfferingDao.findByUniqueName(NetworkOffering.SystemControlNetwork), plan, null, null, false).get(0), + new ArrayList()); + + long physicalNetworkId = _networkModel.findPhysicalNetworkId(dataCenterId, _networkOfferingDao.findById(defaultPublicNetwork.getNetworkOfferingId()).getTags(), TrafficType.Public); + // Validate physical network + PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId); + if (physicalNetwork == null) { + throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: " + + _networkOfferingDao.findById(defaultPublicNetwork.getNetworkOfferingId()).getTags()); + } + String guestvnet = physicalNetwork.getVnetString(); + + final List vlans = _vlanDao.listByZone(dataCenterId); + List pvlan = new ArrayList(); + for (final VlanVO vlan : vlans) { + pvlan.add(vlan.getVlanTag()); + } + + long netScalerProvider = getNetScalerLbProviderId(physicalNetworkId); + DomainRouterVO nsVpx = new DomainRouterVO(id, vpxOffering.getId(), netScalerProvider, nxVpxName, + template.getId(), template.getHypervisorType(), template.getGuestOSId(), owner.getDomainId(), owner.getId(), userId, false, RedundantState.UNKNOWN, false, + false, VirtualMachine.Type.NetScalerVm, null); + + nsVpx.setRole(Role.NETSCALER_VM); + + nsVpx = _routerDao.persist(nsVpx); + + VMInstanceVO vmVO= _vmDao.findVMByHostName(nxVpxName); + _itMgr.allocate(nxVpxName, template, vpxOffering, networks, plan, template.getHypervisorType()); + Map params = new HashMap(1); + try { + if (vmVO != null) { + startNsVpx(vmVO, params); + } else { + throw new NullPointerException(); + } + } catch (StorageUnavailableException e) { + e.printStackTrace(); + } catch (ConcurrentOperationException e) { + e.printStackTrace(); + } catch (ResourceUnavailableException e) { + e.printStackTrace(); + } + vmVO= _vmDao.findByUuid(nsVpx.getUuid()); + Map deployResponse = new HashMap(); + deployResponse.put("vm", vmVO); + deployResponse.put("guestvlan", guestvnet); + deployResponse.put("publicvlan", pvlan); + return deployResponse; + } + + protected void startNsVpx(VMInstanceVO nsVpx, Map params) throws StorageUnavailableException, + InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("Starting NS Vpx " + nsVpx); + _itMgr.start(nsVpx.getUuid(), params, null, null); + } + + @Override + public Map deployNetscalerServiceVm(DeployNetscalerVpxCmd cmd) { + DataCenter zone = _dcDao.findById(cmd.getZoneId()); + DeployDestination dest = new DeployDestination(zone, null, null, null); + VMInstanceVO vmvo = null; + Map resp = new HashMap(); + Long templateId = cmd.getTemplateId(); + Long serviceOfferingId = cmd.getServiceOfferingId(); + DeploymentPlan plan = new DataCenterDeployment(dest.getDataCenter().getId()); + try { + resp = deployNsVpx(cmd.getAccount(), dest, plan, serviceOfferingId, templateId); + } catch (InsufficientCapacityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return resp; + } + + protected VirtualRouter stopNetScalerVm(final long vmId, final boolean forced, final Account caller, final long callerUserId) throws ResourceUnavailableException, + ConcurrentOperationException { + final DomainRouterVO netscalerVm = _routerDao.findById(vmId); + s_logger.debug("Stopping NetScaler vm " + netscalerVm); + + if (netscalerVm == null || netscalerVm.getRole() != Role.NETSCALER_VM) { + throw new InvalidParameterValueException("Can't find NetScaler vm by id specified"); + } + _accountMgr.checkAccess(caller, null, true, netscalerVm); + try { + _itMgr.expunge(netscalerVm.getUuid()); + return _routerDao.findById(netscalerVm.getId()); + } catch (final Exception e) { + throw new CloudRuntimeException("Unable to stop " + netscalerVm, e); + } + } + @Override + public VirtualRouter stopNetscalerServiceVm(Long id, boolean forced, Account callingAccount, long callingUserId) throws ConcurrentOperationException, + ResourceUnavailableException { + return stopNetScalerVm(id, forced, callingAccount, callingUserId); + } + +@Override +public VirtualRouter stopNetScalerVm(Long vmId, boolean forced, Account caller, long callingUserId) { + final DomainRouterVO netscalerVm = _routerDao.findById(vmId); + s_logger.debug("Stopping NetScaler vm " + netscalerVm); + + if (netscalerVm == null || netscalerVm.getRole() != Role.NETSCALER_VM) { + throw new InvalidParameterValueException("Can't find NetScaler vm by id specified"); + } + _accountMgr.checkAccess(caller, null, true, netscalerVm); + try { + _itMgr.expunge(netscalerVm.getUuid()); + return _routerDao.findById(netscalerVm.getId()); + } catch (final Exception e) { + throw new CloudRuntimeException("Unable to stop " + netscalerVm, e); + } +} +} diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java index e18d231e173..93c3b777e67 100644 --- a/server/src/com/cloud/alert/AlertManagerImpl.java +++ b/server/src/com/cloud/alert/AlertManagerImpl.java @@ -90,7 +90,7 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi private static final Logger s_logger = Logger.getLogger(AlertManagerImpl.class.getName()); private static final Logger s_alertsLogger = Logger.getLogger("org.apache.cloudstack.alerts"); - private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds + private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L;// thirty seconds expressed in milliseconds private static final DecimalFormat DfPct = new DecimalFormat("###.##"); private static final DecimalFormat DfWhole = new DecimalFormat("########"); @@ -126,7 +126,7 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi protected ConfigDepot _configDepot; private Timer _timer = null; - private long _capacityCheckPeriod = 60L * 60L * 1000L; // one hour by default + private long _capacityCheckPeriod = 60L * 60L * 1000L;// one hour by default private double _publicIPCapacityThreshold = 0.75; private double _privateIPCapacityThreshold = 0.75; private double _secondaryStorageCapacityThreshold = 0.75; @@ -250,7 +250,7 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi _emailAlert.sendAlert(alertType, dataCenterId, podId, null, subject, body); } else { s_alertsLogger.warn(" alertType:: " + alertType + " // dataCenterId:: " + dataCenterId + " // podId:: " + podId + - " // message:: " + subject + " // body:: " + body); + " // message:: " + subject + " // body:: " + body); } } catch (Exception ex) { s_logger.error("Problem sending email alert", ex); @@ -367,7 +367,8 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi CapacityVO newVlanCapacity = new CapacityVO(null, dcId, null, null, allocatedVlans, totalVlans, Capacity.CAPACITY_TYPE_VLAN); newVlanCapacity.setCapacityState(vlanCapacityState); _capacityDao.persist(newVlanCapacity); - } else if (!(capacities.get(0).getUsedCapacity() == allocatedVlans && capacities.get(0).getTotalCapacity() == totalVlans && capacities.get(0).getCapacityState() == vlanCapacityState)) { + } else if (!(capacities.get(0).getUsedCapacity() == allocatedVlans && capacities.get(0).getTotalCapacity() == totalVlans + && capacities.get(0).getCapacityState() == vlanCapacityState)) { CapacityVO capacity = capacities.get(0); capacity.setUsedCapacity(allocatedVlans); capacity.setTotalCapacity(totalVlans); @@ -405,7 +406,8 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi CapacityVO newPublicIPCapacity = new CapacityVO(null, dcId, podId, null, allocatedIPs, totalIPs, capacityType); newPublicIPCapacity.setCapacityState(ipCapacityState); _capacityDao.persist(newPublicIPCapacity); - } else if (!(capacities.get(0).getUsedCapacity() == allocatedIPs && capacities.get(0).getTotalCapacity() == totalIPs && capacities.get(0).getCapacityState() == ipCapacityState)) { + } else if (!(capacities.get(0).getUsedCapacity() == allocatedIPs && capacities.get(0).getTotalCapacity() == totalIPs + && capacities.get(0).getCapacityState() == ipCapacityState)) { CapacityVO capacity = capacities.get(0); capacity.setUsedCapacity(allocatedIPs); capacity.setTotalCapacity(totalIPs); @@ -489,21 +491,21 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi // cpu and memory allocated capacity notification threshold can be defined at cluster level, so getting the value if they are defined at cluster level double threshold = 0; switch (capacityType) { - case Capacity.CAPACITY_TYPE_STORAGE: - capacity.add(getUsedStats(capacityType, cluster.getDataCenterId(), cluster.getPodId(), cluster.getId())); - threshold = StorageCapacityThreshold.valueIn(cluster.getId()); - break; - case Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED: - threshold = StorageAllocatedCapacityThreshold.valueIn(cluster.getId()); - break; - case Capacity.CAPACITY_TYPE_CPU: - threshold = CPUCapacityThreshold.valueIn(cluster.getId()); - break; - case Capacity.CAPACITY_TYPE_MEMORY: - threshold = MemoryCapacityThreshold.valueIn(cluster.getId()); - break; - default: - threshold = _capacityTypeThresholdMap.get(capacityType); + case Capacity.CAPACITY_TYPE_STORAGE: + capacity.add(getUsedStats(capacityType, cluster.getDataCenterId(), cluster.getPodId(), cluster.getId())); + threshold = StorageCapacityThreshold.valueIn(cluster.getId()); + break; + case Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED: + threshold = StorageAllocatedCapacityThreshold.valueIn(cluster.getId()); + break; + case Capacity.CAPACITY_TYPE_CPU: + threshold = CPUCapacityThreshold.valueIn(cluster.getId()); + break; + case Capacity.CAPACITY_TYPE_MEMORY: + threshold = MemoryCapacityThreshold.valueIn(cluster.getId()); + break; + default: + threshold = _capacityTypeThresholdMap.get(capacityType); } if (capacity == null || capacity.size() == 0) { continue; @@ -513,7 +515,7 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi double usedCapacity = capacity.get(0).getUsedCapacity() + capacity.get(0).getReservedCapacity(); if (totalCapacity != 0 && usedCapacity / totalCapacity > threshold) { generateEmailAlert(ApiDBUtils.findZoneById(cluster.getDataCenterId()), ApiDBUtils.findPodById(cluster.getPodId()), cluster, totalCapacity, - usedCapacity, capacityType); + usedCapacity, capacityType); } } } @@ -549,84 +551,82 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi switch (capacityType) { //Cluster Level - case Capacity.CAPACITY_TYPE_MEMORY: - msgSubject = "System Alert: Low Available Memory in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + dc.getName(); - totalStr = formatBytesToMegabytes(totalCapacity); - usedStr = formatBytesToMegabytes(usedCapacity); - msgContent = "System memory is low, total: " + totalStr + " MB, used: " + usedStr + " MB (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_MEMORY; - break; - case Capacity.CAPACITY_TYPE_CPU: - msgSubject = "System Alert: Low Unallocated CPU in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + dc.getName(); - totalStr = DfWhole.format(totalCapacity); - usedStr = DfWhole.format(usedCapacity); - msgContent = "Unallocated CPU is low, total: " + totalStr + " Mhz, used: " + usedStr + " Mhz (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_CPU; - break; - case Capacity.CAPACITY_TYPE_STORAGE: - msgSubject = "System Alert: Low Available Storage in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + dc.getName(); - totalStr = formatBytesToMegabytes(totalCapacity); - usedStr = formatBytesToMegabytes(usedCapacity); - msgContent = "Available storage space is low, total: " + totalStr + " MB, used: " + usedStr + " MB (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_STORAGE; - break; - case Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED: - msgSubject = - "System Alert: Remaining unallocated Storage is low in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + - dc.getName(); - totalStr = formatBytesToMegabytes(totalCapacity); - usedStr = formatBytesToMegabytes(usedCapacity); - msgContent = "Unallocated storage space is low, total: " + totalStr + " MB, allocated: " + usedStr + " MB (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_STORAGE_ALLOCATED; - break; - case Capacity.CAPACITY_TYPE_LOCAL_STORAGE: - msgSubject = - "System Alert: Remaining unallocated Local Storage is low in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + - dc.getName(); - totalStr = formatBytesToMegabytes(totalCapacity); - usedStr = formatBytesToMegabytes(usedCapacity); - msgContent = "Unallocated storage space is low, total: " + totalStr + " MB, allocated: " + usedStr + " MB (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_LOCAL_STORAGE; - break; + case Capacity.CAPACITY_TYPE_MEMORY: + msgSubject = "System Alert: Low Available Memory in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + dc.getName(); + totalStr = formatBytesToMegabytes(totalCapacity); + usedStr = formatBytesToMegabytes(usedCapacity); + msgContent = "System memory is low, total: " + totalStr + " MB, used: " + usedStr + " MB (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_MEMORY; + break; + case Capacity.CAPACITY_TYPE_CPU: + msgSubject = "System Alert: Low Unallocated CPU in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + dc.getName(); + totalStr = DfWhole.format(totalCapacity); + usedStr = DfWhole.format(usedCapacity); + msgContent = "Unallocated CPU is low, total: " + totalStr + " Mhz, used: " + usedStr + " Mhz (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_CPU; + break; + case Capacity.CAPACITY_TYPE_STORAGE: + msgSubject = "System Alert: Low Available Storage in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + dc.getName(); + totalStr = formatBytesToMegabytes(totalCapacity); + usedStr = formatBytesToMegabytes(usedCapacity); + msgContent = "Available storage space is low, total: " + totalStr + " MB, used: " + usedStr + " MB (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_STORAGE; + break; + case Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED: + msgSubject = "System Alert: Remaining unallocated Storage is low in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + + dc.getName(); + totalStr = formatBytesToMegabytes(totalCapacity); + usedStr = formatBytesToMegabytes(usedCapacity); + msgContent = "Unallocated storage space is low, total: " + totalStr + " MB, allocated: " + usedStr + " MB (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_STORAGE_ALLOCATED; + break; + case Capacity.CAPACITY_TYPE_LOCAL_STORAGE: + msgSubject = "System Alert: Remaining unallocated Local Storage is low in cluster " + cluster.getName() + " pod " + pod.getName() + " of availability zone " + + dc.getName(); + totalStr = formatBytesToMegabytes(totalCapacity); + usedStr = formatBytesToMegabytes(usedCapacity); + msgContent = "Unallocated storage space is low, total: " + totalStr + " MB, allocated: " + usedStr + " MB (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_LOCAL_STORAGE; + break; - //Pod Level - case Capacity.CAPACITY_TYPE_PRIVATE_IP: - msgSubject = "System Alert: Number of unallocated private IPs is low in pod " + pod.getName() + " of availability zone " + dc.getName(); - totalStr = Double.toString(totalCapacity); - usedStr = Double.toString(usedCapacity); - msgContent = "Number of unallocated private IPs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_PRIVATE_IP; - break; + //Pod Level + case Capacity.CAPACITY_TYPE_PRIVATE_IP: + msgSubject = "System Alert: Number of unallocated private IPs is low in pod " + pod.getName() + " of availability zone " + dc.getName(); + totalStr = Double.toString(totalCapacity); + usedStr = Double.toString(usedCapacity); + msgContent = "Number of unallocated private IPs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_PRIVATE_IP; + break; - //Zone Level - case Capacity.CAPACITY_TYPE_SECONDARY_STORAGE: - msgSubject = "System Alert: Low Available Secondary Storage in availability zone " + dc.getName(); - totalStr = formatBytesToMegabytes(totalCapacity); - usedStr = formatBytesToMegabytes(usedCapacity); - msgContent = "Available secondary storage space is low, total: " + totalStr + " MB, used: " + usedStr + " MB (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_SECONDARY_STORAGE; - break; - case Capacity.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP: - msgSubject = "System Alert: Number of unallocated virtual network public IPs is low in availability zone " + dc.getName(); - totalStr = Double.toString(totalCapacity); - usedStr = Double.toString(usedCapacity); - msgContent = "Number of unallocated public IPs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_VIRTUAL_NETWORK_PUBLIC_IP; - break; - case Capacity.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP: - msgSubject = "System Alert: Number of unallocated shared network IPs is low in availability zone " + dc.getName(); - totalStr = Double.toString(totalCapacity); - usedStr = Double.toString(usedCapacity); - msgContent = "Number of unallocated shared network IPs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_DIRECT_ATTACHED_PUBLIC_IP; - break; - case Capacity.CAPACITY_TYPE_VLAN: - msgSubject = "System Alert: Number of unallocated VLANs is low in availability zone " + dc.getName(); - totalStr = Double.toString(totalCapacity); - usedStr = Double.toString(usedCapacity); - msgContent = "Number of unallocated VLANs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; - alertType = AlertManager.AlertType.ALERT_TYPE_VLAN; - break; + //Zone Level + case Capacity.CAPACITY_TYPE_SECONDARY_STORAGE: + msgSubject = "System Alert: Low Available Secondary Storage in availability zone " + dc.getName(); + totalStr = formatBytesToMegabytes(totalCapacity); + usedStr = formatBytesToMegabytes(usedCapacity); + msgContent = "Available secondary storage space is low, total: " + totalStr + " MB, used: " + usedStr + " MB (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_SECONDARY_STORAGE; + break; + case Capacity.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP: + msgSubject = "System Alert: Number of unallocated virtual network public IPs is low in availability zone " + dc.getName(); + totalStr = Double.toString(totalCapacity); + usedStr = Double.toString(usedCapacity); + msgContent = "Number of unallocated public IPs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_VIRTUAL_NETWORK_PUBLIC_IP; + break; + case Capacity.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP: + msgSubject = "System Alert: Number of unallocated shared network IPs is low in availability zone " + dc.getName(); + totalStr = Double.toString(totalCapacity); + usedStr = Double.toString(usedCapacity); + msgContent = "Number of unallocated shared network IPs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_DIRECT_ATTACHED_PUBLIC_IP; + break; + case Capacity.CAPACITY_TYPE_VLAN: + msgSubject = "System Alert: Number of unallocated VLANs is low in availability zone " + dc.getName(); + totalStr = Double.toString(totalCapacity); + usedStr = Double.toString(usedCapacity); + msgContent = "Number of unallocated VLANs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)"; + alertType = AlertManager.AlertType.ALERT_TYPE_VLAN; + break; } try { @@ -746,9 +746,9 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi // TODO: make sure this handles SSL transport (useAuth is true) and regular public void sendAlert(AlertType alertType, long dataCenterId, Long podId, Long clusterId, String subject, String content) throws MessagingException, - UnsupportedEncodingException { + UnsupportedEncodingException { s_alertsLogger.warn(" alertType:: " + alertType + " // dataCenterId:: " + dataCenterId + " // podId:: " + - podId + " // clusterId:: " + clusterId + " // message:: " + subject); + podId + " // clusterId:: " + clusterId + " // message:: " + subject); AlertVO alert = null; if ((alertType != AlertManager.AlertType.ALERT_TYPE_HOST) && (alertType != AlertManager.AlertType.ALERT_TYPE_USERVM) && @@ -771,7 +771,7 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager, Confi newAlert.setClusterId(clusterId); newAlert.setPodId(podId); newAlert.setDataCenterId(dataCenterId); - newAlert.setSentCount(1); // initialize sent count to 1 since we are now sending an alert + newAlert.setSentCount(1);// initialize sent count to 1 since we are now sending an alert newAlert.setLastSent(new Date()); newAlert.setName(alertType.getName()); _alertDao.persist(newAlert); diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 7d7f0fdcdae..c03d36744ef 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -1267,13 +1267,11 @@ public class ApiResponseHelper implements ResponseGenerator { @Override public SystemVmResponse createSystemVmResponse(VirtualMachine vm) { SystemVmResponse vmResponse = new SystemVmResponse(); - if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy || vm.getType() == Type.DomainRouter) { - // SystemVm vm = (SystemVm) systemVM; + if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy || vm.getType() == Type.DomainRouter || vm.getType() == Type.NetScalerVm) { vmResponse.setId(vm.getUuid()); - // vmResponse.setObjectId(vm.getId()); vmResponse.setSystemVmType(vm.getType().toString().toLowerCase()); - vmResponse.setName(vm.getHostName()); + if (vm.getPodIdToDeployIn() != null) { HostPodVO pod = ApiDBUtils.findPodById(vm.getPodIdToDeployIn()); if (pod != null) { diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index f6e040f2b31..f7a6104ab7e 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -3917,7 +3917,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final Boolean egressDefaultPolicy = cmd.getEgressDefaultPolicy(); Integer maxconn = null; boolean enableKeepAlive = false; - + String servicePackageuuid = cmd.getServicePackageId(); // Verify traffic type for (final TrafficType tType : TrafficType.values()) { if (tType.name().equalsIgnoreCase(trafficTypeString)) { @@ -4293,6 +4293,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final boolean conserveMode, final Map> serviceCapabilityMap, final boolean specifyIpRanges, final boolean isPersistent, final Map details, final boolean egressDefaultPolicy, final Integer maxconn, final boolean enableKeepAlive) { + String servicePackageUuid; + String spDescription = null; + if (details == null) { + servicePackageUuid = null; + } else { + servicePackageUuid = details.get(NetworkOffering.Detail.servicepackageuuid); + spDescription = details.get(NetworkOffering.Detail.servicepackagedescription); + } + + final String multicastRateStr = _configDao.getValue("multicast.throttling.rate"); final int multicastRate = multicastRateStr == null ? 10 : Integer.parseInt(multicastRateStr); tags = StringUtils.cleanupTags(tags); @@ -4451,11 +4461,37 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati offeringFinal.setServiceOfferingId(serviceOfferingId); } + //Set Service package id + offeringFinal.setServicePackage(servicePackageUuid); // validate the details if (details != null) { validateNtwkOffDetails(details, serviceProviderMap); } + boolean vpcOff = false; + boolean nsOff = false; + + if (serviceProviderMap != null && spDescription != null) { + for (final Network.Service service : serviceProviderMap.keySet()) { + final Set providers = serviceProviderMap.get(service); + if (providers != null && !providers.isEmpty()) { + for (final Network.Provider provider : providers) { + if (provider == Provider.VPCVirtualRouter) { + vpcOff = true; + } + if (provider == Provider.Netscaler) { + nsOff = true; + } + } + } + } + if(vpcOff && nsOff) { + if(!(spDescription.equalsIgnoreCase("A NetScalerVPX is dedicated per network.") || spDescription.contains("dedicated NetScaler"))) { + throw new InvalidParameterValueException("Only NetScaler Service Pacakge with Dedicated Device Mode is Supported in VPC Type Guest Network"); + } + } + } + return Transaction.execute(new TransactionCallback() { @Override public NetworkOfferingVO doInTransaction(final TransactionStatus status) { @@ -4778,6 +4814,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati return vpcProvider || nuageVpcProvider; } + @DB @Override @ActionEvent(eventType = EventTypes.EVENT_NETWORK_OFFERING_DELETE, eventDescription = "deleting network offering") public boolean deleteNetworkOffering(final DeleteNetworkOfferingCmd cmd) { diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java index c413eddc1a8..d84c104f76b 100644 --- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java @@ -48,6 +48,7 @@ import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicSecondaryIpDao; import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; +import com.cloud.network.Networks.BroadcastDomainType; public abstract class HypervisorGuruBase extends AdapterBase implements HypervisorGuru { public static final Logger s_logger = Logger.getLogger(HypervisorGuruBase.class); @@ -134,6 +135,9 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis NicTO[] nics = new NicTO[nicProfiles.size()]; int i = 0; for (NicProfile nicProfile : nicProfiles) { + if(vm.getType() == VirtualMachine.Type.NetScalerVm) { + nicProfile.setBroadcastType(BroadcastDomainType.Native); + } nics[i++] = toNicTO(nicProfile); } diff --git a/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java b/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java index 200b279bf92..49dc78585ab 100644 --- a/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java +++ b/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java @@ -43,6 +43,7 @@ import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.VlanDao; import com.cloud.host.Host; import com.cloud.host.HostVO; +import com.cloud.host.Host.Type; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; import com.cloud.network.Networks.BroadcastDomainType; @@ -68,6 +69,7 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.rules.LoadBalancerContainer.Scheme; import com.cloud.network.rules.PortForwardingRuleVO; import com.cloud.network.rules.dao.PortForwardingRulesDao; +import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.ResourceManager; import com.cloud.user.AccountManager; @@ -332,6 +334,21 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter }); } + public boolean isNccServiceProvider(Network network) { + NetworkOffering networkOffering = _networkOfferingDao.findById(network.getNetworkOfferingId()); + if(null!= networkOffering && networkOffering.getServicePackage() != null ) { + return true; + } + else { + return false; + } + } + + public HostVO getNetScalerControlCenterForNetwork(Network guestConfig) { + long zoneId = guestConfig.getDataCenterId(); + return _hostDao.findByTypeNameAndZoneId(zoneId, "NetscalerControlCenter", Type.NetScalerControlCenter); + } + protected class ExternalDeviceNetworkUsageTask extends ManagedContextRunnable { public ExternalDeviceNetworkUsageTask() { @@ -400,11 +417,20 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter continue; } - ExternalFirewallDeviceVO fwDeviceVO = getExternalFirewallForNetwork(network); ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); - if (lbDeviceVO == null && fwDeviceVO == null) { + HostVO externalNcc = null; + boolean isNccNetwork = isNccServiceProvider(network); + if(isNccNetwork) { + externalNcc = getNetScalerControlCenterForNetwork(network); + } + ExternalFirewallDeviceVO fwDeviceVO = getExternalFirewallForNetwork(network); + + if (fwDeviceVO == null) { continue; } + if(externalNcc == null && lbDeviceVO == null) { + return; + } // Get network stats from the external firewall ExternalNetworkResourceUsageAnswer firewallAnswer = null; @@ -440,13 +466,17 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter // Get network stats from the external load balancer ExternalNetworkResourceUsageAnswer lbAnswer = null; HostVO externalLoadBalancer = null; - if (lbDeviceVO != null) { - externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + if (lbDeviceVO != null || externalNcc != null) { + if(isNccNetwork) { + externalLoadBalancer = externalNcc; + } else { + externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + } if (externalLoadBalancer != null) { Long lbDeviceId = new Long(externalLoadBalancer.getId()); if (!lbDeviceUsageAnswerMap.containsKey(lbDeviceId)) { try { - ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); + ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(network.getId()); lbAnswer = (ExternalNetworkResourceUsageAnswer)_agentMgr.easySend(externalLoadBalancer.getId(), cmd); if (lbAnswer == null || !lbAnswer.getResult()) { String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index 85eda6b836c..f1b4a7958be 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -27,12 +27,13 @@ import java.util.UUID; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.log4j.Logger; + import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice; -import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -63,8 +64,8 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.DetailVO; import com.cloud.host.Host; -import com.cloud.host.HostVO; import com.cloud.host.Host.Type; +import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; import com.cloud.network.Network.Provider; @@ -91,6 +92,7 @@ import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.element.IpDeployer; import com.cloud.network.element.NetworkElement; import com.cloud.network.element.StaticNatServiceProvider; @@ -111,6 +113,8 @@ import com.cloud.resource.ResourceState; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.dao.AccountDao; @@ -129,8 +133,10 @@ import com.cloud.utils.net.UrlUtil; import com.cloud.vm.Nic; import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicVO; +import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.VMInstanceDao; public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase implements ExternalLoadBalancerDeviceManager, ResourceStateAdapter { @@ -194,6 +200,19 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase protected HostPodDao _podDao = null; @Inject IpAddressManager _ipAddrMgr; + @Inject + protected + VirtualMachineManager _itMgr; + @Inject + VMInstanceDao _vmDao; + @Inject + VMTemplateDao _templateDao; + @Inject + ServiceOfferingDao _serviceOfferingDao; + @Inject + PhysicalNetworkServiceProviderDao _physicalProviderDao; + @Inject + VirtualRouterProviderDao _vrProviderDao; private long _defaultLbCapacity; private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalLoadBalancerDeviceManagerImpl.class); @@ -867,9 +886,9 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase return nic; } - private boolean isNccServiceProvider(Network network) { + public boolean isNccServiceProvider(Network network) { NetworkOffering networkOffering = _networkOfferingDao.findById(network.getNetworkOfferingId()); - if(networkOffering.getServicePackage() != null ) { + if(null!= networkOffering && networkOffering.getServicePackage() != null ) { return true; } else { @@ -927,11 +946,14 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase String uuid = rule.getUuid(); String srcIp = rule.getSourceIp().addr(); String srcIpVlan = null; - //IpAddress ipAddress = _networkModel.getPublicIpAddress(rule.getSourceIp().addr(), network.getDataCenterId()).getVlanId(); + String srcIpGateway = null; + String srcIpNetmask = null; Long vlanid = _networkModel.getPublicIpAddress(rule.getSourceIp().addr(), network.getDataCenterId()).getVlanId(); if(vlanid != null ) { VlanVO publicVlan = _vlanDao.findById(vlanid); srcIpVlan = publicVlan.getVlanTag(); + srcIpGateway = publicVlan.getVlanGateway(); + srcIpNetmask = publicVlan.getVlanNetmask(); } int srcPort = rule.getSourcePortStart(); List destinations = rule.getDestinations(); @@ -956,6 +978,8 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase rule.getHealthCheckPolicies(), rule.getLbSslCert(), rule.getLbProtocol()); loadBalancer.setNetworkId(network.getId()); loadBalancer.setSrcIpVlan(srcIpVlan); + loadBalancer.setSrcIpNetmask(srcIpNetmask); + loadBalancer.setSrcIpGateway(srcIpGateway); if (rule.isAutoScaleConfig()) { loadBalancer.setAutoScaleVmGroup(rule.getAutoScaleVmGroup()); } @@ -1197,13 +1221,19 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase return null; } - ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); - if (lbDeviceVO == null) { - s_logger.warn("There is no external load balancer device assigned to this network either network is not implement are already shutdown so just returning"); - return null; - } + HostVO externalLoadBalancer = null; - HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + if(isNccServiceProvider(network)) { + externalLoadBalancer = getNetScalerControlCenterForNetwork(network); + } else { + ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); + if (lbDeviceVO == null) { + s_logger.warn("There is no external load balancer device assigned to this network either network is not implement are already shutdown so just returning"); + return null; + } else { + externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + } + } boolean externalLoadBalancerIsInline = _networkMgr.isNetworkInlineMode(network); @@ -1253,7 +1283,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase LoadBalancerTO[] loadBalancersForCommand = loadBalancersToApply.toArray(new LoadBalancerTO[numLoadBalancersForCommand]); // LoadBalancerConfigCommand cmd = new // LoadBalancerConfigCommand(loadBalancersForCommand, null); - HealthCheckLBConfigCommand cmd = new HealthCheckLBConfigCommand(loadBalancersForCommand); + HealthCheckLBConfigCommand cmd = new HealthCheckLBConfigCommand(loadBalancersForCommand, network.getId()); long guestVlanTag = Integer.parseInt(BroadcastDomainType.getValue(network.getBroadcastUri())); cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag)); @@ -1280,4 +1310,5 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase } return null; } + } diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java index d950cc486ee..f3584d1b650 100644 --- a/server/src/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/com/cloud/network/IpAddressManagerImpl.java @@ -52,7 +52,6 @@ import com.cloud.configuration.Resource.ResourceType; import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.DomainVlanMapVO; import com.cloud.dc.DataCenterIpAddressVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.Pod; @@ -287,6 +286,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage VpcDao _vpcDao; @Inject DataCenterIpAddressDao _privateIPAddressDao; + @Inject HostPodDao _hpDao; SearchBuilder AssignIpAddressSearch; @@ -1024,9 +1024,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage @DB @Override - public AcquirePodIpCmdResponse allocatePodIp(Long zoneId, String cidr) throws ConcurrentOperationException, ResourceAllocationException { + public AcquirePodIpCmdResponse allocatePodIp(String zoneId, String podId) throws ConcurrentOperationException, ResourceAllocationException { - DataCenter zone = _entityMgr.findById(DataCenter.class, zoneId); + DataCenter zone = _entityMgr.findByUuid(DataCenter.class, zoneId); Account caller = CallContext.current().getCallingAccount(); if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getId())) { ResourceAllocationException ex = new ResourceAllocationException("Cannot perform this operation, " + "Zone is currently disabled" + "zoneId=" + zone.getUuid(), @@ -1035,15 +1035,18 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage } DataCenterIpAddressVO vo = null; - if (cidr != null) { - List pod_list = _hpDao.listAllPodsByCidr(zoneId, cidr); - if (pod_list.get(0) == null) - throw new ResourceAllocationException("No sush pod exists", ResourceType.network); - vo = _privateIPAddressDao.takeIpAddress(zoneId, pod_list.get(0).getId(), 0, caller.getId() + ""); - if (vo.getIpAddress() == null) - throw new ResourceAllocationException("Unable to allocate IP from this Pod", ResourceType.network); - } else - vo = _privateIPAddressDao.takeDataCenterIpAddress(zoneId, caller.getId() + ""); + if (podId == null) + throw new ResourceAllocationException("Please do not provide NULL podId", ResourceType.network); + HostPodVO podvo = null; + podvo = _hpDao.findByUuid(podId); + if (podvo == null) + throw new ResourceAllocationException("No sush pod exists", ResourceType.network); + + vo = _privateIPAddressDao.takeIpAddress(zone.getId(), podvo.getId(), 0, caller.getId() + ""); + if(vo == null) + throw new ResourceAllocationException("Unable to allocate IP from this Pod", ResourceType.network); + if (vo.getIpAddress() == null) + throw new ResourceAllocationException("Unable to allocate IP from this Pod", ResourceType.network); HostPodVO pod_vo = _hpDao.findById(vo.getPodId()); AcquirePodIpCmdResponse ret = new AcquirePodIpCmdResponse(); @@ -1956,7 +1959,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage boolean ipv4 = false; if (network.getGateway() != null) { - if (nic.getIp4Address() == null) { + if (nic.getIPv4Address() == null) { ipv4 = true; PublicIp ip = null; @@ -1964,9 +1967,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage if (requestedIpv4 != null && vm.getType() == VirtualMachine.Type.DomainRouter) { Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null); if (placeholderNic != null) { - IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address()); + IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIPv4Address()); ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId())); - s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network); + s_logger.debug("Nic got an ip address " + placeholderNic.getIPv4Address() + " stored in placeholder nic for the network " + network); } } @@ -1974,12 +1977,10 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv4, false); } - nic.setIp4Address(ip.getAddress().toString()); - nic.setGateway(ip.getGateway()); - nic.setNetmask(ip.getNetmask()); + nic.setIPv4Address(ip.getAddress().toString()); + nic.setIPv4Gateway(ip.getGateway()); + nic.setIPv4Netmask(ip.getNetmask()); nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag())); - //nic.setBroadcastType(BroadcastDomainType.Vlan); - //nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag())); nic.setBroadcastType(network.getBroadcastDomainType()); if (network.getBroadcastUri() != null) nic.setBroadcastUri(network.getBroadcastUri()); @@ -1989,18 +1990,18 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage nic.setReservationId(String.valueOf(ip.getVlanTag())); nic.setMacAddress(ip.getMacAddress()); } - nic.setDns1(dc.getDns1()); - nic.setDns2(dc.getDns2()); + nic.setIPv4Dns1(dc.getDns1()); + nic.setIPv4Dns2(dc.getDns2()); } //FIXME - get ipv6 address from the placeholder if it's stored there if (network.getIp6Gateway() != null) { - if (nic.getIp6Address() == null) { + if (nic.getIPv6Address() == null) { UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6); Vlan vlan = _vlanDao.findById(ip.getVlanId()); - nic.setIp6Address(ip.getAddress().toString()); - nic.setIp6Gateway(vlan.getIp6Gateway()); - nic.setIp6Cidr(vlan.getIp6Cidr()); + nic.setIPv6Address(ip.getAddress().toString()); + nic.setIPv6Gateway(vlan.getIp6Gateway()); + nic.setIPv6Cidr(vlan.getIp6Cidr()); if (ipv4) { nic.setFormat(AddressFormat.DualStack); } else { @@ -2012,8 +2013,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage nic.setMacAddress(ip.getMacAddress()); } } - nic.setIp6Dns1(dc.getIp6Dns1()); - nic.setIp6Dns2(dc.getIp6Dns2()); + nic.setIPv6Dns1(dc.getIp6Dns1()); + nic.setIPv6Dns2(dc.getIp6Dns2()); } } }); diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 26ad1db5796..04956064415 100644 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -42,6 +42,7 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; import org.apache.cloudstack.api.command.admin.network.CreateNetworkCmdByAdmin; import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; @@ -50,6 +51,7 @@ import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; import org.apache.cloudstack.api.command.user.vm.ListNicsCmd; +import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -4210,4 +4212,27 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return _ipAddressDao.findById(id); } + @Override + public AcquirePodIpCmdResponse allocatePodIp(Account ipOwner, String zoneId, String podId) throws ResourceAllocationException { + + Account caller = CallContext.current().getCallingAccount(); + long callerUserId = CallContext.current().getCallingUserId(); + DataCenter zone = _entityMgr.findByUuid(DataCenter.class, zoneId); + + if (zone == null) + throw new InvalidParameterValueException("Invalid zone Id "); + if (_accountMgr.checkAccessAndSpecifyAuthority(caller, zone.getId()) != zone.getId()) + throw new InvalidParameterValueException("Caller does not have permission for this Zone" + "(" + zoneId + ")"); + if (s_logger.isDebugEnabled()) + s_logger.debug("Associate IP address called by the user " + callerUserId + " account " + ipOwner.getId()); + return _ipAddrMgr.allocatePodIp(zoneId, podId); + + } + + @Override + public boolean releasePodIp(ReleasePodIpCmdByAdmin ip) throws CloudRuntimeException { + _ipAddrMgr.releasePodIp(ip.getId()); + return true; + } + } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 5e19ad7b1b9..099a274f709 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -875,13 +875,10 @@ public class LoadBalancingRulesManagerImpl extends ManagerBase implements for (LoadBalancerVO lb : rules) { List dstList = getExistingDestinations(lb.getId()); List hcPolicyList = getHealthCheckPolicies(lb.getId()); - // adding to lbrules list only if the LB rule - // hashealtChecks - if (hcPolicyList != null && hcPolicyList.size() > 0) { - Ip sourceIp = getSourceIp(lb); - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, null, hcPolicyList, sourceIp, null, lb.getLbProtocol()); - lbrules.add(loadBalancing); - } + // Now retrive the status of services from NS even there are no policies. because there is default monitor + Ip sourceIp = getSourceIp(lb); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, null, hcPolicyList, sourceIp, null, lb.getLbProtocol()); + lbrules.add(loadBalancing); } if (lbrules.size() > 0) { isHandled = false; @@ -2124,10 +2121,11 @@ public class LoadBalancingRulesManagerImpl extends ManagerBase implements throw new InvalidParameterValueException("Modifications in lb rule " + lbRuleId + " are not supported."); } + LoadBalancerVO tmplbVo = _lbDao.findById(lbRuleId); boolean success = _lbDao.update(lbRuleId, lb); // If algorithm is changed, have to reapply the lb config - if (algorithm != null) { + if ((algorithm!= null) && (tmplbVo.getAlgorithm().compareTo(algorithm)!=0)){ try { lb.setState(FirewallRule.State.Add); _lbDao.persist(lb); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index c20039abd81..b14086a19b3 100644 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -48,8 +48,10 @@ import org.apache.cloudstack.api.command.admin.account.EnableAccountCmd; import org.apache.cloudstack.api.command.admin.account.ListAccountsCmdByAdmin; import org.apache.cloudstack.api.command.admin.account.LockAccountCmd; import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd; +import org.apache.cloudstack.api.command.admin.address.AcquirePodIpCmdByAdmin; import org.apache.cloudstack.api.command.admin.address.AssociateIPAddrCmdByAdmin; import org.apache.cloudstack.api.command.admin.address.ListPublicIpAddressesCmdByAdmin; +import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; import org.apache.cloudstack.api.command.admin.affinitygroup.UpdateVMAffinityGroupCmdByAdmin; import org.apache.cloudstack.api.command.admin.alert.GenerateAlertCmd; import org.apache.cloudstack.api.command.admin.autoscale.CreateCounterCmd; @@ -3019,6 +3021,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe cmdList.add(ChangeOutOfBandManagementPasswordCmd.class); cmdList.add(GetUserKeysCmd.class); + cmdList.add(AcquirePodIpCmdByAdmin.class); + cmdList.add(ReleasePodIpCmdByAdmin.class); + return cmdList; } diff --git a/server/src/org/apache/cloudstack/network/ssl/CertServiceImpl.java b/server/src/org/apache/cloudstack/network/ssl/CertServiceImpl.java index 9da9bddd5b8..68e84fbb7b8 100644 --- a/server/src/org/apache/cloudstack/network/ssl/CertServiceImpl.java +++ b/server/src/org/apache/cloudstack/network/ssl/CertServiceImpl.java @@ -123,6 +123,7 @@ public class CertServiceImpl implements CertService { final String key = certCmd.getKey(); final String password = certCmd.getPassword(); final String chain = certCmd.getChain(); + final String name = certCmd.getName(); validate(cert, key, password, chain); s_logger.debug("Certificate Validation succeeded"); @@ -142,7 +143,7 @@ public class CertServiceImpl implements CertService { final Long accountId = owner.getId(); final Long domainId = owner.getDomainId(); - final SslCertVO certVO = new SslCertVO(cert, key, password, chain, accountId, domainId, fingerPrint); + final SslCertVO certVO = new SslCertVO(cert, key, password, chain, accountId, domainId, fingerPrint, name); _sslCertDao.persist(certVO); return createCertResponse(certVO, null); @@ -325,10 +326,10 @@ public class CertServiceImpl implements CertService { response.setId(cert.getUuid()); response.setCertificate(cert.getCertificate()); response.setFingerprint(cert.getFingerPrint()); + response.setName(cert.getName()); - if (cert.getChain() != null) { + if (cert.getChain() != null) response.setCertchain(cert.getChain()); - } if (lbCertMap != null && !lbCertMap.isEmpty()) { final List lbIds = new ArrayList(); diff --git a/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java b/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java index dbc31ba6ef4..47c3250bcaa 100644 --- a/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java +++ b/server/test/com/cloud/network/ExternalLoadBalancerDeviceManagerImplTest.java @@ -61,16 +61,21 @@ import com.cloud.network.dao.NetworkExternalLoadBalancerVO; import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.ResourceManager; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.AccountManager; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.utils.net.Ip; +import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.VMInstanceDao; @RunWith(MockitoJUnitRunner.class) public class ExternalLoadBalancerDeviceManagerImplTest { @@ -135,9 +140,20 @@ public class ExternalLoadBalancerDeviceManagerImplTest { protected HostPodDao _podDao = null; @Mock IpAddressManager _ipAddrMgr; - + @Mock + protected VirtualMachineManager _itMgr; @Mock Network network; + @Mock + VMInstanceDao _vmDao; + @Mock + VMTemplateDao _templateDao; + @Mock + ServiceOfferingDao _serviceOfferingDao; + @Mock + PhysicalNetworkServiceProviderDao _physicalProviderDao; + @Mock + VirtualRouterProviderDao _vrProviderDao; @Mock LoadBalancingRule rule; @@ -192,6 +208,7 @@ public class ExternalLoadBalancerDeviceManagerImplTest { private void setupLBHealthChecksMocks() throws URISyntaxException { Mockito.when(network.getId()).thenReturn(42l); + Mockito.when(network.getNetworkOfferingId()).thenReturn(1l); Mockito.when(network.getBroadcastUri()).thenReturn(new URI("vlan://1")); NetworkExternalLoadBalancerVO externalLb = Mockito .mock(NetworkExternalLoadBalancerVO.class); diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java index 75c181f8a6d..495989d65be 100644 --- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; @@ -32,6 +33,7 @@ import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; import org.apache.cloudstack.api.command.user.vm.ListNicsCmd; +import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -72,6 +74,7 @@ import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.NicSecondaryIp; @@ -907,30 +910,17 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches } @Override -<<<<<<< db052a96b18391ae5f972960d1f496f5396b8684 public List listVmNicSecondaryIps(ListNicsCmd listNicsCmd) { return null; -======= - public AcquirePodIpCmdResponse allocatePodIp(Account ipOwner, long zoneId, String cidr) throws ResourceAllocationException, ConcurrentOperationException { - - Account caller = CallContext.current().getCallingAccount(); - long callerUserId = CallContext.current().getCallingUserId(); - DataCenter zone = _entityMgr.findById(DataCenter.class, zoneId); - - if (zone == null) - throw new InvalidParameterValueException("Invalid zone Id is Null"); - if (_accountMgr.checkAccessAndSpecifyAuthority(caller, zoneId) != zoneId) - throw new InvalidParameterValueException("Caller does not have permission for this Zone" + "(" + zoneId + ")"); - if (s_logger.isDebugEnabled()) - s_logger.debug("Associate IP address called by the user " + callerUserId + " account " + ipOwner.getId()); - return _ipAddrMgr.allocatePodIp(zoneId, cidr); } @Override public boolean releasePodIp(ReleasePodIpCmdByAdmin ip) throws CloudRuntimeException { - _ipAddrMgr.releasePodIp(ip.getId()); return true; ->>>>>>> CLOUDSTACK-8672 : NCC Integration with CloudStack. } + @Override + public AcquirePodIpCmdResponse allocatePodIp(Account account, String zoneId, String podId) throws ResourceAllocationException, ConcurrentOperationException { + return null; + } } diff --git a/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java b/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java index 757b0245705..b0440f2e946 100644 --- a/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java +++ b/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java @@ -381,4 +381,10 @@ public class MockNetworkDaoImpl extends GenericDaoBase implemen public int getNonSystemNetworkCountByVpcId(final long vpcId) { return 0; } + + @Override + public List listNetworkVO(List idset) { + // TODO Auto-generated method stub + return null; + } } diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py index 0fd97754176..a261037d803 100644 --- a/tools/apidoc/gen_toc.py +++ b/tools/apidoc/gen_toc.py @@ -171,6 +171,16 @@ known_categories = { 'StratosphereSsp' : ' Stratosphere SSP', 'Metrics' : 'Metrics', 'Infrastructure' : 'Metrics', + 'listNetscalerControlCenter' : 'Load Balancer', + 'listRegisteredServicePackages': 'Load Balancer', + 'listNsVpx' : 'Load Balancer', + 'destroyNsVPx': 'Load Balancer', + 'deployNetscalerVpx' : 'Load Balancer', + 'deleteNetscalerControlCenter' : 'Load Balancer', + 'stopNetScalerVpx' : 'Load Balancer', + 'deleteServicePackageOffering' : 'Load Balancer', + 'destroyNsVpx' : 'Load Balancer', + 'startNsVpx' : 'Load Balancer' } diff --git a/ui/index.html b/ui/index.html index 41894a65f83..6cc7db9583b 100644 --- a/ui/index.html +++ b/ui/index.html @@ -1837,6 +1837,7 @@ + diff --git a/ui/l10n/en.js b/ui/l10n/en.js index 125e96d41ca..bd6ac0a7499 100644 --- a/ui/l10n/en.js +++ b/ui/l10n/en.js @@ -254,6 +254,7 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.action.reboot.systemvm.processing":"Rebooting System VM....", "label.action.recurring.snapshot":"Recurring Snapshots", "label.action.register.iso":"Register ISO", +"label.action.register.ncc":"Register NCC", "label.action.register.template":"Register Template from URL", "label.action.release.ip":"Release IP", "label.action.release.ip.processing":"Releasing IP....", @@ -318,6 +319,7 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.add.by":"Add by", "label.add.by.cidr":"Add By CIDR", "label.add.by.group":"Add By Group", +"label.add.certificate":"Add Certificate", "label.add.ciscoASA1000v":"Add CiscoASA1000v Resource", "label.add.cluster":"Add Cluster", "label.add.compute.offering":"Add compute offering", @@ -502,6 +504,10 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.capacity.bytes":"Capacity Bytes", "label.capacity.iops":"Capacity IOPS", "label.certificate":"Server certificate", +"label.certificate.details":"Certificate Details", +"label.certificate.name":"Certificate", +"label.certificateid":"Certificate ID", +"label.chain":"Chain", "label.change.affinity":"Change Affinity", "label.change.ipaddress":"Change IP address for NIC", "label.change.service.offering":"Change service offering", @@ -617,6 +623,7 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.delete.project":"Delete project", "label.delete.role":"Delete Role", "label.delete.secondary.staging.store":"Delete Secondary Staging Store", +"label.delete.sslcertificate":"Delete SSL Certificate", "label.delete.ucs.manager":"Delete UCS Manager", "label.delete.vpn.user":"Delete VPN user", "label.deleting.failed":"Deleting Failed", @@ -941,6 +948,10 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.lb.algorithm.leastconn":"Least connections", "label.lb.algorithm.roundrobin":"Round-robin", "label.lb.algorithm.source":"Source", +"label.lb.protocol.http":"HTTP", +"label.lb.protocol.ssl":"SSL", +"label.lb.protocol.tcp":"TCP", +"label.lb.protocol.udp":"UDP", "label.ldap.configuration":"LDAP Configuration", "label.ldap.group.name":"LDAP Group", "label.ldap.link.type":"Type", @@ -1101,9 +1112,14 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.name.lower":"name", "label.name.optional":"Name (Optional)", "label.nat.port.range":"NAT Port Range", +"label.ncc":"NCC", +"label.ncc.delete":"Delete NCC", +"label.ncc.details":"NCC Details", "label.netScaler":"NetScaler", "label.netmask":"Netmask", "label.netscaler.details":"NetScaler details", +"label.netscaler.service.packages":"Netscaler Service Packages", +"label.netscaler.service.packages.description":"Service Package Description", "label.network":"Network", "label.network.ACL":"Network ACL", "label.network.ACL.total":"Network ACL Total", @@ -1263,6 +1279,8 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.private.port":"Private Port", "label.private.zone":"Private Zone", "label.privatekey":"PKCS#8 Private Key", +"label.privatekey.name":"Private Key", +"label.privatekey.password":"Private Key Password", "label.profile":"Profile", "label.project":"Project", "label.project.dashboard":"Project dashboard", @@ -1520,6 +1538,7 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.ssh.key.pair":"SSH Key Pair", "label.ssh.key.pair.details":"SSH Key Pair Details", "label.ssh.key.pairs":"SSH Key Pairs", +"label.sslcertificates":"SSL Certificates", "label.standard.us.keyboard":"Standard (US) keyboard", "label.start.IP":"Start IP", "label.start.lb.vm":"Start LB VM", @@ -1667,6 +1686,7 @@ var dictionary = {"ICMP.code":"ICMP Code", "label.username":"Username", "label.username.lower":"username", "label.users":"Users", +"label.uuid":"UUID", "label.vSwitch.type":"vSwitch Type", "label.value":"Value", "label.vcdcname":"vCenter DC name", @@ -2020,6 +2040,7 @@ var dictionary = {"ICMP.code":"ICMP Code", "message.delete.affinity.group":"Please confirm that you would like to remove this affinity group.", "message.delete.gateway":"Please confirm you want to delete the gateway", "message.delete.project":"Are you sure you want to delete this project?", +"message.delete.sslcertificate":"Please confirm that you would like to delete this certificate.", "message.delete.user":"Please confirm that you would like to delete this user.", "message.desc.add.new.lb.sticky.rule":"Add new LB sticky rule", "message.desc.advanced.zone":"For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support.", @@ -2122,6 +2143,7 @@ var dictionary = {"ICMP.code":"ICMP Code", "message.migrate.router.confirm":"Please confirm the host you wish to migrate the router to:", "message.migrate.systemvm.confirm":"Please confirm the host you wish to migrate the system VM to:", "message.migrate.volume":"Please confirm that you want to migrate volume to another primary storage.", +"message.ncc.delete.confirm":"Please confirm you want to delete this NCC", "message.network.addVM.desc":"Please specify the network that you would like to add this VM to. A new NIC will be added for this network.", "message.network.addVMNIC":"Please confirm that you would like to add a new VM NIC for this network.", "message.network.remote.access.vpn.configuration":"Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try.", @@ -2165,6 +2187,8 @@ var dictionary = {"ICMP.code":"ICMP Code", "message.read.admin.guide.scaling.up":"Please read the dynamic scaling section in the admin guide before scaling up.", "message.recover.vm":"Please confirm that you would like to recover this VM.", "message.redirecting.region":"Redirecting to region...", +"message.register.failed":"Registration Failed", +"message.register.succeeded":"Registration Succeeded", "message.reinstall.vm":"NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched.", "message.remove.ldap":"Are you sure you want to delete the LDAP configuration?", "message.remove.region":"Are you sure you want to remove this region from this management server?", diff --git a/ui/scripts/accounts.js b/ui/scripts/accounts.js index 62cc62567aa..439683fd159 100644 --- a/ui/scripts/accounts.js +++ b/ui/scripts/accounts.js @@ -895,6 +895,199 @@ } }, + sslCertificates: { + title: 'label.sslcertificates', + listView: { + id: 'sslCertificates', + + fields: { + name: { + label: 'label.name' + }, + id: { + label: 'label.certificateid' + } + }, + + dataProvider: function(args) { + var data = {}; + listViewDataProvider(args, data); + if (args.context != null) { + if ("accounts" in args.context) { + $.extend(data, { + accountid: args.context.accounts[0].id + }); + } + } + $.ajax({ + url: createURL('listSslCerts'), + data: data, + success: function(json) { + var items = json.listsslcertsresponse.sslcert; + args.response.success({ + data: items + }); + } + }); + }, + + actions: { + add: { + label: 'label.add.certificate', + + messages: { + notification: function(args) { + return 'label.add.certificate'; + } + }, + + createForm: { + title: 'label.add.certificate', + fields: { + name: { + label: 'label.name', + validation: { + required: true + } + }, + certificate: { + label: 'label.certificate.name', + isTextarea: true, + validation: { + required: true + }, + }, + privatekey: { + label: 'label.privatekey.name', + isTextarea: true, + validation: { + required: true + } + }, + certchain: { + label: "label.chain", + isTextarea: true, + validation: { + required: false + } + }, + password: { + label: "label.privatekey.password", + isPassword: true, + validation: { + required: false + } + } + } + }, + + action: function(args) { + var data = { + name: args.data.name, + certificate: args.data.certificate, + privatekey: args.data.privatekey + }; + + if (args.data.certchain != null && args.data.certchain.length > 0) { + $.extend(data, { + certchain: args.data.certchain + }); + } + + if (args.data.password != null && args.data.password.length > 0) { + $.extend(data, { + password: args.data.password + }); + } + + $.ajax({ + url: createURL('uploadSslCert'), + data: data, + success: function(json) { + var item = json.uploadsslcertresponse.sslcert; + args.response.success({ + data: item + }); + }, + error: function(json) { + args.response.error(parseXMLHttpResponse(json)); + } + }); + } + } + }, + + detailView: { + actions: { + remove: { + label: 'label.delete.sslcertificate', + messages: { + confirm: function(args) { + return 'message.delete.sslcertificate'; + }, + notification: function(args) { + return 'label.delete.sslcertificate'; + } + }, + action: function(args) { + $.ajax({ + url: createURL('deleteSslCert'), + data: { + id: args.context.sslCertificates[0].id + }, + success: function(json) { + var items = json.deletesslcertresponse.sslcert; + args.response.success({ + data: items + }); + } + }); + } + } + }, + + tabs: { + details: { + title: 'label.certificate.details', + fields: { + name: { + label: 'label.name' + }, + certificate: { + label: 'label.certificate.name' + }, + certchain: { + label: 'label.chain' + } + }, + + dataProvider: function(args) { + var data = {}; + + if (args.context != null) { + if ("sslCertificates" in args.context) { + $.extend(data, { + certid: args.context.sslCertificates[0].id + }); + } + } + $.ajax({ + url: createURL('listSslCerts'), + data: data, + success: function(json) { + var items = json.listsslcertsresponse.sslcert[0]; + args.response.success({ + data: items + }); + } + }); + } + } + } + } + } + }, + // Granular settings for account settings: { title: 'label.settings', diff --git a/ui/scripts/configuration.js b/ui/scripts/configuration.js index 512ccf7c738..921735bd69e 100644 --- a/ui/scripts/configuration.js +++ b/ui/scripts/configuration.js @@ -2639,11 +2639,17 @@ args.$form.find('.form-item[rel=\"egressdefaultpolicy\"]').css('display', 'none'); } - //show LB Isolation dropdown only when (1)LB Service is checked (2)Service Provider is Netscaler OR F5 - if ((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'Netscaler' || args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'F5BigIp')) { - args.$form.find('.form-item[rel=\"service.Lb.lbIsolationDropdown\"]').css('display', 'inline-block'); + //show Netscaler service packages only when (1)LB Service is checked (2)Service Provider is Netscaler + if ((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'Netscaler')) { + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages\"]').css('display', 'inline-block'); + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').css('display', 'inline-block'); + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").attr("disabled", "disabled"); + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").text(args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages\"]').find('#label_netscaler_service_packages option:selected').data("json-obj").desc); } else { - args.$form.find('.form-item[rel=\"service.Lb.lbIsolationDropdown\"]').hide(); + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages\"]').hide(); + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').hide(); + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").attr("disabled", "disabled"); + args.$form.find('.form-item[rel=\"service.Lb.Netscaler.servicePackages.description\"]').find("#label_netscaler_service_packages_description").text(""); } //show Elastic LB checkbox only when (1)LB Service is checked (2)Service Provider is Netscaler (3)Guest IP Type is Shared @@ -3014,22 +3020,7 @@ isHidden: true, isBoolean: true }, - "service.Lb.lbIsolationDropdown": { - label: 'label.LB.isolation', - docID: 'helpNetworkOfferingLBIsolation', - isHidden: true, - select: function(args) { - args.response.success({ - data: [{ - id: 'dedicated', - description: 'Dedicated' - }, { - id: 'shared', - description: 'Shared' - }] - }) - } - }, + "service.Lb.inlineModeDropdown": { label: 'label.mode', docID: 'helpNetworkOfferingMode', @@ -3049,6 +3040,62 @@ } }, + "service.Lb.Netscaler.servicePackages": { + label: 'label.netscaler.service.packages', + docID: 'helpNetscalerServicePackages', + isHidden: true, + select: function(args) { + $.ajax({ + url: createURL('listRegisteredServicePackages'), + dataType: 'json', + async: true, + success: function(data) { + var servicePackages = data.listregisteredservicepackage.registeredServicepackage; + + if (servicePackages == undefined || servicePackages == null || !servicePackages) { + servicePackages = data.listregisteredservicepackage; + } + + args.response.success({ + data: $.map(servicePackages, function(elem) { + return { + id: elem.id, + description: elem.name, + desc: elem.description + }; + }) + }); + }, + error: function(data) { + args.response.error(parseXMLHttpResponse(data)); + } + }); + } + }, + + "service.Lb.Netscaler.servicePackages.description": { + label: 'label.netscaler.service.packages.description', + isHidden: true, + isTextarea: true + }, + + "service.Lb.lbIsolationDropdown": { + label: 'label.LB.isolation', + docID: 'helpNetworkOfferingLBIsolation', + isHidden: true, + select: function(args) { + args.response.success({ + data: [{ + id: 'dedicated', + description: 'Dedicated' + }, { + id: 'shared', + description: 'Shared' + }] + }) + } + }, + "service.StaticNat.elasticIpCheckbox": { label: "label.elastic.IP", isHidden: true, @@ -3129,6 +3176,12 @@ $.each(formData, function(key, value) { var serviceData = key.split('.'); + if (key == 'service.Lb.Netscaler.servicePackages' && value != "") { + inputData['details[' + 0 + '].servicepackageuuid'] = value; + inputData['details[' + 1 + '].servicepackagedescription'] = args.$form.find('#label_netscaler_service_packages option:selected').data().jsonObj.desc; + } + + if (serviceData.length > 1) { if (serviceData[0] == 'service' && serviceData[2] == 'isEnabled' && diff --git a/ui/scripts/docs.js b/ui/scripts/docs.js index 938514f84d2..2908e8b5f64 100755 --- a/ui/scripts/docs.js +++ b/ui/scripts/docs.js @@ -568,6 +568,10 @@ cloudStack.docs = { desc: 'Number of guest networks/accounts that will share this device', externalLink: '' }, + helpNetscalerServicePackages: { + desc: 'Choose the Netscaler Service Package you want to use.', + externalLink: '' + }, // Add network offering helpNetworkOfferingName: { desc: 'Any desired name for the network offering', diff --git a/ui/scripts/lbCertificatePolicy.js b/ui/scripts/lbCertificatePolicy.js new file mode 100644 index 00000000000..538e33dcc03 --- /dev/null +++ b/ui/scripts/lbCertificatePolicy.js @@ -0,0 +1,183 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +(function($, cloudStack) { + cloudStack.lbCertificatePolicy = { + dialog: function(args) { + return function(args) { + var success = args.response.success; + var context = args.context; + + var certid = { + certificate: { + label: 'label.certificate.name', + select: function(args) { + var data = {}; + var item = {}; + + if (context != null) { + if (context.networks != null) { + $.extend(data, {account: context.networks[0].account}); + $.extend(data, {domain: context.networks[0].domain}); + } + } + + $.ajax({ + url: createURL('listAccounts'), + async: false, + data: data, + success: function(json) { + var items = json.listaccountsresponse.account; + $.extend(item, {accountid: items[0].id}); + } + }); + + $.ajax({ + url: createURL('listSslCerts'), + async: false, + data: item, + success: function(json) { + var items = json.listsslcertsresponse.sslcert; + args.response.success({ + data: $.map(items, function(item) { + return { + id: item.id, + description: item.id + }; + }) + }); + } + }); + } + } + }; + + var $item = args.$item; + + cloudStack.dialog.createForm({ + form: { + title: 'Configure Certificate', + desc: 'Please complete the following fields', + fields: certid + }, + after: function(args) { + // Remove fields not applicable to sticky method + args.$form.find('.form-item:hidden').remove(); + + var data = cloudStack.serializeForm(args.$form); + + /* $item indicates that this is an existing sticky rule; + re-create sticky rule with new parameters */ + if ($item) { + var $loading = $('
').addClass('loading-overlay'); + + $loading.prependTo($item); + cloudStack.lbStickyPolicy.actions.recreate( + $item.data('multi-custom-data').id, + $item.data('multi-custom-data').lbRuleID, + data, + function() { // Complete + $(window).trigger('cloudStack.fullRefresh'); + }, + function(error) { // Error + $(window).trigger('cloudStack.fullRefresh'); + } + ); + } else { + success({ + data: data + }); + } + } + }); + }; + }, + + actions: { + add: function(lbRuleID, data, complete, error) { + + $.ajax({ + url: createURL('assignCertToLoadBalancer'), + data: {certid: data.certificate, lbruleid: lbRuleID}, + success: function(json) { + cloudStack.ui.notifications.add({ + desc: 'Add new LB Certificate', + section: 'Network', + poll: pollAsyncJobResult, + _custom: { + jobId: json.assigncerttoloadbalancerresponse.jobid + } + }, + complete, {}, + error, {} + ); + }, + error: function(json) { + complete(); + cloudStack.dialog.notice({ + message: parseXMLHttpResponse(json) + }); + } + }); + }, + 'delete': function(stickyRuleID, complete, error) { + $.ajax({ + url: createURL('deleteLBStickinessPolicy'), + data: { + id: stickyRuleID + }, + success: function(json) { + cloudStack.ui.notifications.add({ + desc: 'Remove previous LB sticky rule', + section: 'Network', + poll: pollAsyncJobResult, + _custom: { + jobId: json.deleteLBstickinessrruleresponse.jobid + } + }, + complete, {}, + error, {} + ); + }, + error: function(json) { + complete(); + cloudStack.dialog.notice({ + message: parseXMLHttpResponse(json) + }); + } + }); + }, + recreate: function(stickyRuleID, lbRuleID, data, complete, error) { + var addStickyPolicy = function() { + cloudStack.lbStickyPolicy.actions.add( + lbRuleID, + data, + complete, + error + ); + }; + + // Delete existing rule + if (data.methodname !== 'None') { + addStickyPolicy(); + } else { + cloudStack.lbStickyPolicy.actions['delete'](stickyRuleID, complete, error); + } + } + } + }; +}(jQuery, cloudStack)); \ No newline at end of file diff --git a/ui/scripts/network.js b/ui/scripts/network.js old mode 100755 new mode 100644 index 175ab4c1666..31f8016e12b --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -3025,112 +3025,6 @@ vmDetails: cloudStack.sections.instances.listView.detailView, - - //"NAT Port Range" multiEdit screen for StaticNAT is obsolete in cloudstack 3.0 because createIpForwardingRule/deleteIpForwardingRule/listIpForwardingRules API are obsolete in cloudstack 3.0. - //cloudstack 3.0 is using createFirewallRule/listFirewallRules/deleteFirewallRule API for both staticNAT and non-staticNAT . - /* - staticNAT: { - noSelect: true, - fields: { - 'protocol': { - label: 'label.protocol', - select: function(args) { - args.response.success({ - data: [ - { name: 'tcp', description: 'TCP' }, - { name: 'udp', description: 'UDP' } - ] - }); - } - }, - 'startport': { edit: true, label: 'label.start.port' }, - 'endport': { edit: true, label: 'label.end.port' }, - 'add-rule': { - label: 'label.add.rule', - addButton: true - } - }, - add: { - label: 'label.add', - action: function(args) { - $.ajax({ - url: createURL('createIpForwardingRule'), - data: $.extend(args.data, { - ipaddressid: args.context.ipAddresses[0].id - }), - dataType: 'json', - success: function(data) { - args.response.success({ - _custom: { - jobId: data.createipforwardingruleresponse.jobid - }, - notification: { - label: 'label.add.static.nat.rule', - poll: pollAsyncJobResult - } - }); - }, - error: function(data) { - args.response.error(parseXMLHttpResponse(data)); - } - }); - } - }, - actions: { - destroy: { - label: 'label.remove.rule', - action: function(args) { - $.ajax({ - url: createURL('deleteIpForwardingRule'), - data: { - id: args.context.multiRule[0].id - }, - dataType: 'json', - async: true, - success: function(data) { - var jobID = data.deleteipforwardingruleresponse.jobid; - args.response.success({ - _custom: { - jobId: jobID - }, - notification: { - label: 'label.remove.static.nat.rule', - poll: pollAsyncJobResult - } - }); - }, - error: function(data) { - args.response.error(parseXMLHttpResponse(data)); - } - }); - } - } - }, - dataProvider: function(args) { - setTimeout(function() { - $.ajax({ - url: createURL('listIpForwardingRules'), - data: { - listAll: true, - ipaddressid: args.context.ipAddresses[0].id - }, - dataType: 'json', - async: true, - success: function(data) { - args.response.success({ - data: data.listipforwardingrulesresponse.ipforwardingrule - }); - }, - error: function(data) { - args.response.error(parseXMLHttpResponse(data)); - } - }); - }, 100); - } - }, - */ - - // Load balancing rules loadBalancing: { listView: $.extend(true, {}, cloudStack.sections.instances, { @@ -3360,6 +3254,41 @@ } }, + 'protocol': { + label: 'label.protocol', + isEditable: true, + select: function(args) { + var data = [{ + id: 'ssl', + name: 'ssl', + description: _l('label.lb.protocol.ssl') + }, { + id: 'tcp', + name: 'tcp', + description: _l('label.lb.protocol.tcp') + }, { + id: 'udp', + name: 'udp', + description: _l('label.lb.protocol.udp') + }]; + if (typeof args.context != 'undefined') { + var lbProtocols = getLBProtocols(args.context.networks[0]); + data = (lbProtocols.length == 0) ? data : lbProtocols; + } + args.response.success({ + data: data + }); + } + }, + + 'sslcertificate': { + label: 'label.update.ssl', + custom: { + buttonLabel: 'label.configure', + action: cloudStack.lbCertificatePolicy.dialog() + } + }, + 'health-check': { label: 'label.health.check', custom: { @@ -3441,12 +3370,10 @@ } } }, - 'add-vm': { label: 'label.add.vms', addButton: true }, - 'state' : { edit: 'ignore', label: 'label.state' @@ -3478,11 +3405,13 @@ publicport: args.data.publicport, openfirewall: false, networkid: networkid, - publicipid: args.context.ipAddresses[0].id + publicipid: args.context.ipAddresses[0].id, + protocol: args.data.protocol }; var stickyData = $.extend(true, {}, args.data.sticky); - + var certificateData = $.extend(true, {}, args.data.sslcertificate); + //***** create new LB rule > Add VMs ***** $.ajax({ url: createURL('createLoadBalancerRule'), @@ -3495,46 +3424,70 @@ var lbID = data.createloadbalancerruleresponse.id; var inputData = { - id: data.createloadbalancerruleresponse.id - }; - - /* - var inputData = { - id: data.createloadbalancerruleresponse.id, - virtualmachineids: $.map(itemData, function(elem) { - return elem.id; - }).join(',') - }; - */ - //virtualmachineids parameter has been replaced with vmidipmap parameter, so comment out the 6 lines above. - - - /* - * e.g. first VM(xxx) has two IPs(10.1.1.~), second VM(yyy) has three IPs(10.2.2.~): - * vmidipmap[0].vmid=xxx vmidipmap[0].vmip=10.1.1.11 - * vmidipmap[1].vmid=xxx vmidipmap[1].vmip=10.1.1.12 - * vmidipmap[2].vmid=yyy vmidipmap[2].vmip=10.2.2.77 - * vmidipmap[3].vmid=yyy vmidipmap[3].vmip=10.2.2.78 - * vmidipmap[4].vmid=yyy vmidipmap[4].vmip=10.2.2.79 - */ + id: data.createloadbalancerruleresponse.id + }; + var selectedVMs = args.itemData; if (selectedVMs != null) { - var vmidipmapIndex = 0; - for (var vmIndex = 0; vmIndex < selectedVMs.length; vmIndex++) { - var selectedIPs = selectedVMs[vmIndex]._subselect; - for (var ipIndex = 0; ipIndex < selectedIPs.length; ipIndex++) { - inputData['vmidipmap[' + vmidipmapIndex + '].vmid'] = selectedVMs[vmIndex].id; + var vmidipmapIndex = 0; + for (var vmIndex = 0; vmIndex < selectedVMs.length; vmIndex++) { + var selectedIPs = selectedVMs[vmIndex]._subselect; + for (var ipIndex = 0; ipIndex < selectedIPs.length; ipIndex++) { + inputData['vmidipmap[' + vmidipmapIndex + '].vmid'] = selectedVMs[vmIndex].id; + + if (args.context.ipAddresses[0].isportable) { + inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex].split(',')[1]; + } else { + inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex]; + } + + vmidipmapIndex++; + } + } + } + + /*$.ajax({ + url: createURL('assignCertToLoadBalancer'), + data: {certid: certificateData.certificate, lbruleid: lbID}, + success: function(data) { + var jobID = data.assigncerttoloadbalancerresponse.jobid; + var lbProtocolCreated = false; - if (args.context.ipAddresses[0].isportable) { - inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex].split(',')[1]; - } else { - inputData['vmidipmap[' + vmidipmapIndex + '].vmip'] = selectedIPs[ipIndex]; + args.response.success({ + _custom: { + jobId: jobID + }, + notification: { + label: 'label.add.certificate', + poll: function(args) { + var complete = args.complete; + var error = args.error; + + pollAsyncJobResult({ + _custom: { + jobId: jobID + }, + complete: function(args) { + if (lbProtocolCreated) return; + + lbProtocolCreated = true; + + if (certificateData && certificateData.certificate) { + cloudStack.lbCertificatePolicy.actions.add(lbID, certificateData, complete, error); + } else { + complete(); + } + }, + error: error + }); + } } - - vmidipmapIndex++; - } + }); + }, + error: function(data) { + args.response.error(parseXMLHttpResponse(data)); } - } + });*/ $.ajax({ url: createURL('assignToLoadBalancerRule'), @@ -3542,6 +3495,7 @@ success: function(data) { var jobID = data.assigntoloadbalancerruleresponse.jobid; var lbStickyCreated = false; + var lbCertificateCreated = false; args.response.success({ _custom: { @@ -3558,17 +3512,26 @@ jobId: jobID }, complete: function(args) { - if (lbStickyCreated) return; + if (lbStickyCreated && lbCertificateCreated) { + return; + } - lbStickyCreated = true; + if (!lbStickyCreated) { + lbStickyCreated = true; - // Create stickiness policy - if (stickyData && - stickyData.methodname && - stickyData.methodname != 'None') { - cloudStack.lbStickyPolicy.actions.add(lbID, - stickyData, - complete, error); + if (stickyData && stickyData.methodname && stickyData.methodname != 'None') { + cloudStack.lbStickyPolicy.actions.add(lbID, stickyData, complete, error); + } + } + + if (!lbCertificateCreated) { + lbCertificateCreated = true; + + if (certificateData && certificateData.certificate && certificateData.certificate != 'None') { + cloudStack.lbCertificatePolicy.actions.add(lbID, certificateData, complete, error); + } else { + complete(); + } } else { complete(); } @@ -3761,7 +3724,7 @@ $(loadbalancerrules).each(function() { var lbRule = this; var stickyData = {}; - + var sslCertData = {}; //var lbInstances = []; var itemData = []; @@ -3822,6 +3785,21 @@ } }); + // Get SSL Certificate data + $.ajax({ + url: createURL('listSslCerts'), + data: { + listAll: true, + lbruleid: lbRule.id + }, + async: false, + success: function(json) { + if (json.listsslcertsresponse != null) { + lbRule._hideFields.push('sslcertificate'); + } + } + }); + // Get instances $.ajax({ url: createURL('listLoadBalancerRuleInstances'), @@ -6562,4 +6540,63 @@ } } + var getLBProtocols = function(networkObj) { + if (!networkObj || !networkObj.service) { + return []; + } + + var lbService = $.grep(networkObj.service, function(service) { + return service.name == 'Lb'; + })[0]; + + if (!lbService || !lbService.capability) { + return []; + } + + var protocolCapabilities = $.grep( + lbService.capability, + function(capability) { + return (capability.name == 'SupportedProtocols'); + } + )[0]; + + if (!protocolCapabilities) { + return []; + } + + var protocols = protocolCapabilities.value.split(','); + + if (!protocols) { + return []; + } + + var data = []; + $(protocols).each(function() { + data.push({id: this.valueOf(), name: this.valueOf(), description: _l('label.lb.protocol.' + this.valueOf())}); + }); + + protocolCapabilities = $.grep( + lbService.capability, + function(capability) { + return (capability.name == 'SslTermination' && (capability.value == 'true' || capability.value == true)); + } + )[0]; + + if (!protocolCapabilities) { + return data; + } + + var protocols = protocolCapabilities.value.split(','); + + if (!protocols) { + return data; + } + + $(protocols).each(function() { + data.push({id: 'ssl', name: 'ssl', description: _l('label.lb.protocol.ssl')}); + }); + + return data; + } + })(cloudStack, jQuery); diff --git a/ui/scripts/regions.js b/ui/scripts/regions.js index 16b891f78b5..ff50bff09e5 100644 --- a/ui/scripts/regions.js +++ b/ui/scripts/regions.js @@ -159,6 +159,9 @@ return false; } + }, { + path: 'regions.NCC', + label: 'label.ncc' }], actions: { edit: { @@ -258,6 +261,7 @@ } } }, + GSLB: { id: 'GSLB', type: 'select', @@ -1021,6 +1025,224 @@ } } } + }, + + NCC: { + id: 'NCC', + type: 'select', + title: 'NCC', + listView: { + id: 'NCC', + label: 'label.ncc', + + fields: { + uuid: { + label: 'label.id' + }, + ipaddress: { + label: 'label.ipaddress' + }, + numretries: { + label: 'label.numretries' + } + }, + + actions: { + add: { + label: 'label.action.register.ncc', + + preFilter: function(args) { + var isRegisterButtonShown = false; + + $.ajax({ + url: createURL('listNetscalerControlCenter'), + async: false, + success: function(json) { + isRegisterButtonShown = json.listNetscalerControlCenter.netscalercontrolcenter ? false : true; + } + }); + + return isRegisterButtonShown; + }, + + messages: { + confirm: function(args) { + return 'label.action.register.ncc'; + }, + notification: function(args) { + return 'label.action.register.ncc'; + } + }, + + createForm: { + title: 'label.action.register.ncc', + fields: { + ipaddress: { + label: 'label.ipaddress', + validation: { + required: true + } + }, + username: { + label: 'label.username', + validation : { + required: true + } + }, + password: { + label: 'label.password', + isPassword: true, + validation : { + required: true, + } + }, + numretries: { + label: 'label.numretries', + defaultValue: '2', + validation : { + required: true, + } + } + } + }, + + action: function(args) { + var $loading = $('
').addClass('loading-overlay'); + $('.system-dashboard-view:visible').prepend($loading); + + var data = { + ipaddress: args.data.ipaddress, + username: args.data.username, + password: args.data.password, + numretries: args.data.numretries + }; + + $.ajax({ + url: createURL('registerNetscalerControlCenter'), + data: data, + dataType: 'json', + type: "POST", + success: function(json) { + var jid = json.registernetscalercontrolcenterresponse.jobid; + var registerNetscalerControlCenterIntervalID = setInterval(function() { + $.ajax({ + url: createURL("queryAsyncJobResult&jobId=" + jid), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + clearInterval(registerNetscalerControlCenterIntervalID); + if (result.jobstatus == 1) { + cloudStack.dialog.notice({ + message: 'message.register.succeeded' + }); + $loading.remove(); + } else if (result.jobstatus == 2) { + cloudStack.dialog.notice({ + message: _l('message.register.failed') + ' ' + _s(result.jobresult.errortext) + }); + $loading.remove(); + } + } + }, + error: function(XMLHttpResponse) { + cloudStack.dialog.notice({ + message: _l('message.register.failed') + ' ' + parseXMLHttpResponse(XMLHttpResponse) + }); + $loading.remove(); + } + }); + }, g_queryAsyncJobResultInterval); + }, + error: function(XMLHttpResponse) { + cloudStack.dialog.notice({ + message: _l('message.register.failed') + ' ' + parseXMLHttpResponse(XMLHttpResponse) + }); + $loading.remove(); + } + }); + }, + + notification: { + poll: pollAsyncJobResult + } + } + }, + + dataProvider: function(args) { + $.ajax({ + url: createURL('listNetscalerControlCenter'), + success: function(json) { + var item = json.listNetscalerControlCenter.netscalercontrolcenter ? json.listNetscalerControlCenter.netscalercontrolcenter : null; + args.response.success({ + data: item + }); + } + }); + }, + + detailView: { + name: 'label.ncc.details', + actions: { + remove: { + label: 'label.ncc.delete', + messages: { + confirm: function(args) { + return 'message.ncc.delete.confirm'; + }, + notification: function(args) { + return 'label.ncc.delete'; + } + }, + action: function(args) { + var data = { + id: args.context.NCC[0].uuid + }; + $.ajax({ + url: createURL("deleteNetscalerControlCenter"), + data: data, + success: function(json) { + var status = json.deleteNetscalerControlCenter ? json.deleteNetscalerControlCenter.success : null; + args.response.success({ + data: status + }); + } + }); + }, + } + }, + tabs: { + details: { + title: 'label.details', + fields: [{ + uuid: { + label: 'label.id' + } + }, { + ipaddress: { + label: 'label.ipaddress' + }, + numretries: { + label: 'label.numretries', + }, + }], + dataProvider: function(args) { + $.ajax({ + url: createURL('listNetscalerControlCenter'), + success: function(json) { + var item = json.listNetscalerControlCenter.netscalercontrolcenter ? json.listNetscalerControlCenter.netscalercontrolcenter[0] : null; + args.response.success({ + data: item + }); + } + }); + } + } + } + } + } } } }; diff --git a/ui/scripts/system.js b/ui/scripts/system.js old mode 100644 new mode 100755 index 9cff5956a1e..6c1b89d8bad --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -21472,11 +21472,66 @@ nspMap[id]: { }; + if (id == "netscaler") { + var netscalerControlCenter = null; + + $.ajax({ + url: createURL("listNetscalerControlCenter"), + dataType: "json", + async: false, + success: function(json) { + var items = json.listNetscalerControlCenter.netscalercontrolcenter; + if (items != null && items.length > 0) { + netscalerControlCenter = items[0]; + } + } + }); + } + + if (netscalerControlCenter != null) { + if (jsonObj.state == undefined) { + $.ajax({ + url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + selectedPhysicalNetworkObj.id), + dataType: "json", + async: true, + success: function (json) { + var jobId = json.addnetworkserviceproviderresponse.jobid; + var addNetscalerProviderIntervalID = setInterval(function () { + $.ajax({ + url: createURL("queryAsyncJobResult&jobId=" + jobId), + dataType: "json", + success: function (json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + clearInterval(addNetscalerProviderIntervalID); + if (result.jobstatus == 1) { + nspMap[ "netscaler"] = result.jobresult.networkserviceprovider; + addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer"); + } else if (result.jobstatus == 2) { + alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + _s(result.jobresult.errortext)); + } + } + }, + error: function (XMLHttpResponse) { + var errorMsg = parseXMLHttpResponse(XMLHttpResponse); + alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg); + } + }); + }, + g_queryAsyncJobResultInterval); + } + }); + jsonObj.state = "Disabled"; + } + } + if (jsonObj.state) { - if (jsonObj.state == "Enabled") - allowedActions.push("disable"); else if (jsonObj.state == "Disabled") - allowedActions.push("enable"); - allowedActions.push("destroy"); + if (jsonObj.state == "Enabled") + allowedActions.push("disable"); else if (jsonObj.state == "Disabled") + allowedActions.push("enable"); + allowedActions.push("destroy"); } allowedActions.push('add');