Skip to content
This repository was archived by the owner on Jun 11, 2023. It is now read-only.

Commit 5567939

Browse files
committed
Rewrite Log internals
1 parent ad321e6 commit 5567939

File tree

40 files changed

+1794
-1637
lines changed

40 files changed

+1794
-1637
lines changed

lib/event/dispatcher.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ defmodule Helix.Event.Dispatcher do
146146
# All
147147
event LogEvent.Log.Created
148148
event LogEvent.Log.Deleted
149-
event LogEvent.Log.Modified
149+
# event LogEvent.Log.Modified
150150

151151
##############################################################################
152152
# Process events

lib/event/loggable/flow.ex

Lines changed: 74 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ defmodule Helix.Event.Loggable.Flow do
2424
alias Helix.Event
2525
alias Helix.Event.Loggable.Utils, as: LoggableUtils
2626
alias Helix.Entity.Model.Entity
27+
alias Helix.Log.Model.Log
28+
alias Helix.Log.Model.LogType
2729
alias Helix.Log.Action.Log, as: LogAction
2830
alias Helix.Network.Model.Bounce
2931
alias Helix.Network.Model.Network
3032
alias Helix.Network.Model.Tunnel
3133
alias Helix.Network.Query.Bounce, as: BounceQuery
3234
alias Helix.Server.Model.Server
3335

34-
@type log_entry ::
35-
{Server.id, Entity.id, log_msg}
36-
37-
@type log_msg :: String.t
36+
@typep log_entry ::
37+
{Server.id, Entity.id, Log.info}
3838

3939
@doc """
4040
Top-level macro for events wanting to implement the Loggable protocol.
@@ -66,13 +66,12 @@ defmodule Helix.Event.Loggable.Flow do
6666
"""
6767
defmacro log_map(map) do
6868
quote do
69-
map = unquote(map)
69+
unquote(map)
7070

7171
# Put default values (if not specified)
72-
map
7372
|> Map.put_new(:network_id, nil)
7473
|> Map.put_new(:endpoint_id, nil)
75-
|> Map.put_new(:msg_endpoint, nil)
74+
|> Map.put_new(:data_both, %{})
7675
|> Map.put_new(:opts, %{})
7776
end
7877
end
@@ -119,8 +118,11 @@ defmodule Helix.Event.Loggable.Flow do
119118
gateway_id: gateway_id,
120119
endpoint_id: endpoint_id,
121120
network_id: network_id,
122-
msg_gateway: msg_gateway,
123-
msg_endpoint: msg_endpoint,
121+
type_gateway: type_gateway,
122+
data_gateway: data_gateway,
123+
type_endpoint: type_endpoint,
124+
data_endpoint: data_endpoint,
125+
data_both: data_both,
124126
opts: opts
125127
})
126128
do
@@ -147,25 +149,36 @@ defmodule Helix.Event.Loggable.Flow do
147149
end
148150
|> customize_last_ip(opts)
149151

150-
msg_gateway = String.replace(msg_gateway, "$first_ip", first_ip)
151-
msg_endpoint = String.replace(msg_endpoint, "$last_ip", last_ip)
152+
data_gateway =
153+
data_gateway
154+
|> replace_ips(first_ip, last_ip)
155+
|> Map.merge(data_both)
156+
157+
data_endpoint =
158+
data_endpoint
159+
|> replace_ips(first_ip, last_ip)
160+
|> Map.merge(data_both)
152161

153-
log_gateway = build_entry(gateway_id, entity_id, msg_gateway)
154-
log_endpoint = build_entry(endpoint_id, entity_id, msg_endpoint)
162+
log_gateway = {type_gateway, LogType.new(type_gateway, data_gateway)}
163+
log_endpoint = {type_endpoint, LogType.new(type_endpoint, data_endpoint)}
155164

156-
bounce_logs =
165+
entry_gateway = build_entry(gateway_id, entity_id, log_gateway)
166+
entry_endpoint = build_entry(endpoint_id, entity_id, log_endpoint)
167+
168+
bounce_entries =
157169
if skip_bounce? do
158170
[]
159171
else
160172
build_bounce_entries(
161173
bounce,
162174
{gateway_id, network_id, gateway_ip},
163175
{endpoint_id, network_id, endpoint_ip},
164-
entity_id
176+
entity_id,
177+
network_id
165178
)
166179
end
167180

168-
[log_gateway, log_endpoint, bounce_logs] |> List.flatten()
181+
[entry_gateway, entry_endpoint, bounce_entries] |> List.flatten()
169182
end
170183

