summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBen Busby <noreply+git@benbusby.com>2021-11-08 17:08:19 -0700
committerBen Busby <noreply+git@benbusby.com>2021-11-08 17:08:19 -0700
commit56b9c52528d1e514d4ec15f1da7517cd83bcf5ff (patch)
treeb7a5c0f8015bba7b47fb1e72577ea4eb9c7e99c2 /lib
parent8042dcad0c61110111949a856c935325ca65f8ef (diff)
downloadfarside-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.ex45
-rw-r--r--lib/farside/router.ex18
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,