Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/logflare/backends/adaptor/bigquery_adaptor.ex
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ defmodule Logflare.Backends.Adaptor.BigQueryAdaptor do
project_id = project_id || Application.get_env(:logflare, Logflare.Google)[:project_id]

get_next_page(project_id, nil)
|> Enum.filter(&(&1.name =~ @service_account_prefix <> "@"))
|> Enum.filter(&(&1.name =~ @service_account_prefix))
end

defp handle_response({:ok, response}, project_id) do
Expand Down
112 changes: 57 additions & 55 deletions lib/logflare/google/resource_manager.ex
Original file line number Diff line number Diff line change
Expand Up @@ -44,71 +44,70 @@ defmodule Logflare.Google.CloudResourceManager do
policy = %Model.Policy{bindings: bindings}
body = %Model.SetIamPolicyRequest{policy: policy}

{function, arity} = __ENV__.function
caller = "#{function}" <> "_" <> "#{arity}"

case Api.Projects.cloudresourcemanager_projects_set_iam_policy(conn, env_project_number(),
body: body
) do
{:ok, _response} ->
Logger.info("Set IAM policy: #{Enum.count(members)} accounts",
logflare: %{
google: %{
cloudresourcemanager: %{
"#{caller}": %{
accounts: Enum.count(members),
response: :ok
}
}
}
}
:telemetry.execute(
[:logflare, :google, :set_iam_policy],
%{members: Enum.uniq(members) |> Enum.count()},
%{}
)

{:error, %Tesla.Env{} = response} ->
message = GenUtils.get_tesla_error_message(response)
user_exists_regexp = ~r/User (\S+?@\S+) does not exist/

cond do
message =~ user_exists_regexp ->
[captured] = Regex.run(user_exists_regexp, message, capture: :all_but_first)
# set user as invalid google account
result =
cond do
user = Users.get_by(email: captured) ->
user
|> Users.update_user_all_fields(%{valid_google_account: false})

team_user = TeamUsers.get_team_user_by(email: captured) ->
team_user
|> TeamUsers.update_team_user(%{valid_google_account: false})

true ->
:noop
end

if result == :noop do
Logger.error(
"Could find user #{captured} in the database. Set IAM policy error: #{message}"
)
else
Logger.info(
"Google account #{captured} was marked as invalid and excluded from IAM policy"
)
end
Logger.info("Set IAM policy successful")

true ->
Logger.error("Set IAM policy error: #{message}",
error_string: Jason.decode!(response.body)
)
{:error, _err} = err ->
handle_errors(err)
end
end

:noop
defp handle_errors({:error, %Tesla.Env{} = response}) do
message = GenUtils.get_tesla_error_message(response)
user_exists_regexp = ~r/User (\S+?@\S+) does not exist/

cond do
message =~ user_exists_regexp ->
[captured] = Regex.run(user_exists_regexp, message, capture: :all_but_first)
# set user as invalid google account
result =
cond do
user = Users.get_by(email: captured) ->
user
|> Users.update_user_all_fields(%{valid_google_account: false})

team_user = TeamUsers.get_team_user_by(email: captured) ->
team_user
|> TeamUsers.update_team_user(%{valid_google_account: false})

true ->
:noop
end

if result == :noop do
Logger.error(
"Could find user #{captured} in the database. Set IAM policy error: #{message}",
error_string: Jason.decode!(response.body)
)
else
Logger.info(
"Google account #{captured} was marked as invalid and excluded from IAM policy",
error_string: Jason.decode!(response.body)
)
end

{:error, err} ->
Logger.error("Set IAM policy unknown error: #{inspect(err)}")
true ->
Logger.error("Set IAM policy unknown API error: #{message}",
error_string: Jason.decode!(response.body)
)

:noop
end
end

defp handle_errors({:error, err}) do
Logger.error("Set IAM policy unknown error: #{inspect(err)}")
end

defp get_service_accounts() do
managed_service_accounts =
for %{email: name} <- BigQueryAdaptor.list_managed_service_accounts() do
Expand Down Expand Up @@ -166,9 +165,12 @@ defmodule Logflare.Google.CloudResourceManager do
Users.list_users(paying: true, provider: :google)
|> Users.preload_valid_google_team_users()
|> Enum.flat_map(fn user ->
for tu <- user.team.team_users do
tu.email
end ++ [user.email]
[
user.email
| for tu <- user.team.team_users do
tu.email
end
]
end)

if length(emails) > 1000 do
Expand Down
4 changes: 0 additions & 4 deletions lib/logflare/users/users.ex
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,6 @@ defmodule Logflare.Users do
Repo.preload(user, :team)
end

def preload_team_users(user) do
Repo.preload(user, team: [:team_users])
end

def preload_valid_google_team_users(user) do
query =
from(tu in TeamUser, where: tu.valid_google_account != false and tu.provider == "google")
Expand Down
5 changes: 4 additions & 1 deletion lib/telemetry.ex
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,10 @@ defmodule Logflare.Telemetry do
description: "Rate limited API hits"
),
last_value("logflare.backends.egress.request_length", tags: [:backend_id]),
last_value("logflare.system.finch.in_flight_requests", tags: [:pool, :url])
last_value("logflare.system.finch.in_flight_requests", tags: [:pool, :url]),
last_value("logflare.google.set_iam_policy.members",
description: "Google IAM policy members count"
)
]

Enum.concat([
Expand Down
Loading