%%%------------------------------------------------------------------- %%% @author licheng5 %%% @copyright (C) 2020, %%% @doc %%% %%% @end %%% Created : 26. 4月 2020 3:36 下午 %%%------------------------------------------------------------------- -module(service_handler). -author("licheng5"). -include("iot.hrl"). %% API -export([handle_request/4]). %% 下发config.json, 微服务接受后,保存服务配置 handle_request("POST", "/service/push_config", _, #{<<"uuid">> := UUID, <<"service_id">> := ServiceId, <<"last_edit_user">> := LastEditUser, <<"config_json">> := ConfigJson, <<"timeout">> := Timeout0}) when is_binary(UUID), is_binary(ServiceId), is_binary(ConfigJson), is_integer(Timeout0) -> %% 检查ConfigJson是否是合法的json字符串 case iot_util:is_json(ConfigJson) of true -> case iot_host:get_pid(UUID) of undefined -> {ok, 200, iot_util:json_error(-1, <<"host not found">>)}; Pid when is_pid(Pid) -> Timeout = Timeout0 * 1000, case iot_host:async_service_config(Pid, ServiceId, ConfigJson, Timeout) of {ok, Ref} -> case iot_host:await_reply(Ref, Timeout) of {ok, Result} -> %% 更新配置信息到数据库 case service_config_model:update(ServiceId, UUID, ConfigJson, LastEditUser) of ok -> {ok, 200, iot_util:json_data(Result)}; {error, Reason} -> lager:debug("[service_handler] set_config service_id: ~p, get error: ~p", [ServiceId, Reason]), {ok, 200, iot_util:json_error(-1, <<"set service config failed">>)} end; {error, Reason} -> {ok, 200, iot_util:json_error(-1, Reason)} end; {error, Reason} when is_binary(Reason) -> {ok, 200, iot_util:json_error(-1, Reason)} end end; false -> {ok, 200, iot_util:json_error(-1, <<"config is invalid json">>)} end; %% 获取服务配置信息 handle_request("GET", "/service/get_config", #{<<"service_id">> := ServiceId}, _) when is_binary(ServiceId) -> case service_config_model:get_config(ServiceId) of error -> {ok, 200, iot_util:json_error(-1, <<"service config not found">>)}; {ok, Config} -> {ok, 200, iot_util:json_data(service_config_model:as_map(Config))} end; %% 删除对应的主机信息 handle_request("POST", "/service/delete_config", _, #{<<"service_id">> := ServiceId}) when is_binary(ServiceId) -> case service_config_model:delete(ServiceId) of ok -> {ok, 200, iot_util:json_data(<<"success">>)}; {error, Reason} -> lager:debug("[service_handler] delete config of service_id: ~p, error: ~p", [ServiceId, Reason]), {ok, 200, iot_util:json_error(-1, <<"delete service config errror">>)} end; %% 部署微服务 handle_request("POST", "/service/deploy", _, #{<<"uuid">> := UUID, <<"task_id">> := TaskId, <<"service_id">> := ServiceId, <<"tar_url">> := TarUrl}) when is_binary(UUID), is_integer(TaskId), is_binary(ServiceId), is_binary(TarUrl) -> case iot_host:get_pid(UUID) of undefined -> {ok, 200, iot_util:json_error(404, <<"host not found">>)}; Pid when is_pid(Pid) -> case iot_host:deploy_service(Pid, TaskId, ServiceId, TarUrl) of {ok, Ref} -> case iot_host:await_reply(Ref, 5000) of {ok, Result} -> {ok, 200, iot_util:json_data(Result)}; {error, Reason} -> {ok, 200, iot_util:json_error(400, Reason)} end; {error, Reason} when is_binary(Reason) -> {ok, 200, iot_util:json_error(400, Reason)} end end; %% 启动服务 handle_request("POST", "/service/start", _, #{<<"uuid">> := UUID, <<"service_id">> := ServiceId}) when is_binary(UUID), is_binary(ServiceId) -> case iot_host:get_pid(UUID) of undefined -> {ok, 200, iot_util:json_error(404, <<"host not found">>)}; Pid when is_pid(Pid) -> case iot_host:start_service(Pid, ServiceId) of {ok, Ref} -> case iot_host:await_reply(Ref, 5000) of {ok, Result} -> {ok, 200, iot_util:json_data(Result)}; {error, Reason} -> {ok, 200, iot_util:json_error(400, Reason)} end; {error, Reason} when is_binary(Reason) -> {ok, 200, iot_util:json_error(400, Reason)} end end; %% 停止服务 handle_request("POST", "/service/stop", _, #{<<"uuid">> := UUID, <<"service_id">> := ServiceId}) when is_binary(UUID), is_binary(ServiceId) -> case iot_host:get_pid(UUID) of undefined -> {ok, 200, iot_util:json_error(404, <<"host not found">>)}; Pid when is_pid(Pid) -> case iot_host:stop_service(Pid, ServiceId) of {ok, Ref} -> case iot_host:await_reply(Ref, 5000) of {ok, Result} -> {ok, 200, iot_util:json_data(Result)}; {error, Reason} -> {ok, 200, iot_util:json_error(400, Reason)} end; {error, Reason} when is_binary(Reason) -> {ok, 200, iot_util:json_error(400, Reason)} end end; %% 远程调用微服务, 返回值的格式为json handle_request("POST", "/service/invoke", _, #{<<"uuid">> := UUID, <<"service_id">> := ServiceId, <<"payload">> := Payload, <<"timeout">> := Timeout0}) when is_binary(UUID), is_binary(ServiceId), is_binary(Payload), is_integer(Timeout0) -> case iot_host:get_pid(UUID) of undefined -> {ok, 200, iot_util:json_error(404, <<"host not found">>)}; Pid when is_pid(Pid) -> Timeout = Timeout0 * 1000, case iot_host:invoke_service(Pid, ServiceId, Payload, Timeout) of {ok, Ref} -> case iot_host:await_reply(Ref, Timeout) of {ok, Result} -> {ok, 200, iot_util:json_data(Result)}; {error, Reason} -> {ok, 200, iot_util:json_error(400, Reason)} end; {error, Reason} when is_binary(Reason) -> {ok, 200, iot_util:json_error(400, Reason)} end end; handle_request("POST", "/service/task_log", _, #{<<"uuid">> := UUID, <<"task_id">> := TaskId}) when is_binary(UUID), is_integer(TaskId) -> case iot_host:get_pid(UUID) of undefined -> {ok, 200, iot_util:json_error(404, <<"host not found">>)}; Pid when is_pid(Pid) -> case iot_host:task_log(Pid, TaskId) of {ok, Ref} -> case iot_host:await_reply(Ref, 5000) of {ok, Result} -> {ok, 200, iot_util:json_data(Result)}; {error, Reason} -> {ok, 200, iot_util:json_error(400, Reason)} end; {error, Reason} when is_binary(Reason) -> {ok, 200, iot_util:json_error(400, Reason)} end end; handle_request(_, Path, _, _) -> Path1 = list_to_binary(Path), {ok, 200, iot_util:json_error(-1, <<"url: ", Path1/binary, " not found">>)}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% helper methods %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%