diff options
| author | Ben Busby <noreply+git@benbusby.com> | 2021-11-08 17:08:19 -0700 |
|---|---|---|
| committer | Ben Busby <noreply+git@benbusby.com> | 2021-11-08 17:08:19 -0700 |
| commit | 56b9c52528d1e514d4ec15f1da7517cd83bcf5ff (patch) | |
| tree | b7a5c0f8015bba7b47fb1e72577ea4eb9c7e99c2 /lib | |
| parent | 8042dcad0c61110111949a856c935325ca65f8ef (diff) | |
| download | farside-56b9c52528d1e514d4ec15f1da7517cd83bcf5ff.tar.gz | |
Display list of available instances on home page
This introduces a number of new changes:
- Services are now inserted into redis with a prefix prepended to the
key name. This allows for easier filtering to get only live instances.
- The home page now uses an eex template for displaying all live
instances for every service, determined by the last update
- A "last_updated" field was added
- farside.ex was added to contain all functionality related to querying
for instances (WIP)
- Other improvements
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/farside.ex | 45 | ||||
| -rw-r--r-- | lib/farside/router.ex | 18 |
2 files changed, 61 insertions, 2 deletions
diff --git a/lib/farside.ex b/lib/farside.ex new file mode 100644 index 0000000..9432406 --- /dev/null +++ b/lib/farside.ex @@ -0,0 +1,45 @@ +defmodule Farside do + @service_prefix Application.fetch_env!(:farside, :service_prefix) + + def get_services_map do + {:ok, redis_keys} = Redix.command(:redix, ["KEYS", "*"]) + + # Extract only service related keys + service_list = + Enum.filter( + redis_keys, + fn key -> + String.starts_with?(key, @service_prefix) + end + ) + + # Match service name to list of available instances + Enum.reduce(service_list, %{}, fn service, acc -> + {:ok, instance_list} = + Redix.command( + :redix, + ["LRANGE", service, "0", "-1"] + ) + + Map.put( + acc, + String.replace_prefix( + service, + @service_prefix, + "" + ), + instance_list + ) + end) + end + + def get_last_updated do + {:ok, last_updated} = + Redix.command( + :redix, + ["GET", "last_updated"] + ) + + last_updated + end +end diff --git a/lib/farside/router.ex b/lib/farside/router.ex index 95d9b41..82b3757 100644 --- a/lib/farside/router.ex +++ b/lib/farside/router.ex @@ -1,5 +1,7 @@ defmodule Farside.Router do + @index Application.fetch_env!(:farside, :index) @fallback_str Application.fetch_env!(:farside, :fallback_str) + @service_prefix Application.fetch_env!(:farside, :service_prefix) use Plug.Router @@ -7,7 +9,14 @@ defmodule Farside.Router do plug(:dispatch) get "/" do - send_resp(conn, 200, "") + resp = + EEx.eval_file( + @index, + last_updated: Farside.get_last_updated(), + services: Farside.get_services_map() + ) + + send_resp(conn, 200, resp) end get "/ping" do @@ -22,7 +31,12 @@ defmodule Farside.Router do {:ok, instances} = Redix.command( :redix, - ["LRANGE", service, "0", "-1"] + [ + "LRANGE", + "#{@service_prefix}#{service}", + "0", + "-1" + ] ) # Either pick a random available instance, |
