diff --git a/Makefile b/Makefile index fe08cb244..359fb372e 100644 --- a/Makefile +++ b/Makefile @@ -1145,6 +1145,10 @@ telemetry_compile_bls_verifier: @cd telemetry_api/priv && \ go build ../bls_verifier/bls_verify.go +telemetry_fetch_operators_metadata: + @cd telemetry_api && \ + ./scripts/fetch_operators_metadata.sh + setup_local_aligned_all: tmux kill-session -t aligned_layer || true tmux new-session -d -s aligned_layer diff --git a/telemetry_api/README.md b/telemetry_api/README.md index 3640c501e..f327975fb 100644 --- a/telemetry_api/README.md +++ b/telemetry_api/README.md @@ -60,4 +60,18 @@ This API uses Ecto for migrations. To apply migrations, run: make telemetry_ecto_migrate ``` +## Scripts +This API has a script to make it fetch operator's metadata from the blockchain. + +To run it you must run: + +```bash +make telemetry_fetch_operators_metadata +``` + +Once connected to the Telemetry node, you must run what appears on screen: + +```iex +Scripts.FetchOperatorsMetadata.run() +``` diff --git a/telemetry_api/lib/scripts/fetch_operators_metadata.ex b/telemetry_api/lib/scripts/fetch_operators_metadata.ex new file mode 100644 index 000000000..0dabe1f93 --- /dev/null +++ b/telemetry_api/lib/scripts/fetch_operators_metadata.ex @@ -0,0 +1,45 @@ +defmodule Scripts.FetchOperatorsMetadata do + require Logger + alias TelemetryApi.ContractManagers.OperatorStateRetriever + alias TelemetryApi.Operators.Operator + alias TelemetryApi.Repo + + # This Script is to fetch operators metadata from the blockchain activity + # and insert/update them into the Ecto database + + def run() do + "Fetching old operators changes" |> Logger.debug() + update_operators_metadata() + + "Done" |> Logger.debug() + end + + def update_operators_metadata() do + with {:ok, operators} <- OperatorStateRetriever.get_operators() do + # Construct tuple {%Operator{}, op_data} + operators = Enum.map(operators, fn op_data -> + {Repo.get(Operator, op_data.address), op_data} + end) + + # Fetch metadata for all operators + operators = Enum.map(operators, fn {op, op_data} -> + case TelemetryApi.Operators.add_operator_metadata(op_data) do + {:ok, data} -> {:ok, {op, data}} + {:error, msg} -> {:error, msg} + end + end) + |> tap(&dbg/1) + # Filter status ok and map to {op, op_data} + |> Enum.filter(fn {status, _} -> status == :ok end) + |> Enum.map(fn {_, data} -> data end) + + dbg(operators) + + # Insert in db + Enum.map(operators, fn {op, op_data} -> + Operator.changeset(op, op_data) |> Repo.insert_or_update() + end) + end + :ok + end +end diff --git a/telemetry_api/lib/telemetry_api/operators.ex b/telemetry_api/lib/telemetry_api/operators.ex index 21ea013b2..5ea090824 100644 --- a/telemetry_api/lib/telemetry_api/operators.ex +++ b/telemetry_api/lib/telemetry_api/operators.ex @@ -129,7 +129,7 @@ defmodule TelemetryApi.Operators do # iex> add_operator_metadata(operator) # {:error, string} # - defp add_operator_metadata(op_data) do + def add_operator_metadata(op_data) do with {:ok, url} <- DelegationManager.get_operator_url(op_data.address), {:ok, metadata} <- TelemetryApi.Utils.fetch_json_data(url) do operator = %{ diff --git a/telemetry_api/scripts/fetch_operators_metadata.sh b/telemetry_api/scripts/fetch_operators_metadata.sh new file mode 100755 index 000000000..e166a3aa1 --- /dev/null +++ b/telemetry_api/scripts/fetch_operators_metadata.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +source .env + +export ENVIRONMENT=$ENVIRONMENT +export RPC_URL=$RPC_URL +ELIXIR_HOSTNAME=$(elixir -e 'IO.puts(:inet.gethostname() |> elem(1))') +export ELIXIR_HOSTNAME=$ELIXIR_HOSTNAME +export ALIGNED_CONFIG_FILE=$ALIGNED_CONFIG_FILE +export OPERATOR_FETCHER_WAIT_TIME_MS=$OPERATOR_FETCHER_WAIT_TIME_MS + +mix compile --force #force recompile to get the latest .env values + +echo "You will now connect to the Telemetry Node, make sure you run the following command inside it:" +echo "Scripts.FetchOperatorsMetadata.run()" + +iex --sname fetch_operators_metadata --remsh telemetry@$ELIXIR_HOSTNAME