From 30b13cdfcf8341a08af8da95ecfeea07c7e0cf15 Mon Sep 17 00:00:00 2001 From: Antoine Augusti Date: Tue, 19 Sep 2023 13:05:40 +0200 Subject: [PATCH] ResourceUnavailableJob : permet d'ignorer certaines ressources (#3471) * ResourceUnavailableJob : permet d'ignorer certaines ressources * Add log --- .../lib/jobs/resource_unavailable_job.ex | 27 ++++++++++++++---- .../jobs/resource_unavailable_job_test.exs | 28 +++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/apps/transport/lib/jobs/resource_unavailable_job.ex b/apps/transport/lib/jobs/resource_unavailable_job.ex index 8a2417fdfe..6835990893 100644 --- a/apps/transport/lib/jobs/resource_unavailable_job.ex +++ b/apps/transport/lib/jobs/resource_unavailable_job.ex @@ -52,6 +52,13 @@ defmodule Transport.Jobs.ResourceUnavailableJob do require Logger alias DB.{Repo, Resource, ResourceUnavailability} + # Set this env variable to a list of `resource.id`s (comma separated) to bypass + # `AvailabilityChecker.available?`. This is *not* something that should be used + # for too long or for too many resources. + # Example values: `42,1337` + # https://github.com/etalab/transport-site/issues/3470 + @bypass_ids_env_name "BYPASS_RESOURCE_AVAILABILITY_RESOURCE_IDS" + @impl Oban.Worker def perform(%Oban.Job{args: %{"resource_id" => resource_id}}) do Logger.info("Running ResourceUnavailableJob for #{resource_id}") @@ -68,14 +75,24 @@ defmodule Transport.Jobs.ResourceUnavailableJob do {true, resource} end - defp check_availability({:updated, status_code, %Resource{format: format, url: url} = resource}) + defp check_availability({:updated, status_code, %Resource{url: url} = resource}) when status_code != 200 do - {Transport.AvailabilityChecker.Wrapper.available?(format, url), resource} + perform_check(resource, url) + end + + defp check_availability({:no_op, %Resource{} = resource}) do + perform_check(resource, Resource.download_url(resource)) end - defp check_availability({:no_op, %Resource{format: format} = resource}) do - check_url = Resource.download_url(resource) - {Transport.AvailabilityChecker.Wrapper.available?(format, check_url), resource} + defp perform_check(%Resource{id: resource_id, format: format} = resource, check_url) do + bypass_resource_ids = @bypass_ids_env_name |> System.get_env("") |> String.split(",") + + if to_string(resource_id) in bypass_resource_ids do + Logger.info("is_available=true for resource##{resource_id} because the check is bypassed") + {true, resource} + else + {Transport.AvailabilityChecker.Wrapper.available?(format, check_url), resource} + end end # GOTCHA: `filetype` is set to `"file"` for exports coming from ODS diff --git a/apps/transport/test/transport/jobs/resource_unavailable_job_test.exs b/apps/transport/test/transport/jobs/resource_unavailable_job_test.exs index 9e6f2315e4..6f6e2aba59 100644 --- a/apps/transport/test/transport/jobs/resource_unavailable_job_test.exs +++ b/apps/transport/test/transport/jobs/resource_unavailable_job_test.exs @@ -209,6 +209,34 @@ defmodule Transport.Test.Transport.Jobs.ResourceUnavailableJobTest do ] = all_enqueued(worker: Transport.Jobs.Workflow) end + test "does not perform a real availability check if the resource is bypassed" do + url = "https://example.com/stop-monitoring" + + resource = + insert(:resource, + url: url, + latest_url: latest_url = url, + filetype: "file", + is_available: true, + format: "SIRI", + datagouv_id: Ecto.UUID.generate() + ) + + System.put_env("BYPASS_RESOURCE_AVAILABILITY_RESOURCE_IDS", "#{resource.id},42") + + Transport.HTTPoison.Mock + |> expect(:get, fn ^latest_url -> + {:ok, %HTTPoison.Response{status_code: 405}} + end) + + # `Transport.AvailabilityChecker.Mock` is not called + + assert :ok == perform_job(ResourceUnavailableJob, %{"resource_id" => resource.id}) + + assert 0 == count_resource_unavailabilities() + assert %DB.Resource{is_available: true} = Repo.reload(resource) + end + test "performs a GET request and allows a 401 response for a SIRI resource" do resource = insert(:resource,