Script Development
The steps to develop and test an SDP script are as follows:
1. Create the script
Clone the ska-sdp-script repository from GitLab and create a new branch for your work.
Create a directory for your script in
src
:$ mkdir src/<my-script> $ cd src/<my-script>
Write the script (
<my-script>.py
). See the existing scripts for examples of how to do this. The examples Real-time script (Test Real-Time Script) and Batch script (Test Batch Script) are the best place to start. These are meant to give you a general idea of the structure real-time and batch scripts should have, and help develop your own.List of available Helm charts, which can be used for scripts, and their documentation can be found at SDP Helm Deployer Charts
We use
poetry
as Python packaging and dependency management software. The related documentation can be found at Poetry. In the development, please create apyproject.toml
file with your script’s Python requirements, e.g.[tool.poetry] name = "ska-sdp-script-<my-script>" version = "0.0.0" description = "SKA SDP <my-script> Script" authors = ["SKA SDP Developers"] license = "BSD-3-Clause" repository = "<link to script directory in repository>" documentation = "<link to script documentation>" package-mode = false [[tool.poetry.source]] name = "PyPI" priority = "primary" [[tool.poetry.source]] name = "skao" url = "https://artefact.skao.int/repository/pypi-internal/simple" priority = "primary" [tool.poetry.dependencies] python = "^3.10" ska-ser-logging = "^0.4.3" ska-sdp-scripting = "~0.7.1"
In general, modifying
[tool.poetry.dependencies]
is enough to add your script’s dependencies.Create a
Dockerfile
for building the script image, e.g.FROM python:3.10-slim WORKDIR /app COPY pyproject.toml poetry.lock ./ RUN pip install poetry && \ poetry config cache-dir /app/.cache && \ poetry config virtualenvs.create false RUN poetry install && \ poetry -n cache clear --all . && \ rm -rf /app/.cache COPY <my-script>.py ./ ENTRYPOINT ["python", "<my-script>.py"]
Use the base image of your choice, preferably the latest numbered slim version of it, e.g. python:3.10-slim.
Create a file called
version.txt
containing the semantic version number of the script.Create a
Makefile
containingNAME := ska-sdp-script-<my-script> VERSION := $(shell cat version.txt) include ../../make/Makefile
2. Test the script locally
Build the script image. If you are using
minikube
to deploy the SDP, run:$ eval $(minikube -p minikube docker-env) $ make build
else, just run the
make build
command. This will add the image to yourminikube
or local Docker daemon where it can be used for testing with a local deployment of the SDP.Add the new script to the configuration DB. This will tell the SDP where to find the Docker image to run the script:
ska-sdp create script <kind>:<name>:<version> '{"image": "<docker-image:version>"}'
where the values are:
<kind>
:batch
orrealtime
, depending on the kind of script<name>
: name of your script<version>
: version of your script<docker-image:version>
: Docker image you just built from your script, including its version tag.
If you have multiple scripts to add, you can import the definitions with:
ska-sdp import scripts my-scripts.yaml
An example file for importing scripts can be found at: Example Script Definitions
To run the script, create a processing block, either via the Tango interface, or by creating it directly in the configuration DB with ska-sdp create pb.
3. Finish development and deploy the script
Once you are happy with the script, add it to the GitLab CI file (
.gitlab-ci.yml
) in the root of the repository. You need to add jobs to publish the development and release versions:publish-dev-<my-script>: extends: .publish-dev variables: SRCDIR: src/<my-script> publish-release-<my-script>: extends: .publish-release variables: SRCDIR: src/<my-script>
This will enable the Docker image to be built and pushed to the SKA artefact repository when it is merged into the master branch.
Add the script to the script definition file
scripts.yaml
in the root of the repository. By default the SDP uses this file to populate the script definitions in the configuration DB when it starts up.Create a
README.md
and add the description and instructions to run your script. Include it in the documentation:create a new file in
docs/src/scripts/<my-script>.rst
add the following to it:
.. mdinclude:: ../../../src/<my-script>/README.md
update
docs/src/index.rst
Commit the changes to your branch and push to GitLab.
Script Generator
To speed things up for the developer, a Python script has been developed to automatically generate the source files.
The script will generate all the required source files (Python script, requirements, version number, Dockerfile, Makefile, README) for both real-time and batch scripts.
Note: you will need docopt
to be installed for the script to run:
pip install docopt
To run the script:
cd templates
python create_script.py <kind> <name>
For example:
python create_script.py realtime my-realtime
Usage
Create source files for real-time or batch script.
Usage:
create_script.py <kind> <name>
create_script.py (-h|--help)
Arguments:
<kind> Kind of script (realtime or batch)
<name> Name of the script to be created