clone to branch ferdi_feature
digital-twin/RBD-multibranch/pipeline/head This commit looks good
Details
digital-twin/RBD-multibranch/pipeline/head This commit looks good
Details
commit
14ad828e3e
@ -0,0 +1,17 @@
|
|||||||
|
# EditorConfig is awesome: http://EditorConfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
end_of_line = lf
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
trim_trailing_whitespace = false
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
LOG_LEVEL=INFO
|
||||||
|
ENV=local
|
||||||
|
PORT=8000
|
||||||
|
HOST=localhost
|
||||||
|
|
||||||
|
# Database
|
||||||
|
DATABASE_HOSTNAME=localhost
|
||||||
|
DATABASE_CREDENTIAL_USER=user
|
||||||
|
DATABASE_CREDENTIAL_PASSWORD=password
|
||||||
|
DATABASE_NAME=digital_twin
|
||||||
|
DATABASE_PORT=5432
|
||||||
|
|
||||||
|
# Collector
|
||||||
|
COLLECTOR_HOSTNAME=localhost
|
||||||
|
COLLECTOR_PORT=5432
|
||||||
|
COLLECTOR_CREDENTIAL_USER=user
|
||||||
|
COLLECTOR_CREDENTIAL_PASSWORD=password
|
||||||
|
COLLECTOR_NAME=collector
|
||||||
|
|
||||||
|
# Services
|
||||||
|
AUTH_SERVICE_API=http://192.168.1.82:8000/auth
|
||||||
|
AEROS_BASE_URL=http://192.168.1.102
|
||||||
|
WINDOWS_AEROS_BASE_URL=http://192.168.1.102:8800
|
||||||
|
TEMPORAL_URL=http://192.168.1.86:7233
|
||||||
|
RELIABILITY_SERVICE_API=http://192.168.1.82:8000/reliability
|
||||||
|
|
||||||
|
# Aeros License (Fallback if Vault is not used)
|
||||||
|
AEROS_LICENSE_ID=
|
||||||
|
AEROS_LICENSE_SECRET=
|
||||||
|
|
||||||
|
# Vault (Optional if using .env fallback)
|
||||||
|
VAULT_URL=
|
||||||
|
ROLE_ID=
|
||||||
|
SECRET_ID=
|
||||||
|
AEROS_SECRET_PATH=
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
# Set the default behavior for all files.
|
||||||
|
* text=auto eol=lf
|
||||||
|
|
||||||
|
# Normalized and converts to native line endings on checkout.
|
||||||
|
*.py text
|
||||||
|
*.pyx text
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
env/
|
||||||
|
__pycache__/
|
||||||
|
venv/
|
||||||
|
.env
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
default_language_version:
|
||||||
|
python: python3
|
||||||
|
repos:
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v4.5.0
|
||||||
|
hooks:
|
||||||
|
- id: check-ast
|
||||||
|
- id: check-builtin-literals
|
||||||
|
- id: check-merge-conflict
|
||||||
|
- id: check-yaml
|
||||||
|
- id: check-toml
|
||||||
|
|
||||||
|
- repo: https://github.com/nbQA-dev/nbQA
|
||||||
|
rev: 1.7.1
|
||||||
|
hooks:
|
||||||
|
- id: nbqa-isort
|
||||||
|
|
||||||
|
- repo: https://github.com/PyCQA/isort
|
||||||
|
rev: 5.13.2
|
||||||
|
hooks:
|
||||||
|
- id: isort
|
||||||
|
|
||||||
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
|
rev: v0.2.1
|
||||||
|
hooks:
|
||||||
|
- id: ruff-format
|
||||||
|
types_or: [python, pyi, jupyter]
|
||||||
|
|
||||||
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
|
rev: 'v0.2.0'
|
||||||
|
hooks:
|
||||||
|
- id: ruff
|
||||||
|
types_or: [python, pyi, jupyter]
|
||||||
|
args: [ --fix, --exit-non-zero-on-fix ]
|
||||||
|
|
||||||
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||||
|
rev: v1.8.0
|
||||||
|
hooks:
|
||||||
|
- id: mypy
|
||||||
|
language: system
|
||||||
|
pass_filenames: false
|
||||||
|
args: ['.']
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "PyDebug: Current File",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${file}",
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"args": [],
|
||||||
|
"justMyCode": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PyDebug: Main File",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/main.py",
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"args": [],
|
||||||
|
"justMyCode": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "Python: Current File",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${command:python.interpreterPath} ${file}",
|
||||||
|
"args": [],
|
||||||
|
"group": "build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Python: Main File",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${command:python.interpreterPath} ${workspaceFolder}/main.py",
|
||||||
|
"args": [],
|
||||||
|
"group": "build"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
# Use the official Python 3.11 image from the Docker Hub
|
||||||
|
FROM python:3.11-slim as builder
|
||||||
|
|
||||||
|
# Install Poetry
|
||||||
|
RUN pip install poetry
|
||||||
|
|
||||||
|
ARG GITEA_USERNAME
|
||||||
|
ARG GITEA_PASSWORD
|
||||||
|
|
||||||
|
# Set environment variables for Poetry
|
||||||
|
ENV POETRY_NO_INTERACTION=1 \
|
||||||
|
POETRY_VIRTUALENVS_IN_PROJECT=1 \
|
||||||
|
POETRY_VIRTUALENVS_CREATE=1 \
|
||||||
|
POETRY_CACHE_DIR=/tmp/poetry_cache
|
||||||
|
|
||||||
|
# Set the working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN poetry config http-basic.licaeros-repo ${GITEA_USERNAME} ${GITEA_PASSWORD}
|
||||||
|
|
||||||
|
# Copy the Poetry configuration files
|
||||||
|
COPY pyproject.toml poetry.lock ./
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN poetry install --no-root
|
||||||
|
|
||||||
|
# Use a new slim image for the runtime
|
||||||
|
FROM python:3.11-slim as runtime
|
||||||
|
|
||||||
|
# Install necessary tools for running the app, including `make`
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
make \
|
||||||
|
python3-tk \
|
||||||
|
tk-dev \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Set environment variables for Poetry
|
||||||
|
ENV POETRY_VIRTUALENVS_IN_PROJECT=1 \
|
||||||
|
PATH="/app/.venv/bin:$PATH"
|
||||||
|
|
||||||
|
# Copy Poetry installation from builder
|
||||||
|
COPY --from=builder /app/.venv /app/.venv
|
||||||
|
|
||||||
|
# Copy application files
|
||||||
|
COPY . /app/
|
||||||
|
|
||||||
|
# Expose port for the application
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
# Set the working directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Run `make run` as the entry point
|
||||||
|
CMD ["make", "run"]
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
environment {
|
||||||
|
DOCKER_HUB_USERNAME = 'aimodocker'
|
||||||
|
// This creates DOCKER_AUTH_USR and DOCKER_AUTH_PSW
|
||||||
|
DOCKER_AUTH = credentials('aimodocker')
|
||||||
|
GITEA_CREDS = credentials('gitea-credentials')
|
||||||
|
IMAGE_NAME = 'rbd-service'
|
||||||
|
SERVICE_NAME = 'ahm-app'
|
||||||
|
|
||||||
|
SECURITY_PREFIX = 'security'
|
||||||
|
|
||||||
|
// Initialize variables to be updated in script blocks
|
||||||
|
GIT_COMMIT_HASH = ""
|
||||||
|
IMAGE_TAG = ""
|
||||||
|
SECONDARY_TAG = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Checkout & Setup') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
checkout scm
|
||||||
|
GIT_COMMIT_HASH = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
|
||||||
|
|
||||||
|
// Use env.BRANCH_NAME or logic to handle detached HEAD if necessary
|
||||||
|
def branch = env.BRANCH_NAME ?: 'unknown'
|
||||||
|
echo "Current Branch: ${branch}"
|
||||||
|
|
||||||
|
if (branch == 'main') {
|
||||||
|
IMAGE_TAG = GIT_COMMIT_HASH
|
||||||
|
SECONDARY_TAG = 'latest'
|
||||||
|
} else if (branch == 'rbd_security') {
|
||||||
|
IMAGE_TAG = "${SECURITY_PREFIX}-${GIT_COMMIT_HASH}"
|
||||||
|
SECONDARY_TAG = "${SECURITY_PREFIX}-latest"
|
||||||
|
} else {
|
||||||
|
IMAGE_TAG = "temp-${GIT_COMMIT_HASH}"
|
||||||
|
SECONDARY_TAG = "" // Ensure it's empty for other branches
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Primary Tag: ${IMAGE_TAG}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Docker Login') {
|
||||||
|
steps {
|
||||||
|
// Fixed variable names based on the 'DOCKER_AUTH' environment key
|
||||||
|
sh "echo ${DOCKER_AUTH_PSW} | docker login -u ${DOCKER_AUTH_USR} --password-stdin"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Build & Tag') {
|
||||||
|
steps {
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'gitea-credentials', usernameVariable: 'GITEA_USERNAME', passwordVariable: 'GITEA_PASSWORD')]) {
|
||||||
|
// Logic and variable definitions go inside 'script'
|
||||||
|
script {
|
||||||
|
def fullImageName = "${DOCKER_HUB_USERNAME}/${IMAGE_NAME}"
|
||||||
|
|
||||||
|
sh "docker build --build-arg GITEA_USERNAME=${GITEA_USERNAME} --build-arg GITEA_PASSWORD=${GITEA_PASSWORD} -t ${fullImageName}:${IMAGE_TAG} ."
|
||||||
|
|
||||||
|
if (SECONDARY_TAG) {
|
||||||
|
sh "docker tag ${fullImageName}:${IMAGE_TAG} ${fullImageName}:${SECONDARY_TAG}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Push to Docker Hub') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
def fullImageName = "${DOCKER_HUB_USERNAME}/${IMAGE_NAME}"
|
||||||
|
sh "docker push ${fullImageName}:${IMAGE_TAG}"
|
||||||
|
|
||||||
|
if (SECONDARY_TAG) {
|
||||||
|
sh "docker push ${fullImageName}:${SECONDARY_TAG}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
sh 'docker logout'
|
||||||
|
def fullImageName = "${DOCKER_HUB_USERNAME}/${IMAGE_NAME}"
|
||||||
|
// Clean up images to save agent disk space
|
||||||
|
sh "docker rmi ${fullImageName}:${IMAGE_TAG} || true"
|
||||||
|
if (SECONDARY_TAG) {
|
||||||
|
sh "docker rmi ${fullImageName}:${SECONDARY_TAG} || true"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success {
|
||||||
|
echo "Successfully processed ${env.BRANCH_NAME}."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
# Define variables
|
||||||
|
POETRY = poetry
|
||||||
|
PYTHON = $(POETRY) run python
|
||||||
|
APP = src/server.py
|
||||||
|
|
||||||
|
# Targets and their rules
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
install:
|
||||||
|
$(POETRY) install
|
||||||
|
|
||||||
|
# Run the application
|
||||||
|
run:
|
||||||
|
python run.py
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
# Unit Testing Guide - be-rbd
|
||||||
|
|
||||||
|
This document provides instructions on how to set up and run unit tests for the **be-rbd** project.
|
||||||
|
|
||||||
|
## 1. Preparation
|
||||||
|
|
||||||
|
### Install Dependencies
|
||||||
|
Ensure you have all dependencies installed. This project uses `poetry`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
poetry install
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Configuration
|
||||||
|
|
||||||
|
### Pytest Configuration
|
||||||
|
Ensure the `pytest.ini` file in the root directory points to the `unit` test folder:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[pytest]
|
||||||
|
testpaths = tests/unit
|
||||||
|
python_files = test_*.py
|
||||||
|
asyncio_mode = auto
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Running Tests
|
||||||
|
|
||||||
|
### Run Unit Tests
|
||||||
|
To run all unit tests in the project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
poetry run pytest tests/unit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Specific Unit Test File
|
||||||
|
```bash
|
||||||
|
poetry run pytest tests/unit/test_specific_feature.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. Best Practices
|
||||||
|
|
||||||
|
- **Isolation**: Unit tests should be isolated from external services. Use mocking for APIs and databases.
|
||||||
|
- **Async Testing**: Use `@pytest.mark.asyncio` for asynchronous test functions.
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"- BTG_PC -",
|
||||||
|
"- BTG_SAC -",
|
||||||
|
"- BTG_SCR -",
|
||||||
|
"- BTG_FW -",
|
||||||
|
"- BTG_BOL -",
|
||||||
|
"- BTG_TUR -",
|
||||||
|
"- BTG_GEN -",
|
||||||
|
"- BTG_COND -",
|
||||||
|
"- BTG_CW -",
|
||||||
|
"- BTG_AFG -",
|
||||||
|
"- BTG_ASH -",
|
||||||
|
"- BTG_SPS -",
|
||||||
|
"- BTG_KLH -"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{
|
||||||
|
"series": ["AFG_FDF A", "AFG_PAF A", "AFG_RAPH A", "AFG_ESP A", "AFG_IDF A", "AFG_FGD A"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": ["AFG_FDF B", "AFG_PAF B", "AFG_RAPH B", "AFG_ESP B", "AFG_IDF B", "AFG_FGD B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3BAD-PAN501",
|
||||||
|
"3BAD-M531",
|
||||||
|
"3BAD-AG531",
|
||||||
|
"3BAD-PN501",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"series": ["3BAD-H511A", "3BAD-M511A", "3BAD-P511A"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": ["3BAD-H511B", "3BAD-M511B", "3BAD-P511B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3BAD-M501",
|
||||||
|
"3BAD-CV501",
|
||||||
|
"3BAD-T531",
|
||||||
|
"3BAD-T532",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"series": ["3BAD-M521A", "3BAD-P521A"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": ["3BAD-M521B", "3BAD-P521B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"BOL_DP",
|
||||||
|
"BOL_OB",
|
||||||
|
"BOL_BDW",
|
||||||
|
"3BOL-H501",
|
||||||
|
"BOL_MS",
|
||||||
|
"BOL_BSS",
|
||||||
|
"3CRH-W002",
|
||||||
|
"BOL_BRS",
|
||||||
|
"BOL_HRH",
|
||||||
|
"BOL_SB"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3CO-H001",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"series": ["3CO-M001A", "3CO-P001A"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": ["3CO-M001B", "3CO-P001B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"series": ["3CAE-M010A", "3CAE-P010A", "3CAE-H010A"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": ["3CAE-M010B", "3CAE-P010B", "3CAE-H010B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3CO-FCV001",
|
||||||
|
"3CO-H010",
|
||||||
|
"3CO-H020",
|
||||||
|
"3CO-H030"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3CCCW-T010",
|
||||||
|
"3CCCW-M090",
|
||||||
|
"3CCCW-P090",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"series": ["3CCCW-M010A", "3CCCW-P010A", "3CCCW-H010A"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": ["3CCCW-M010B", "3CCCW-P010B", "3CCCW-H010B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3FW-H040",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3LOT-T010A",
|
||||||
|
"FW_BFT A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3LOT-T010B",
|
||||||
|
"FW_BFT B"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"FW_MBFP"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3FW-H070",
|
||||||
|
"3FW-H060",
|
||||||
|
"3FW-H050"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"GEN_SCW",
|
||||||
|
"3GEN-GM001",
|
||||||
|
"GEN_SO",
|
||||||
|
"GEN_GEN",
|
||||||
|
"GEN_GMC",
|
||||||
|
"GEN_TR"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["KLH_ABS"]
|
||||||
|
}
|
||||||
@ -0,0 +1,107 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB001A",
|
||||||
|
"3DCS-CAB001B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB002A",
|
||||||
|
"3DCS-CAB002B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB003A",
|
||||||
|
"3DCS-CAB003B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB004A",
|
||||||
|
"3DCS-CAB004B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB005A",
|
||||||
|
"3DCS-CAB005B",
|
||||||
|
"3DCS-CAB005C"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB006A",
|
||||||
|
"3DCS-CAB006B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3DCS-CAB007",
|
||||||
|
"3DCS-CAB008",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB009A",
|
||||||
|
"3DCS-CAB009B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB010A",
|
||||||
|
"3DCS-CAB010B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB011A",
|
||||||
|
"3DCS-CAB011B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3DCS-CAB012",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB013A",
|
||||||
|
"3DCS-CAB013B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CAB014A",
|
||||||
|
"3DCS-CAB014B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3DCS-CAB015",
|
||||||
|
"3DCS-CO001",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CO002A",
|
||||||
|
"3DCS-CO002B"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CO003A",
|
||||||
|
"3DCS-CO003B",
|
||||||
|
"3DCS-CO003C",
|
||||||
|
"3DCS-CO003D"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3DCS-CO004",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CO005A",
|
||||||
|
"3DCS-CO005B",
|
||||||
|
"3DCS-CO005C"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
"3DCS-CO006A",
|
||||||
|
"3DCS-CO006B",
|
||||||
|
"3DCS-CO006C"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3DCS-CO007",
|
||||||
|
"3DCS-CO008"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["00ACR-M001A", "00ACR-C001A"]},
|
||||||
|
{"series": ["00ACR-M001B", "00ACR-C001B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{"series": ["00ACR-M001C", "00ACR-C001C"]},
|
||||||
|
{"series": ["00ACR-M001D", "00ACR-C001D"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel": ["00IA-A001A", "00IA-A001B"]
|
||||||
|
},
|
||||||
|
"3IA-T005"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["00SCR-Z001", "00SCR-Z015"]
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"SPS_APC",
|
||||||
|
"SPS_APE",
|
||||||
|
"SPS_EG"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"TUR_LOS",
|
||||||
|
"TUR_EHS",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{
|
||||||
|
"series": ["3MT-ST010", "3MT-ST020"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"series": ["3HPB-PCV010", "TUR_EHB"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3MT-ST030A",
|
||||||
|
"3MT-ST030B",
|
||||||
|
"3MT-AU040",
|
||||||
|
"3AS-T010",
|
||||||
|
"3AS-BS010",
|
||||||
|
"TUR_GSS",
|
||||||
|
"TUR_CW"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"- CMN_CHS -",
|
||||||
|
"- CMN_CL -",
|
||||||
|
"- CMN_CP -",
|
||||||
|
"WTP",
|
||||||
|
"- CMN_FGD -",
|
||||||
|
"- CMN_SSB -"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["00CHA-SU801A", "00CHA-CV801A", "00CHA-MS801A", "00CHA-BW802A", "00CHA-CV802A", "00CHA-CV803A", "00CHA-SWT801"]},
|
||||||
|
{"series": ["00CHA-SU801B", "00CHA-CV801B", "00CHA-MS801B", "00CHA-BW802B", "00CHA-CV802B", "00CHA-CV803B", "00CHA-SWT802"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["00CHA-CV805A", "00CHB-SKR805A"]},
|
||||||
|
{"series": ["00CHA-CV804", "00CHA-CV805B", "00CHB-SKR805B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"COAL YARD"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["BOOSTER", "FILTER", "TRAFO", "CELL", "SUMP PUMP"]
|
||||||
|
}
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["00RO-M110A", "00RO-P110A"]},
|
||||||
|
{"series": ["00RO-M110B", "00RO-P110B"]},
|
||||||
|
{"series": ["00RO-M110C", "00RO-P110C"]},
|
||||||
|
{"series": ["00RO-M110D", "00RO-P110D"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"00RO-T120",
|
||||||
|
"FeCl3 DOSING",
|
||||||
|
"ANIONIC POLYMER DOSING",
|
||||||
|
"CLEAR WATER",
|
||||||
|
"CLARIFIER",
|
||||||
|
"00RO-T170",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["00RO-M195A", "00RO-P195A"]},
|
||||||
|
{"series": ["00RO-M195B", "00RO-P195B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"00RO-T320",
|
||||||
|
"00RO-T130",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["00RO-M126A", "00RO-P126A"]},
|
||||||
|
{"series": ["00RO-M126B", "00RO-P126B"]},
|
||||||
|
{"series": ["00RO-M126C", "00RO-P126C"]},
|
||||||
|
{"series": ["00RO-M126D", "00RO-P126D"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"NaOCL DOSING",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["00RO-F161A", "00RO-M152A", "00RO-F152A"]},
|
||||||
|
{"series": ["00RO-F161B", "00RO-M152B", "00RO-F152B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"00RO-T150",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["00RO-M150A", "00RO-P150A"]},
|
||||||
|
{"series": ["00RO-M150B", "00RO-P150B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["00RO-M160A", "00RO-P160A"]},
|
||||||
|
{"series": ["00RO-M160B", "00RO-P160B"]},
|
||||||
|
{"series": ["00RO-M160C", "00RO-P160C"]},
|
||||||
|
{"series": ["00RO-M160D", "00RO-P160D"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"H2SO4 DOSING",
|
||||||
|
"SBS DOSING",
|
||||||
|
"ANTI SCALANT DOSING",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["00RO-M170A", "00RO-P170A", "00RO-T160A", "00RO-Z110A"]},
|
||||||
|
{"series": ["00RO-M170B", "00RO-P170B", "00RO-T160B", "00RO-Z110B"]},
|
||||||
|
{"series": ["00RO-M170C", "00RO-P170C", "00RO-T160C", "00RO-Z110C"]},
|
||||||
|
{"series": ["00RO-M170D", "00RO-P170D", "00RO-T160D", "00RO-Z110D"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"NaOH DOSING",
|
||||||
|
"00RO-H181",
|
||||||
|
"00RO-AG181",
|
||||||
|
"00RO-M181",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["00RO-M180A", "00RO-P180A"]},
|
||||||
|
{"series": ["00RO-M180B", "00RO-P180B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"header 3",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["00RO-M340A", "00RO-P340A"]},
|
||||||
|
{"series": ["00RO-M340B", "00RO-P340B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"00RO-T162",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["00RO-M190A", "00RO-P190A"]},
|
||||||
|
{"series": ["00RO-M190B", "00RO-P190B"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["FGD_DS", "FGD_OA", "FGD_LSH", "FGD_RP"]
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"00SSB-EV001",
|
||||||
|
"00SSB-EV002",
|
||||||
|
"00SSB-EV003",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["00SSB-EV004", "00SSB-EV005"]
|
||||||
|
},
|
||||||
|
"00SSB-EV006",
|
||||||
|
"00SSB-EV007",
|
||||||
|
"00SSB-EV012",
|
||||||
|
"00SSB-LA008",
|
||||||
|
"00SSB-LA009",
|
||||||
|
"00SSB-TF010"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"- BTG -",
|
||||||
|
"- CMN -"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["ESP_A1", "ESP_A2"]
|
||||||
|
},
|
||||||
|
"3GG-AX801A"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["ESP_B1", "ESP_B2"]
|
||||||
|
},
|
||||||
|
"3GG-AX801B"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3AF-FCV501A",
|
||||||
|
"3AF-M501A",
|
||||||
|
"3AF-F501A"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3AF-FCV501B",
|
||||||
|
"3AF-M501B",
|
||||||
|
"3AF-F501B"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["3GG-F853A", "3GG-F853B", "3GG-F853C", "3GG-F853D"]
|
||||||
|
},
|
||||||
|
"3GG-M851",
|
||||||
|
"3GG-M851A",
|
||||||
|
"3GG-F851",
|
||||||
|
"3GG-H877",
|
||||||
|
"3GG-F865A",
|
||||||
|
"3GG-M870A",
|
||||||
|
"3GG-F870A",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["3GG-M875A", "3GG-F875A"]},
|
||||||
|
{"series": ["3GG-M875B", "3GG-F875B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["3GG-M877A", "3GG-P877A"]},
|
||||||
|
{"series": ["3GG-M877B", "3GG-P877B"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["3GG-F854A", "3GG-F854B", "3GG-F854C", "3GG-F854D"]
|
||||||
|
},
|
||||||
|
"3GG-M852",
|
||||||
|
"3GG-M851B",
|
||||||
|
"3GG-F852",
|
||||||
|
"3GG-H878",
|
||||||
|
"3GG-F865B",
|
||||||
|
"3GG-M870B",
|
||||||
|
"3GG-F870B",
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["3GG-M880A", "3GG-F880A"]},
|
||||||
|
{"series": ["3GG-M880B", "3GG-F880B"]}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel": [
|
||||||
|
{"series": ["3GG-M878A", "3GG-P878A"]},
|
||||||
|
{"series": ["3GG-M878B", "3GG-P878B"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3GG-M810A",
|
||||||
|
"3GG-F801A",
|
||||||
|
{
|
||||||
|
"parallel": ["3GG-F802A", "3GG-F802B"]
|
||||||
|
},
|
||||||
|
"3GG-M801A",
|
||||||
|
{
|
||||||
|
"parallel": ["3GG-F803A", "3GG-F803B"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel": ["3GG-P801A", "3GG-P801B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3GG-M810B",
|
||||||
|
"3GG-F801B",
|
||||||
|
{
|
||||||
|
"parallel": ["3GG-F804A", "3GG-F804B"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parallel": ["3GG-F805A", "3GG-F805B"]
|
||||||
|
},
|
||||||
|
"3GG-M801B",
|
||||||
|
"3GG-T801B",
|
||||||
|
{
|
||||||
|
"parallel": ["3GG-P802A", "3GG-P802B"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3AL-PCV501A",
|
||||||
|
"3AL-M501A",
|
||||||
|
"3AL-F501A"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3AL-PCV501B",
|
||||||
|
"3AL-M501B",
|
||||||
|
"3AL-F501B"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3AH-AU501A",
|
||||||
|
"3AH-M531A",
|
||||||
|
"3AH-P531A",
|
||||||
|
"3AH-H531A",
|
||||||
|
"3AH-M502A",
|
||||||
|
"3AH-M501A",
|
||||||
|
"3AH-H501A"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3AH-AU501B",
|
||||||
|
"3AH-M531B",
|
||||||
|
"3AH-P531B",
|
||||||
|
"3AH-H531B",
|
||||||
|
"3AH-M502B",
|
||||||
|
"3AH-M501B",
|
||||||
|
"3AH-H501B"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["3BAD-CV501", "203596"]
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3BDW-H601",
|
||||||
|
"3BDW-T601",
|
||||||
|
"3BDW-H611",
|
||||||
|
"3BDW-H621",
|
||||||
|
"3BDW-H631",
|
||||||
|
"3BDW-H641",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["3BDW-M521A", "3BDW-P521A", "3BDW-H521A"]},
|
||||||
|
{"series": ["3BDW-M521B", "3BDW-P521B", "3BDW-H521B"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["3ATT-N503A", "3ATT-N503B"]
|
||||||
|
},
|
||||||
|
"3BRS-H611",
|
||||||
|
"3BRS-H621",
|
||||||
|
"3BRS-H631"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3BSS-H611",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["3ATT-N501A", "3ATT-N501B"]
|
||||||
|
},
|
||||||
|
"3BSS-H621",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": ["3ATT-N502A", "3ATT-N502B"]
|
||||||
|
},
|
||||||
|
"3BSS-H631"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"series": [
|
||||||
|
"3BOL-FD501",
|
||||||
|
{
|
||||||
|
"parallel_no_redundancy": [
|
||||||
|
{"series": ["BOL_DP_FDR A", "BOL_DP_MILL A", "BOL_DP_CB A"]},
|
||||||
|
{"series": ["BOL_DP_FDR B", "BOL_DP_MILL B", "BOL_DP_CB B"]},
|
||||||
|
{"series": ["BOL_DP_FDR C", "BOL_DP_MILL C", "BOL_DP_CB C"]},
|
||||||
|
{"series": ["BOL_DP_FDR D", "BOL_DP_MILL D", "BOL_DP_CB D"]},
|
||||||
|
{"series": ["BOL_DP_FDR E", "BOL_DP_MILL E", "BOL_DP_CB E"]},
|
||||||
|
{"series": ["BOL_DP_FDR F", "BOL_DP_MILL F", "BOL_DP_CB F"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["3DP-B701A", "3DP-B702A", "3DP-B703A", "3DP-B704A"]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["3DP-B701B", "3DP-B702B", "3DP-B703B", "3DP-B704B"]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["3DP-B701C", "3DP-B702C", "3DP-B703C", "3DP-B704C"]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["3DP-B701D", "3DP-B702D", "3DP-B703D", "3DP-B704D"]
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"series": ["3DP-B701E", "3DP-B702E", "3DP-B703E", "3DP-B704E"]
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue