./ct_report/coverage/mongoose_server_api.COVER.html

1 -module(mongoose_server_api).
2
3 -export([get_loglevel_mongooseimctl/0]).
4
5 -export([status/0, get_cookie/0, join_cluster/1, leave_cluster/0,
6 remove_from_cluster/1, stop/0, restart/0, remove_node/1, set_loglevel/1,
7 get_loglevel/0]).
8
9 -ignore_xref([get_loglevel_mongooseimctl/0]).
10
11 -spec get_loglevel_mongooseimctl() -> {ok, iolist()}.
12 get_loglevel_mongooseimctl() ->
13
:-(
Level = mongoose_logs:get_global_loglevel(),
14
:-(
Number = mongoose_logs:loglevel_keyword_to_number(Level),
15
:-(
String = io_lib:format("global loglevel is ~p, which means '~p'", [Number, Level]),
16
:-(
{ok, String}.
17
18 -spec get_loglevel() -> {ok, mongoose_logs:atom_log_level()}.
19 get_loglevel() ->
20 20 {ok, mongoose_logs:get_global_loglevel()}.
21
22 -spec set_loglevel(mongoose_logs:atom_log_level()) -> {ok, iolist()} | {invalid_level, iolist()}.
23 set_loglevel(Level) ->
24 20 case mongoose_logs:set_global_loglevel(Level) of
25 ok ->
26 20 {ok, "Log level successfully set."};
27 {error, _} ->
28
:-(
{invalid_level, io_lib:format("Log level ~p does not exist.", [Level])}
29 end.
30
31 -spec status() -> {ok, {boolean(), iolist(), iolist()}}.
32 status() ->
33 2 {InternalStatus, ProvidedStatus} = init:get_status(),
34 2 String1 = io_lib:format("The node ~p is ~p. Status: ~p.",
35 [node(), InternalStatus, ProvidedStatus]),
36 2 Result =
37 case lists:keysearch(mongooseim, 1, application:which_applications()) of
38 false ->
39
:-(
{false, String1 ++ " MongooseIM is not running in that node.",
40 "MongooseIM is not running in that node"};
41 {value, {_, _, Version}} ->
42 2 {true,
43 String1 ++ io_lib:format(" MongooseIM ~s is running in that node.", [Version]),
44 lists:nth(1, string:split(Version, "-"))}
45 end,
46 2 {ok, Result}.
47
48 -spec get_cookie() -> {ok, iolist()}.
49 get_cookie() ->
50 2 {ok, atom_to_list(erlang:get_cookie())}.
51
52 -spec join_cluster(string()) -> {ok, iolist()}
53 | {pang | already_joined | mnesia_error | error, iolist()}.
54 join_cluster(NodeString) ->
55 9 NodeAtom = list_to_atom(NodeString),
56 9 NodeList = mnesia:system_info(db_nodes),
57 9 case lists:member(NodeAtom, NodeList) of
58 true ->
59 1 String = io_lib:format(
60 "The MongooseIM node ~s has already joined the cluster.", [NodeString]),
61 1 {already_joined, String};
62 _ ->
63 8 do_join_cluster(NodeAtom)
64 end.
65
66 do_join_cluster(Node) ->
67 8 try mongoose_cluster:join(Node) of
68 ok ->
69 7 String = io_lib:format("You have successfully added the MongooseIM node"
70 " ~p to the cluster with node member ~p.", [node(), Node]),
71 7 {ok, String}
72 catch
73 error:pang ->
74 1 String = io_lib:format(
75 "Timeout while attempting to connect to a MongooseIM node ~s~n", [Node]),
76 1 {pang, String};
77 error:{cant_get_storage_type, {T, E, R}} ->
78
:-(
String =
79 io_lib:format("Cannot get storage type for table ~p. Reason: ~p:~p", [T, E, R]),
80
:-(
{mnesia_error, String};
81 E:R ->
82
:-(
String =
83 io_lib:format("Failed to join the cluster. Reason: ~p:~p", [E, R]),
84
:-(
{error, String}
85 end.
86
87 -spec leave_cluster() -> {ok, string()} | {error | not_in_cluster, iolist()}.
88 leave_cluster() ->
89 9 NodeList = mnesia:system_info(running_db_nodes),
90 9 ThisNode = node(),
91 9 case NodeList of
92 [ThisNode] ->
93 5 String = io_lib:format("The MongooseIM node ~p is not in the cluster~n", [node()]),
94 5 {not_in_cluster, String};
95 _ ->
96 4 do_leave_cluster()
97 end.
98
99 do_leave_cluster() ->
100 4 try mongoose_cluster:leave() of
101 ok ->
102 4 String = io_lib:format(
103 "The MongooseIM node ~p has successfully left the cluster~n", [node()]),
104 4 {ok, String}
105 catch
106 E:R ->
107
:-(
String = io_lib:format("Failed to leave the cluster. Reason: ~p:~p", [E, R]),
108
:-(
{error, String}
109 end.
110
111 -spec remove_from_cluster(string()) -> {ok, iolist()} |
112 {node_is_alive | mnesia_error | rpc_error, iolist()}.
113 remove_from_cluster(NodeString) ->
114 4 Node = list_to_atom(NodeString),
115 4 IsNodeAlive = mongoose_cluster:is_node_alive(Node),
116 4 case IsNodeAlive of
117 true ->
118 2 remove_rpc_alive_node(Node);
119 false ->
120 2 remove_dead_node(Node)
121 end.
122
123 remove_dead_node(DeadNode) ->
124 2 try mongoose_cluster:remove_from_cluster(DeadNode) of
125 ok ->
126 2 String =
127 io_lib:format(
128 "The dead MongooseIM node ~p has been removed from the cluster~n", [DeadNode]),
129 2 {ok, String}
130 catch
131 error:{node_is_alive, DeadNode} ->
132
:-(
String = io_lib:format(
133 "The MongooseIM node ~p is alive but shoud not be.", [DeadNode]),
134
:-(
{node_is_alive, String};
135 error:{del_table_copy_schema, R} ->
136
:-(
String = io_lib:format("Cannot delete table schema. Reason: ~p", [R]),
137
:-(
{mnesia_error, String}
138 end.
139
140 remove_rpc_alive_node(AliveNode) ->
141 2 case rpc:call(AliveNode, mongoose_cluster, leave, []) of
142 {badrpc, Reason} ->
143
:-(
String =
144 io_lib:format(
145 "Cannot remove the MongooseIM node ~p~n. RPC Reason: ~p", [AliveNode, Reason]),
146
:-(
{rpc_error, String};
147 ok ->
148 2 String = io_lib:format(
149 "The MongooseIM node ~p has been removed from the cluster", [AliveNode]),
150 2 {ok, String};
151 Unknown ->
152
:-(
String = io_lib:format("Unknown error: ~p", [Unknown]),
153
:-(
{rpc_error, String}
154 end.
155
156 -spec stop() -> ok.
157 stop() ->
158
:-(
timer:sleep(500),
159
:-(
init:stop().
160
161 -spec restart() -> ok.
162 restart() ->
163
:-(
timer:sleep(500),
164
:-(
init:restart().
165
166 -spec remove_node(string()) -> {ok, iolist()}.
167 remove_node(Node) ->
168
:-(
mnesia:del_table_copy(schema, list_to_atom(Node)),
169
:-(
{ok, "MongooseIM node removed from the Mnesia schema"}.
Line Hits Source