yolo007wizard
Problem Statement:
I am trying to build an ‘action runner’ for judge json rules. In a nut shell, say a json defined rule matches with action string:
{
...rule
"action": "collect_signature"
}
I’m trying to think of best architecture to run that ‘collect_signature’ code. It could be a module name or a script file. The intention is for rules to trigger actions in a dynamic way so actions are easy to maintain separately.
Desired Requirements:
- the action code has its own dependencies/hex packages
- adding new actions does not require app reload/recompile/redeploy of the ‘action runner’ i.e. the actions are dynamically loaded and run somehow.
Idea 1:
standalone exs scripts - Actions are defined in standalone exs files with their own Mix.installs. I tried this already by using Code.require_file/1 to dynamically run an exs file however ran into dependency errors. The ‘action runner’ runtime dependencies had conflicts with the loaded exs dependencies. Need a way to get around that. This seems the most promising however.
Idea 2:
Umbrella project where each action is a separate application. I don’t have experience with umbrella projects but this might be a feasible path. It seems a bit overkill however and I think the action runner would have to be reloaded every time a new action is created (which is a big con).
Idea 3:
Similar to umbrella, load actions as private local packages via a dependency path. The ‘action runner’ would then dynamically load dependencies in its mix.exs. Sudo code like:
defp deps do
for each action_name in actions folder return:
{:action_name, ">= 0.0.0", path: "/actions/action_name"}
end
Then maybe add a Mix task ‘new action’ that loads up the boiler plate for a new action in the correct folder. The main con with this is same as #2 - the action runner would have to be recompiled with every new action.
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex











First 10 of 17 Posts
derek-zhou
Or you can do what Livebook does. Use a separate BEAM node.
yolo007wizard
Ok cool I tried that out and still getting dependency errors. Do nodes have their own isolated dependencies?
I have a simple test setup. A file called ‘action_test.exs’ contains:
Then from the ‘acion runner’ I have tried:
and
but getting error:
** (Mix.Error) Mix.install/2 can only be called with the same dependencies in the given VM
(mix 1.15.2) lib/mix.ex:577: Mix.raise/2
al2o3cr
Not sure if it’s the problem, but note that
Node.spawnexpects a function as its second argument and you’re trying to pass the result ofCode.require_filethere instead. Maybe you need a wrappingfn -> ... end?yolo007wizard
ah nice catch. I retried with:
And its running now but with a warning:
** Can not start :erlang::apply,[function<43.125776118/0 in :erl_eval.expr/6>, ] on :node1@localhost **
In order to see output I tweaked action_test.exs to be:
After re-running
I see no output
so not sure whats wrong
al2o3cr
That message comes from an internal Erlang function
crasher:https://github.com/erlang/otp/blob/7b164938ec6d8c8889417d51fe0e6b1a90cb7d39/erts/preloaded/src/erts_internal.erl#L1008
When
spawn_optcan’t connect to the destination node to spawn the requested process, it spawnscrasherinstead and returns that PID:https://github.com/erlang/otp/blob/7b164938ec6d8c8889417d51fe0e6b1a90cb7d39/erts/preloaded/src/erlang.erl#L3492-L3496
How are you creating
node1@localhostand connecting to it?D4no0
Node.spawn/2is a low-level function, try instead:erpc.call/2, that will handle redirection of errors and output.yolo007wizard
I’m running tests from a livebook:
No luck
I also tried:
still no luck
yolo007wizard
Ok I gave up on nodes as I’m not very confident with them. Not sure how I would prodify that either.
Another idea I didn’t think of is dead simple:
Getting back to the desired requirements this could work. Put all the action scripts in a cloud directory. Then the action runner checks if script exists before running it.
axelson
When I tried running multiple notes before I used the Erlang
:peermodule.Here’s a few snippets from a semi-defunct unreleased project I have:
yolo007wizard
Ok I gave it a spin with a module wrapper like so:
Then I ran:
But its complaining about :peer args:
** (ErlangError) Erlang error: {:invalid_arg, 45}
(stdlib 5.0.2) peer.erl:563: :peer.“-verify_args/1-lc$^0/1-0-”/1
(stdlib 5.0.2) peer.erl:563: :peer.verify_args/1
(stdlib 5.0.2) peer.erl:626: :peer.start_it/2
For debugging I tried both with no luck: