From 8f1d76dde2d4d2cac5da0b433825b7c8d7c203a5 Mon Sep 17 00:00:00 2001 From: Andrew Dryga Date: Thu, 9 Nov 2023 10:34:39 -0600 Subject: [PATCH] Add optional name field to relays (#2544) The idea is to allow users to explicitly name them so they are easier to identify in the UI. @thomaseizinger we will need to add an optional `FIREZONE_NAME` environment variable for the relays and send it along with other attributes when you connect to a WebSocket. --- elixir/apps/api/lib/api/relay/socket.ex | 2 +- .../apps/api/test/api/relay/socket_test.exs | 13 +++++++++ elixir/apps/domain/lib/domain/relays/relay.ex | 2 ++ .../lib/domain/relays/relay/changeset.ex | 5 ++-- .../20231101014812_add_relays_name.exs | 9 ++++++ .../web/lib/web/live/relay_groups/index.ex | 3 ++ elixir/apps/web/lib/web/live/relays/show.ex | 29 ++++++++++--------- 7 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 elixir/apps/domain/priv/repo/migrations/20231101014812_add_relays_name.exs diff --git a/elixir/apps/api/lib/api/relay/socket.ex b/elixir/apps/api/lib/api/relay/socket.ex index 66a9a7050..6cadf744a 100644 --- a/elixir/apps/api/lib/api/relay/socket.ex +++ b/elixir/apps/api/lib/api/relay/socket.ex @@ -28,7 +28,7 @@ defmodule API.Relay.Socket do attrs = attrs - |> Map.take(~w[ipv4 ipv6]) + |> Map.take(~w[ipv4 ipv6 name]) |> Map.put("last_seen_user_agent", user_agent) |> Map.put("last_seen_remote_ip", real_ip) |> Map.put("last_seen_remote_ip_location_region", location_region) diff --git a/elixir/apps/api/test/api/relay/socket_test.exs b/elixir/apps/api/test/api/relay/socket_test.exs index fcdc6ddb8..822e6c755 100644 --- a/elixir/apps/api/test/api/relay/socket_test.exs +++ b/elixir/apps/api/test/api/relay/socket_test.exs @@ -43,6 +43,19 @@ defmodule API.Relay.SocketTest do assert relay.last_seen_version == @connlib_version end + test "creates a new named relay" do + token = Fixtures.Relays.create_token() + encrypted_secret = Relays.encode_token!(token) + + attrs = + connect_attrs(token: encrypted_secret) + |> Map.put("name", "us-east1-x381") + + assert {:ok, socket} = connect(Socket, attrs, connect_info: @connect_info) + assert relay = Map.fetch!(socket.assigns, :relay) + assert relay.name == "us-east1-x381" + end + test "uses region code to put default coordinates" do token = Fixtures.Relays.create_token() encrypted_secret = Relays.encode_token!(token) diff --git a/elixir/apps/domain/lib/domain/relays/relay.ex b/elixir/apps/domain/lib/domain/relays/relay.ex index 8cc4ac228..50cb3a8f7 100644 --- a/elixir/apps/domain/lib/domain/relays/relay.ex +++ b/elixir/apps/domain/lib/domain/relays/relay.ex @@ -2,6 +2,8 @@ defmodule Domain.Relays.Relay do use Domain, :schema schema "relays" do + field :name, :string + field :ipv4, Domain.Types.IP field :ipv6, Domain.Types.IP diff --git a/elixir/apps/domain/lib/domain/relays/relay/changeset.ex b/elixir/apps/domain/lib/domain/relays/relay/changeset.ex index 34a456f0e..2e3ac205b 100644 --- a/elixir/apps/domain/lib/domain/relays/relay/changeset.ex +++ b/elixir/apps/domain/lib/domain/relays/relay/changeset.ex @@ -3,14 +3,14 @@ defmodule Domain.Relays.Relay.Changeset do alias Domain.Version alias Domain.Relays - @upsert_fields ~w[ipv4 ipv6 port + @upsert_fields ~w[ipv4 ipv6 port name last_seen_user_agent last_seen_remote_ip last_seen_remote_ip_location_region last_seen_remote_ip_location_city last_seen_remote_ip_location_lat last_seen_remote_ip_location_lon]a - @conflict_replace_fields ~w[ipv4 ipv6 port + @conflict_replace_fields ~w[ipv4 ipv6 port name last_seen_user_agent last_seen_remote_ip last_seen_remote_ip_location_region @@ -37,6 +37,7 @@ defmodule Domain.Relays.Relay.Changeset do |> cast(attrs, @upsert_fields) |> validate_required(~w[last_seen_user_agent last_seen_remote_ip]a) |> validate_required_one_of(~w[ipv4 ipv6]a) + |> validate_length(:name, min: 1, max: 255) |> validate_number(:port, greater_than_or_equal_to: 1, less_than_or_equal_to: 65_535) |> unique_constraint(:ipv4, name: :relays_unique_address_index) |> unique_constraint(:ipv6, name: :relays_unique_address_index) diff --git a/elixir/apps/domain/priv/repo/migrations/20231101014812_add_relays_name.exs b/elixir/apps/domain/priv/repo/migrations/20231101014812_add_relays_name.exs new file mode 100644 index 000000000..5f8acde01 --- /dev/null +++ b/elixir/apps/domain/priv/repo/migrations/20231101014812_add_relays_name.exs @@ -0,0 +1,9 @@ +defmodule Domain.Repo.Migrations.AddRelaysName do + use Ecto.Migration + + def change do + alter table(:relays) do + add(:name, :string) + end + end +end diff --git a/elixir/apps/web/lib/web/live/relay_groups/index.ex b/elixir/apps/web/lib/web/live/relay_groups/index.ex index 31e35cf03..d5be3c5ef 100644 --- a/elixir/apps/web/lib/web/live/relay_groups/index.ex +++ b/elixir/apps/web/lib/web/live/relay_groups/index.ex @@ -55,6 +55,9 @@ defmodule Web.RelayGroups.Index do navigate={~p"/#{@account}/relays/#{relay.id}"} class="font-medium text-blue-600 dark:text-blue-500 hover:underline" > + + <%= relay.name %> + <%= relay.ipv4 %> diff --git a/elixir/apps/web/lib/web/live/relays/show.ex b/elixir/apps/web/lib/web/live/relays/show.ex index 4ee27925e..e71c00ab7 100644 --- a/elixir/apps/web/lib/web/live/relays/show.ex +++ b/elixir/apps/web/lib/web/live/relays/show.ex @@ -50,6 +50,22 @@ defmodule Web.Relays.Show do <:label>Instance Group Name <:value><%= @relay.group.name %> + <.vertical_table_row> + <:label>Remote IPv4 + <:value> + <%= @relay.ipv4 %> + + + <.vertical_table_row> + <:label>Remote IPv6 + <:value> + <%= @relay.ipv6 %> + + + <.vertical_table_row> + <:label>Name + <:value><%= @relay.name %> + <.vertical_table_row> <:label>Status <:value> @@ -70,19 +86,6 @@ defmodule Web.Relays.Show do <.relative_datetime datetime={@relay.last_seen_at} /> - <.vertical_table_row> - <:label>Remote IPv4 - <:value> - <%= @relay.ipv4 %> - - - <.vertical_table_row> - <:label>Remote IPv6 - <:value> - <%= @relay.ipv6 %> - - - <.vertical_table_row> <:label>Version <:value>