diff options
| author | Ben Busby <noreply+git@benbusby.com> | 2021-11-24 09:35:21 -0700 |
|---|---|---|
| committer | Ben Busby <noreply+git@benbusby.com> | 2021-11-24 09:35:21 -0700 |
| commit | ff97d258f0ac2bbd3b89df892ce3aed08b5e0a42 (patch) | |
| tree | 0a7f8452878ad0838befaf4e39f53ddc794d5338 /update.exs | |
| parent | d1c9212994925bbe18f5bad7070f2a6238a969f8 (diff) | |
| download | farside-ff97d258f0ac2bbd3b89df892ce3aed08b5e0a42.tar.gz | |
Use quantum core for update scheduling
Rather than requiring a traditional crontab install, the app now
leverages quantum-core (link below) to schedule the instance update/sync
task every 5 minutes. Some updates as a result:
- The new job is scheduled at runtime in server.ex.
- The update.exs script was refactored to be compiled along with the
rest of the app as instances.ex.
- Scheduler and Server modules were added for creating and executing
the new update task
- All shell scripts were removed, as they are no longer needed
https://github.com/quantum-elixir/quantum-core
Diffstat (limited to 'update.exs')
| -rw-r--r-- | update.exs | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/update.exs b/update.exs deleted file mode 100644 index bc9ba0d..0000000 --- a/update.exs +++ /dev/null @@ -1,88 +0,0 @@ -defmodule Instances do - @fallback_suffix Application.fetch_env!(:farside, :fallback_suffix) - @update_file Application.fetch_env!(:farside, :update_file) - @services_json Application.fetch_env!(:farside, :services_json) - @service_prefix Application.fetch_env!(:farside, :service_prefix) - - def init() do - File.rename(@update_file, "#{@update_file}-prev") - update() - end - - def request(url) do - cond do - System.get_env("FARSIDE_TEST") -> - :good - true -> - case HTTPoison.get(url) do - {:ok, %HTTPoison.Response{status_code: 200}} -> - # TODO: Add validation of results, not just status code - :good - _ -> - :bad - end - end - end - - def update do - {:ok, file} = File.read(@services_json) - {:ok, json} = Poison.decode(file, as: [%Service{}]) - - # Loop through all instances and check each for availability - for service <- json do - IO.puts "======== " <> service.type - result = Enum.filter(service.instances, fn(instance_url) -> - IO.puts " " <> instance_url - request(instance_url <> service.test_url) == :good - end) - - add_to_redis(service, result) - log_results(service.type, result) - end - end - - def add_to_redis(service, instances) do - # Remove previous list of instances - Redix.command(:redix, [ - "DEL", - "#{@service_prefix}#{service.type}" - ]) - - # Update with new list of available instances - Redix.command(:redix, [ - "LPUSH", - "#{@service_prefix}#{service.type}" - ] ++ instances) - - # Set fallback to one of the available instances, - # or the default instance if all are "down" - if Enum.count(instances) > 0 do - Redix.command(:redix, [ - "SET", - "#{service.type}#{@fallback_suffix}", - Enum.random(instances) - ]) - else - Redix.command(:redix, [ - "SET", - "#{service.type}#{@fallback_suffix}", - service.fallback - ]) - end - end - - def log_results(service_name, results) do - {:ok, file} = File.open(@update_file, [:append, {:delayed_write, 100, 20}]) - IO.write(file, "#{service_name}: #{inspect(results)}\n") - File.close(file) - end -end - -Instances.init() - -# Add UTC time of last update -Redix.command(:redix, [ - "SET", - "last_updated", - Calendar.strftime(DateTime.utc_now(), "%c") -]) |
