Packages
step_flow
1.7.0-rc0
1.9.0-rc2
1.9.0-rc1
1.9.0-rc0
1.8.2
1.8.1
1.8.1-rc8
1.8.1-rc7
1.8.1-rc6
1.8.1-rc5
1.8.1-rc4
1.8.1-rc3
1.8.1-rc2
1.8.1-rc1
1.8.1-rc0
1.8.0
1.8.0-rc3
1.8.0-rc2
1.8.0-rc1
1.8.0-rc0
1.7.3
1.7.3-rc4
1.7.3-rc3
1.7.3-rc2
1.7.3-rc1
1.7.3-rc0
1.7.2
1.7.2-rc4
1.7.2-rc3
1.7.2-rc2
1.7.2-rc1
1.7.2-rc0
1.7.1
1.7.0
1.7.0-rc1
1.7.0-rc0
1.6.1
1.6.1-rc1
1.6.1-rc0
1.6.0
1.6.0-rc9
1.6.0-rc8
1.6.0-rc7
1.6.0-rc6
1.6.0-rc5
1.6.0-rc4
1.6.0-rc3
1.6.0-rc20
1.6.0-rc2
1.6.0-rc19
1.6.0-rc18
1.6.0-rc17
1.6.0-rc16
1.6.0-rc15
1.6.0-rc14
1.6.0-rc13
1.6.0-rc12
1.6.0-rc11
1.6.0-rc10
1.6.0-rc1
1.5.0
1.5.0-rc1
1.4.2-rc2
1.4.2-rc1
1.4.1
1.4.1-rc1
1.4.0
1.4.0-rc4
1.4.0-rc3
1.4.0-rc2
1.4.0-rc1
1.3.1
1.3.0
1.3.0-rc
1.2.0
1.1.0
1.0.0
1.0.0-rc9
1.0.0-rc8
1.0.0-rc7
1.0.0-rc6
1.0.0-rc5
1.0.0-rc1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.4
0.0.3
0.0.2
0.0.1
Step flow manager for Elixir applications
Current section
Files
Jump to
Current section
Files
lib/step_flow/process_manager.ex
defmodule StepFlow.ProcessManager do
@moduledoc false
use Supervisor
require Logger
alias StepFlow.Repo.Checker
@doc false
def child_spec(_) do
%{
id: StepFlow.ProcessManager,
start: {StepFlow.ProcessManager, :start_link, []},
type: :supervisor
}
end
@doc false
def start_link do
Logger.warn("#{__MODULE__} start_link")
supervisor = Supervisor.start_link(__MODULE__, [], name: __MODULE__)
if Checker.repo_running?() do
start_children()
end
supervisor
end
@doc false
def init(_) do
Logger.warn("#{__MODULE__} init")
Supervisor.init([], strategy: :one_for_one)
end
def start_children do
children = [
StepFlow.Workers.Supervisor,
StepFlow.Workflows.StepManager,
StepFlow.Workflows.WorkflowsWatcher
]
children =
case Application.get_env(:step_flow, StepFlow.Endpoint) do
nil ->
children
_ ->
children ++
[
{Phoenix.PubSub, [name: StepFlow.PubSub, adapter: Phoenix.PubSub.PG2]},
StepFlow.Endpoint
]
end
children =
StepFlow.Configuration.get_slack_token()
|> case do
nil ->
children
slack_token ->
Logger.info("Starting Slack Bot")
List.insert_at(
children,
-1,
%{
id: Slack.Bot,
start: {
Slack.Bot,
:start_link,
[
StepFlow.SlackBot,
[],
slack_token,
%{
keepalive: 10_000,
name: :step_flow_slack_bot,
scope: "identify,incoming-webhook"
}
],
restart: :transient
}
}
)
end
children
|> Enum.each(fn child ->
Logger.info("#{__MODULE__} start child: #{inspect(child)}")
case get_child_pid(StepFlow.ProcessManager, child) do
nil ->
{:ok, _pid} = Supervisor.start_child(StepFlow.ProcessManager, child)
:undefined ->
{:ok, _pid} = Supervisor.restart_child(StepFlow.ProcessManager, child)
:restarting ->
Logger.info("#{inspect(child)}} #{__MODULE__} child already restarting...")
pid ->
Logger.info("#{inspect(child)}} #{__MODULE__} child already running: #{inspect(pid)}")
end
end)
end
def stop_children do
Supervisor.which_children(StepFlow.ProcessManager)
|> Enum.each(fn {id, pid, _type, _modules} ->
Logger.info("#{__MODULE__} terminate child: #{id}, #{inspect(pid)}")
Supervisor.terminate_child(StepFlow.ProcessManager, id)
end)
end
def get_child_pid(supervisor, child) do
case get_child(supervisor, child) do
nil -> nil
{_id, pid, _type, _modules} -> pid
end
end
def get_child(supervisor, child) do
Supervisor.which_children(supervisor)
|> Enum.find(fn {id, _pid, _type, _} -> id == child end)
end
end