Add Relay admin feature flag (#2736)

Why:

* Self-hosted Relays are not going to be apart of the beta release, so
hiding the functionality in the portal will allow the user not to get
confused about a feature they aren't able to use.

Closes #2178
This commit is contained in:
bmanifold
2023-11-29 17:02:50 -05:00
committed by GitHub
parent 81598dbaff
commit 67c14c02ed
18 changed files with 141 additions and 15 deletions

View File

@@ -136,6 +136,10 @@ defmodule Domain.Config do
feature_enabled?(:traffic_filters)
end
def self_hosted_relays_enabled? do
feature_enabled?(:self_hosted_relays)
end
## Test helpers
if Mix.env() != :test do

View File

@@ -635,4 +635,9 @@ defmodule Domain.Config.Definitions do
Boolean flag to turn Resource traffic filters on/off.
"""
defconfig(:feature_traffic_filters_enabled, :boolean, default: false)
@doc """
Boolean flag to turn Relay Admin functionality on/off.
"""
defconfig(:feature_self_hosted_relays_enabled, :boolean, default: false)
end

View File

@@ -42,6 +42,7 @@
</.sidebar_item>
<.sidebar_item
:if={Domain.Config.self_hosted_relays_enabled?()}
current_path={@current_path}
navigate={~p"/#{@account}/relay_groups"}
icon="hero-arrows-right-left"

View File

@@ -3,11 +3,12 @@ defmodule Web.RelayGroups.Edit do
alias Domain.Relays
def mount(%{"id" => id}, _session, socket) do
with {:ok, group} <- Relays.fetch_group_by_id(id, socket.assigns.subject) do
with true <- Domain.Config.self_hosted_relays_enabled?(),
{:ok, group} <- Relays.fetch_group_by_id(id, socket.assigns.subject) do
changeset = Relays.change_group(group)
{:ok, assign(socket, group: group, form: to_form(changeset))}
else
{:error, _reason} -> raise Web.LiveErrors.NotFoundError
_other -> raise Web.LiveErrors.NotFoundError
end
end

View File

@@ -5,12 +5,12 @@ defmodule Web.RelayGroups.Index do
def mount(_params, _session, socket) do
subject = socket.assigns.subject
with {:ok, groups} <-
Relays.list_groups(subject, preload: [:relays]) do
with true <- Domain.Config.self_hosted_relays_enabled?(),
{:ok, groups} <- Relays.list_groups(subject, preload: [:relays]) do
:ok = Relays.subscribe_for_relays_presence_in_account(socket.assigns.account)
{:ok, assign(socket, groups: groups)}
else
{:error, _reason} -> raise Web.LiveErrors.NotFoundError
_other -> raise Web.LiveErrors.NotFoundError
end
end

View File

@@ -3,8 +3,12 @@ defmodule Web.RelayGroups.New do
alias Domain.Relays
def mount(_params, _session, socket) do
changeset = Relays.new_group()
{:ok, assign(socket, form: to_form(changeset))}
with true <- Domain.Config.self_hosted_relays_enabled?() do
changeset = Relays.new_group()
{:ok, assign(socket, form: to_form(changeset))}
else
_other -> raise Web.LiveErrors.NotFoundError
end
end
def render(assigns) do

View File

@@ -3,7 +3,8 @@ defmodule Web.RelayGroups.NewToken do
alias Domain.Relays
def mount(%{"id" => id}, _session, socket) do
with {:ok, group} <- Relays.fetch_group_by_id(id, socket.assigns.subject) do
with true <- Domain.Config.self_hosted_relays_enabled?(),
{:ok, group} <- Relays.fetch_group_by_id(id, socket.assigns.subject) do
{group, env} =
if connected?(socket) do
{:ok, group} =
@@ -25,7 +26,7 @@ defmodule Web.RelayGroups.NewToken do
selected_tab: "docker-instructions"
)}
else
{:error, _reason} -> raise Web.LiveErrors.NotFoundError
_other -> raise Web.LiveErrors.NotFoundError
end
end

View File

@@ -3,7 +3,8 @@ defmodule Web.RelayGroups.Show do
alias Domain.Relays
def mount(%{"id" => id}, _session, socket) do
with {:ok, group} <-
with true <- Domain.Config.self_hosted_relays_enabled?(),
{:ok, group} <-
Relays.fetch_group_by_id(id, socket.assigns.subject,
preload: [
relays: [token: [created_by_identity: [:actor]]],
@@ -13,7 +14,7 @@ defmodule Web.RelayGroups.Show do
:ok = Relays.subscribe_for_relays_presence_in_group(group)
{:ok, assign(socket, group: group)}
else
{:error, _reason} -> raise Web.LiveErrors.NotFoundError
_other -> raise Web.LiveErrors.NotFoundError
end
end

View File

@@ -3,7 +3,8 @@ defmodule Web.Relays.Show do
alias Domain.{Relays, Config}
def mount(%{"id" => id}, _session, socket) do
with {:ok, relay} <-
with true <- Domain.Config.self_hosted_relays_enabled?(),
{:ok, relay} <-
Relays.fetch_relay_by_id(id, socket.assigns.subject, preload: :group) do
:ok = Relays.subscribe_for_relays_presence_in_group(relay.group)
@@ -16,7 +17,7 @@ defmodule Web.Relays.Show do
{:ok, assign(socket, relay: relay)}
else
{:error, _reason} -> raise Web.LiveErrors.NotFoundError
_other -> raise Web.LiveErrors.NotFoundError
end
end

View File

@@ -152,4 +152,19 @@ defmodule Web.Live.RelayGroups.EditTest do
assert group = Repo.get_by(Domain.Relays.Group, id: group.id)
assert group.name == attrs.name
end
test "renders not found error when self_hosted_relays feature flag is false", %{
account: account,
identity: identity,
group: group,
conn: conn
} do
Domain.Config.feature_flag_override(:self_hosted_relays, false)
assert_raise Web.LiveErrors.NotFoundError, fn ->
conn
|> authorize_conn(identity)
|> live(~p"/#{account}/relay_groups/#{group}/edit")
end
end
end

View File

@@ -99,4 +99,18 @@ defmodule Web.Live.RelayGroups.IndexTest do
assert row["status"] =~ "Online"
end)
end
test "renders not found error when self_hosted_relays feature flag is false", %{
account: account,
identity: identity,
conn: conn
} do
Domain.Config.feature_flag_override(:self_hosted_relays, false)
assert_raise Web.LiveErrors.NotFoundError, fn ->
conn
|> authorize_conn(identity)
|> live(~p"/#{account}/relay_groups")
end
end
end

View File

@@ -121,4 +121,18 @@ defmodule Web.Live.RelayGroups.NewTest do
assert assert_redirect(lv, ~p"/#{account}/relay_groups/#{group}")
end
test "renders not found error when self_hosted_relays feature flag is false", %{
account: account,
identity: identity,
conn: conn
} do
Domain.Config.feature_flag_override(:self_hosted_relays, false)
assert_raise Web.LiveErrors.NotFoundError, fn ->
conn
|> authorize_conn(identity)
|> live(~p"/#{account}/relay_groups/new")
end
end
end

View File

@@ -46,4 +46,19 @@ defmodule Web.Live.RelayGroups.NewTokenTest do
assert element(lv, "#deployment-instructions")
|> render() =~ "Connected, click to continue"
end
test "renders not found error when self_hosted_relays feature flag is false", %{
account: account,
identity: identity,
group: group,
conn: conn
} do
Domain.Config.feature_flag_override(:self_hosted_relays, false)
assert_raise Web.LiveErrors.NotFoundError, fn ->
conn
|> authorize_conn(identity)
|> live(~p"/#{account}/relay_groups/#{group}/new_token")
end
end
end

View File

@@ -172,4 +172,19 @@ defmodule Web.Live.RelayGroups.ShowTest do
assert Repo.get(Domain.Relays.Group, group.id).deleted_at
end
test "renders not found error when self_hosted_relays feature flag is false", %{
account: account,
identity: identity,
group: group,
conn: conn
} do
Domain.Config.feature_flag_override(:self_hosted_relays, false)
assert_raise Web.LiveErrors.NotFoundError, fn ->
conn
|> authorize_conn(identity)
|> live(~p"/#{account}/relay_groups/#{group}")
end
end
end

View File

@@ -134,4 +134,19 @@ defmodule Web.Live.Relays.ShowTest do
assert Repo.get(Domain.Relays.Relay, relay.id).deleted_at
end
test "renders not found error when self_hosted_relays feature flag is false", %{
account: account,
identity: identity,
relay: relay,
conn: conn
} do
Domain.Config.feature_flag_override(:self_hosted_relays, false)
assert_raise Web.LiveErrors.NotFoundError, fn ->
conn
|> authorize_conn(identity)
|> live(~p"/#{account}/relays/#{relay}")
end
end
end

View File

@@ -75,7 +75,8 @@ config :domain, :enabled_features,
traffic_filters: true,
signups: true,
flow_activities: true,
todos: true
todos: true,
self_hosted_relays: true
config :domain, docker_registry: "us-east1-docker.pkg.dev/firezone-staging/firezone"

View File

@@ -69,7 +69,8 @@ if config_env() == :prod do
traffic_filters: compile_config!(:feature_traffic_filters_enabled),
signups: compile_config!(:feature_sign_up_enabled),
flow_activities: compile_config!(:feature_flow_activities_enabled),
todos: compile_config!(:feature_todos_enabled)
todos: compile_config!(:feature_todos_enabled),
relay_admin: compile_config!(:feature_self_hosted_relays_enabled)
config :domain, docker_registry: compile_config!(:docker_registry)

View File

@@ -420,7 +420,25 @@ locals {
value = jsonencode({
api_key = var.postmark_server_api_token
})
},
# Feature Flags
{
name = "FEATURE_FLOW_ACTIVITIES_ENABLED"
value = true
},
{
name = "FEATURE_TRAFFIC_FILTERS_ENABLED"
value = true
},
{
name = "FEATURE_TODOS_ENABLED"
value = true
},
{
name = "FEATURE_RELAY_ADMIN_ENABLED"
value = true
}
]
}