171184
@doc """
@@ -178,10 +191,13 @@ defmodule Helix.Event.Loggable.Flow do
178191
event: _,
179192
server_id: server_id,
180193
entity_id: entity_id,
181-
msg_server: msg_server
194+
type: type,
195+
data: data
182196
})
183197
do
184-
[build_entry(server_id, entity_id, msg_server)]
198+
log_type = LogType.new(type, data)
199+
200+
[build_entry(server_id, entity_id, {type, log_type})]
185201
end
186202

187203
@doc """
@@ -249,7 +265,7 @@ defmodule Helix.Event.Loggable.Flow do
249265
defdelegate format_ip(ip),
250266
to: LoggableUtils
251267

252-
@spec build_entry(Server.id, Entity.id, log_msg) ::
268+
@spec build_entry(Server.id, Entity.id, Log.info) ::
253269
log_entry
254270
@doc """
255271
Returns data required to insert the log
@@ -263,16 +279,23 @@ defmodule Helix.Event.Loggable.Flow do
263279
264280
Messages follow the format "Connection bounced from hop (n-1) to (n+1)"
265281
"""
266-
def build_bounce_entries(nil, _, _, _),
282+
def build_bounce_entries(nil, _, _, _, _),
267283
do: []
268-
def build_bounce_entries(bounce_id = %Bounce.ID{}, gateway, endpoint, entity) do
284+
def build_bounce_entries(
285+
bounce_id = %Bounce.ID{}, gateway, endpoint, entity, network
286+
) do
269287
bounce_id
270288
|> BounceQuery.fetch()
271-
|> build_bounce_entries(gateway, endpoint, entity)
289+
|> build_bounce_entries(gateway, endpoint, entity, network)
272290
end
291+
273292
def build_bounce_entries(
274-
bounce = %Bounce{}, gateway = {_, _, _}, endpoint = {_, _, _}, entity_id)
275-
do
293+
bounce = %Bounce{},
294+
gateway = {_, _, _},
295+
endpoint = {_, _, _},
296+
entity_id,
297+
network_id
298+
) do
276299
full_path = [gateway | bounce.links] ++ [endpoint]
277300
length_hop = length(full_path)
278301

@@ -298,8 +321,11 @@ defmodule Helix.Event.Loggable.Flow do
298321
{_, _, ip_prev} = bounce_map[idx - 1]
299322
{_, _, ip_next} = bounce_map[idx + 1]
300323

301-
msg = "Connection bounced from #{ip_prev} to #{ip_next}"
302-
entry = build_entry(server_id, entity_id, msg)
324+
data = %{ip_prev: ip_prev, ip_next: ip_next, network_id: network_id}
325+
# TODO
326+
log_type = {:connection_bounced, LogType.new(:connection_bounced, data)}
327+
328+
entry = build_entry(server_id, entity_id, log_type)
303329

