Example #1
0
        /// <summary>
        /// Get or Create Region.
        /// </summary>
        /// <param name="region">Region name.</param>
        /// <returns>Instance of <see cref="FailoverRegion{RegionEndpoint}"/></returns>
        private FailoverRegion <RegionEndpoint> GetOrCreateRegion(string region)
        {
            // If exists
            if (_failoverRegions.TryGetValue(region, out var failoverRegion))
            {
                return(failoverRegion);
            }

            // If does not exists, create and store
            failoverRegion = new FailoverRegion <RegionEndpoint>(RegionEndpoint.GetBySystemName(region),
                                                                 _regionResetWindowInMillis);
            _failoverRegions.Add(region, failoverRegion);

            return(failoverRegion);
        }
Example #2
0
        /// <summary>
        /// Setup region and create client.
        /// </summary>
        /// <param name="credentials">Instance of <see cref="AWSCredentials"/> class.</param>
        /// <param name="regionEndpoint">Instance of <see cref="RegionEndpoint"/> class.</param>
        /// <param name="failover">Fail over to the new region.</param>
        /// <param name="freeCurrentRegion">Mark current region as free.</param>
        /// <returns>Instance of <see cref="AmazonServiceClient"/> class</returns>
        protected virtual TAWSClient GetOrCreateRegionClient(AWSCredentials credentials, RegionEndpoint regionEndpoint, bool failover = true, bool freeCurrentRegion = false)
        {
            var failoverRegion = GetOrCreateRegion(regionEndpoint);

            _logger.LogDebug("Creating client for AWS region: {0}", regionEndpoint.SystemName);
            // Check Failover Region is available
            if (failoverRegion.Available())
            {
                if (failover)
                {
                    // Mark in use
                    failoverRegion.MarkInUse();

                    // Mark current region free
                    if (freeCurrentRegion && _currentRegion is not null)
                    {
                        _currentRegion.Reset();
                    }
                    // Mark current region as down
                    else if (_currentRegion is not null)
                    {
                        _currentRegion.MarkIsDown();
                    }

                    // Store as current region
                    _currentRegion = failoverRegion;
                }

                _logger.LogInformation("Successfully created client for AWS region: {0}.", regionEndpoint.SystemName);

                return(_createClient(_context, credentials, failoverRegion.Region));
            }
            else
            {
                _logger.LogDebug("Skipped creating client for AWS region: {0}, currently in use or region is down.", regionEndpoint.SystemName);
            }

            return(null);
        }