diff options
| author | Ben Busby <noreply+git@benbusby.com> | 2021-10-22 17:15:40 -0600 |
|---|---|---|
| committer | Ben Busby <noreply+git@benbusby.com> | 2021-10-22 17:15:40 -0600 |
| commit | 4949ae22bb2fd1b81cdfbbe21468015fb229b553 (patch) | |
| tree | eaad6f87b43a1b741697cb350a19dad65e384444 /update.exs | |
| parent | b0953f07779a4fc6fdfe650a872c4e39251db3ee (diff) | |
| download | farside-4949ae22bb2fd1b81cdfbbe21468015fb229b553.tar.gz | |
Output available instances and fallback URL to redis
Once a list of available URLs has been determined for a particular
service, the list is written as "service -> [list of instances]" to a
local redis connection. These can then be used in the greater routing
logic to pick a random instance from the list, or use a fallback
instance if none are determined to be available.
Diffstat (limited to 'update.exs')
| -rw-r--r-- | update.exs | 57 |
1 files changed, 47 insertions, 10 deletions
@@ -1,8 +1,9 @@ -defmodule Instance do +defmodule Service do defstruct [ - instance_type: nil, - instance_test: nil, - instance_list: [] + type: nil, + test_url: nil, + fallback: nil, + instances: [] ] end @@ -18,16 +19,52 @@ defmodule Instances do end def update(filename) do + {:ok, conn} = Redix.start_link( + "redis://localhost:6379", + name: :redix + ) {:ok, file} = File.read(filename) - {:ok, json} = Poison.decode(file, as: [%Instance{}]) + {:ok, json} = Poison.decode(file, as: [%Service{}]) + + # Loop through all instances and check each for availability for service <- json do - result = Enum.filter(service.instance_list, fn(url) -> - request(url <> service.instance_test) == :good + result = Enum.filter(service.instances, fn(instance_url) -> + request(instance_url <> service.test_url) == :good end) - # TODO: Output result to redis - IO.inspect(result) + + add_to_redis(conn, service, result) + end + end + + def add_to_redis(conn, service, instances) do + # Remove previous list of instances + Redix.command(conn, [ + "DEL", + service.type + ]) + + # Update with new list of available instances + Redix.command(conn, [ + "LPUSH", + 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(conn, [ + "SET", + service.type <> "-fallback", + Enum.random(instances) + ]) + else + Redix.command(conn, [ + "SET", + service.type <> "-fallback", + service.fallback + ]) end end end -Instances.update("instances.json") +Instances.update("services.json") |
