From 599f5c8d4f8007faa157352e00118830345bd967 Mon Sep 17 00:00:00 2001 From: spring2maz Date: Sun, 17 Feb 2019 11:38:44 +0100 Subject: [PATCH] Add API emqx_portal:ensure_forward_absent --- src/portal/emqx_portal.erl | 21 ++++++++++++++++++--- test/emqx_portal_SUITE.erl | 5 ++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/portal/emqx_portal.erl b/src/portal/emqx_portal.erl index a0f954e1a..508fb81a9 100644 --- a/src/portal/emqx_portal.erl +++ b/src/portal/emqx_portal.erl @@ -73,7 +73,7 @@ -export([connecting/3, connected/3]). %% management APIs --export([get_forwards/1, ensure_forward_present/2]). %, del_forward/2]). +-export([get_forwards/1, ensure_forward_present/2, ensure_forward_absent/2]). -export([get_subscriptions/1]). %, add_subscription/3, del_subscription/2]). -export_type([config/0, @@ -143,8 +143,13 @@ handle_ack(Pid, Ref) when node() =:= node(Pid) -> get_forwards(Id) -> gen_statem:call(id(Id), get_forwards, timer:seconds(1000)). %% @doc Add a new forward (local topic subscription). --spec ensure_forward_present(id(), topic()) -> ok | {error, any()}. -ensure_forward_present(Id, Topic) -> gen_statem:call(id(Id), {ensure_forward_present, topic(Topic)}). +-spec ensure_forward_present(id(), topic()) -> ok. +ensure_forward_present(Id, Topic) -> + gen_statem:call(id(Id), {ensure_forward_present, topic(Topic)}). + +-spec ensure_forward_absent(id(), topic()) -> ok. +ensure_forward_absent(Id, Topic) -> + gen_statem:call(id(Id), {ensure_forward_absent, topic(Topic)}). -spec get_subscriptions(id()) -> [{emqx_topic:topic(), qos()}]. get_subscriptions(Id) -> gen_statem:call(id(Id), get_subscriptions). @@ -290,6 +295,16 @@ common(_StateName, {call, From}, {ensure_forward_present, Topic}, {keep_state, State#{forwards := lists:usort([Topic | Forwards])}, [{reply, From, ok}]} end; +common(_StateName, {call, From}, {ensure_forward_absent, Topic}, + #{forwards := Forwards} = State) -> + case lists:member(Topic, Forwards) of + true -> + emqx_broker:unsubscribe(Topic), + {keep_state, State#{forwards := lists:delete(Topic, Forwards)}, + [{reply, From, ok}]}; + false -> + {keep_state_and_data, [{reply, From, ok}]} + end; common(_StateName, {call, From}, get_subscriptions, #{subscriptions := Subs}) -> {keep_state_and_data, [{reply, From, Subs}]}; common(_StateName, info, {dispatch, _, Msg}, diff --git a/test/emqx_portal_SUITE.erl b/test/emqx_portal_SUITE.erl index 2c92afd94..fb851c400 100644 --- a/test/emqx_portal_SUITE.erl +++ b/test/emqx_portal_SUITE.erl @@ -39,7 +39,7 @@ init_per_suite(Config) -> _ -> ok end, - emqx_ct_broker_helpers:run_setup_steps(Config). + emqx_ct_broker_helpers:run_setup_steps([{log_leve, info} | Config]). end_per_suite(_Config) -> emqx_ct_broker_helpers:run_teardown_steps(). @@ -59,6 +59,9 @@ t_forwards_mngr(Config) when is_list(Config) -> ?assertEqual(ok, emqx_portal:ensure_forward_present(Name, "mngr")), ?assertEqual(ok, emqx_portal:ensure_forward_present(Name, "mngr2")), ?assertEqual([<<"mngr">>, <<"mngr2">>], emqx_portal:get_forwards(Pid)), + ?assertEqual(ok, emqx_portal:ensure_forward_absent(Name, "mngr2")), + ?assertEqual(ok, emqx_portal:ensure_forward_absent(Name, "mngr3")), + ?assertEqual([<<"mngr">>], emqx_portal:get_forwards(Pid)), ?assertEqual(Subs, emqx_portal:get_subscriptions(Pid)) after ok = emqx_portal:stop(Pid)