304330
{idx + 1, acc ++ [entry]}
305331
end
@@ -321,8 +347,8 @@ defmodule Helix.Event.Loggable.Flow do
321347
do: save([log_entry])
322348
def save(logs) do
323349
logs
324-
|> Enum.map(fn {server_id, entity_id, msg} ->
325-
{:ok, _, events} = LogAction.create(server_id, entity_id, msg)
350+
|> Enum.map(fn {server_id, entity_id, log_type} ->
351+
{:ok, _, events} = LogAction.create(server_id, entity_id, log_type)
326352
events
327353
end)
328354
|> List.flatten()
@@ -378,4 +404,24 @@ defmodule Helix.Event.Loggable.Flow do
378404
do: censor_ip(ip)
379405
defp customize_last_ip(ip, _),
380406
do: ip
407+
408+
defp replace_ips(params, first_ip, last_ip) do
409+
params
410+
|> Enum.reduce([], fn {k, v}, acc ->
411+
new_v =
412+
case v do
413+
"$first_ip" ->
414+
first_ip
415+
416+
"$last_ip" ->
417+
last_ip
418+
419+
_ ->
420+
v
421+
end
422+
423+
[{k, new_v} | acc]
424+
end)
425+
|> Enum.into(%{})
426+
end
381427
end

lib/log/action/log.ex

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -25,73 +25,56 @@ defmodule Helix.Log.Action.Log do
2525
alias Helix.Log.Event.Log.Deleted, as: LogDeletedEvent
2626
alias Helix.Log.Event.Log.Modified, as: LogModifiedEvent
2727

28-
@spec create(Server.idt, Entity.idt, String.t, pos_integer | nil) ::
28+
@spec create(Server.id, Entity.id, Log.info, pos_integer | nil) ::
2929
{:ok, Log.t, [LogCreatedEvent.t]}
30-
| {:error, Ecto.Changeset.t}
30+
| :error
3131
@doc """
32-
Creates a new log linked to `entity` on `server` with `message` as content.
32+
Creates a new log linked to `entity` on `server` with `log_info` as content.
3333
"""
34-
def create(server, entity, message, forge \\ nil) do
35-
with {:ok, log} <- LogInternal.create(server, entity, message, forge) do
36-
event = LogCreatedEvent.new(log)
34+
def create(server_id, entity_id, log_info, forge_version \\ nil) do
35+
case LogInternal.create(server_id, entity_id, log_info, forge_version) do
36+
{:ok, log} ->
37+
{:ok, log, [LogCreatedEvent.new(log)]}
3738

38-
{:ok, log, [event]}
39+
{:error, _} ->
40+
:error
3941
end
4042
end
4143

42-
@spec revise(Log.t, Entity.idt, String.t, pos_integer) ::
43-
{:ok, Log.t, [LogModifiedEvent.t]}
44-
| {:error, Ecto.Changeset.t}
44+
@spec revise(Log.t, Entity.id, Log.info, pos_integer) ::
45+
{:ok, Log.t, [LogRevisedEvent.t]}
46+
| :error
4547
@doc """
46-
Adds a revision over `log`.
47-
48-
### Params
49-
- `entity` is the the entity that is doing the revision.
50-
- `message` is the new log's content.
51-
- `forge_version` is the version of log forger used to make this revision.
52-
53-
### Examples
54-
55-
iex> revise(%Log{}, %Entity{}, "empty log", 100)
56-
{:ok, %Log{message: "empty log"}, [%LogModifiedEvent{}]}
48+
Adds a revision to the given `log`.
5749
"""
58-
def revise(log, entity, message, forge_version) do
59-
with \
60-
{:ok, log} <- LogInternal.revise(log, entity, message, forge_version)
61-
do
62-
event = LogModifiedEvent.new(log)
63-
64-
{:ok, log, [event]}
50+
def revise(log = %Log{}, entity_id, log_info, forge_version) do
51+
case LogInternal.revise(log, entity_id, log_info, forge_version) do
52+
{:ok, log} ->
53+
event = LogRevisedEvent.new(log)
54+
{:ok, log, [event]}
55+
56+
{:error, _} ->
57+
:error
6558
end
6659
end
6760

6861
@spec recover(Log.t) ::
69-
{:ok, :recovered, [LogModifiedEvent.t]}
70-
| {:ok, :deleted, [LogDeletedEvent.t]}
71-
| {:error, :original_revision}
62+
{:ok, :destroyed, [LogDeletedEvent.t]}
63+
| {:ok, :original, []}
64+
| {:ok, :recovered, [LogRecoveredEvent.t]}
7265
@doc """
73-
Recovers `log` to a previous revision.
74-
75-
### Notes
76-
- If the log is in its original state and it is not a forged log, the
77-
operation will fail with `{:error, :original_revision}`.
78-
- If the log is in its original state and it is forged, it will be deleted,
79-
returning `{:ok, :deleted, [Helix.Event.t]}`.
80-
- Otherwise the revision will be deleted and the log will be updated to use
81-
the last revision's message, returning `{:ok, :recovered, [Helix.Event.t]}`.
66+
Attempts to recover the given `log`.
8267
"""
83-
def recover(log) do
68+
def recover(log = %Log{}) do
8469
case LogInternal.recover(log) do
85-
{:ok, :deleted} ->
86-
event = LogDeletedEvent.new(log)
87-
{:ok, :deleted, [event]}
70+
:destroyed ->
71+
{:ok, :destroyed, [LogDeletedEvent.new(log)]}
8872

89-
{:ok, :recovered} ->
90-
event = LogModifiedEvent.new(log)
91-
{:ok, :recovered, [event]}
73+
{:original, _} ->
74+
{:ok, :original, []}
9275

93-
{:error, :original_revision} ->
94-
{:error, :original_revision}
76+
{:recovered, new_log} ->
77+
{:ok, :recovered, [LogRecoveredEvent.new(new_log)]}
9578
end
9679
end
9780
end

0 commit comments

Comments
 (0)