From 8f2a15cbc5b848c0f3c23546924a54b33f8d27b6 Mon Sep 17 00:00:00 2001 From: prasadtalasila Date: Sat, 21 Sep 2024 16:11:46 +0200 Subject: [PATCH] Updates documentation - Improves developer documentation for client - Refactors documentation for docker scenarios - Adds new run-time monitoring example --- client/DEVELOPER.md | 10 + client/config/dev.js | 6 +- client/package.json | 2 +- client/test/README.md | 233 +++++++----------- deploy/docker/SERVER.md | 2 +- deploy/services/README.md | 3 +- docker/README.md | 2 +- docs/admin/client/config.md | 6 +- docs/admin/servers/auth.md | 2 - .../README.md | 166 +++++++++++++ .../figures/dt-structure-nurv-fmu.png | Bin 0 -> 38774 bytes .../README.md | 3 + docs/user/examples/incubator/README.md | 58 ++++- mkdocs-github.yml | 5 +- mkdocs.yml | 5 +- 15 files changed, 344 insertions(+), 159 deletions(-) create mode 100644 docs/user/examples/incubator-NuRV-fmu-monitor-service/README.md create mode 100644 docs/user/examples/incubator-NuRV-fmu-monitor-service/figures/dt-structure-nurv-fmu.png diff --git a/client/DEVELOPER.md b/client/DEVELOPER.md index 7ebf2d7f9..7133eefe1 100644 --- a/client/DEVELOPER.md +++ b/client/DEVELOPER.md @@ -88,6 +88,16 @@ It is therefore reccommend to keep the configurations in the `client/config/` directory and use one of the `yarn config` sub-commands to switch between them. +The purpose of different configuration files are given in the table below. + +| Configuration File Name | Usage Scenario | +|:--------|:--------| +| `dev.js` | Check functionality of the client application without using any other parts of the DTaaS software | +| `gitlab.js` | Used for testing the gitlab code written in `src/utils/gitlab.ts`. These credentials are not used by the client application | +| `local.js` | Used by the `docker/compose.dev.yml` to setup a check the complete DTaaS application on the developer computer | +| `prod.js` | Used for running the client application on a production server. This file is kept here for reference. The `deploy/config/client/env.js` is used during installations. | +| `test.js` | Used by all the tests | + ## Example configuration for developers The first step is to collect the URL of gitlab acting as oauth provider. diff --git a/client/config/dev.js b/client/config/dev.js index e8b36f844..3dfe3b0a3 100644 --- a/client/config/dev.js +++ b/client/config/dev.js @@ -1,7 +1,7 @@ if (typeof window !== 'undefined') { window.env = { REACT_APP_ENVIRONMENT: 'dev', - REACT_APP_URL: 'http://localhost/', + REACT_APP_URL: 'http://localhost:4000/', REACT_APP_URL_BASENAME: '', REACT_APP_URL_DTLINK: '/lab', REACT_APP_URL_LIBLINK: '', @@ -12,8 +12,8 @@ if (typeof window !== 'undefined') { REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c', REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/', - REACT_APP_REDIRECT_URI: 'http://localhost/Library', - REACT_APP_LOGOUT_REDIRECT_URI: 'http://localhost/', + REACT_APP_REDIRECT_URI: 'http://localhost:4000/Library', + REACT_APP_LOGOUT_REDIRECT_URI: 'http://localhost:4000', REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api', }; }; diff --git a/client/package.json b/client/package.json index 8231082a5..bd2088bf5 100644 --- a/client/package.json +++ b/client/package.json @@ -16,7 +16,7 @@ "type": "module", "scripts": { "build": "npx shx cp config/gitlab.json src/util/gitlab.json && npx react-scripts build && npx rimraf src/util/gitlab.json", - "clean": "npx rimraf build/ dist/ node_modules/ coverage/ playwright-report/ *.svg src/util/gitlab.json", + "clean": "npx rimraf build/ dist/ node_modules/ coverage/ playwright-report/ test-results/ *.svg src/util/gitlab.json", "config:dev": "npx shx cp config/dev.js public/env.js && npx shx cp config/dev.js build/env.js", "config:local": "npx shx cp config/local.js public/env.js && npx shx cp config/local.js build/env.js", "config:prod": "npx shx cp config/prod.js public/env.js && npx shx cp config/prod.js build/env.js", diff --git a/client/test/README.md b/client/test/README.md index c87a8ad14..ec1f512bb 100644 --- a/client/test/README.md +++ b/client/test/README.md @@ -1,42 +1,25 @@ # End-to-End (E2E) Tests -The E2E tests require playwright test runner, an on-premise GitLab OAuth setup and -configured `config/test.js` and `test/.env` files. When everything is set up, you -can run the tests by running `yarn test:e2e`. +The E2E tests require playwright test runner and an on-premise GitLab OAuth setup. +The has CAPTCHA protection blocking the end-to-end tests. +Thus on-premise or third-party Gitlab instance hosted without CAPTCHA protection +is needed. -It is also possible to test the hosted DTaaS applications hosted at a URL, -say `https://foo.com` using `yarn test:e2e:ext`. Remember to set the environment -variable in `test/.env` to the URL of the hosted DTaaS application. An example -is shown below: +Make sure you have an active internet connection while running these tests, +as the tests simulate real user interactions with your GitLab account. -```js -if (typeof window !== 'undefined') { - window.env = { - REACT_APP_ENVIRONMENT: 'test', - REACT_APP_URL: 'https://foo.com/', - REACT_APP_URL_BASENAME: '', - REACT_APP_URL_DTLINK: '/lab', - REACT_APP_URL_LIBLINK: '', - REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword', - REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/', - REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab', - REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '', - - REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c', - REACT_APP_AUTH_AUTHORITY: 'https://gitlab.com/', - REACT_APP_REDIRECT_URI: 'https://foo.com/Library', - REACT_APP_LOGOUT_REDIRECT_URI: 'https://foo.com/', - REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api', - }; -}; -``` +There are two possible testing setups you can create. + +1. Host website on the developer computer and test from developer computer. + This is the default E2E testing scenario. + The DTaaS client application will be running at `http://localhost:4000`. +1. Host website on the integration server and test from the integration server. + The DTaaS client application will be running at `https://foo.com`. -The `yarn install` and `yarn config:test` need to be run before `yarn test:e2e:ext` -can be run successfully. Also note that if you are deploying the client -application with Traeffik forward authorization, the tests will fail due to -the additionally required Gitlab authorization. +The following sections describe configuration and yarn test commands for +both these scenarios. -## Playwright +## Install Playwright The E2E tests use playwright test runner. You also need to have the software installed. If it is not installed, you can install it with the following command. @@ -45,21 +28,31 @@ installed. If it is not installed, you can install it with the following command yarn playwright install --with-deps ``` -## OAuth Setup +## Setup Test Configuration -You can follow the instructions in [authorization page -](../../docs/admin/client/auth.md)to setup OAuth for the react client website. -Remember to add the `http://localhost:4000` as callback URL in the OAuth -application. The GitLab will still be running on a remote machine. +### OAuth Setup + +You can follow the instructions in +[authorization page](../../docs/admin/client/auth.md) to setup OAuth for +the react client website. +Remember to add the correct callback URL in the OAuth +application. Depending the location of the client website, +one of the following URLs must be registered as callback URL. + +| Location of client application | URL | +|:---|:---| +| Localhost | `http://localhost:4000` | +| External / Integration server | `https://foo.com` | + +The GitLab will still be running on a remote machine. It is not possible to run both the GitLab and react client website on localhost. -## config/test.js file +### Client Configuration -Before running the E2E tests, you need to update the `config/test.js` file. -If you have a live DTaaS client website running, you can copy the `build/env.js` -into `config/test.js`. +Before running the E2E tests, you need to update +the client configuration file available at `config/test.js`. -Open `config/test.js` in a text editor and make sure the configuration matches +Make sure the configuration in `config/test.js` matches the details of your testing environment. For instance, you need to adjust: * `REACT_APP_URL` @@ -69,66 +62,10 @@ the details of your testing environment. For instance, you need to adjust: to reflect your test setup. More information on about the environment settings is available in [authorization](../../docs/admin/client/auth.md) and -[client deployment](../../docs/admin/client/CLIENT.md) pages. +[client configuration](../../docs/admin/client/config.md) pages. Here's an example of relevant values for variables. This example is suitable for -testing on developer computer. - -```js -REACT_APP_URL="http://localhost:4000" -REACT_APP_AUTH_AUTHORITY="http://gitlab.foo.com" -REACT_APP_REDIRECT_URI="http://localhost:4000/Library" -REACT_APP_LOGOUT_REDIRECT_URI="http://localhost:4000" -``` - -Finally, run `yarn config:test` to copy the config file into the `build` -and `public` folders. - -## env file - -You need to create a `test/.env` file where you will store the GitLab user -credentials and application URL for the website. The credentials will be -used by playwright to simulate real user interactions during the E2E tests. - -A template for `test/.env` is given here: - -```env -REACT_APP_TEST_USERNAME=your_username -REACT_APP_TEST_PASSWORD=your_password -REACT_APP_URL='https://foo.com' -``` - -Replace _your_username_ and _your_password_ with the actual username and password -of your GitLab account or the testing account that you intend to use. Finally -replace _foo.com_ with the URL of your application, as you did in `env.js`. - -Here's an example for test setup on the developer machine and on the -integration server: - -```env -REACT_APP_TEST_USERNAME=TestUsername -REACT_APP_TEST_PASSWORD=TestPassword123 -REACT_APP_URL='http://localhost:4000' -``` - -## Testing on localhost - -If you want to handle starting the react client server yourself, there are two -possible testing setups you can create. - -1. Host website on the developer computer and test from developer computer -1. Host website on the integration server and test from the integration server - -If you use `localhost` in the `REACT_APP_URL` the above the two mentioned setups -are essentially the same. -In order to run the tests on the integration server, you need to disable the -HTTP authorization (if setup in the first place) on the Traefik server and -let the website be accessible without any authenticaiton. - -### The configuration files for the test on localhost - -The `config/test.js` file is given below. The `build/env.js` also holds the -same content. +testing on developer computer, i.e., `localhost`. ```js window.env = { @@ -150,26 +87,8 @@ window.env = { }; ``` -## test/.env - localhost - -```ini -REACT_APP_TEST_USERNAME=TestUsername -REACT_APP_TEST_PASSWORD=TestPassword123 -REACT_APP_URL='http://localhost:4000' -``` - -Please note that the username and password are the user -credentials on `gitlab.foo.com`. - -## Testing on the integration server - -In this test setup, the DTaaS application is running at `https://foo.com` and -the GitLab instance is running at `https://gitlab.foo.com`. The E2E test shall -be run from the developer computer. The codebase commit should be the same on -both the developer computer and integration server. - -The `config/test.js` file on the developer computer is given below. The -`build/env.js` of the integration server also holds the same content. +The matching values for the running the DTaaS client applicat on an integration +server hosted at `https://foo.com` are: ```js window.env = { @@ -191,38 +110,76 @@ window.env = { }; ``` -## test/.env - Integration server +### Test User Credentials + +You need to create a test environment file named `test/.env` +in which you will store the GitLab user credentials and +the DTaaS application URL for the website. The credentials will be +used by playwright to simulate real user interactions during the E2E tests. + +A template for `test/.env` for running the DTaaS client application +on the developer computer, i.e., `localhost` is given here: + +```env +REACT_APP_TEST_USERNAME=your_username +REACT_APP_TEST_PASSWORD=your_password +REACT_APP_URL='http://localhost:4000' +``` + +Replace _your_username_ and _your_password_ with the actual username and password +of your on-premise GitLab account (`gitlab.foo.com`) or the testing account that +you intend to use. + +Here's an example `test/.env` for test setup on the developer machine and +and the DTaaS client application running on a remote integration server: -```ini +```env REACT_APP_TEST_USERNAME=TestUsername REACT_APP_TEST_PASSWORD=TestPassword123 REACT_APP_URL='https://foo.com' ``` -Please note that the username and password are the user credentials on `gitlab.foo.com`. +Here `https://foo.com` is the URL of the application. +Remember to replace _foo.com_ with the URL of your application. -**NOTE:** The tests from developer computer to the integration server only -work with null basename. The test fails if a basename (say `au`) is specified. -This might be due to a complex interaction of developer computer, traefik -gateway and the client website hosted behind traefik. +## Run Tests -## Running the Tests +### Localhost -Once you've properly set up your .env file, you can run the end-to-end tests as follows: +You can run the end-to-end tests as follows: ```bash +yarn install +yarn build +yarn config:test yarn test:e2e ``` -Or with manual website launch: +The `yarn test:e2e` command launches the test runner, the DTaaS client application +and execute all end-to-end tests. +The client application is terminated at the end of end-to-end tests. + +## Testing on the integration server + +In this test setup, the DTaaS application is running at `https://foo.com` and +the GitLab instance is running at `https://gitlab.foo.com`. The E2E test shall +be run from the developer computer. The codebase commit should be the same on +both the developer computer and integration server. + +Points to note: + +1. In order to run the tests on the integration server, you need to disable the + HTTPS authorization (if setup in the first place) on the Traefik server and + let the website be accessible without any authenticaiton done by + [Traefik forward auth](../../docs/admin/servers/auth.md) service. +1. The tests from developer computer to the integration server only + work with null basename. The tests fail if a basename (say `au`) is specified. + This might be due to a complex interaction of developer computer, traefik + gateway and the client website hosted behind traefik. + +You can run the end-to-end tests as follows: ```bash +yarn install yarn test:e2e:ext ``` - -These commands launch the test runner and execute all end-to-end tests. The first -command also runs the `yarn start` command to start the client website -and terminates it after testing. - -Make sure you have an active internet connection while running these tests, -as they simulate real user interactions with your GitLab account. diff --git a/deploy/docker/SERVER.md b/deploy/docker/SERVER.md index df70a649a..12bee0a1f 100644 --- a/deploy/docker/SERVER.md +++ b/deploy/docker/SERVER.md @@ -269,7 +269,7 @@ docker compose -f compose.server.secure.yml --env-file .env.server up -d --force ## Use The application will be accessible at: - from web browser. +`http(s)://foo.com` from web browser. Sign in using your account linked to either _gitlab.com_ or your local gitlab instance. diff --git a/deploy/services/README.md b/deploy/services/README.md index 26981eba4..358d0f997 100644 --- a/deploy/services/README.md +++ b/deploy/services/README.md @@ -9,6 +9,7 @@ The installation scripts in this directory install: * **Grafana** visualization and dashboard service * **RabbitMQ** AMQP broker and its' management interface * Eclipse Mosquitto **MQTT** broker +* **MongoDB** database server ## Configure and Install @@ -35,7 +36,7 @@ at the following ports / URLs. | RabbitMQ Broker | services.foo.com:5672 | | RabbitMQ Broker Management Website | services.foo.com:15672 | | MQTT Broker | services.foo.com:1883 | -|| +| MongoDB database | services.foo.com:27017 | The firewall and network access settings of corporate / cloud network need to be configured to allow external access to the services. Otherwise the users of DTaaS diff --git a/docker/README.md b/docker/README.md index 2dca93849..5201125f7 100644 --- a/docker/README.md +++ b/docker/README.md @@ -66,7 +66,7 @@ The configuration files to be updated are: 1. docker/conf.dev please see [server docs](../docs/admin/servers/auth.md) for help with updating this config file) -1. client/config/dev.js +1. client/config/local.js please see [client config](../docs/admin/client/config.md) for help with updating this config file) diff --git a/docs/admin/client/config.md b/docs/admin/client/config.md index 2712256bb..54f973478 100644 --- a/docs/admin/client/config.md +++ b/docs/admin/client/config.md @@ -49,7 +49,7 @@ This page describes various configuration options for react website. if (typeof window !== 'undefined') { window.env = { REACT_APP_ENVIRONMENT: "dev", - REACT_APP_URL: 'https://foo.com/', + REACT_APP_URL: 'http://localhost:4000/', REACT_APP_URL_BASENAME: 'bar', REACT_APP_URL_DTLINK: '/lab', REACT_APP_URL_LIBLINK: '', @@ -59,8 +59,8 @@ This page describes various configuration options for react website. REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '', REACT_APP_CLIENT_ID: '1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c', REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/', - REACT_APP_REDIRECT_URI: 'https://foo.com/bar/Library', - REACT_APP_LOGOUT_REDIRECT_URI: 'https://foo.com/bar', + REACT_APP_REDIRECT_URI: 'http://localhost:4000/bar/Library', + REACT_APP_LOGOUT_REDIRECT_URI: 'http://localhost:4000/bar', REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api', }; }; diff --git a/docs/admin/servers/auth.md b/docs/admin/servers/auth.md index f5869f2d6..2b3d215eb 100644 --- a/docs/admin/servers/auth.md +++ b/docs/admin/servers/auth.md @@ -53,8 +53,6 @@ you need two URLs: a _callback URL_ and a _logout URL_. **4. Create OAuth Application:** -Oauth application setup on GitLab can be located on Edit Profile -> Application . - During the creation of the OAuth application on GitLab, you need to specify the scope. Choose **_read_user_** scope. diff --git a/docs/user/examples/incubator-NuRV-fmu-monitor-service/README.md b/docs/user/examples/incubator-NuRV-fmu-monitor-service/README.md new file mode 100644 index 000000000..e05e8b77a --- /dev/null +++ b/docs/user/examples/incubator-NuRV-fmu-monitor-service/README.md @@ -0,0 +1,166 @@ +# Incubator Digital Twin with NuRV FMU Monitoring Service + +## Overview + +This example demonstrates how an FMU can be used as a runtime monitoring +service (in this example NuRV[1]) and connected with the +[Incubator digital twin](../incubator/README.md) to verify +runtime behavior of the Incubator. + +## Simulated scenario + +This example simulates a scenario where the lid of the Incubator is +removed and later put back on. The Incubator is equipped with +anomaly detection capabilities, which can detect anomalous behavior +(i.e. the removal of the lid). When an anomaly is detected, +the Incubator triggers an energy saving mode where the heater is turned off. + +From a monitoring perspective, we wish to verify that within 3 messages of +an anomaly detection, the energy saving mode is turned on. +To verify this behavior, we construct the property: + +$G(anomaly \rightarrow (F_{[0,3]}\space energy\_saving))$. + +The monitor will output the _unknown_ state as long as the property is +satisfied and will transition to the _false_ state once +a violation is detected. + +The simulated scenario progresses as follows: + +- _Initialization_: The services are initialized and the Kalman filter + in the Incubator is given 2 minutes to stabilize. Sometimes, + the anomaly detection algorithm will detect an anomaly at startup + even though the lid is still on. It will disappear after approx 15 seconds. +- _After 2 minutes_: The lid is lifted and an anomaly is detected. + The energy saver is turned on shortly after. +- _After another 30 seconds_: The energy saver is manually disabled + producing a _false_ verdict. +- _After another 30 seconds_: The lid is put back on and + the anomaly detection is given time to detect that the lid is back on. + The monitor is then reset producing an Unknown verdict again. + The simulation then ends. + +## Example structure + +A diagram depicting the logical software structure of +the example can be seen below. + +![DT structure](./figures/dt-structure-nurv-fmu.png) + +The _execute_ script is responsible for starting the NuRV service and +running the Python script that controls the scenario (_execute.py_). + +The _execute.py_ script starts the Incubator services and runs +the example scenario. Once the Incubator DT is started, a RabbitMQ client +is created that subscribes to changes in the _anomaly_ and +_energy_saving_ states of the DT, as well as the verdicts produced +by the NuRV service. +Each time an update is received, the full state and verdict is +printed to the console. + +## Digital Twin configuration + +Before running the example, please configure the _simulation.conf_ file with +your RabbitMQ credentials. + +The example uses the following assets: + +| Asset Type | Names of Assets | Visibility | Reuse in other Examples | +| :------------ | :----------------------------- | :--------- | :---------------------- | +| Tools | common/tool/NuRV/NuRV | Common | Yes | +| Other | common/fmi2_headers | Common | Yes | +| DT | common/digital_twins/incubator | Common | Yes | +| Specification | safe-operation.smv | Private | No | +| Script | execute.py | Private | No | + +The _safe-operation.smv_ file contains the default monitored specification +as described in the [Simulated scenario section](#simulated-scenario). +These can be configured as desired. + +## Lifecycle phases + +The lifecycle phases for this example include: + +| Lifecycle phase | Completed tasks | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| create | Downloads the necessary tools and creates a virtual python environment with the necessary dependencies | +| execute | Runs a python script that starts up the necessary services as well as the Incubator simulation. Various status messages are printed to the console, including the monitored system states and monitor verdict. | + +If required, change the execute permissions of lifecycle scripts you +need to execute. This can be done using the following command. + +```bash +chmod +x lifecycle/{script} +``` + +where {script} is the name of the script, e.g. _create_, _execute_ etc. + +## Running the example + +To run the example, first run the following command in a terminal: + +```bash +cd /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/ +``` + +Then, first execute the _create_ script followed by the _execute_ script +using the following command: + +```bash +lifecycle/{script} +``` + +The _execute_ script will then start outputting system states and +the monitor verdict approx every 3 seconds. The output is printed +as follows + +"__State: {anomaly state} & {energy_saving state}__" + +where "_anomaly_" indicates that an anomaly is detected and "!anomaly" +indicates that an anomaly is not currently detected. The same format is +used for the energy_saving state. +NuRV verdicts are printed as follows + +"__Verdict from NuRV: {verdict}__". + +The monitor verdict can be false or unknown, where the latter indicates +that the monitor does not yet have sufficient information to determine +the satisfaction of the property. The monitor will never produce +a true verdict as the entire trace must be verified to ensure satisfaction +due to the G operator. Thus the unknown state can be viewed as +a tentative true verdict. + +An example output trace is provided below: + +````log +.... +Using LIFECYCLE_PATH: /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/lifecycle +Using INCUBATOR_PATH: /workspace/examples/digital_twins/incubator-NuRV-fmu-monitor-service/lifecycle/../../../common/digital_twins/incubator +Starting NuRV FMU Monitor Service, see output at /tmp/nurv-fmu-service.log +NuRVService.py PID: 13496 +Starting incubator +Connected to rabbitmq server. +Running scenario with initial state: lid closed and energy saver on +Setting energy saver mode: enable +Setting G_box to: 0.5763498 +State: !anomaly & !energy_saving +State: !anomaly & !energy_saving +Verdict from NuRV: unknown +State: !anomaly & !energy_saving +State: !anomaly & !energy_saving +Verdict from NuRV: unknown +State: !anomaly & !energy_saving +State: !anomaly & !energy_saving +Verdict from NuRV: unknown +State: !anomaly & !energy_saving +State: !anomaly & !energy_saving +Verdict from NuRV: unknown +State: !anomaly & !energy_saving +State: !anomaly & !energy_saving +Verdict from NuRV: unknown +```` + +## References + +1. Information on the NuRV monitor can be found on + [FBK website](https://es-static.fbk.eu/tools/nurv/). diff --git a/docs/user/examples/incubator-NuRV-fmu-monitor-service/figures/dt-structure-nurv-fmu.png b/docs/user/examples/incubator-NuRV-fmu-monitor-service/figures/dt-structure-nurv-fmu.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2f3b695c002fa59d2aef3b70889e672dc43641 GIT binary patch literal 38774 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