Symbolic engine, or OperationRunner, is something like what we have seen for the scripts: a couple of job/thread that going in polling over database, look for ready operation, or completed (success/failed) operations.
All this operation will be completely asynchronous both for user and symbolic application: a ControllerJob will call each "n" seconds to verify the state of ran operation.
- Select machine(s), decide which operation he want, and complete (if required) the parameters needed for the execution
- An entry is stored in database and set in "ready state"
- RunnerJob (is not the same job used to run scripts!) check, each "x" seconds, if there's any operation to run.
- When it finds something, using func api, he call func and change the operation status in database: running state
- Func, through func-transmit script, will call required minion creating an "async job" (the job id will be returned to RunnerJob and stored in database)
- Another job, the ControllerJob, verifies if there is any running operation (contacting database) and, using stored job id, it asks to Func the state of that job
- When it receives a "complete job" response (could be success or failed) store the information in database setting also the status to correct value (success/error)
- User can see the result for the operation he called.