mirror of
https://github.com/benbusby/farside.git
synced 2025-03-15 03:36:33 -04:00

The update script now writes the available instances to a .update-results* file (where previous runs have "-prev" appended to the file name). This helps to see how instance availability changes between runs of the script when debugging overall functionality of the app.
79 lines
1.9 KiB
Elixir
79 lines
1.9 KiB
Elixir
defmodule Service do
|
|
defstruct [
|
|
type: nil,
|
|
test_url: nil,
|
|
fallback: nil,
|
|
instances: []
|
|
]
|
|
end
|
|
|
|
defmodule Instances do
|
|
def request(url) do
|
|
case HTTPoison.get(url) do
|
|
{:ok, %HTTPoison.Response{status_code: 200}} ->
|
|
# TODO: Add validation of results, not just status code
|
|
:good
|
|
_ ->
|
|
:bad
|
|
end
|
|
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: [%Service{}])
|
|
|
|
# Loop through all instances and check each for availability
|
|
for service <- json do
|
|
result = Enum.filter(service.instances, fn(instance_url) ->
|
|
request(instance_url <> service.test_url) == :good
|
|
end)
|
|
|
|
add_to_redis(conn, service, result)
|
|
log_results(service.type, 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
|
|
|
|
def log_results(service_name, results) do
|
|
{:ok, file} = File.open(".update-results", [:append, {:delayed_write, 100, 20}])
|
|
IO.write(file, service_name <> ": " <> inspect(results) <> "\n")
|
|
File.close(file)
|
|
end
|
|
end
|
|
|
|
File.rename(".update-results", ".update-results-prev")
|
|
Instances.update("services.json")
|