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