aboutsummaryrefslogtreecommitdiff
path: root/apps/dreki/src/dreki_app.erl
blob: 0442b4cb7aae30be77c6ddef68226c40c7b53abf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
%%%-------------------------------------------------------------------
%% @doc dreki public API
%% @end
%%%-------------------------------------------------------------------

-module(dreki_app).
-behaviour(application).

-include_lib("kernel/include/logger.hrl").

-export([start/2, stop/1]).

start(Type, Args) ->
    ok = before_start(Type, Args),
    case dreki_sup:start_link() of
        {ok, Pid} ->
            ok = after_start(),
            {ok, Pid};
        Error ->
            Error
   end.

stop(_State) ->
    dreki_tasks:stop(),
    ok.

%% internal functions

before_start(Type, Args) ->
    logger:set_application_level(dreki, debug),
    logger:set_application_level(dreki_web, debug),
    logger:set_application_level(partisan, info),
    logger:set_application_level(plum_db, info),
    logger:set_handler_config(default, level, debug),
    opentelemetry_logger_metadata:setup(),
    ?LOG_NOTICE(#{message => "Dreki starting...."}),
    application:stop(partisan),
    ok = dreki_config:init(Args),
    ok = dreki_plum:before_start(),
    ok = maybe_create_mnesia(),
    {ok, _} = mnesia_rocksdb:register(),
    ok = dreki_urn:start(),
    {ok, _} = dreki_world_dns:start(),
    ?LOG_NOTICE(#{message => "Pre-Start done"}),
    ok = dreki_plum:after_start(),
    ok.

after_start() ->
    %%ok = dreki_plum:after_start(),
    ok = setup_event_manager(),
    ok = dreki_store:start(),
    ?LOG_NOTICE(#{message => "Dreki Ready"}),
    ok = dreki_config:set([dreki, status], ready),
    dreki_event_manager:notify(dreki_ready),
    ok.

maybe_create_mnesia() ->
  ok = maybe_create_mnesia(mnesia:system_info(use_dir)).

maybe_create_mnesia(false) ->
  ?LOG_NOTICE(#{message => "Creating mnesia directory"}),
  stopped = mnesia:stop(),
  ok = mnesia:create_schema([node()]),
  ok = mnesia:start(),
  ok;
maybe_create_mnesia(true) ->
  ok.

setup_event_manager() ->
    %% TODO: Alarm handler

    %% We subscribe to partisan up and down events and republish them
    Mod = partisan_peer_service:manager(),

    Mod:on_up('_', fun(Node) ->
        dreki_event_manager:notify({partisan_peer_service, peer_up, Node})
    end),

    Mod:on_down('_', fun(Node) ->
        dreki_event_manager:notify({partisan_peer_service, peer_down, Node})
    end),

    ok.