diff --git a/InfoLogger/.dockerignore b/InfoLogger/.dockerignore new file mode 100644 index 000000000..3476a2a3b --- /dev/null +++ b/InfoLogger/.dockerignore @@ -0,0 +1,12 @@ +# Default ignore everything +* + +# Project +!lib/ +!package*.json +!public/ +!index.js +!test/ +!eslint.config.js +!config.js +!docker/ diff --git a/InfoLogger/Dockerfile b/InfoLogger/Dockerfile new file mode 100644 index 000000000..bde48bf2d --- /dev/null +++ b/InfoLogger/Dockerfile @@ -0,0 +1,70 @@ +# +# ---- Base ---- +FROM node:22-alpine AS base + +RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app + +WORKDIR /home/node/app + +# +# ---- Development Dependencies ---- +FROM base AS developmentdependencies + +# Must be set before `npm ci` otherwise Puppeteer will try to install Chrome. We'll be using the installed package. +ENV PUPPETEER_SKIP_DOWNLOAD=true + +COPY package.json package-lock.json ./ +# Installs modules from package-lock.json if there are changes, this ensures reproducible build +RUN npm --silent ci + + +# +# ---- Development ---- +FROM developmentdependencies AS development + +EXPOSE 8080 + +# Run the container as a non-root user 1000:1000, which is the default user in the node:22-alpine image +USER 1000:1000 + +CMD [ "npm", "run", "start:dev" ] + +# +# ---- Seeder ---- +# One-shot job, so the sources are copied in rather than bind-mounted +FROM developmentdependencies AS seeder + +COPY docker/database/seed-messages.js ./docker/database/seed-messages.js +COPY test/fake-data ./test/fake-data +COPY test/utils ./test/utils + +USER 1000:1000 + +CMD [ "npm", "run", "seed" ] + +# +# ---- Test ---- +FROM developmentdependencies AS test + +RUN apk add --no-cache chromium +ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser + +# Copy all files, except those ignored by .dockerignore +COPY . . + +USER 1000:1000 + +CMD [ "npm", "run", "test" ] + +# +# ---- Simul ---- +FROM base AS simul + +COPY test/live-simulator ./test/live-simulator +COPY test/fake-data ./test/fake-data +COPY test/utils ./test/utils +EXPOSE 6102 + +USER 1000:1000 + +CMD [ "node", "test/live-simulator/runInfoLoggerServer.js" ] diff --git a/InfoLogger/README.md b/InfoLogger/README.md index 676e37a56..4b0aa2c5f 100644 --- a/InfoLogger/README.md +++ b/InfoLogger/README.md @@ -11,6 +11,8 @@ - [Interface User Guide](#interface-user-guide) - [Requirements](#requirements) - [Project Layout](#project-layout) + - [Scripts](#scripts) + - [Docker development](#docker-development) - [Backend](#backend) - [Frontend](#frontend) - [Local Development](#local-development) @@ -55,12 +57,41 @@ Screenshot of the current interface, running locally against a fake InfoLoggerSe ## Requirements - `nodejs` >= `22.x` +- Docker/Docker Compose - InfoLogger MariaDB database for Query mode - InfoLoggerServer endpoint for Live mode ## Project Layout ILG is a Node.js API Gateway and Single-Page Application built on top of the `@aliceo2/web-ui` framework. It serves as a unified interface to two separate operational backends: a **MariaDB database** for historical queries and an **InfoLoggerServer TCP endpoint** for live log streaming. +## Scripts +| Script | Description | +| --- | --- | +| `npm start` | Run the app (`node index.js`). | +| `npm run lint` | Lint the project with ESLint. | +| `npm run lint:fix` | Lint and automatically fix fixable problems. | +| `npm test` | Run the linter, then the Mocha test suite. | +| `npm run coverage` | Run the test suite under `nyc` and generate the coverage report. | +| `npm run coverage:report` | Generate HTML + JSON coverage reports under `coverage/` from the last run. | + +Docker commands (`docker:dev`, `docker:dev:local-ilg`, `docker:dev:local-db`, `docker:dev:local-both`, `docker:test` and `docker:cleanup`) are documented under [Docker development](#docker-development). + +### Docker development + +The development image is approx. 500MB and the test image is approx 1.5GB, about 50% of that is due to puppeteer's chromium requirement. + +`database` and `simulator` each live in their own Compose override file, so they only start when you ask for them. Rather than stacking `-f` flags by hand, use one of: + +| Script | Compose files (on top of `docker-compose.yaml`) | Application | Database | Simulator | +| --- | --- | --- | --- | --- | +| `npm run docker:dev` | `dev` | ✅ | ❌ | ❌ | +| `npm run docker:dev:local-ilg` | `dev` + `dev.ilg` | ✅ | ❌ | ✅ | +| `npm run docker:dev:local-db` | `dev` + `dev.db` | ✅ | ✅ | ❌ | +| `npm run docker:dev:local-both` | `dev` + `dev.db` + `dev.ilg` | ✅ | ✅ | ✅ | + +For services with a cross, point `config.js` at a remote host and port and change the credentials accordingly. For services with a checkmark, the script will start a local container for you. + +Run `npm run docker:cleanup` to remove all containers created by the above and their data. ## Backend @@ -93,72 +124,38 @@ cp config-default.js config.js Edit `config.js` for the setup you're using below. -`npm run dev` runs the backend under nodemon. The frontend has no hot reload - refresh the browser to pick up changes. - ### Query & Live mode Against a remote backend (e.g. a staging instance) -1. Point `mysql` and `infoLoggerServer` in `config.js` at the remote host and port. -2. `npm start`, then open [http://localhost:8080](http://localhost:8080). +1. Point `mysql` and `infoLoggerServer` in `config.js` at a remote host and port. Ask your team for the correct values if you don't have them. +2. `npm run docker:dev`, then open [http://localhost:8080](http://localhost:8080). ### Live mode against synthetic logs (thoroughly test Live mode) -The bundled [fake InfoLoggerServer](test/live-simulator/) emits a log every 0-100 ms, shuffling through [test/live-simulator/fakeData.json](test/live-simulator/fakeData.json). +The bundled [fake InfoLoggerServer](test/live-simulator/) emits a log every 0-100 ms, shuffling through [test/fake-data/fakeData.json](test/fake-data/fakeData.json). -1. Set `infoLoggerServer` in `config.js` to `localhost:6102`. -2. Terminal 1: `npm run simul`. -3. Terminal 2: `npm run dev`. -4. Open [http://localhost:8080](http://localhost:8080) and click **Live**. +1. Point `infoLoggerServer` in `config.js` at `simulator`. +2. `npm run docker:dev:local-ilg`. +3. Open [http://localhost:8080](http://localhost:8080) and click **Live**. ### Query against a local DB -Requires [Docker Desktop](https://www.docker.com/products/docker-desktop/). - -1. In a working dir, create `compose.yaml`: - - ```yaml - services: - mariadb: - image: mariadb - restart: unless-stopped - ports: ['3306:3306'] - environment: - MARIADB_ROOT_PASSWORD: root # this is just an example, not intended to be a production configuration - phpmyadmin: - image: phpmyadmin - restart: unless-stopped - ports: ['9090:80'] - environment: - - PMA_HOST=mariadb - ``` - - Gives you a MariaDB server with phpMyAdmin on the latest image. Pin a specific version (e.g. `mariadb:11.5`) by changing the `image:` tag. - -2. `docker compose up -d`. -3. Open [http://localhost:9090/](http://localhost:9090/) → log in `root` / `root` → **New** → create database `INFOLOGGER`. -4. Open the **SQL** tab, paste [docs/database-specs.sql](docs/database-specs.sql), click **Go**. -5. In `config.js`: - - ```js - mysql: { - host: '127.0.0.1', - user: 'root', - password: 'root', - database: 'INFOLOGGER', - port: 3306, - timeout: 60000, - retryMs: 5000, - }, - ``` - -6. `npm run dev` - startup should log `Connection to DB successfully established: 127.0.0.1:3306`. +1. Point `mysql` in `config.js` at `database`. +2. `npm run docker:dev:local-db`. +3. Open [http://localhost:8080](http://localhost:8080) and click **Query**. + +The schema in [test/db/INFOLOGGER.sql](test/db/INFOLOGGER.sql) is applied once, when the database volume is +first created. The `seeder` service then runs [test/db/seed-messages.js](test/db/seed-messages.js) on **every** +`up`: it inserts a batch of messages if the table is empty, or re-dates the existing messages to keep them within the N many days specified in `seed-messages.js`. The seeder is idempotent, so you can run `docker compose up` repeatedly without accumulating duplicate messages. You only need to run 'npm run docker:cleanup' to remove the database volume if you have made changes to the schema or the seeder. + +Need both at once? `npm run docker:dev:local-both` starts the simulator and the local DB together. ## Testing -- `npm test` - eslint + mocha. `npm run mocha` runs the suite alone. +- `npm run docker:test` - eslint + mocha. - Backend tests: [test/lib/](test/lib). - Frontend tests: [test/public/](test/public). - Add or update the matching test when fixing a bug. -- `npm run eslint` - config in [eslint.config.js](eslint.config.js). Lint failures block CI. +- Lint failures block CI. ### Integration tests (live elsewhere) diff --git a/InfoLogger/config-default.js b/InfoLogger/config-default.js index dbf38c686..fc67c524f 100644 --- a/InfoLogger/config-default.js +++ b/InfoLogger/config-default.js @@ -28,7 +28,7 @@ module.exports = { // optional data source, comment object if not used // all options: https://github.com/mysqljs/mysql#connection-options mysql: { - host: '127.0.0.1', + host: process.env.mariadb_host ?? 'database', user: 'root', password: 'root', database: 'INFOLOGGER', @@ -40,7 +40,7 @@ module.exports = { // optional data source, comment object if not used // all options: https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener infoLoggerServer: { - host: 'localhost', + host: process.env.infologger_host ?? 'simulator', port: 6102, }, logging: { diff --git a/InfoLogger/docker-compose.dev.db.yaml b/InfoLogger/docker-compose.dev.db.yaml new file mode 100644 index 000000000..66290440b --- /dev/null +++ b/InfoLogger/docker-compose.dev.db.yaml @@ -0,0 +1,62 @@ +# Local MariaDB to query, plus a one-shot seeder. +services: + application: + depends_on: + database: + condition: service_healthy + seeder: + condition: service_completed_successfully + + database: + image: mariadb:10.5 + + # Fail the stack + restart: "no" + + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: INFOLOGGER + + # should you want to access the DB using a external program + ports: + - "3306:3306" + + # The schema is applied once, when the data volume is first created. + # A directory mount, not a single file so can have multiple scripts. + volumes: + - type: bind + read_only: true + source: ./docker/database/initdb.d + target: /docker-entrypoint-initdb.d + - type: volume + source: database-data + target: /var/lib/mysql + + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 5s + timeout: 20s + retries: 20 + + # One-shot job: re-seeds the messages table on every `up`, so the fake logs are + # always dated within the last day and a `-1d`/`-2d` filter shows them straight away. + seeder: + build: + target: seeder + + restart: "no" + + depends_on: + database: + condition: service_healthy + + environment: + NODE_ENV: development + MYSQL_HOST: database + MYSQL_PORT: 3306 + MYSQL_USER: root + MYSQL_PASSWORD: root + MYSQL_DATABASE: INFOLOGGER + +volumes: + database-data: diff --git a/InfoLogger/docker-compose.dev.ilg.yaml b/InfoLogger/docker-compose.dev.ilg.yaml new file mode 100644 index 000000000..baa07a51a --- /dev/null +++ b/InfoLogger/docker-compose.dev.ilg.yaml @@ -0,0 +1,19 @@ +# Local InfoLogger server simulator, streaming fake logs on port 6102. +services: + application: + # Ordering only, no healthcheck: InfoLoggerReceiver retries the connection every 5s + depends_on: + - simulator + + simulator: + build: + target: simul + + # Fail the stack + restart: "no" + + environment: + NODE_ENV: development + + ports: + - "6102:6102" diff --git a/InfoLogger/docker-compose.dev.yaml b/InfoLogger/docker-compose.dev.yaml new file mode 100644 index 000000000..b98754263 --- /dev/null +++ b/InfoLogger/docker-compose.dev.yaml @@ -0,0 +1,31 @@ +name: infologger-dev +services: + application: + build: + target: development + + restart: "no" + + environment: + NODE_ENV: development + + ports: + - "8080:8080" + + volumes: + - type: bind + read_only: true + source: ./lib + target: /home/node/app/lib + - type: bind + read_only: true + source: ./public + target: /home/node/app/public + - type: bind + read_only: true + source: ./config.js + target: /home/node/app/config.js + - type: bind + read_only: true + source: ./index.js + target: /home/node/app/index.js diff --git a/InfoLogger/docker-compose.test.yaml b/InfoLogger/docker-compose.test.yaml new file mode 100644 index 000000000..4063107eb --- /dev/null +++ b/InfoLogger/docker-compose.test.yaml @@ -0,0 +1,10 @@ +name: infologger-test +services: + application: + build: + target: test + + restart: "no" + + environment: + NODE_ENV: development diff --git a/InfoLogger/docker-compose.yaml b/InfoLogger/docker-compose.yaml new file mode 100644 index 000000000..65e53fe27 --- /dev/null +++ b/InfoLogger/docker-compose.yaml @@ -0,0 +1,5 @@ +services: + application: + build: + context: . + dockerfile: Dockerfile diff --git a/InfoLogger/docker/database/initdb.d/INFOLOGGER.sql b/InfoLogger/docker/database/initdb.d/INFOLOGGER.sql new file mode 100644 index 000000000..99f186d78 --- /dev/null +++ b/InfoLogger/docker/database/initdb.d/INFOLOGGER.sql @@ -0,0 +1,44 @@ +-- Meant to mirror PROD InfoLogger configuration. +-- Applied once, when the database volume is first created. + +CREATE DATABASE IF NOT EXISTS `INFOLOGGER` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +USE `INFOLOGGER`; + +CREATE TABLE `messages` ( + `severity` char(1) DEFAULT NULL, + `level` tinyint(3) UNSIGNED DEFAULT NULL, + `timestamp` double(16,6) DEFAULT NULL, + `hostname` varchar(32) DEFAULT NULL, + `rolename` varchar(32) DEFAULT NULL, + `pid` mediumint(8) UNSIGNED DEFAULT NULL, + `username` varchar(32) DEFAULT NULL, + `system` varchar(32) DEFAULT NULL, + `facility` varchar(32) DEFAULT NULL, + `detector` varchar(32) DEFAULT NULL, + `partition` varchar(32) DEFAULT NULL, + `dest` varchar(32) DEFAULT NULL, + `run` int(10) UNSIGNED DEFAULT NULL, + `errcode` int(10) UNSIGNED DEFAULT NULL, + `errline` smallint(5) UNSIGNED DEFAULT NULL, + `errsource` varchar(32) DEFAULT NULL, + `message` text DEFAULT NULL, + KEY `ix_severity` (`severity`), + KEY `ix_level` (`level`), + KEY `ix_timestamp` (`timestamp`), + KEY `ix_hostname` (`hostname`(14)), + KEY `ix_rolename` (`rolename`(20)), + KEY `ix_system` (`system`(3)), + KEY `ix_facility` (`facility`(20)), + KEY `ix_detector` (`detector`(8)), + KEY `ix_partition` (`partition`(10)), + KEY `ix_dest` (`dest`(10)), + KEY `ix_run` (`run`), + KEY `ix_errcode` (`errcode`), + KEY `ix_errline` (`errline`), + KEY `ix_errsource` (`errsource`(20)) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; + +-- We don't partition in the local DB. Partitioning by day earns its keep over a production-sized time span; +-- but causes the seeder's re-dating updates to rewrite the entire table which is slow and not ideal. +-- PARTITION BY HASH (`timestamp` DIV 86400) +-- PARTITIONS 365 diff --git a/InfoLogger/docker/database/seed-messages.js b/InfoLogger/docker/database/seed-messages.js new file mode 100644 index 000000000..9661fe08a --- /dev/null +++ b/InfoLogger/docker/database/seed-messages.js @@ -0,0 +1,127 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +const mariadb = require('mariadb'); +const rawFakeData = require('../../test/fake-data/fakeData.json'); +const { shuffle } = require('../../test/utils/utils.js'); + +const fakeData = shuffle([...rawFakeData]); + +const COLUMNS = [ + 'severity', + 'level', + 'timestamp', + 'hostname', + 'rolename', + 'pid', + 'username', + 'system', + 'facility', + 'detector', + 'partition', + 'dest', + 'run', + 'errcode', + 'errline', + 'errsource', + 'message', +]; + +const INSERT_QUERY = `INSERT INTO messages (${COLUMNS.map((column) => `\`${column}\``).join(', ')}) ` + + `VALUES (${COLUMNS.map(() => '?').join(', ')})`; + +// Slides the whole batch forward so it ends at the current time +const REDATE_QUERY = 'UPDATE messages SET `timestamp` = `timestamp` + ?'; + +const CONNECTION_ATTEMPTS = 10; +const CONNECTION_RETRY_MS = 2000; + +const config = { + host: process.env.MYSQL_HOST ?? 'localhost', + port: Number(process.env.MYSQL_PORT ?? 3306), + user: process.env.MYSQL_USER ?? 'root', + password: process.env.MYSQL_PASSWORD ?? 'root', + database: process.env.MYSQL_DATABASE ?? 'INFOLOGGER', + connectionLimit: 1, +}; + +/** + * Grab a connection from the pool, retrying while the database is still starting up. + * @param {object} pool - the mariadb pool to take the connection from + * @returns {Promise} an open connection + */ +async function connectWithRetry(pool) { + for (let attempt = 1; attempt <= CONNECTION_ATTEMPTS; attempt++) { + try { + return await pool.getConnection(); + } catch (error) { + if (attempt === CONNECTION_ATTEMPTS) { + throw error; + } + console.log(`${new Date().toISOString()} [InfoLogger Seeder] Database not ready (attempt ${attempt}/${CONNECTION_ATTEMPTS}), retrying...`); + await new Promise((resolve) => setTimeout(resolve, CONNECTION_RETRY_MS)); + } + } +} + +/** + * Build the rows to insert, evenly spread over the faked time span, oldest first. + * @returns {Array} one array of column values per message + */ +function buildRows() { + const messagesPerSecond = 1; + const numberOfSecondsToSpan = 2 * 24 * 3600; // 2 days + const start = Date.now() / 1000 - numberOfSecondsToSpan; + const totalMessages = messagesPerSecond * numberOfSecondsToSpan; + + return Array.from({ length: totalMessages }, (_, i) => { + const timestamp = start + i / messagesPerSecond; + const data = fakeData[i % fakeData.length]; + + return COLUMNS.map((column) => column === 'timestamp' ? timestamp : data[column] ?? null); + }); +} + +/** + * Insert the batch of fake messages, or just re-date it when a previous run already inserted it + * @returns {Promise} resolved once the database has been seeded + */ +async function seed() { + const pool = mariadb.createPool(config); + let connection; + try { + connection = await connectWithRetry(pool); + + const [{ newest }] = await connection.query('SELECT MAX(`timestamp`) AS newest FROM messages;'); + + if (newest === null || newest === undefined) { + const rows = buildRows(); + console.log(`${new Date().toISOString()} [InfoLogger Seeder] Inserting ${rows.length} messages.`); + await connection.batch(INSERT_QUERY, rows); + } else { + console.log(`${new Date().toISOString()} [InfoLogger Seeder] Re-dating the existing messages.`); + await connection.query(REDATE_QUERY, [Date.now() / 1000 - newest]); + } + + console.log(`${new Date().toISOString()} [InfoLogger Seeder] Seeding completed successfully!`); + } finally { + connection?.release(); + await pool.end(); + } +} + +seed().catch((error) => { + console.error(`${new Date().toISOString()} [InfoLogger Seeder] Error seeding database:`, error); + process.exit(1); +}); diff --git a/InfoLogger/eslint.config.js b/InfoLogger/eslint.config.js index 78eb9bdb8..c9aa70ccb 100644 --- a/InfoLogger/eslint.config.js +++ b/InfoLogger/eslint.config.js @@ -18,6 +18,16 @@ const jsdoc = require('eslint-plugin-jsdoc'); const stylisticJs = require('@stylistic/eslint-plugin'); module.exports = [ + { + ignores: [ + 'test/', + 'node_modules/', + 'tmp/', + '.nyc_output/', + 'coverage/', + 'docker/database/', + ], + }, jsdoc.configs['flat/recommended'], pluginJs.configs.recommended, { diff --git a/InfoLogger/package-lock.json b/InfoLogger/package-lock.json index 5d290a118..e1c29243a 100644 --- a/InfoLogger/package-lock.json +++ b/InfoLogger/package-lock.json @@ -22,6 +22,7 @@ "eslint-plugin-jsdoc": "64.0.1", "globals": "17.9.0", "mocha": "11.8.0", + "nodemon": "^3.1.14", "nyc": "18.0.0", "puppeteer": "25.5.0", "sinon": "22.1.0" @@ -1250,6 +1251,33 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", @@ -1318,6 +1346,19 @@ "node": ">=6.0.0" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/body-parser": { "version": "1.20.5", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", @@ -1383,6 +1424,19 @@ "node": "18 || 20 || >=22" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2358,6 +2412,19 @@ "node": ">=16.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", @@ -2517,6 +2584,21 @@ } ] }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2862,6 +2944,13 @@ "node": ">= 4" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2897,6 +2986,19 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2927,6 +3029,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3744,6 +3856,132 @@ "node": ">=18" } }, + "node_modules/nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/nodemon/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/nodemon/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nyc": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-18.0.0.tgz", @@ -4377,6 +4615,13 @@ "node": ">= 0.10" } }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4851,6 +5096,19 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sinon": { "version": "22.1.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-22.1.0.tgz", @@ -5120,6 +5378,19 @@ "inBundle": true, "license": "MIT" }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/to-valid-identifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", @@ -5147,6 +5418,16 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -5218,6 +5499,13 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", diff --git a/InfoLogger/package.json b/InfoLogger/package.json index cdef92d5d..a6575fbd4 100644 --- a/InfoLogger/package.json +++ b/InfoLogger/package.json @@ -18,14 +18,22 @@ }, "homepage": "https://alice-o2-project.web.cern.ch/", "scripts": { + "lint": "eslint --config eslint.config.js", + "lint:fix": "npm run lint -- --fix", + "test": "npm run lint && npm run mocha", + "mocha": "mocha --exit $(find test -name 'mocha-*.js')", + "coverage": "nyc npm test && npm run coverage:report", + "coverage:report": "nyc report --reporter=html --reporter=json", "start": "node index.js", - "test": "npm run eslint && npm run mocha", - "dev": "nodemon --inspect --watch index.js --watch lib --watch config.js index.js", + "start:dev": "nodemon --inspect --watch index.js --watch lib --watch config.js index.js", "simul": "node test/live-simulator/runInfoLoggerServer.js", - "eslint": "./node_modules/.bin/eslint --config eslint.config.js lib/ public/", - "mocha": "mocha --exit $(find test -name 'mocha-*.js')", - "coverage": "npm run eslint && nyc npm run mocha", - "coverage-local": "nyc --reporter=lcov npm run mocha" + "seed": "node docker/database/seed-messages.js", + "docker:dev": "docker compose -f docker-compose.yaml -f docker-compose.dev.yaml up --build", + "docker:dev:local-ilg": "docker compose -f docker-compose.yaml -f docker-compose.dev.yaml -f docker-compose.dev.ilg.yaml up --build", + "docker:dev:local-db": "docker compose -f docker-compose.yaml -f docker-compose.dev.yaml -f docker-compose.dev.db.yaml up --build", + "docker:dev:local-both": "docker compose -f docker-compose.yaml -f docker-compose.dev.yaml -f docker-compose.dev.db.yaml -f docker-compose.dev.ilg.yaml up --build", + "docker:test": "docker compose -f docker-compose.yaml -f docker-compose.test.yaml up --build --abort-on-container-exit --exit-code-from application", + "docker:cleanup": "docker compose -f docker-compose.yaml -f docker-compose.dev.yaml -f docker-compose.dev.db.yaml -f docker-compose.dev.ilg.yaml down -v --remove-orphans && docker compose -f docker-compose.yaml -f docker-compose.test.yaml down -v --remove-orphans" }, "main": "index.js", "dependencies": { @@ -39,6 +47,7 @@ "eslint-plugin-jsdoc": "64.0.1", "globals": "17.9.0", "mocha": "11.8.0", + "nodemon": "^3.1.14", "nyc": "18.0.0", "puppeteer": "25.5.0", "sinon": "22.1.0" diff --git a/InfoLogger/test/live-simulator/fakeData.json b/InfoLogger/test/fake-data/fakeData.json similarity index 91% rename from InfoLogger/test/live-simulator/fakeData.json rename to InfoLogger/test/fake-data/fakeData.json index ce97f5810..2bd2df5a6 100644 --- a/InfoLogger/test/live-simulator/fakeData.json +++ b/InfoLogger/test/fake-data/fakeData.json @@ -18998,5 +18998,1905 @@ "errline": null, "errsource": null, "message": "Loading SLM:CFG/ltu/SLMproxy/sod.seq" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.140838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095311", + "username": "qc", + "system": "QC", + "facility": "post/Tracking_Things", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracking_Things' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.774838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095247", + "username": "qc", + "system": "QC", + "facility": "post/DCS_SomethingOrAnother", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'DCS_SomethingOrAnother' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138443.960838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095283", + "username": "qc", + "system": "QC", + "facility": "post/PID_Testing123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'PID_Testing123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.170838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095264", + "username": "qc", + "system": "QC", + "facility": "post/Task123", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Task123' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.213838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095268", + "username": "qc", + "system": "QC", + "facility": "post/tgl", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'tgl' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.567838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095262", + "username": "qc", + "system": "QC", + "facility": "post/CcdbInspector", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'CcdbInspector' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138444.903838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095274", + "username": "qc", + "system": "QC", + "facility": "post/Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Trending' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.053838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095182", + "username": "qc", + "system": "QC", + "facility": "post/Calib", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.139838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095184", + "username": "qc", + "system": "QC", + "facility": "post/Calib_long", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Calib_long' (det TPC)" + }, + { + "severity": "D", + "level": "1", + "timestamp": "1456138445.515838", + "hostname": "qc1", + "rolename": "qc1", + "pid": "3095305", + "username": "qc", + "system": "QC", + "facility": "post/Tracks_Trending", + "detector": "TPC", + "partition": "31BxkZPDBDj", + "dest": null, + "run": "569617", + "errcode": null, + "errline": 126, + "errsource": "PostProcessingRunner.cxx", + "message": "Checking triggers of the task 'Tracks_Trending' (det TPC)" } ] \ No newline at end of file diff --git a/InfoLogger/test/lib/mocha-json-db.js b/InfoLogger/test/lib/mocha-json-db.js index 38205ec32..9acb66074 100644 --- a/InfoLogger/test/lib/mocha-json-db.js +++ b/InfoLogger/test/lib/mocha-json-db.js @@ -15,9 +15,11 @@ const assert = require('assert'); const fs = require('fs'); const path = require('path'); +const os = require('os'); const JsonFileConnector = require('../../lib/JSONFileConnector.js'); -const CONFIG_FILE = path.join(__dirname, 'db.json.temp'); +const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'infologger-test-')); +const CONFIG_FILE = path.join(tempDir, 'db.json'); const TEST_CONTENT = { colsHeader: { @@ -49,10 +51,6 @@ let jsonConfig; describe('JSON file custom database', () => { before(() => { - // Drop previous DB if exists - try { - fs.unlinkSync(CONFIG_FILE); - } catch (error) { } jsonConfig = new JsonFileConnector(CONFIG_FILE); }); @@ -171,6 +169,6 @@ describe('JSON file custom database', () => { }); }); after(() => { - fs.unlinkSync(CONFIG_FILE); + fs.rmSync(tempDir, { recursive: true, force: true }); }); }); diff --git a/InfoLogger/test/live-simulator/infoLoggerServer.js b/InfoLogger/test/live-simulator/infoLoggerServer.js index 5c7dbbc49..a95d0036a 100644 --- a/InfoLogger/test/live-simulator/infoLoggerServer.js +++ b/InfoLogger/test/live-simulator/infoLoggerServer.js @@ -18,8 +18,8 @@ // https://nodejs.org/api/net.html#net_net_createserver_options_connectionlistener const net = require('net'); -const rawFakeData = require('./fakeData.json'); -const { shuffle } = require('./utils.js'); +const rawFakeData = require('../fake-data/fakeData.json'); +const { shuffle } = require('../utils/utils.js'); const fakeData = shuffle([...rawFakeData]); @@ -27,12 +27,15 @@ const createServer = () => { const server = net.createServer(connectionListener); const port = 6102; // infoLoggerServer default port + const clients = new Set(); + /** * Listener for new client connections. It sends fake log messages to the client at random intervals. * @param {net.Socket} client - The connected client socket */ function connectionListener(client) { console.log('[InfoLogger Server] Client connected at:', new Date().toISOString()); + clients.add(client); let timer = null; let currentLogIndex = 0; @@ -105,6 +108,7 @@ const createServer = () => { */ function onClientDisconnect() { console.log('[InfoLogger Server] Client disconnected at:', new Date().toISOString()); + clients.delete(client); clearTimeout(timer); } } @@ -126,25 +130,33 @@ const createServer = () => { server.listen(port, () => { console.log(`[InfoLogger Server] InfoLoggerServer is running on port ${port}`); }); + + server.clients = clients; return server; }; -const closeServer = (server) => { +const closeServer = (server) => new Promise((resolve, reject) => { console.log('[InfoLogger Server] Closing server at:', new Date().toISOString()); - try { - if (server && server.listening) { - server.close((err) => { - if (err) { - console.error('[InfoLogger Server] Error closing server:', err.message); - } else { - console.log('[InfoLogger Server] Server closed successfully'); - } - }); + + if (!server || !server.listening) { + console.log('[InfoLogger Server] Server was not listening, nothing to close'); + resolve(); + return; + } + + server.close((err) => { + if (err) { + console.error('[InfoLogger Server] Error closing server:', err.message); + reject(err); + } else { + console.log('[InfoLogger Server] Server closed successfully'); + resolve(); } - } catch (err) { - console.error('[InfoLogger Server] Exception while closing server:', err.message); - console.error('[InfoLogger Server] Stack:', err.stack); + }); + + for (const client of server.clients ?? []) { + client.destroy(); } -}; +}); module.exports = { createServer, closeServer }; diff --git a/InfoLogger/test/live-simulator/runInfoLoggerServer.js b/InfoLogger/test/live-simulator/runInfoLoggerServer.js index 18285e780..e1741471d 100644 --- a/InfoLogger/test/live-simulator/runInfoLoggerServer.js +++ b/InfoLogger/test/live-simulator/runInfoLoggerServer.js @@ -1,3 +1,12 @@ -const { createServer } = require('./infoLoggerServer.js'); +const { createServer, closeServer } = require('./infoLoggerServer.js'); -createServer(); +const server = createServer(); + +['SIGTERM', 'SIGINT', 'SIGHUP'].forEach((event) => process.on(event, async () => { + try { + await closeServer(server); + process.exit(0); + } catch { + process.exit(1); + } +})); diff --git a/InfoLogger/test/mocha-index.js b/InfoLogger/test/mocha-index.js index 273b58edc..acc97e25f 100644 --- a/InfoLogger/test/mocha-index.js +++ b/InfoLogger/test/mocha-index.js @@ -17,6 +17,8 @@ const puppeteer = require('puppeteer'); const assert = require('assert'); const { spawn } = require('child_process'); const fs = require('fs'); +const os = require('os'); +const path = require('path'); const config = require('./test-config.js'); const { createServer, closeServer } = require('./live-simulator/infoLoggerServer.js'); @@ -35,6 +37,7 @@ describe('InfoLogger', function () { let subprocess; // web-server runs into a subprocess let subprocessOutput = ''; let ilgServer; + let tempDBDir; // temporary directory holding the web-server's user profile DB this.timeout(30000); this.slow(1000); @@ -59,15 +62,18 @@ describe('InfoLogger', function () { } }); - // Remove any leftover user profile DB from a previous run so tests that modify - // profile state (e.g. user-actions-mocha) always start from the same known state. - fs.rmSync(config.dbFile, { force: true }); - // Start infologger server simulator ilgServer = createServer(); + // Give the web-server a private, empty user profile DB so that tests which modify + // profile state (e.g. user-actions-mocha) always start from the same known state. + tempDBDir = fs.mkdtempSync(path.join(os.tmpdir(), 'infologger-test-')); + // Start web-server in background - subprocess = spawn('node', ['index.js', 'test/test-config.js'], { stdio: 'pipe' }); + subprocess = spawn('node', ['index.js', 'test/test-config.js'], { + stdio: 'pipe', + env: { ...process.env, ILG_TEST_DB: path.join(tempDBDir, 'db.json') }, + }); subprocess.stdout.on('data', (chunk) => subprocessOutput += chunk.toString()); subprocess.stderr.on('data', (chunk) => subprocessOutput += chunk.toString()); subprocess.on('error', (error) => console.error(`Server failed due to: ${error}`)); @@ -123,6 +129,7 @@ describe('InfoLogger', function () { console.log(subprocessOutput); console.log('---------------------------------------------'); subprocess.kill(); - closeServer(ilgServer); + await closeServer(ilgServer); + fs.rmSync(tempDBDir, { recursive: true, force: true }); }); }); diff --git a/InfoLogger/test/test-config.js b/InfoLogger/test/test-config.js index 885acf844..947731aa8 100644 --- a/InfoLogger/test/test-config.js +++ b/InfoLogger/test/test-config.js @@ -33,5 +33,8 @@ module.exports = { expiration: '60s', maxAge: '2', }, - dbFile: './test/testdb.json', + // Set by mocha-index.js to a freshly created temporary directory and removes it afterwards. + // It must differ from the file used by mocha-json-db.js as that unit tests JSONFileConnector in a separate process, + // so sharing a file would mean two uncoordinated writers. + dbFile: process.env.ILG_TEST_DB, }; diff --git a/InfoLogger/test/live-simulator/utils.js b/InfoLogger/test/utils/utils.js similarity index 100% rename from InfoLogger/test/live-simulator/utils.js rename to InfoLogger/test/utils/utils.js