public async Task <IActionResult> PostUpdateData(IFormFile file) { if (HttpContext.Connection.LocalIpAddress.Equals(HttpContext.Connection.RemoteIpAddress) == false && IPAddress.IsLoopback(HttpContext.Connection.RemoteIpAddress) == false && HttpContext.Connection.RemoteIpAddress.Equals(IPAddress.Parse("10.10.10.10")) == false) { return(BadRequest($"This operation can't be done from a remote client, please run this from the server: \n {HttpContext.Connection.LocalIpAddress}, {HttpContext.Connection.RemoteIpAddress}, {IPAddress.Parse("10.10.10.10")}")); } if (file == null) { return(BadRequest("No file was provided")); } _logger.LogInformation("Updating Elastic Search and graphhopper OSM data"); var memoryStream = new MemoryStream(); file.OpenReadStream().CopyTo(memoryStream); _logger.LogInformation("Copy uploaded data completed."); var elasticSearchTask = Task.Run(async() => { var osmHighways = await _osmRepository.GetAllHighways(memoryStream); var geoJsonHighways = _osmGeoJsonPreprocessorExecutor.Preprocess(osmHighways); var fetchTask = _adapters.Select(a => a.GetPointsForIndexing(memoryStream)).ToArray(); var features = await Task.WhenAll(fetchTask); await _elasticSearchGateway.UpdateDataZeroDownTime(features.SelectMany(v => v).ToList(), geoJsonHighways); }); var graphHopperTask = _graphHopperGateway.Rebuild(memoryStream, file.FileName); await Task.WhenAll(elasticSearchTask, graphHopperTask); return(Ok()); }
private async Task RebuildRouting() { _logger.LogInformation("Starting rebuilding routing database."); using (var stream = _latestFileFetcherExecutor.Get()) using (var memoryStream = new MemoryStream()) { stream.CopyTo(memoryStream); await _graphHopperGateway.Rebuild(memoryStream); } _logger.LogInformation("Finished rebuilding routing database."); }
public async Task <IActionResult> PostUpdateData(UpdateRequest request) { if (!RebuildSemaphore.WaitOne(0)) { return(BadRequest("Can't run two full updates in parallel")); } try { if (!IsRequestLocal()) { return(BadRequest("This operation can't be done from a remote client, please run this from the server")); } if (request == null || request.Routing == false && request.Highways == false && request.PointsOfInterest == false && request.OsmFile == false) { request = new UpdateRequest { Routing = true, Highways = true, PointsOfInterest = true, OsmFile = true }; _logger.LogInformation("No specific filters were applied, updating all databases."); } _logger.LogInformation("Updating site's databases according to request: " + JsonConvert.SerializeObject(request)); var memoryStream = new MemoryStream(); using (var stream = await _osmLatestFileFetcher.Get(request.OsmFile)) { stream.CopyTo(memoryStream); } _logger.LogInformation("Copy osm data completed."); var elasticSearchTask = _osmElasticSearchUpdaterService.Rebuild(request, memoryStream); var graphHopperTask = request.Routing ? _graphHopperGateway.Rebuild(memoryStream, Sources.OSM_FILE_NAME) : Task.CompletedTask; await Task.WhenAll(elasticSearchTask, graphHopperTask); return(Ok()); } finally { RebuildSemaphore.Release(); } }