Exemple #1
0
        private async Task WarmupBrowserHub(ContainerLeaseData lease)
        {
            var url = lease.Url;

            if (url == null)
            {
                throw new ArgumentException(nameof(url));
            }
            var builder = new UriBuilder(url)
            {
                Path = "/wd/hub"
            };
            var ping = builder.Uri;

            for (int i = 0; i < 200; i++)
            {
                try
                {
                    var data = await httpClient.GetAsync(ping);

                    if ((int)data.StatusCode < 400)
                    {
                        logger.LogInformation($"Browser warmed up (WarmIndex: {i*50} ms |ID={lease.LeaseId}).");
                        return;
                    }
                }
                catch (Exception e)
                {
                    await Task.Delay(50);
                }
            }
        }
Exemple #2
0
        public async Task DropLease(Guid leaseId)
        {
            ContainerLeaseData lease = null;

            lock (locker)
            {
                // find lease
                foreach (var browser in leases)
                {
                    var index = browser.Value.FindIndex(l => l?.LeaseId == leaseId);
                    if (index >= 0)
                    {
                        lease = browser.Value[index];

                        // drop lease
                        browser.Value[index] = null;
                        break;
                    }
                }
            }

            if (lease != null)
            {
                // stop container
                await dockerProvisioningService.StopContainer(lease.ContainerId);

                logger.LogInformation($"The lease {leaseId} was dropped and the container was stopped.");
            }
            else
            {
                logger.LogInformation($"The lease {leaseId} has already been dropped, no action was taken.");
            }

            LogHub.Refresh(hubContext);
        }
Exemple #3
0
        public async Task <ContainerLeaseData> AcquireLease(string browserType)
        {
            logger.LogInformation($"Acquiring lock for browser {browserType}...");

            int index;
            ContainerLeaseData lease;

            lock (locker)
            {
                var browserLeases = leases[browserType];

                // find unused instance
                index = browserLeases.FindIndex(l => l == null);
                if (index < 0)
                {
                    logger.LogWarning($"No containers for browser {browserType} are available right now. Try again later.");
                    return(null);
                }

                // create lease
                lease = new ContainerLeaseData()
                {
                    LeaseId           = Guid.NewGuid(),
                    ExpirationDateUtc = DateTime.UtcNow + LeaseTimeout
                };
                browserLeases[index] = lease;
                logger.LogDebug($"Acquired lease {lease.LeaseId}, preparing container...");
            }

            try
            {
                // start container
                var container = await dockerProvisioningService.StartContainer(GetImageName(browserType), browserType, index);

                // return lease
                lease.ContainerId = container.ContainerId;
                lease.Url         = container.Url;
                logger.LogInformation($"Warm up started for browser {browserType} (ID={lease.LeaseId}).");
                await WarmupBrowserHub(lease);

                lease.ExpirationDateUtc = DateTime.UtcNow + LeaseTimeout;
                logger.LogInformation($"Lock for browser {browserType} (ID={lease.LeaseId}) acquired and valid until {lease.ExpirationDateUtc}.");
                LogHub.Refresh(hubContext);
                return(lease);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"Error acquiring lock for browser {browserType}!");
                throw;
            }
        }