summaryrefslogtreecommitdiff
path: root/update.exs
diff options
context:
space:
mode:
Diffstat (limited to 'update.exs')
-rw-r--r--update.exs57
1 files changed, 47 insertions, 10 deletions
diff --git a/update.exs b/update.exs
index 2387fb8..dad22ec 100644
--- a/update.exs
+++ b/update.exs
@@ -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")