Automate consists of three main application tiers: Webservers, Databases and Services. Automate components are primarily written in Python. UI components are HTML/Ajax. Some utilities are C++.
The UI utilizes the Python web.py framework. By default, Continuum provides a built in http server for the UI and API. It can, however, be configured to use Apache as well.
There are two HTTP processes - the Admin UI and Rest API.
The UI is as the main user console and is available on port 8080 by default.
The Rest API web service provides authenticated access to most functionality so external tools or developers can interact with the system.
Continuum uses MongoDB database to house all the configuration data, security, task code, logs, user-defined task datastores, metrics collection, and reporting.
The services layer is comprised of several processes that perform many automation Tasks: Messenger, Scheduler, Poller and Task Engine.
The Messenger takes care of sending email messages via SMTP to external email addresses. The messenger must be configured with the appropriate SMTP server address, port and credentials to properly connect and send email.
Most messaging originates from Tasks. Tasks will insert messages into the queue and continue processing while the messenger attempts to send the email.
If the messenger fails when attempting to send the message, it will wait a configurable number of seconds before attempting again. It will retry a configurable number of times before giving up the attempt.
The Scheduler is responsible for queuing automation Tasks and submitting them at the appropriate time. The Scheduler continually looks for Tasks that need to be scheduled or queues that need to be further populated in advance.
The Scheduler also serves as a balancer for Task workloads in the case of multiple Task Poller nodes (more on this below). Essentially any Tasks that are submitted will get balanced with the Poller node with the lowest load average. If a Poller node fails to update it's heartbeat within a certain period of time, the Scheduler will remove the Poller Node from the mix and shift any submitted workloads to the remaining healthy Pollers.
The Poller and Task Engine go hand in hand, working together to perform discrete automation Tasks. The Poller watches it's work queue and spawns Task Engine processes accordingly.
Unlike the other processes, the Task Engine isn't a single process. Task Engines are many single processes that get started, one per Task Instance. The Task Engine does all of the heavy lifting: connecting to external databases or web services, performing logic, issuing commands, spinning through loops, etc.
Once the Task that is being performed has run to completion, the Task Engine process updates the Task Instance status and the process ends.
The Poller serves two other important functions:
Cancels Tasks - any running Task instances that are set to be cancelled mid-execution get killed by the Poller.
Cleans up - the Poller monitors running Task instances - any processes that exit without updating their status get cleaned up.