summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Feuer <mfeuer@jaguarlandrover.com>2015-03-04 19:11:33 -0800
committerMagnus Feuer <mfeuer@jaguarlandrover.com>2015-03-04 19:11:33 -0800
commit9f11329836f8710274102b6d57d1ebc65a3ec31b (patch)
treec96bf1b6cd4787aa094bdd0cebc1523f7994310c
parentaaa752c6d8b81f5557b995e10e31c2a11b77b747 (diff)
downloadrvi_core-9f11329836f8710274102b6d57d1ebc65a3ec31b.tar.gz
Added unregister. Added get_available_services
-rw-r--r--components/service_edge/src/service_edge_rpc.erl107
1 files changed, 89 insertions, 18 deletions
diff --git a/components/service_edge/src/service_edge_rpc.erl b/components/service_edge/src/service_edge_rpc.erl
index 036efd9..6cb3129 100644
--- a/components/service_edge/src/service_edge_rpc.erl
+++ b/components/service_edge/src/service_edge_rpc.erl
@@ -12,7 +12,10 @@
-export([handle_rpc/2]).
-export([wse_register_service/2]).
+-export([wse_unregister_service/2]).
+-export([wse_get_available_services/1]).
-export([wse_message/5]).
+-export([wse_message/4]).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -68,9 +71,9 @@ init_rvi_component() ->
end.
-register_service(Service, ServiceAddress) ->
- ?debug("service_edge_rpc:register_service(): service: ~p ", [Service]),
- ?debug("service_edge_rpc:register_service(): address: ~p ", [ServiceAddress]),
+register_local_service(Service, ServiceAddress) ->
+ ?debug("service_edge_rpc:register_local_service(): service: ~p ", [Service]),
+ ?debug("service_edge_rpc:register_local_service(): address: ~p ", [ServiceAddress]),
case
%% Register the service at service discovery
@@ -89,19 +92,66 @@ register_service(Service, ServiceAddress) ->
], [service]),
%% Retrieve addresses of all locally registered services.
- {ok, _JSONStatus, [ LocalAddresses ]} =
+ {ok, _JSONStatus, [ AnnounceAddresses ]} =
rvi_common:send_component_request(service_discovery, get_local_network_addresses,
[], [addresses]),
%% Send out an announcement to all locally connected services, but skip
%% the one that made the registration call
- announce_service_availability(services_available, LocalAddresses, [Service], ServiceAddress),
+ announce_service_availability(services_available, AnnounceAddresses,
+ [Service], ServiceAddress),
+
%% Return ok.
{ ok, [ {service, FullSvcName},
{status, rvi_common:json_rpc_status(JSONStatus)} ] };
Err ->
- ?debug("service_edge_rpc:register_service() Failed at service_discovery(): ~p",
+ ?debug("service_edge_rpc:register_local_service() Failed at service_discovery(): ~p",
+ [ Err ]),
+ Err
+ end.
+
+unregister_local_service(Service) ->
+ ?debug("service_edge_rpc:unregister_local_service(): service: ~p ", [Service]),
+
+ case
+ %% Register the service at service discovery
+ rvi_common:send_component_request(service_discovery, unregister_local_service,
+ [
+ {service, Service}
+ ]) of
+ { ok, ok } ->
+ %% Retrieve addresses of all locally registered services.
+ {ok, ok, [ AnnounceAddresses ]} =
+ rvi_common:send_component_request(service_discovery,
+ get_local_network_addresses,
+ [], [addresses]),
+ %% Send out an announcement to all locally connected services, but skip
+ %% the one that made the registration call
+ announce_service_availability(services_unavailable, AnnounceAddresses, Service),
+
+ %% Return ok.
+ { ok, [ {status, rvi_common:json_rpc_status(ok)} ] };
+
+ Err ->
+ ?debug("service_edge_rpc:unregister_local_service() Failed at service_discovery(): ~p",
+ [ Err ]),
+ Err
+ end.
+
+
+get_available_services() ->
+ ?debug("service_edge_rpc:get_available_services()"),
+
+ case
+ %% Register the service at service discovery
+ rvi_common:send_component_request(service_discovery, get_all_services,
+ [], [services]) of
+ { ok, _JSONStatus, [ Services ]} ->
+ { ok, Services};
+
+ Err ->
+ ?debug("service_edge_rpc:get_all_services() Failed at service_discovery(): ~p",
[ Err ]),
Err
end.
@@ -113,7 +163,7 @@ announce_service_availability(Cmd, LocalServiceAddresses, Services) ->
announce_service_availability(Cmd, LocalServiceAddresses, Services, undefined).
-%% Announces the services listed in Services wit all
+%% Announces the services listed in Services with all
%% local services listed under LocalServices
%% SkipAddress is a single address that, if found in LocalServiceAddresses,
%% will not receive an announcement.
@@ -138,11 +188,10 @@ announce_service_availability(Cmd, LocalServiceAddresses, Services, SkipAddress)
%% Handle a message, delivered from a locally connected service, that is
%% to be forwarded to a remote service.
%%
-handle_local_message(ServiceName, Timeout, Parameters, CallingService) ->
+handle_local_message(ServiceName, Timeout, Parameters) ->
?debug("service_edge_rpc:local_msg: service_name: ~p", [ServiceName]),
?debug("service_edge_rpc:local_msg: timeout: ~p", [Timeout]),
?debug("service_edge_rpc:local_msg: parameters: ~p", [Parameters]),
- ?debug("service_edge_rpc:local_msg: calling_service: ~p", [CallingService]),
case
%%
@@ -152,7 +201,6 @@ handle_local_message(ServiceName, Timeout, Parameters, CallingService) ->
%%
rvi_common:send_component_request(authorize, authorize_local_message,
[
- {calling_service, CallingService},
{service_name, ServiceName}
],
[ certificate, signature ]) of
@@ -390,7 +438,16 @@ forward_message_to_scheduler(ServiceName, Timeout, Parameters, Certificate, Sign
handle_rpc("register_service", Args) ->
{ok, Service} = rvi_common:get_json_element(["service"], Args),
{ok, Address} = rvi_common:get_json_element(["network_address"], Args),
- register_service(Service, Address);
+ register_local_service(Service, Address);
+
+handle_rpc("unregister_service", Args) ->
+ {ok, Service} = rvi_common:get_json_element(["service"], Args),
+ unregister_local_service(Service);
+
+handle_rpc("get_available_services", _Args) ->
+ { ok, Services } = get_available_services(),
+ { ok, [ { status, rvi_common:json_rpc_status(ok)},
+ { services, {array, Services}}] };
handle_rpc("register_remote_services", Args) ->
@@ -403,8 +460,7 @@ handle_rpc("message", Args) ->
{ok, ServiceName} = rvi_common:get_json_element(["service_name"], Args),
{ok, Timeout} = rvi_common:get_json_element(["timeout"], Args),
{ok, Parameters} = rvi_common:get_json_element(["parameters"], Args),
- {ok, CallingService} = rvi_common:get_json_element(["calling_service"], Args),
- handle_local_message( ServiceName, Timeout, Parameters, CallingService);
+ handle_local_message( ServiceName, Timeout, Parameters);
handle_rpc("handle_remote_message", Args) ->
{ ok, ServiceName } = rvi_common:get_json_element(["service_name"], Args),
@@ -423,16 +479,32 @@ handle_rpc(Other, _Args) ->
%% Websocket iface
wse_register_service(Ws, Service ) ->
?debug("service_edge_rpc:wse_register_service(~p) service: ~p", [ Ws, Service ]),
- register_service(Service, "ws:" ++ pid_to_list(Ws)).
+ register_local_service(Service, "ws:" ++ pid_to_list(Ws)).
+
+wse_unregister_service(Ws, Service ) ->
+ ?debug("service_edge_rpc:wse_unregister_service(~p) service: ~p", [ Ws, Service ]),
+ unregister_local_service(Service).
+
+wse_get_available_services(_Ws ) ->
+ ?debug("service_edge_rpc:wse_get_available_services()"),
+ { ok, Services } = get_available_services(),
+ { ok, [ { status, rvi_common:json_rpc_status(ok)},
+ { services, Services}] }.
+
-wse_message(Ws, ServiceName, Timeout, JSONParameters, CallingService) ->
+wse_message(Ws, ServiceName, Timeout, JSONParameters) ->
%% Parameters are delivered as JSON. Decode into tuple
{ ok, Parameters } = exo_json:decode_string(JSONParameters),
?debug("service_edge_rpc:wse_message(~p) ServiceName: ~p", [ Ws, ServiceName ]),
?debug("service_edge_rpc:wse_message(~p) Timeout: ~p", [ Ws, Timeout]),
- ?debug("service_edge_rpc:wse_message(~p) CallingService: ~p", [ Ws, CallingService ]),
?debug("service_edge_rpc:wse_message(~p) Parameters: ~p", [ Ws, Parameters ]),
- handle_local_message( ServiceName, Timeout, [Parameters] , CallingService).
+ handle_local_message( ServiceName, Timeout, [Parameters]).
+
+%% Deprecated
+wse_message(Ws, ServiceName, Timeout, JSONParameters, _CallingService) ->
+ wse_message(Ws, ServiceName, Timeout, JSONParameters).
+
+
%% Handle calls received through regular gen_server calls, routed byh
@@ -454,7 +526,6 @@ handle_call({rvi_call, unregister_remote_services, Args}, _From, State) ->
announce_service_availability(services_unavailable, LocalServiceAddresses, Services),
{ reply, {ok, [ { status, rvi_common:json_rpc_status(ok)} ] }, State };
-
handle_call({rvi_call, handle_remote_message, Args}, _From, State) ->
{ _, ServiceName } = lists:keyfind(service_name, 1, Args),
{ _, Timeout } = lists:keyfind(timeout, 1, Args),