summaryrefslogtreecommitdiff
path: root/update.exs
diff options
context:
space:
mode:
authorBen Busby <noreply+git@benbusby.com>2021-11-24 09:35:21 -0700
committerBen Busby <noreply+git@benbusby.com>2021-11-24 09:35:21 -0700
commitff97d258f0ac2bbd3b89df892ce3aed08b5e0a42 (patch)
tree0a7f8452878ad0838befaf4e39f53ddc794d5338 /update.exs
parentd1c9212994925bbe18f5bad7070f2a6238a969f8 (diff)
downloadfarside-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.exs88
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")
-])