clone to branch ferdi_feature
digital-twin/RBD-multibranch/pipeline/head This commit looks good Details

ferdi_feature
akumadoferudi 2 months ago
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=

6
.gitattributes vendored

@ -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

4
.gitignore vendored

@ -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 @@
{}

19
.vscode/tasks.json vendored

@ -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"]

101
Jenkinsfile vendored

@ -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 @@
Test 5

@ -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…
Cancel
Save