/// <summary> /// Initializes a new instance of the <see cref="LoadBalancerConfiguration{TNodeConfiguration}"/> /// class with the specified values. /// </summary> /// <param name="name">The name of the load balancer.</param> /// <param name="protocol">The load balancing protocol to use for this load balancer.</param> /// <param name="virtualAddresses">A collection of <see cref="LoadBalancerVirtualAddress"/> objects describing the virtual addresses to assign to the load balancer.</param> /// <param name="nodes">A collection of <typeparamref name="TNodeConfiguration"/> objects describing the nodes in the load balancer. If this value is <see langword="null"/>, the load balancer will be created without any nodes.</param> /// <param name="halfClosed"><see langword="true"/> to enable half-closed support for the load balancer; otherwise, <see langword="false"/>. Half-Closed support provides the ability for one end of the connection to terminate its output, while still receiving data from the other end. Only applies to TCP/TCP_CLIENT_FIRST protocols.</param> /// <param name="accessList">A collection of <see cref="NetworkItem"/> objects describing the access list for the load balancer. If this value is <see langword="null"/>, the load balancer will be created without an access list configured.</param> /// <param name="algorithm">The load balancing algorithm that defines how traffic should be directed between back-end nodes. If this value is <see langword="null"/>, a provider-specific default algorithm will be used.</param> /// <param name="connectionLogging"><see langword="true"/> to enable connection logging; otherwise, <see langword="false"/>. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="contentCaching"><see langword="true"/> to enable content caching; otherwise, <see langword="false"/>. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="connectionThrottle">A <see cref="ConnectionThrottles"/> object defining the connection throttling configuration for the load balancer. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="healthMonitor">A <see cref="HealthMonitor"/> object defining the health monitor to configure for the load balancer. If this value is <see langword="null"/>, the load balancer will be created with no health monitor configured.</param> /// <param name="metadata">A collection of <see cref="LoadBalancerMetadataItem"/> objects defining the initial metadata for the load balancer. If this value is <see langword="null"/>, the load balancer will be created without any initial custom metadata.</param> /// <param name="timeout">The timeout value for the load balancer and communications with its nodes. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="sessionPersistence">A <see cref="SessionPersistence"/> object defining the session persistence configuration for the load balancer. If this value is <see langword="null"/>, the load balancer will be created with session persistence disabled.</param> /// <exception cref="ArgumentNullException"> /// If <paramref name="name"/> is <see langword="null"/>. /// <para>-or-</para> /// <para>If <paramref name="protocol"/> is <see langword="null"/>.</para> /// <para>-or-</para> /// <para>If <paramref name="virtualAddresses"/> is <see langword="null"/>.</para> /// </exception> /// <exception cref="ArgumentException"> /// If <paramref name="name"/> is empty. /// <para>-or-</para> /// <para>If <paramref name="nodes"/> contains any <see langword="null"/> values.</para> /// <para>-or-</para> /// <para>If <paramref name="virtualAddresses"/> is empty.</para> /// <para>-or-</para> /// <para>If <paramref name="virtualAddresses"/> contains any <see langword="null"/> values.</para> /// <para>-or-</para> /// <para>If <paramref name="accessList"/> contains any <see langword="null"/> values.</para> /// <para>-or-</para> /// <para>If <paramref name="metadata"/> contains any <see langword="null"/> values.</para> /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// If <paramref name="timeout"/> is negative or <see cref="TimeSpan.Zero"/>. /// </exception> public LoadBalancerConfiguration(string name, LoadBalancingProtocol protocol, IEnumerable <LoadBalancerVirtualAddress> virtualAddresses, IEnumerable <TNodeConfiguration> nodes = null, bool?halfClosed = null, IEnumerable <NetworkItem> accessList = null, LoadBalancingAlgorithm algorithm = null, bool?connectionLogging = null, bool?contentCaching = null, ConnectionThrottles connectionThrottle = null, HealthMonitor healthMonitor = null, IEnumerable <LoadBalancerMetadataItem> metadata = null, TimeSpan?timeout = null, SessionPersistence sessionPersistence = null) { if (name == null) { throw new ArgumentNullException("name"); } if (protocol == null) { throw new ArgumentNullException("protocol"); } if (virtualAddresses == null) { throw new ArgumentNullException("virtualAddresses"); } if (string.IsNullOrEmpty(name)) { throw new ArgumentException("name cannot be empty"); } if (timeout <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException("timeout"); } _name = name; _nodes = nodes != null?nodes.ToArray() : null; _protocolName = protocol != null ? protocol.Name : null; _port = protocol != null ? (int?)protocol.Port : null; _halfClosed = halfClosed; _virtualIps = virtualAddresses.ToArray(); _accessList = accessList != null?accessList.ToArray() : null; _algorithm = algorithm; if (connectionLogging.HasValue) { _connectionLogging = connectionLogging.Value ? LoadBalancerEnabledFlag.True : LoadBalancerEnabledFlag.False; } if (contentCaching.HasValue) { _contentCaching = contentCaching.Value ? LoadBalancerEnabledFlag.True : LoadBalancerEnabledFlag.False; } _connectionThrottle = connectionThrottle; _healthMonitor = healthMonitor != null?JObject.FromObject(healthMonitor) : null; _metadata = metadata != null?metadata.ToArray() : null; _timeout = timeout != null ? (int?)timeout.Value.TotalSeconds : null; _sessionPersistence = sessionPersistence; if (_nodes != null && _nodes.Contains(null)) { throw new ArgumentException("nodes cannot contain any null values", "nodes"); } if (_virtualIps.Contains(null)) { throw new ArgumentException("virtualAddresses cannot contain any null values", "virtualAddresses"); } if (_accessList != null && _accessList.Contains(null)) { throw new ArgumentException("accessList cannot contain any null values", "accessList"); } if (_metadata != null && _metadata.Contains(null)) { throw new ArgumentException("metadata cannot contain any null values", "metadata"); } }
/// <summary> /// Initializes a new instance of the <see cref="LoadBalancerConfiguration"/> class /// with the specified values. /// </summary> /// <param name="name">The name of the load balancer.</param> /// <param name="protocol">The load balancing protocol to use for this load balancer.</param> /// <param name="virtualAddresses">A collection of <see cref="LoadBalancerVirtualAddress"/> objects describing the virtual addresses to assign to the load balancer.</param> /// <param name="nodes">A collection of <see name="NodeConfiguration"/> objects describing the nodes in the load balancer. If this value is <see langword="null"/>, the load balancer will be created without any nodes.</param> /// <param name="halfClosed"><see langword="true"/> to enable half-closed support for the load balancer; otherwise, <see langword="false"/>. Half-Closed support provides the ability for one end of the connection to terminate its output, while still receiving data from the other end. Only applies to TCP/TCP_CLIENT_FIRST protocols.</param> /// <param name="accessList">A collection of <see cref="NetworkItem"/> objects describing the access list for the load balancer. If this value is <see langword="null"/>, the load balancer will be created without an access list configured.</param> /// <param name="algorithm">The load balancing algorithm that defines how traffic should be directed between back-end nodes. If this value is <see langword="null"/>, a provider-specific default algorithm will be used.</param> /// <param name="connectionLogging"><see langword="true"/> to enable connection logging; otherwise, <see langword="false"/>. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="contentCaching"><see langword="true"/> to enable content caching; otherwise, <see langword="false"/>. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="connectionThrottle">A <see cref="ConnectionThrottles"/> object defining the connection throttling configuration for the load balancer. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="healthMonitor">A <see cref="HealthMonitor"/> object defining the health monitor to configure for the load balancer. If this value is <see langword="null"/>, the load balancer will be created with no health monitor configured.</param> /// <param name="metadata">A collection of <see cref="LoadBalancerMetadataItem"/> objects defining the initial metadata for the load balancer. If this value is <see langword="null"/>, the load balancer will be created without any initial custom metadata.</param> /// <param name="timeout">The timeout value for the load balancer and communications with its nodes. If this value is <see langword="null"/>, a provider-specific default value will be used.</param> /// <param name="sessionPersistence">A <see cref="SessionPersistence"/> object defining the session persistence configuration for the load balancer. If this value is <see langword="null"/>, the load balancer will be created with session persistence disabled.</param> /// <exception cref="ArgumentNullException"> /// If <paramref name="name"/> is <see langword="null"/>. /// <para>-or-</para> /// <para>If <paramref name="protocol"/> is <see langword="null"/>.</para> /// <para>-or-</para> /// <para>If <paramref name="virtualAddresses"/> is <see langword="null"/>.</para> /// </exception> /// <exception cref="ArgumentException"> /// If <paramref name="name"/> is empty. /// <para>-or-</para> /// <para>If <paramref name="nodes"/> contains any <see langword="null"/> values.</para> /// <para>-or-</para> /// <para>If <paramref name="virtualAddresses"/> is empty.</para> /// <para>-or-</para> /// <para>If <paramref name="virtualAddresses"/> contains any <see langword="null"/> values.</para> /// <para>-or-</para> /// <para>If <paramref name="accessList"/> contains any <see langword="null"/> values.</para> /// <para>-or-</para> /// <para>If <paramref name="metadata"/> contains any <see langword="null"/> values.</para> /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// If <paramref name="timeout"/> is negative or <see cref="TimeSpan.Zero"/>. /// </exception> public LoadBalancerConfiguration(string name, LoadBalancingProtocol protocol, IEnumerable <LoadBalancerVirtualAddress> virtualAddresses, IEnumerable <NodeConfiguration> nodes = null, bool?halfClosed = null, IEnumerable <NetworkItem> accessList = null, LoadBalancingAlgorithm algorithm = null, bool?connectionLogging = null, bool?contentCaching = null, ConnectionThrottles connectionThrottle = null, HealthMonitor healthMonitor = null, IEnumerable <LoadBalancerMetadataItem> metadata = null, TimeSpan?timeout = null, SessionPersistence sessionPersistence = null) : base(name, protocol, virtualAddresses, nodes, halfClosed, accessList, algorithm, connectionLogging, contentCaching, connectionThrottle, healthMonitor, metadata, timeout, sessionPersistence) { }
public async Task TestConnectionThrottleConfiguration() { ILoadBalancerService provider = CreateProvider(); using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TestTimeout(TimeSpan.FromSeconds(60)))) { IEnumerable<LoadBalancingProtocol> protocols = await provider.ListProtocolsAsync(cancellationTokenSource.Token); LoadBalancingProtocol httpProtocol = protocols.First(i => i.Name.Equals("HTTP", StringComparison.OrdinalIgnoreCase)); string loadBalancerName = CreateRandomLoadBalancerName(); LoadBalancerConfiguration configuration = new LoadBalancerConfiguration( name: loadBalancerName, nodes: null, protocol: httpProtocol, virtualAddresses: new[] { new LoadBalancerVirtualAddress(LoadBalancerVirtualAddressType.ServiceNet) }, halfClosed: null, accessList: null, algorithm: LoadBalancingAlgorithm.RoundRobin, connectionLogging: null, contentCaching: null, connectionThrottle: null, healthMonitor: null, metadata: null, timeout: null, sessionPersistence: null); LoadBalancer tempLoadBalancer = await provider.CreateLoadBalancerAsync(configuration, AsyncCompletionOption.RequestCompleted, cancellationTokenSource.Token, null); Assert.AreEqual(LoadBalancerStatus.Active, tempLoadBalancer.Status); Assert.IsNull(tempLoadBalancer.ConnectionThrottles); Console.WriteLine("Reported by create:"); Console.WriteLine(JsonConvert.SerializeObject(tempLoadBalancer.ConnectionThrottles, Formatting.Indented)); ConnectionThrottles throttles = await provider.ListThrottlesAsync(tempLoadBalancer.Id, cancellationTokenSource.Token); Console.WriteLine("After create:"); Console.WriteLine(JsonConvert.SerializeObject(throttles, Formatting.Indented)); int maxConnectionRate = 3; int maxConnections = 2; int minConnections = 1; TimeSpan rateInterval = TimeSpan.FromSeconds(5); throttles = new ConnectionThrottles(maxConnectionRate, maxConnections, minConnections, rateInterval); await provider.UpdateThrottlesAsync(tempLoadBalancer.Id, throttles, AsyncCompletionOption.RequestCompleted, cancellationTokenSource.Token, null); throttles = await provider.ListThrottlesAsync(tempLoadBalancer.Id, cancellationTokenSource.Token); Assert.AreEqual(maxConnectionRate, throttles.MaxConnectionRate); Assert.AreEqual(maxConnections, throttles.MaxConnections); Assert.AreEqual(minConnections, throttles.MinConnections); Assert.AreEqual(rateInterval, throttles.RateInterval); Console.WriteLine("After update:"); Console.WriteLine(JsonConvert.SerializeObject(throttles, Formatting.Indented)); await provider.RemoveThrottlesAsync(tempLoadBalancer.Id, AsyncCompletionOption.RequestCompleted, cancellationTokenSource.Token, null); throttles = await provider.ListThrottlesAsync(tempLoadBalancer.Id, cancellationTokenSource.Token); Console.WriteLine("After removal:"); Console.WriteLine(JsonConvert.SerializeObject(throttles, Formatting.Indented)); /* Cleanup */ await provider.RemoveLoadBalancerAsync(tempLoadBalancer.Id, AsyncCompletionOption.RequestCompleted, cancellationTokenSource.Token, null); } }
public static void UpdateThrottles(this ILoadBalancerService service, LoadBalancerId loadBalancerId, ConnectionThrottles throttleConfiguration) { if (service == null) throw new ArgumentNullException("service"); try { service.UpdateThrottlesAsync(loadBalancerId, throttleConfiguration, AsyncCompletionOption.RequestSubmitted, CancellationToken.None, null).Wait(); } catch (AggregateException ex) { ReadOnlyCollection<Exception> innerExceptions = ex.Flatten().InnerExceptions; if (innerExceptions.Count == 1) throw innerExceptions[0]; throw; } }