Rocky

Rocky is part of the openKAT project, made with Django. To comply to government standards, Manon is used for style and accessibility. Yarn is used as package manager and ParcelJS is used as bundler to compile the frontend (CSS and Javascript). You can find the Manon repository here.

Installation

Containerized

To run rocky from using Docker, run this from the parent directory nl-kat-coordination:

$ make kat

and continue reading this document at “First run”.

Local

For a local set up, you need to start the Django app and compile the frontend.

Django App

This requires a working Python (>3.10) environment. One example of how to create, activate and initialize a development environment is:

$ python3 -m venv $PWD/.venv
$ source .venv/bin/activate
$ python3 -m pip install -r requirements-dev.txt

Copy the .env-dist to a .env and configure the hosts and credentials to PostgreSQL, RabbitMQ and the other services.

$ cp .env-dist .env

For instance, to configure the PostgreSQL database set the following variables:

ROCKY_DB_HOST=
ROCKY_DB_PORT=
ROCKY_DB=
ROCKY_DB_USER=
ROCKY_DB_PASSWORD=
ROCKY_DB_DSN=

Here, ROCKY_DB_DSN is optional (e.g. postgresql://username:password@hostname:port/database_name) and if not set, the other DB variables will be used.

Once your environment variables are set up (see .env-dist, you can initialize Rocky using:

$ make build-rocky-native

To start the Django server, run:

$ make run

Frontend

Yarn is used to bundle CSS and Javascript.

To compile the frontend using yarn locally, run:

$ yarn --ignore-engine
$ yarn build

To compile the frontend using Docker, run:

$ make build-rocky-frontend

The app should be running at localhost:8000.

TL;DR

Given a proper .env file, run:

$ python3 -m venv $PWD/.venv
$ source .venv/bin/activate
$ python3 -m pip install -r requirements-dev.txt
$ make build-rocky-native
$ & make run
$ make build-rocky-frontend

Development

Testing

To run all unit tests, run:

$ make utest

Tip

A local Python environment is useful for unit testing even when using Docker. Follow the first instructions in the local setup to create a Python environment. Then create a rocky/.env from the template rocky/.env-dist and set ROCKY_DB_HOST=localhost. Now for the unit tests you should be able to just run

$ pytest

to run them locally.

You can easily parallelize the tests can be parallelized using pytest-xdist:

$ python -m pip install pytest-xdist
$ time pytest  # 1:08,92 on 13-02-2024
$ time pytest -n 8  # 21,749 on 13-02-2024

Design

Fonts license

All fonts used within Rocky remain under their own license. For example: Fredoka, Open Sans & Tabler icons.

For more information check their respective folders for extra/ more specific license (if available) or visit:

Fredoka

https://fonts.google.com/specimen/Fredoka/about

Open Sans

https://fonts.google.com/specimen/Open+Sans/about

Tabler icons

https://tabler-icons.io/

Technical Design

Running a boefje

The following diagram shows the triggered flows when running a Boefje from Rocky.

        sequenceDiagram
    participant Rocky
    participant Scheduler
    participant Boefje
    participant Bytes
    participant Normalizer
    participant Octopoes
    Rocky->>+Scheduler: Push Boefje Task
    Boefje->>Scheduler: Pull Boefje Task
    Scheduler-->>Rocky: boefje_task.status = dispatched
    Boefje->>Bytes: Save Raw
    Boefje->>Scheduler: boefje_task.status = completed
    Scheduler->>-Rocky: boefje_task.status = completed
    Bytes-->>Scheduler: Raw File Received
    Scheduler->>+Scheduler: Push Normalizer Task
    Normalizer->>Scheduler: Pull Normalizer Task
    Normalizer->>Bytes: Get Raw
    Scheduler-->>Rocky: normalizer_task.status = dispatched
    Normalizer->>Octopoes: Add object(s)
    Normalizer->>Scheduler: normalizer_task.status = completed
    Scheduler->>-Rocky: normalizer_task.status = completed
    

Rocky View Structure

Rocky has a hierarchical set of views that are not easy to capture in a single diagram. We therefore made several diagrams to show the most coherent components.

Overview of child Views of the OrganizationViews

        classDiagram
direction RL
    class OrganizationView
    OrganizationView : organization
    OrganizationView : octopoes_api_connector
    OrganizationView : organization_member
    OrganizationView : indemnification_present

    OrganizationView <|-- View
    SinglePluginView <|-- OrganizationView
    BytesRawView <|-- OrganizationView
    Health <|-- OrganizationView
    HealthChecks <|-- OrganizationView
    IndemnificationAddView <|-- OrganizationView
    OctopoesView <|-- OrganizationView
    OOIAddTypeSelectView <|-- OrganizationView
    Report <|-- OrganizationView
    OrganizationDetailView <|-- OrganizationView
    OrganizationMemberEditView <|-- OrganizationView
    DownloadTaskDetail <|-- OrganizationView
    TaskListView <|-- OrganizationView
    UploadCSV <|-- OrganizationView
    UploadRaw <|-- OrganizationView
    ObjectsBreadcrumbsMixin <|-- OrganizationView
    OrganizationMemberBreadcrumbsMixin <|-- OrganizationView
    FindingTypeAddView <|-- OrganizationView
    

Exhaustive overview of OctopoesViews

        classDiagram
direction RL
    class OrganizationView
    class OctopoesView
    class SchedulerView
    class TaskListView

    OctopoesView <|-- OrganizationView

    SchedulerView <|-- OctopoesView
    TaskListView <|-- SchedulerView
    BoefjeDetailView <|-- TaskListView
    OOIDetailView <|-- TaskListView
    OOIDetailView <|-- OOIRelatedObjectAddView
    OOIDetailView <|-- OOIFindingManager
    ChangeClearanceLevel <|-- SchedulerView

    SingleOOIMixin <|-- OctopoesView
    SingleOOITreeMixin <|-- SingleOOIMixin

    BaseOOIDetailView <|-- SingleOOITreeMixin
    BaseOOIDetailView <|-- ConnectorFormMixin
    OOIDetailView <|-- BaseOOIDetailView
    OOIFindingListView <|-- OOIFindingManager
    OOIFindingListView <|-- BaseOOIDetailView
    MuteFindingView <|-- BaseOOIDetailView
    BaseReportView <|-- BaseOOIDetailView

    OOIReportView <|-- BaseOOIDetailView
    OOITreeView <|-- BaseOOIDetailView
    OOISummaryView <|-- OOITreeView
    OOIGraphView <|-- OOITreeView

    OOIRelatedObjectManager <|-- SingleOOITreeMixin
    OOIFindingManager <|-- SingleOOITreeMixin
    OOIRelatedObjectAddView <|-- OOIRelatedObjectManager

    OOIReportPDFView <|-- SingleOOITreeMixin
    OnboardingSetupScanOOIDetailView <|-- SingleOOITreeMixin

    BaseOOIFormView <|-- SingleOOIMixin
    OOIDeleteView <|-- SingleOOIMixin

    OnboardingSetupScanOOIAddView <|-- BaseOOIFormView
    OOIEditView <|-- BaseOOIFormView
    OOIAddView <|-- BaseOOIFormView
    FindingAddView <|-- BaseOOIFormView

    BaseOOIListView <|-- ConnectorFormMixin
    OOIListView <|-- BaseOOIListView
    FindingListView <|-- BaseOOIListView
    OOIListExportView <|-- BaseOOIListView

    ScanProfileDetailView <|-- OOIDetailView
    ScanProfileResetView <|-- OOIDetailView
    

KATalogus Views

This diagram shows the current view structure and what properties are set in each class for the KATalogus.

        classDiagram
direction RL
    class FormView
    class OrganizationView
    class SinglePluginView
    class KATalogusView
    class PluginSettingsAddView
    class PluginEnableDisableView
    class SingleSettingView
    class PluginSettingsListView

    OrganizationView : organization
    OrganizationView : octopoes_api_connector
    OrganizationView : organization_member
    OrganizationView : indemnification_present

    SinglePluginView : katalogus_client
    SinglePluginView : plugin
    SinglePluginView : plugin_schema

    SingleSettingView : setting_name

    class PluginSettingsDeleteView
    class BoefjeDetailView
    class TaskListView

    KATalogusView  <|--  OrganizationView
    KATalogusView  <|--  FormView
    SinglePluginView  <|--  OrganizationView
    SingleSettingView  <|--  SinglePluginView
    BoefjeDetailView  <|--  PluginSettingsListView
    BoefjeDetailView  <|--  TaskListView
    PluginEnableDisableView  <|--  SinglePluginView
    PluginSettingsAddView  <|--  FormView
    PluginSettingsAddView  <|--  SinglePluginView
    PluginSettingsDeleteView  <|--  SingleSettingView
    PluginSettingsListView  <|--  SinglePluginView