Ernesto Casablanca
What characteristics will EICSymAware have?
The easiest way to distribute a python package is through PyPI.
With a properly configured pyproject.toml
file and CI/CD pipeline, the whole process can be automated and triggered by pushing a new tag.
Installation just requires pip
:
pip install eicsymaware
Each module can be developed independently with its own repository and CI/CD pipeline.
There needs to be agreement on a common API and some coding standards should be enforced (e.g. code style, docstrings, etc.).
Modules should be deployed regularly to allow for integration testing.
eicsymAware-mpi # Module from mpi (repository)
└── src
└── eicsymaware # namespace (no __init__.py)
└── mpi # package (__init__.py)
eicsymAware-sisw # Module from sisw (repository)
└── src
└── eicsymaware # namespace (no __init__.py)
└── sisw # package (__init__.py)
Each component should be as independent as possible from the others.
Loading diagram...
Each module will publish its own package.
An API foundation package would help enforce a common interface between components.
Everything will come together in a single package, the entrypoint of the project.
Loading diagram...
The components should be easily interchangeable, as long as they respect the common API.
Only the main package knows all the modules and how they communicate with each other ⟹ it is possible to replace a each with a compatible one without affecting the others.
Adapting the Publisher-Subscriber design pattern makes it easier to decouple the components.
Loading diagram...
Working with events makes it easier to segregate the implementation of each component from the transmission of data.
Loading diagram...
Loading diagram...
A simple example to show how the architecture could be built is currently available on GitLab.
It includes all the package configuration files, as well as ready to use testing, linting and documentation tools. All is integrated with a CI/CD pipeline.
A group on GitLab is a collection of projects.
Each module is a separate project.
Each module publishes its own package using a CI/CD pipeline.
pip install testsimaware-mpi --index-url https://gitlab.com/api/v4/projects/52682823/packages/pypi/simple
pip install testsimaware-sisw --index-url https://gitlab.com/api/v4/projects/52755635/packages/pypi/simple
The agent will combine all the modules together and provide the entrypoint to the project.
from testsimaware.mpi import Perception
from testsimaware.sisw import SituationAwareness
class Agent:
def __init__(self):
self.perception = Perception()
self.situation_awareness = SituationAwareness()
self.perception.add("system_status", self.situation_awareness.update)
self.situation_awareness.add("low_cpu", lambda _: self.stop)
self.situation_awareness.add("low_memory", lambda _: self.stop)
self.situation_awareness.add("low_disk", lambda _: self.stop)
def start(self):
self.perception.start()
def stop(self):
self.perception.stop()
agent = Agent()
agent.start()
For a more complete example, check the agent.py file.
Any questions or comments?