diff --git a/community/autonomous_5g_slicing_lab/Automate_5G_Network_Lab_Setup.ipynb b/community/autonomous_5g_slicing_lab/Automate_5G_Network_Lab_Setup.ipynb
new file mode 100644
index 00000000..8d53216a
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/Automate_5G_Network_Lab_Setup.ipynb
@@ -0,0 +1,148 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "16b65cd9-dcb9-4b32-b7ac-ae152db55c00",
+ "metadata": {},
+ "source": [
+ "### Automate 5G Network Configurations with NVIDIA AI LLM Agents and Kinetica Accelerated Database"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b08157d5-eeea-463b-927b-10792da54d18",
+ "metadata": {},
+ "source": [
+ "This DLI introduces an Agentic Generative AI solution designed to address bandwidth allocation challenges in 5G networks. It is divided into two parts that guide you through setting up and managing a 5G network."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "64f0e900-6e16-4054-b124-820a5dae11eb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Cloning into 'autonomous_5g_slicing_lab'...\n",
+ "remote: Enumerating objects: 9025, done.\u001b[K\n",
+ "remote: Counting objects: 100% (9025/9025), done.\u001b[K\n",
+ "remote: Compressing objects: 100% (4230/4230), done.\u001b[K\n",
+ "remote: Total 9025 (delta 4692), reused 8969 (delta 4650), pack-reused 0 (from 0)\u001b[K\n",
+ "Receiving objects: 100% (9025/9025), 33.87 MiB | 55.32 MiB/s, done.\n",
+ "Resolving deltas: 100% (4692/4692), done.\n"
+ ]
+ }
+ ],
+ "source": [
+ "!git clone https://github.com/acanaveras/autonomous_5g_slicing_lab.git\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7eb5c629-44da-4d33-97d0-40717c65c6a6",
+ "metadata": {},
+ "source": [
+ "Insert your API Key in the next cell to get it stored for the application"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "fffa0783-c270-4ed6-9b4b-1f5040341f4f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdin",
+ "output_type": "stream",
+ "text": [
+ "Enter your API Key: ········\n"
+ ]
+ },
+ {
+ "ename": "FileNotFoundError",
+ "evalue": "[Errno 2] No such file or directory: '/autonomous_5g_slicing_lab/agentic-llm/config.yaml'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[2], line 25\u001b[0m\n\u001b[1;32m 22\u001b[0m config[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAPI_KEY\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m api_key\n\u001b[1;32m 24\u001b[0m \u001b[38;5;66;03m# Write the updated configuration back to the YAML file\u001b[39;00m\n\u001b[0;32m---> 25\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43myaml_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mw\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m file:\n\u001b[1;32m 26\u001b[0m yaml\u001b[38;5;241m.\u001b[39msafe_dump(config, file)\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m✅ API Key successfully saved to config.yaml\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
+ "File \u001b[0;32m/usr/local/lib/python3.10/dist-packages/IPython/core/interactiveshell.py:324\u001b[0m, in \u001b[0;36m_modified_open\u001b[0;34m(file, *args, **kwargs)\u001b[0m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m {\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m}:\n\u001b[1;32m 318\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 319\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIPython won\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt let you open fd=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfile\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m by default \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 320\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mas it is likely to crash IPython. If you know what you are doing, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124myou can use builtins\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m open.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 322\u001b[0m )\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mio_open\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
+ "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/autonomous_5g_slicing_lab/agentic-llm/config.yaml'"
+ ]
+ }
+ ],
+ "source": [
+ "import yaml\n",
+ "from getpass import getpass\n",
+ "from pathlib import Path\n",
+ "\n",
+ "# Prompt for API Key securely (input not shown)\n",
+ "api_key = getpass(\"Enter your API Key: \")\n",
+ "\n",
+ "# Define the path to the YAML file\n",
+ "yaml_path = Path(\"./autonomous_5g_slicing_lab/agentic-llm/config.yaml\")\n",
+ "\n",
+ "# Read existing YAML if it exists, otherwise start fresh\n",
+ "if yaml_path.exists():\n",
+ " with open(yaml_path, 'r') as file:\n",
+ " try:\n",
+ " config = yaml.safe_load(file) or {}\n",
+ " except yaml.YAMLError:\n",
+ " config = {}\n",
+ "else:\n",
+ " config = {}\n",
+ "\n",
+ "# Insert or update the API_KEY\n",
+ "config['API_KEY'] = api_key\n",
+ "\n",
+ "# Write the updated configuration back to the YAML file\n",
+ "with open(yaml_path, 'w') as file:\n",
+ " yaml.safe_dump(config, file)\n",
+ "\n",
+ "print(\"✅ API Key successfully saved to config.yaml\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a77a79b9-644e-4b4f-b781-ea6810a99980",
+ "metadata": {},
+ "source": [
+ "### Agentic LLMs for 5G Section\n",
+ "\n",
+ "Once you have the **5G Lab GitHub** repository cloned, you can proceed to the **Agentic LLMs** section. This part of the lab demonstrates how to deploy an agentic workflow to monitor network performance and dynamically adjust bandwidth allocation.\n",
+ "\n",
+ "- **Part A – Setup of 5G Lab environment** \n",
+ " Located at: `./autonomous5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Setup.ipynb` \n",
+ " Provides instructions to set up a 5G Network Software Stack in your environemnt.\n",
+ "\n",
+ "- **Part B – 5G Network Agent Workflow** \n",
+ " Located at: `./autonomous5g_slicing_lab/agentic-llm/agentic_pipeline_DLI.ipynb` \n",
+ " Explains the agentic pipeline in **LangGraph** for managing 5G network slicing and bandwidth allocation.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/community/autonomous_5g_slicing_lab/README.md b/community/autonomous_5g_slicing_lab/README.md
new file mode 100644
index 00000000..fc6eae13
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/README.md
@@ -0,0 +1,93 @@
+# 5G Network Simulator Lab with Agentic Workflow
+
+This repository contains Jupyter notebooks to set up and run an open-source 5G Network Simulator lab, coupled with an Agentic Generative AI solution for dynamic bandwidth allocation. The lab uses Open Air Interface (OAI) for the 5G Core and RAN, FlexRIC for slice management, and iPerf for traffic generation, with performance data logged in a Kinetica database. The agentic workflow, powered by a LangGraph agent, analyzes traffic data and optimizes bandwidth allocation.
+
+## Overview
+
+The repository is organized into two main tasks:
+1. **Lab Setup**: Configures a 5G network simulation environment with a core network, gNodeB, two User Equipment (UE) simulators, and traffic generation tools.
+2. **Agentic Workflow**: Runs a LangGraph-based UI to monitor network performance and adjust bandwidth allocation dynamically.
+
+A shutdown notebook is also provided to reinitialize the lab if needed.
+
+## Prerequisites
+
+To run the lab, ensure you have:
+- **Operating System**: Ubuntu (tested on 20.04 or later).
+- **Hardware**: A machine with sufficient resources (e.g., 8GB RAM, multi-core CPU, optional GPU for Kinetica).
+- **Software**:
+ - Docker and Docker Compose for the 5G Core Network.
+ - Python 3.10+ with Jupyter Notebook.
+ - iPerf3 (`sudo apt install -y iperf3`).
+ - Kinetica database access (credentials in `.env` file).
+- **Dependencies**: Listed in `requirements.txt` in the respective directories.
+- **Repository Contents**: Clone this repository and verify the presence of all files, including configuration files (`ran-conf/`), scripts (`build_ric_oai_ne.sh`, `multi_ue.sh`, `change_rc_slice.sh`), and Docker Compose files.
+
+## Lab Setup
+
+The lab setup configures a fully functional 5G network simulation environment. To set up the lab, run the Jupyter notebook located at `autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Setup.ipynb`. The notebook automates the following steps:
+
+1. **Install Dependencies**: Installs iPerf3 and Python packages required for the lab, then restarts the Jupyter kernel to apply changes.
+2. **Compile FlexRIC and gNodeB**: Builds the FlexRIC and gNodeB components using a provided script, preparing the RAN Intelligent Controller and base station software.
+3. **Set Up 5G Core Network**: Launches the 5G Core Network functions for two network slices using Docker Compose, ensuring each slice has its own Session Management Function (SMF) and User Plane Function (UPF).
+4. **Start FlexRIC**: Activates the FlexRIC to manage gNodeB parameters dynamically, logging output for troubleshooting.
+5. **Start gNodeB**: Runs the OAI softmodem to simulate the gNodeB, connecting it to the core network and FlexRIC.
+6. **Initialize Bandwidth Allocation**: Sets an initial 50/50 bandwidth split between the two slices, ensuring balanced resource allocation.
+7. **Start User Equipment (UEs)**: Launches two UE simulators (UE1 and UE3), each connected to a separate slice, to interact with the gNodeB.
+8. **Start iPerf Server**: Runs two iPerf3 servers on the external network to receive traffic from the UEs via the UPF.
+9. **Generate Traffic and Log Data**: Runs iPerf clients on the UEs to generate UDP traffic at alternating speeds (30 Mbps and 120 Mbps), logging performance metrics (e.g., bitrate, packet loss) to a Kinetica database and local log files.
+
+To execute these steps, open `autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Setup.ipynb` in Jupyter Notebook and run the cells sequentially. Monitor the logs in the `logs/` directory (e.g., `tail -f logs/UE1_iperfc.log`) for real-time feedback.
+
+## Running the Agentic Workflow
+
+Once the lab is set up, you can run the agentic workflow to monitor network performance and dynamically adjust bandwidth allocation. The workflow uses a LangGraph-based agent to analyze Kinetica database logs and optimize slice configurations.
+
+To run the agentic workflow:
+1. Open the Jupyter notebook at `autonomous_5g_slicing_lab/agentic-llm/agentic_pipeline-DLI.ipynb` in Jupyter Notebook.
+2. Execute the cells to launch the LangGraph agent UI. The UI interacts with the 5G network simulator, retrieves performance data from the Kinetica database, and issues commands to FlexRIC to adjust bandwidth allocation based on traffic demands.
+
+Ensure the lab setup (`DLI_Lab_Setup.ipynb`) is fully running before starting the agentic workflow, as it relies on the active 5G network simulation and traffic generation.
+
+## Reinitializing the Lab
+
+If you need to reset or reinitialize the lab (e.g., to clear logs, stop processes, or restart the environment), use the shutdown notebook:
+- Open `autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Shutdown.ipynb` in Jupyter Notebook.
+- Run the cells to gracefully stop all running processes (e.g., FlexRIC, gNodeB, UEs, iPerf servers) and clean up resources.
+
+After running the shutdown notebook, you can restart the lab by re-running `DLI_Lab_Setup.ipynb`.
+
+## Usage Notes
+
+- **Execution Order**: Complete the lab setup before running the agentic workflow. The shutdown notebook can be used at any time to reset the environment.
+- **Monitoring**: Check logs in `autonomous_5g_slicing_lab/llm-slicing-5g-lab/logs/` for debugging (e.g., `RIC.log`, `UE1.log`, `UE1_iperfc.log`).
+- **Kinetica Access**: Use the credentials in `autonomous_5g_slicing_lab/llm-slicing-5g-lab/.env` (e.g., `KINETICA_USERNAME=nvidia_gtc_2025`, `KINETICA_PASSWORD=Kinetica123!`) to access the Kinetica database at `https://demo72.kinetica.com/gadmin/`.
+- **Network Configuration**: The notebooks assume specific IP addresses (e.g., `12.1.1.2`, `192.168.70.135`). Modify these in the notebooks if your setup differs.
+- **Environment**: The lab is designed for a controlled DLI environment. For personal machines, ensure all dependencies and the full repository directory are available.
+
+## Repository Structure
+
+- `autonomous_5g_slicing_lab/llm-slicing-5g-lab/`:
+ - `DLI_Lab_Setup.ipynb`: Notebook for setting up the 5G network simulator.
+ - `DLI_Lab_Shutdown.ipynb`: Notebook for reinitializing the lab.
+ - `requirements.txt`: Python dependencies for the lab.
+ - `build_ric_oai_ne.sh`: Script to compile FlexRIC and gNodeB.
+ - `docker-compose-oai-cn-slice1.yaml`, `docker-compose-oai-cn-slice2.yaml`: Docker Compose files for 5G Core Network slices.
+ - `ran-conf/`: Configuration files for gNodeB and UEs.
+ - `multi_ue.sh`: Script to start UE simulators.
+ - `change_rc_slice.sh`: Script to adjust bandwidth allocation.
+ - `.env`: Environment variables (e.g., Kinetica credentials).
+ - `logs/`: Directory for log files (created during execution).
+- `autonomous_5g_slicing_lab/agentic-llm/`:
+ - `agentic_pipeline-DLI.ipynb`: Notebook for running the LangGraph agent UI.
+ - `requirements.txt`: Python dependencies for the agentic workflow.
+
+## References
+
+- [Open Air Interface 5G Core Network](https://openairinterface.org/oai-5g-core-network-project/)
+- [OAI Softmodem RAN](https://github.com/simula/openairinterface5g/blob/dreibh/simulamet-testbed/doc/RUNMODEM.md)
+- [iPerf Tool](https://iperf.fr/)
+- [Kinetica Database](https://www.kinetica.com/)
+- [LangGraph](https://github.com/langchain-ai/langgraph)
+
+For issues or contributions, please open a GitHub issue or submit a pull request.
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/agentic_pipeline-DLI.ipynb b/community/autonomous_5g_slicing_lab/agentic-llm/agentic_pipeline-DLI.ipynb
new file mode 100644
index 00000000..efd3bbfe
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/agentic-llm/agentic_pipeline-DLI.ipynb
@@ -0,0 +1,225 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 5G Network Configuration Agent\n",
+ "\n",
+ "### Overview \n",
+ "This notebook outlines how the 5G network configuration works—how it detects SDU buffer full errors and reconfigures the network. We will use concepts demonstrated in [intro_agents.ipynb](intro_agents.ipynb) to build this agent using LangGraph and LangChain.\n",
+ "\n",
+ "### Table of Contents\n",
+ "1. Architecture Overview\n",
+ "2. File Descriptions\n",
+ "3. Define and run the Agent\n",
+ "4. Streamlit UI implementation\n",
+ "\n",
+ "### 1. Architecture Overview\n",
+ "\n",
+ " \n",
+ "\n",
+ "#### Key Components: \n",
+ "\n",
+ "**Agents**:\n",
+ "1. **Monitoring Agent**: \n",
+ " - Continuously reads gNodeB logs from `../llm-slicing-5g-lab/logs/gNodeB.log`. \n",
+ " - Analyzes each chunk for SDU buffer full errors. \n",
+ " - Routes to the Configuration Agent if an error is detected. \n",
+ "\n",
+ "2. **Configuration Agent**: \n",
+ " - Called when an error is detected in the gNodeB logs. \n",
+ " - Has two tools bound to it: `get_packet_loss` and `reconfigure_network`. \n",
+ " - First, retrieves the latest packet loss logs from the database using the `get_packet_loss` tool. \n",
+ " - Analyzes the logs and determines which UE needs more bandwidth. Based on this, it assigns higher bandwidth to the selected UE. \n",
+ " - Calls the `reconfigure_network` tool to use xAPP and reconfigure the network. \n",
+ " - Returns control to the Monitoring Agent to continue monitoring. \n",
+ "\n",
+ "**Tools**:\n",
+ "1. **`get_packet_loss`**: Queries the database and retrieves a DataFrame containing per-UE packet loss statistics. \n",
+ "2. **`reconfigure_network`**: Calls the xAPP with optimized slicing parameters to adjust network configurations. \n",
+ "\n",
+ "#### Example Error Logs \n",
+ "\n",
+ "```md\n",
+ "[RLC] /home/nvidia/llm-slicing-5g-lab/openairinterface5g/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c:1769:nr_rlc_entity_am_recv_sdu: warning: 195 SDU rejected, SDU buffer full\n",
+ " [NR_MAC] Frame.Slot 896.0\n",
+ " UE RNTI c1f9 CU-UE-ID 1 in-sync PH 0 dB PCMAX 0 dBm, average RSRP -44 (16 meas)\n",
+ " UE c1f9: UL-RI 1, TPMI 0\n",
+ " UE c1f9: dlsch_rounds 23415/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00000 MCS (0) 28\n",
+ " UE c1f9: ulsch_rounds 8560/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 9\n",
+ " UE c1f9: MAC: TX 177738642 RX 612401 bytes\n",
+ " UE c1f9: LCID 1: TX 1022 RX 325 bytes\n",
+ "```\n",
+ " \n",
+ "### 2. Files to Refer \n",
+ "\n",
+ "- **[agents.py](./agents.py)** – Contains code for Monitoring and Configuration Agents. \n",
+ "- **[tools.py](./tools.py)** – Implements the tools used by the agents. \n",
+ "- **[langgraph_agent.py](./langgraph_agent.py)** – Defines the LangGraph agent workflow. \n",
+ "- **[chatbot_DLI.py](./chatbot_DLI.py)** – Implementation for the Streamlit UI. \n",
+ "\n",
+ "\n",
+ "#### Expected Output \n",
+ "\n",
+ "By the end of this notebook, you will have: \n",
+ "- A functional LangGraph workflow connected to the 5g slicing lab, that detects network issues and triggers reconfiguration. \n",
+ "- A pipeline capable of analyzing logs, querying packet loss data, and adjusting slicing parameters dynamically. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Creating a LangGraph Workflow "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We have defined two agents—the **Monitoring Agent** and the **Configuration Agent**—as combinations of a model and the tool(s) they have access to. This is achieved using LangGraph's `create_react_agent()` function, which creates an agent that employs ReAct prompting.\n",
+ "\n",
+ "**States in Graph** \n",
+ " - A state represents the evolving context of execution, maintaining data across multiple steps. \n",
+ " - It stores intermediate results, tool outputs, and agent decisions. \n",
+ " - States enable reasoning over past interactions, ensuring continuity in the workflow. \n",
+ "\n",
+ "**Nodes and Edges in LangGraph** \n",
+ " - **Nodes** represent agents, tool calls, or decision steps in the workflow. \n",
+ " - **Edges** define the flow between nodes, determining execution order based on conditions. \n",
+ " - This structure allows dynamic decision-making and parallel execution where needed. \n",
+ "\n",
+ "Refer [this](https://langchain-ai.github.io/langgraph/concepts/low_level/) for more information.\n",
+ "\n",
+ "The workflow has been defined in [langgraph_agent.py](langgraph_agent.py), please refer it for implementation details. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Running the Streamlit User Interface\n",
+ "\n",
+ "We provide a predefined Streamlit-based user interface for monitoring the system in real time. This interface allows users to interact with the monitoring software efficiently and gain insights into its operation.\n",
+ "\n",
+ "#### About Streamlit:\n",
+ "[Streamlit](https://streamlit.io/) is a lightweight Python framework for building interactive web applications with minimal effort. It enables users to create and deploy data-driven dashboards and tools using simple Python scripts.\n",
+ "\n",
+ "#### Features of the UI:\n",
+ "- Real-time Log Monitoring – View live logs generated by the agent.\n",
+ "- Packet Loss Visualization – Monitor real-time packet loss of UE1 and UE2 using dynamic charts.\n",
+ "- Agent Control – Start and stop the agent directly through the UI."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "var url = 'http://'+window.location.host+'/dashboard';\n",
+ "element.innerHTML = '< Link To Streamlit Frontend >
';\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%%js\n",
+ "var url = 'http://'+window.location.host+'/dashboard';\n",
+ "element.innerHTML = '< Link To Streamlit Frontend >
';"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Collecting usage statistics. To deactivate, set browser.gatherUsageStats to false.\n",
+ "\u001b[0m\n",
+ "\u001b[0m\n",
+ "\u001b[34m\u001b[1m You can now view your Streamlit app in your browser.\u001b[0m\n",
+ "\u001b[0m\n",
+ "\u001b[34m Local URL: \u001b[0m\u001b[1mhttp://localhost:8501\u001b[0m\n",
+ "\u001b[34m Network URL: \u001b[0m\u001b[1mhttp://172.27.19.176:8501\u001b[0m\n",
+ "\u001b[34m External URL: \u001b[0m\u001b[1mhttp://204.52.26.81:8501\u001b[0m\n",
+ "\u001b[0m\n"
+ ]
+ }
+ ],
+ "source": [
+ "!~/.local/bin/streamlit run chatbot_DLI.py --server.enableCORS=false --server.enableXsrfProtection=false"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Running Langgraph Agent"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The streamlit UI calls langgraph_agent.py in the background. The agent logs its outputs to agent.log, which are in turn displayed on the UI. You may run the script to see how the agent works. Log files are written to in the `/llm-slicing-5g-lab/logs` directory. Run the following commands in separate terminals to stream logs for agent, UE1 and UE2 respectively.\n",
+ "\n",
+ "```sh\n",
+ "tail -f /llm-slicing-5g-lab/logs/agent.log\n",
+ "tail -f /llm-slicing-5g-lab/logs/UE2_iperfc.log\n",
+ "tail -f /llm-slicing-5g-lab/logs/UE1_iperfc.log\n",
+ "```\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!python3 langgraph_agent.py"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/agents.py b/community/autonomous_5g_slicing_lab/agentic-llm/agents.py
new file mode 100644
index 00000000..e1ee267b
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/agentic-llm/agents.py
@@ -0,0 +1,206 @@
+import os
+import random
+import time
+import yaml
+from typing import TypedDict, Optional
+from langchain_core.messages import HumanMessage, SystemMessage
+from langchain_nvidia_ai_endpoints import ChatNVIDIA
+from langgraph.graph import StateGraph, MessagesState
+from langgraph.prebuilt import create_react_agent
+from tools import reconfigure_network, get_packetloss_logs
+import logging
+
+# Configure the logger without timestamp and level tags
+config_file = yaml.safe_load(open('config.yaml', 'r'))
+
+logging.basicConfig(
+ filename= config_file['AGENT_LOG_FILE'], # Log file name
+ level=logging.INFO, # Log level
+ format="%(message)s" # Only log the message
+)
+
+#llm api to use Nvidia NIM Inference Endpoints.
+llm = ChatNVIDIA(
+ model= config_file['model_name'],
+ api_key= config_file['API_KEY'],
+ temperature=0.2,
+ top_p=0.7,
+ max_tokens=4096,
+)
+
+#State class for communication between agents
+class State(TypedDict):
+ start: Optional[int] = None #pointer to start reading from gnodeB.log
+ messages: Optional[str] = None
+ agent_id: Optional[str] = None #useful for routing between agents
+ files: Optional[dict] = None #pass error logs from Monitoring Agent to COnfiguration Agent
+ consent: Optional[str] = None
+ config_value: Optional[list] = None #keep a track of slice values
+ count: Optional[int] = None
+
+def MonitoringAgent(state: State):
+ response = "This is a Monitoring agent, monitoring logs for SDU buffer full error."
+ logging.info(response)
+ filename = config_file['gnb_logs']
+ chunk_size = 1000
+ start_val = state['start'] #Always start parsing logs from end of file to analayze the most recent logs
+
+ #Keep reading the gnodeB logs file for chunks till an error is detected.
+ with open(filename, 'r') as file:
+ while True:
+ file_size = os.path.getsize(filename)
+ #Wait till there are substantial logs
+ if (start_val + chunk_size) >= file_size:
+ #print("Waiting for logs\n")
+ logging.info("Waiting for logs \n")
+ time.sleep(2)
+ continue
+ file.seek(start_val)
+ chunk = file.read(chunk_size)
+
+ if chunk:
+ start_val += len(chunk)
+ prompt0 = f"""Hello, you are a Network Monitoring agent. You will be provided with a random chunk of text. Your task is to classify logs with "buffer full" errors:
+ If it has a "buffer full" error just reply "yes". If it does not have a "buffer full" error reply "no". DO NOT provide explanation.
+ Example of Log that HAS a "buffer full" error:
+
+ [RLC] /home/nvidia/llm-slicing-5g-lab/openairinterface5g/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c:1769:nr_rlc_entity_am_recv_sdu: warning: 195 SDU rejected, SDU buffer full
+ [NR_MAC] Frame.Slot 896.0
+ UE RNTI c1f9 CU-UE-ID 1 in-sync PH 0 dB PCMAX 0 dBm, average RSRP -44 (16 meas)
+ UE c1f9: UL-RI 1, TPMI 0
+ UE c1f9: dlsch_rounds 23415/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00000 MCS (0) 28
+ UE c1f9: ulsch_rounds 8560/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 9
+ UE c1f9: MAC: TX 177738642 RX 612401 bytes
+ UE c1f9: LCID 1: TX 1022 RX 325 bytes
+
+ Example of Log that does NOT have a "buffer full" error:
+
+ [NR_MAC] Frame.Slot 896.0
+ UE RNTI c1f9 CU-UE-ID 1 in-sync PH 0 dB PCMAX 0 dBm, average RSRP -44 (16 meas)
+ UE c1f9: UL-RI 1, TPMI 0
+ UE c1f9: dlsch_rounds 56771/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00000 MCS (0) 9
+ UE c1f9: ulsch_rounds 16844/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 9
+ UE c1f9: MAC: TX 480086220 RX 941362 bytes
+ UE c1f9: LCID 1: TX 1022 RX 325 bytes
+
+ Logs to analyze:
+ {chunk}
+ """
+ human_message0 = HumanMessage(content=prompt0)
+ response0 = llm.invoke([human_message0])
+ cleaned_content0 = response0.content
+ logging.info("Response from Monitoring agent: Error Detected? %s\n", cleaned_content0)
+ if cleaned_content0=='yes':
+ break
+ else:
+ continue
+ return {"messages":response, "start": start_val, "files":{"chunk": chunk} }
+
+system_promt = 'You are a Configuration agent in a LangGraph. Your task is to help an user reconfigure a current 5G network. You must reply to the questions asked concisely, and exactly in the format directed to you.'
+config_agent = create_react_agent(llm, tools=[reconfigure_network, get_packetloss_logs], prompt = system_promt)
+def ConfigurationAgent(state: State):
+ response = "This is a Configuration Agent, whose goal is to reconfigure the network to solve the SDU buffer full error."
+ logging.info(response)
+ logging.info("Error detected in logs: \n %s \n\n", state['files']['chunk'])
+ prompt_0 = '''
+ Your task is to determine which UE needs reconfiguration. Follow these steps exactly:
+
+ 1. Call the get_packetloss_logs tool to get packet loss logs.
+ Action: get_packetloss_logs()
+
+ 2. Analyze the results:
+ - Identify which UE (UE1 or UE3) has a higher packet loss, depending on lost_packets,loss_percentage and UE.
+ - State which UE you've identified as needing reconfiguration.
+ If UE1 requires reconfiguration, just reply "UE1". If UE3 requires reconfiguration, just reply "UE3". DO NOT provide explanation.
+ '''
+ human_message = HumanMessage(content=prompt_0)
+ response = config_agent.invoke({"messages":[human_message]})
+ cleaned_content0 = response['messages'][-1].content
+
+ prompt_1 = f'''
+
+ Your task is to reconfigure the network using the `reconfigure_network` tool. The tool accepts the following parameters:
+ 1. `UE` = UE (UE1 or UE2) which requires reconfiguration
+ 2. `value_1_old` = Old value 1 of configs
+ 3. `value_2_old` = Old value 2 of configs
+
+ Here is the input:
+ - `UE` = {cleaned_content0}
+ - `value_1_old` = {state['config_value'][0]}
+ - `value_2_old` = {state['config_value'][1]}
+
+ Use the tool to reconfigure the network. Return **only** the tool response list as the output.'''
+
+ human_message2 = HumanMessage(content=prompt_1)
+ response2 = config_agent.invoke({"messages":[human_message2]})
+ config_value_updated = response2['messages'][-2].content
+ config_value_updated = config_value_updated.strip("[]").replace("'", "").split(", ")
+ count = state['count']
+ count += 1
+
+ #start monitoring from the end
+ start = os.path.getsize(config_file['gnb_logs'])
+
+ #take in human input
+ consent = 'yes'
+ if count >= config_file['interrupt_after']:
+ consent = input("Do you want to continue Monitoring? (yes/no)")
+ return {"messages":response, "agent_id": "Configuration Agent", "start": start, 'config_value':config_value_updated, 'count': count, 'consent': consent}
+
+"""
+**Exercise**
+We saw how to run the configuration agent with 2 LLM calls to the agent. Can we use the create_react_agent to execute both tool calls with a single prompt?
+TO DO:
+Replace the below configuration agent to find out!
+
+def ConfigurationAgent(state: State):
+ response = "This is a Configuration Agent, whose goal is to reconfigure the network to solve the SDU buffer full error."
+ logging.info(response)
+ logging.info("Error detected in logs: \n %s \n\n", state['files']['chunk'])
+ #test:
+ combined_prompt = f'''
+ You are a network reconfiguration agent specializing in UE reconfiguration. Your task is to identify and reconfigure problematic UE equipment. Follow these steps exactly:
+
+ 1. **Get logs**:
+ - Call `get_packetloss_logs` to retrieve network performance data
+ Action: get_packetloss_logs()
+
+ 2. **Analysis**:
+ - Identify which UE (UE1 or UE2) shows higher packet loss using these metrics:
+ * Total lost_packets
+ * loss_percentage
+ * UE identifier
+ - Store your conclusion as "target_UE"
+
+ 3. **Reconfiguration**:
+ - Use `reconfigure_network` with parameters:
+ 1. UE = target_UE
+ 2. value_1_old = {state['config_value'][0]}
+ 3. value_2_old = {state['config_value'][1]}
+ Action: reconfigure_network(UE=target_UE, value_1_old={state['config_value'][0]}, value_2_old={state['config_value'][1]})
+
+ 4. **Output**:
+ - Return **only** the final tool response from `reconfigure_network`
+ - No explanations or additional text
+ '''
+ config_agent = create_react_agent(llm, tools=[reconfigure_network, get_packetloss_logs], prompt=combined_prompt)
+ time.sleep(2)
+ human_message2 = HumanMessage(content="Please reconfigure the network")
+ response2 = config_agent.invoke({"messages":[human_message2]})
+
+ config_value_updated = response2['messages'][-2].content
+ config_value_updated = config_value_updated.strip("[]").replace("'", "").split(", ")
+ count = state['count']
+ count += 1
+
+ #start monitoring from the end
+ start = os.path.getsize(state['logs_filename'])
+
+ #take in human input
+ consent = 'yes'
+ if count >= config_file['interrupt_after']:
+ consent = input("Do you want to continue Monitoring? (yes/no)")
+ return {"messages":response, "agent_id": "Configuration Agent", "start": start, 'config_value':config_value_updated, 'count': count, 'consent': consent}
+
+
+"""
\ No newline at end of file
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/chatbot_DLI.py b/community/autonomous_5g_slicing_lab/agentic-llm/chatbot_DLI.py
new file mode 100644
index 00000000..2f9acf86
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/agentic-llm/chatbot_DLI.py
@@ -0,0 +1,302 @@
+#Streamlit User Interface for visualizing the 5G Network Agent
+import streamlit as st
+import pandas as pd
+import time
+import re
+import matplotlib.pyplot as plt
+import numpy as np
+import time
+import streamlit as st
+from watchdog.observers import Observer
+from watchdog.events import FileSystemEventHandler
+from matplotlib.ticker import FuncFormatter
+import subprocess
+import os
+import signal
+import yaml
+from gpudb import GPUdb
+from dotenv import load_dotenv
+import json
+import logging
+import colorlog
+
+
+# Configure colored logging.
+handler = colorlog.StreamHandler()
+handler.setFormatter(colorlog.ColoredFormatter(
+ fmt="%(log_color)s%(asctime)s %(levelname)s: %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+ log_colors={
+ 'DEBUG': 'blue',
+ 'INFO': 'green',
+ 'WARNING': 'yellow',
+ 'ERROR': 'red',
+ 'CRITICAL': 'red,bg_white',
+ }
+))
+logger = colorlog.getLogger(__name__)
+logger.addHandler(handler)
+logger.setLevel(logging.INFO)
+logger.propagate = False
+
+# Configuration: Paths for both log files
+config_file = yaml.safe_load(open('config.yaml', 'r'))
+AGENT_LOG_FILE = config_file['AGENT_LOG_FILE']
+os.makedirs(os.path.dirname(AGENT_LOG_FILE), exist_ok=True)
+
+# Create the file if it doesn't exist
+if not os.path.exists(AGENT_LOG_FILE):
+ with open(AGENT_LOG_FILE, "w") as file:
+ pass
+
+WINDOW_SIZE_SECONDS = 60
+process = None
+logs = []
+
+load_dotenv("../llm-slicing-5g-lab/.env")
+kdbc_options = GPUdb.Options()
+kdbc_options.username = os.environ.get("KINETICA_USERNAME")
+kdbc_options.password = os.environ.get("KINETICA_PASSWORD")
+kdbc_options.disable_auto_discovery = True
+kdbc: GPUdb = GPUdb(
+ host=os.environ.get("KINETICA_HOST"),
+ options=kdbc_options
+)
+
+def generate_sql_query(ue:str):
+ load_dotenv("../llm-slicing-5g-lab/.env")
+ return f"""
+ SELECT
+ "timestamp",
+ "loss_percentage",
+ "bitrate"
+ FROM
+ {os.environ.get("IPERF3_RANDOM_TABLE_NAME")}
+ WHERE
+ "ue"='{ue}' AND "timestamp" >= current_datetime() - INTERVAL {WINDOW_SIZE_SECONDS} SECONDS
+ ORDER BY
+ "timestamp" DESC
+ """
+
+# Initialize session state for persistent data storage
+if "data_ue1" not in st.session_state:
+ st.session_state.data_ue1 = pd.DataFrame()
+if "data_ue2" not in st.session_state:
+ st.session_state.data_ue2 = pd.DataFrame()
+
+#Class for streaming Agent logs to UI
+class LogFileHandler(FileSystemEventHandler):
+ def __init__(self, callback):
+ self.callback = callback
+
+ def on_modified(self, event):
+ if event.src_path == AGENT_LOG_FILE:
+ self.callback()
+
+def tail_logs():
+ """
+ Generator function that yields new log lines from Agent_logs (all lines that appeared
+ since the last iteration) so we do not artificially delay reading them.
+ """
+ with open(AGENT_LOG_FILE, 'r') as file:
+ # Move to the end of file
+ file.seek(0, 2)
+
+ while True:
+ current_position = file.tell()
+ lines = file.readlines()
+ yield lines
+
+def start():
+ #Start Agent
+ process = subprocess.Popen(['python3', 'langgraph_agent.py'])
+
+ # Read stdout and stderr line by line
+ # for line in process.stdout:
+ # logger.info(line.strip()) # Log stdout
+
+ # for line in process.stderr:
+ # logger.error(line.strip()) # Log stderr
+
+def stop():
+ if process is not None:
+ st.session_state.data_ue1 = None
+ st.session_state.data_ue2 = None
+ os.kill(process.pid, signal.SIGTERM)
+
+def get_cutoff_time() -> str:
+ current_time = pd.Timestamp.utcnow().tz_convert("UTC")
+ return (current_time - pd.Timedelta(seconds=WINDOW_SIZE_SECONDS))
+
+def create_plot():
+ plt.close("all")
+ plt.style.use("dark_background")
+ fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(4,4))
+ ax1.set_title("User Equipment 1", fontsize=8, color="white")
+ ax1.grid(True, linestyle="--", linewidth=0.5, color="gray")
+ ax1.set_ylim(0, 100)
+ ax1.tick_params(axis="y", colors="#FFD700", labelsize=5)
+ ax1.tick_params(axis="x", colors="#FFD700", labelsize=5)
+
+ ax1_twin = ax1.twinx()
+ ax1_twin.set_ylim(0, 60)
+ ax1_twin.tick_params(axis="y", colors="#FF8C00", labelsize=5)
+
+ ax2.set_title("User Equipment 2", fontsize=8, color="white")
+ ax2.grid(True, linestyle="--", linewidth=0.5, color="gray")
+ ax2.set_ylim(0, 100)
+ ax2.tick_params(axis="y", colors="#FFD700", labelsize=5)
+ ax2.tick_params(axis="x", colors="#FFD700", labelsize=5)
+
+ ax2_twin = ax2.twinx()
+ ax2_twin.set_ylim(0, 60)
+ ax2_twin.tick_params(axis="y", colors="#FF8C00", labelsize=5)
+ plt.tight_layout(pad=2.0)
+
+ return fig
+
+
+st.set_page_config(page_title="Real-Time Packet Loss & Transfer Rate", layout="wide")
+st.title("5G-Network Configuration Agent")
+status_placeholder = st.empty()
+status_placeholder.text("Press the button to start monitoring!")
+
+# Set up file watcher (though we mainly rely on tail_logs)
+event_handler = LogFileHandler(lambda: None)
+observer = Observer()
+observer.schedule(event_handler, path=AGENT_LOG_FILE)
+observer.start()
+log_generator = tail_logs()
+
+col_logs, col_charts = st.columns([3, 3])
+with col_logs:
+ button_col1, button_col2 = st.columns(2)
+ with button_col1:
+ start_monitoring = st.button("Start Monitoring", key="start", use_container_width=True)
+
+ with button_col2:
+ stop_monitoring = st.button("Stop Monitoring", key="stop", use_container_width=True)
+
+ log_display = st.empty() # For log text area
+ log_display.code('', height=600)
+
+with col_charts:
+ # Create placeholders for the charts
+ chart_placeholder = st.empty()
+ fig = create_plot()
+ chart_placeholder.pyplot(fig)
+
+if start_monitoring:
+ status_placeholder.text("Monitoring in Progress")
+ start()
+ while True:
+ # Read the latest log data for UE1 and UE2
+ new_log = next(log_generator)
+ logs.extend([line.strip() for line in new_log])
+
+ #erase old logs
+ if len(logs) > 10000:
+ logs.pop(0)
+
+ # Update the display with the last 200 lines
+ log_display.code('\n'.join(logs[-200:]), height=600)
+ st.markdown("""
+
+ """, unsafe_allow_html=True)
+
+ # Fetch new data for UE1 and UE2
+ cutoff_time = get_cutoff_time()
+
+ try:
+ new_data_ue1 = kdbc.to_df(sql=generate_sql_query(ue="UE1"))
+ new_data_ue1["timestamp"] = pd.to_datetime(new_data_ue1["timestamp"]).dt.tz_localize("UTC")
+
+ if not new_data_ue1.empty:
+ st.session_state.data_ue1 = (
+ pd.concat([st.session_state.data_ue1, new_data_ue1])
+ .drop_duplicates(subset=["timestamp"])
+ .sort_values("timestamp")
+ .query("timestamp > @cutoff_time")
+ .reset_index(drop=True)
+ )
+ # Compute the cutoff time for filtering
+
+ except Exception as error:
+ logger.error(f"Error fetching UE1 data: {error}")
+
+ try:
+ new_data_ue2 = kdbc.to_df(sql=generate_sql_query(ue="UE3"))
+ new_data_ue2["timestamp"] = pd.to_datetime(new_data_ue2["timestamp"]).dt.tz_localize("UTC")
+
+ if not new_data_ue2.empty:
+ st.session_state.data_ue2 = (
+ pd.concat([st.session_state.data_ue2, new_data_ue2])
+ .drop_duplicates(subset=["timestamp"])
+ .sort_values("timestamp")
+ .query("timestamp > @cutoff_time")
+ .reset_index(drop=True)
+ )
+ except Exception as error:
+ logger.error(f"Error fetching UE2 data: {error}")
+
+ # If both datasets have data, update the charts
+ if not st.session_state.data_ue1.empty and not st.session_state.data_ue2.empty:
+ plt.close("all") # Close previous figures
+ fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(4,4)) # Two side-by-side charts
+
+ # Generate x-axis as a rolling index for left-to-right movement
+ x_axis_ue1 = st.session_state.data_ue1["timestamp"]
+ x_axis_ue2 = st.session_state.data_ue2["timestamp"]
+
+ # **User Equipment 1 Chart**
+ ax1.set_title("User Equipment 1", fontsize=8, color="white")
+ ax1.grid(True, linestyle="--", linewidth=0.5, color="gray")
+ ax1.set_ylim(0, 100) # Set y-axis range for packet loss
+
+ line1, = ax1.plot(x_axis_ue1, st.session_state.data_ue1["loss_percentage"],
+ color="#FFD700", linestyle="--", linewidth=1, label="Packet Loss (%)")
+
+ ax1.tick_params(axis="y", colors="#FFD700", labelsize=5)
+ ax1.tick_params(axis="x", colors="#FFD700", labelsize=5)
+
+ ax1_twin = ax1.twinx()
+ ax1_twin.set_ylim(0, 160) # Set y-axis range for bitrate
+ line2, = ax1_twin.plot(x_axis_ue1, st.session_state.data_ue1["bitrate"],
+ color="#FF8C00", linestyle="-", linewidth=1, label="Transfer Rate (MBytes)")
+ ax1_twin.tick_params(axis="y", colors="#FF8C00", labelsize=5)
+
+ # **User Equipment 2 Chart**
+ ax2.set_title("User Equipment 2", fontsize=8, color="white")
+ ax2.grid(True, linestyle="--", linewidth=0.5, color="gray")
+ ax2.set_ylim(0, 100) # Set y-axis range for packet loss
+
+ line3, = ax2.plot(x_axis_ue2, st.session_state.data_ue2["loss_percentage"],
+ color="#FFD700", linestyle="--", linewidth=1, label="Packet Loss (%)")
+
+ ax2.tick_params(axis="y", colors="#FFD700", labelsize=5)
+ ax2.tick_params(axis="x", colors="#FFD700", labelsize=5)
+
+ ax2_twin = ax2.twinx()
+ ax2_twin.set_ylim(0, 160) # Set y-axis range for bitrate
+ line4, = ax2_twin.plot(x_axis_ue2, st.session_state.data_ue2["bitrate"],
+ color="#FF8C00", linestyle="-", linewidth=1, label="Transfer Rate (MBytes)")
+ ax2_twin.tick_params(axis="y", colors="#FF8C00", labelsize=5)
+
+ # Add legend
+ ax1.legend(handles=[line1, line2], loc="upper right", fontsize=6, facecolor="#333", edgecolor="white")
+ ax2.legend(handles=[line3, line4], loc="upper right", fontsize=6, facecolor="#333", edgecolor="white")
+
+ plt.tight_layout(pad=2.0)
+
+ # Update the Streamlit plot
+ chart_placeholder.pyplot(fig)
+
+if stop_monitoring:
+ status_placeholder.text("Monitoring in Stopped")
+ fig = create_plot()
+ chart_placeholder.pyplot(fig)
+ stop()
\ No newline at end of file
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/config.yaml b/community/autonomous_5g_slicing_lab/agentic-llm/config.yaml
new file mode 100644
index 00000000..c8d47276
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/agentic-llm/config.yaml
@@ -0,0 +1,7 @@
+AGENT_LOG_FILE: ../llm-slicing-5g-lab/logs/agent.log
+LOG_FILE_UE1: ../llm-slicing-5g-lab/logs/UE1_iperfc.log
+LOG_FILE_UE2: ../llm-slicing-5g-lab/logs/UE2_iperfc.log
+gnb_logs: ../llm-slicing-5g-lab/logs/gNodeB.log
+interrupt_after: 30
+model_name: meta/llama-3.1-70b-instruct
+reconfig_script_path: ../llm-slicing-5g-lab/change_rc_slice.sh
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/images/architecture_diagram.jpg b/community/autonomous_5g_slicing_lab/agentic-llm/images/architecture_diagram.jpg
new file mode 100644
index 00000000..0a087aa6
Binary files /dev/null and b/community/autonomous_5g_slicing_lab/agentic-llm/images/architecture_diagram.jpg differ
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/images/langgraph_DLI.png b/community/autonomous_5g_slicing_lab/agentic-llm/images/langgraph_DLI.png
new file mode 100644
index 00000000..1e0bc108
Binary files /dev/null and b/community/autonomous_5g_slicing_lab/agentic-llm/images/langgraph_DLI.png differ
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/images/nvidia.png b/community/autonomous_5g_slicing_lab/agentic-llm/images/nvidia.png
new file mode 100644
index 00000000..74011cb3
Binary files /dev/null and b/community/autonomous_5g_slicing_lab/agentic-llm/images/nvidia.png differ
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/images/ui_ss_1.png b/community/autonomous_5g_slicing_lab/agentic-llm/images/ui_ss_1.png
new file mode 100644
index 00000000..b4c5e3d2
Binary files /dev/null and b/community/autonomous_5g_slicing_lab/agentic-llm/images/ui_ss_1.png differ
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/images/ui_ss_2.png b/community/autonomous_5g_slicing_lab/agentic-llm/images/ui_ss_2.png
new file mode 100644
index 00000000..b5e8c834
Binary files /dev/null and b/community/autonomous_5g_slicing_lab/agentic-llm/images/ui_ss_2.png differ
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/intro_agents.ipynb b/community/autonomous_5g_slicing_lab/agentic-llm/intro_agents.ipynb
new file mode 100644
index 00000000..56c803e5
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/agentic-llm/intro_agents.ipynb
@@ -0,0 +1,458 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Introduction to LLM Agents in LangGraph and LangChain\n",
+ "\n",
+ "This notebook provides an introduction to building LLM-based agents using LangGraph and LangChain. It covers the fundamental implementations required for developing agentic workflows. By the end of this notebook, you will have an understanding of the following concepts:\n",
+ "\n",
+ "1. [NVIDIA NIM Endpoints](https://build.nvidia.com/explore/discover) – Learn how to integrate and use NVIDIA NIM endpoints for efficient inference.\n",
+ "2. [Tool Calling using `bind_tools`](https://python.langchain.com/docs/modules/agents/tools/custom_tools/) – Understand how to define and bind tools within an agent.\n",
+ "3. [Agents using `create_react_agent`](https://python.langchain.com/docs/modules/agents/) – Explore the creation of ReAct (Reasoning + Acting) agents using Langgraph.\n",
+ "\n",
+ "This notebook serves as a introduction to implementing intelligent agents with modular and scalable workflows.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Set up"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import yaml\n",
+ "from langchain_nvidia_ai_endpoints import ChatNVIDIA\n",
+ "from langchain_core.tools import tool\n",
+ "from langgraph.prebuilt import create_react_agent"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Accessing Nvidia NIM endpoints"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here is a list of available models, we will be using `meta/llama-3.1-70b-instruct` for this notebook."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "tool_models = [model for model in ChatNVIDIA.get_available_models() if model.supports_tools]\n",
+ "for elem in tool_models:\n",
+ " print(elem)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We'll set up the LLM through LangChain's ChatNVIDIA functionality, which provides an interface to NVIDIA NIM chat models. It offers connection to both hosted and local NIMs (Mistral, Llama, etc.), tool calling capabilities, streaming functionality, etc. Here is an example on how to implement that"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "llm = ChatNVIDIA(\n",
+ " model= \"meta/llama-3.1-70b-instruct\",\n",
+ " temperature=0.2,\n",
+ " top_p=0.7,\n",
+ " max_tokens=4096,\n",
+ ")\n",
+ "\n",
+ "# Locally-hosted model example\n",
+ "# llm = ChatNVIDIA(base_url=\"http://3.145.171.211:8000/v1\", model_name=\"meta/llama-3.1-8b-instruct\") "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "I'm just a computer program, so I don't have feelings, but thanks for asking! How can I assist you today?\n"
+ ]
+ }
+ ],
+ "source": [
+ "result = llm.invoke(\"Hi How are you\")\n",
+ "print(result.content)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Tool calling with `.bind_tools()`"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In LangChain, [tool calling](https://python.langchain.com/docs/concepts/tool_calling/) allows LLMs to invoke external functions, APIs, or utilities dynamically, extending LLM capabilities beyond text generation. We define tools with the `@tool` decorator, and bind them to llm with `.bind_tool()` function. That tells the LLM which tools are available for using. LLM calls these functions with the proper arguments depending on the prompt it receives."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/nvidia/.local/lib/python3.10/site-packages/langchain_nvidia_ai_endpoints/chat_models.py:591: UserWarning: Model 'nvdev/meta/llama-3.1-70b-instruct' is not known to support tools. Your tool binding may fail at inference time.\n",
+ " warnings.warn(\n"
+ ]
+ }
+ ],
+ "source": [
+ "@tool\n",
+ "def multiply(a: int, b: int) -> int:\n",
+ " \"\"\"Multiply a and b and return result\n",
+ "\n",
+ " Args:\n",
+ " a: first int\n",
+ " b: second int\n",
+ " \"\"\"\n",
+ " return a*b\n",
+ "\n",
+ "llm_with_tools = llm.bind_tools([multiply])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "LLM intelligently decides where to call a tool or not depending on the prompt."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "AIMessage(content=\"Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?\", additional_kwargs={}, response_metadata={'role': 'assistant', 'content': \"Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?\", 'token_usage': {'prompt_tokens': 283, 'total_tokens': 307, 'completion_tokens': 24}, 'finish_reason': 'stop', 'model_name': 'nvdev/meta/llama-3.1-70b-instruct'}, id='run-34a9624d-e628-4af5-a5c4-f3ceafc8533a-0', usage_metadata={'input_tokens': 283, 'output_tokens': 24, 'total_tokens': 307}, role='assistant')"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "llm_with_tools.invoke(\"Hello world!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[{'name': 'multiply',\n",
+ " 'args': {'a': 56, 'b': 64},\n",
+ " 'id': 'chatcmpl-tool-fb0629aaebde42b4ba91e4d36c93a431',\n",
+ " 'type': 'tool_call'}]"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result = llm_with_tools.invoke(\"What is the multiplication of 56 and 64\")\n",
+ "result.tool_calls"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Using `.bind_tools()`, LLM tells us which tool to call, with which arguments. But it doesn't actually invoke the tool. To invoke the tool intelligently we use the `.create_react_agent()` prebuilt function from Langgraph."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Prebuilt ReAcT agent using `.create_react_agent()`"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "ReAct (Reasoning + Acting) is an agent architecture, based on this paper [ReAct: Synergizing Reasoning and Acting in Language Models](https://arxiv.org/pdf/2210.03629), that combines step-by-step reasoning with tool use. LangGraph provides a prebuilt function [create_react_agent](https://langchain-ai.github.io/langgraph/how-tos/create-react-agent/) to easily implement this architecture. It uses `.bind_tools()` under the hood to attach tools to the language model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/nvidia/.local/lib/python3.10/site-packages/langchain_nvidia_ai_endpoints/chat_models.py:591: UserWarning: Model 'nvdev/meta/llama-3.1-405b-instruct' is not known to support tools. Your tool binding may fail at inference time.\n",
+ " warnings.warn(\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Define Tool 1: Square a Number\n",
+ "@tool\n",
+ "def square(n: int) -> int:\n",
+ " \"\"\"Returns the square of a number.\"\"\"\n",
+ " return n * n\n",
+ "\n",
+ "# Define Tool 2: Multiply Two Numbers\n",
+ "@tool\n",
+ "def multiply(a: int, b: int) -> int:\n",
+ " \"\"\"Multiply two numbers.\"\"\"\n",
+ " return a * b\n",
+ "\n",
+ "\n",
+ "agent = create_react_agent(llm, [square, multiply])\n",
+ "\n",
+ "# Invoke the agent with a query that requires two tool calls\n",
+ "response = agent.invoke({\"messages\": \"What is (5 squared) multiplied by 2?\"})\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'The answer is 50.'"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "response['messages'][-1].content"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "================================\u001b[1m Human Message \u001b[0m=================================\n",
+ "\n",
+ "What is (5 squared) multiplied by 2?\n",
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
+ "Tool Calls:\n",
+ " square (chatcmpl-tool-3fbc1698aad645b7a9b1a38ebfc3c1f4)\n",
+ " Call ID: chatcmpl-tool-3fbc1698aad645b7a9b1a38ebfc3c1f4\n",
+ " Args:\n",
+ " n: 5\n",
+ "=================================\u001b[1m Tool Message \u001b[0m=================================\n",
+ "Name: square\n",
+ "\n",
+ "25\n",
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
+ "Tool Calls:\n",
+ " multiply (chatcmpl-tool-557233293c6c4011a6d54fcfd2633d88)\n",
+ " Call ID: chatcmpl-tool-557233293c6c4011a6d54fcfd2633d88\n",
+ " Args:\n",
+ " a: 25\n",
+ " b: 2\n",
+ "=================================\u001b[1m Tool Message \u001b[0m=================================\n",
+ "Name: multiply\n",
+ "\n",
+ "50\n",
+ "==================================\u001b[1m Ai Message \u001b[0m==================================\n",
+ "\n",
+ "The answer is 50.\n"
+ ]
+ }
+ ],
+ "source": [
+ "for m in response['messages']:\n",
+ " m.pretty_print()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now that you are familiar with the basics of building agents, we will explore how to build a 5G network reconfiguration agent. Please refer to [agentic_pipeline-DLI.ipynb](agentic_pipeline-DLI.ipynb) for more details."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from typing import Literal\n",
+ "from pydantic import BaseModel, Field"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/nvidia/.local/lib/python3.10/site-packages/langchain_nvidia_ai_endpoints/chat_models.py:591: UserWarning: Model 'nvdev/meta/llama-3.1-70b-instruct' is not known to support tools. Your tool binding may fail at inference time.\n",
+ " warnings.warn(\n"
+ ]
+ }
+ ],
+ "source": [
+ "model = llm\n",
+ "# For this tutorial we will use custom tool that returns pre-defined values for weather in two cities (NYC & SF)\n",
+ "@tool\n",
+ "def get_weather(city: Literal[\"nyc\", \"sf\"]):\n",
+ " \"\"\"Use this to get weather information.\"\"\"\n",
+ " if city == \"nyc\":\n",
+ " return \"It might be cloudy in nyc\"\n",
+ " elif city == \"sf\":\n",
+ " return \"It's always sunny in sf\"\n",
+ " else:\n",
+ " raise AssertionError(\"Unknown city\")\n",
+ "\n",
+ "\n",
+ "tools = [get_weather]\n",
+ "\n",
+ "\n",
+ "class WeatherResponse(BaseModel):\n",
+ " \"\"\"Respond to the user in this format.\"\"\"\n",
+ "\n",
+ " conditions: str = Field(description=\"Weather conditions\")\n",
+ "\n",
+ "\n",
+ "# Define the graph\n",
+ "\n",
+ "from langgraph.prebuilt import create_react_agent\n",
+ "\n",
+ "graph = create_react_agent(\n",
+ " model,\n",
+ " tools=tools,\n",
+ " # specify the schema for the structured output using `response_format` parameter\n",
+ " response_format=WeatherResponse,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/nvidia/.local/lib/python3.10/site-packages/langchain_nvidia_ai_endpoints/chat_models.py:814: UserWarning: Model 'nvdev/meta/llama-3.1-70b-instruct' is not known to support structured output. Your output may fail at inference time.\n",
+ " warnings.warn(\n"
+ ]
+ }
+ ],
+ "source": [
+ "inputs = {\"messages\": [(\"user\", \"What's the weather in NYC?\")]}\n",
+ "response = graph.invoke(inputs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "WeatherResponse(conditions='Cloudy')"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "response[\"structured_response\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/langgraph_agent.py b/community/autonomous_5g_slicing_lab/agentic-llm/langgraph_agent.py
new file mode 100644
index 00000000..9bdd55f4
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/agentic-llm/langgraph_agent.py
@@ -0,0 +1,116 @@
+#script to define langgraph agent, and start the workflow
+import json
+import os
+import time
+import yaml
+from typing import Literal
+from langchain_core.messages import convert_to_messages, BaseMessage, AIMessage
+from langchain_core.runnables import RunnableConfig
+from langgraph.graph import StateGraph, MessagesState, END
+from langgraph.prebuilt import ToolNode
+from IPython.display import Image, display
+from agents import ConfigurationAgent, MonitoringAgent, State
+from langchain_nvidia_ai_endpoints import ChatNVIDIA
+import logging
+import json
+
+config_file = yaml.safe_load(open('config.yaml', 'r'))
+file_path = config_file['gnb_logs']
+os.makedirs(os.path.dirname(config_file['AGENT_LOG_FILE']), exist_ok=True)
+
+# Create the file if it doesn't exist
+if not os.path.exists(config_file['AGENT_LOG_FILE']):
+ with open(config_file['AGENT_LOG_FILE'], "w") as file:
+ pass
+
+#logger for printing output to a log file
+logging.basicConfig(
+ filename= config_file['AGENT_LOG_FILE'], # Log file name
+ level=logging.INFO, # Log level
+ format="%(message)s" # Only log the message
+)
+
+#format the output
+def pretty_print_message(update) -> str:
+ output = ""
+ if isinstance(update, tuple):
+ ns, update = update
+ # skip parent graph updates in the printouts
+ #Work on this
+ if len(ns) != 0:
+ for node_name, node_update in update.items():
+ for message in convert_to_messages(node_update["messages"]):
+ output = f"[{message.type}]: {message.content}"
+ if isinstance(message, AIMessage) and hasattr(message, 'tool_calls'):
+ tools = "\n".join(
+ f"- {tc['name']}({json.dumps(tc['args'], indent=2)})"
+ for tc in message.tool_calls
+ )
+ output += f"\nTools:\n{tools}"
+
+ return output
+
+#Build graph
+def create_graph(server=None, model=None, stop=None, model_endpoint=None, temperature=0):
+ workflow = StateGraph(State)
+
+ def monitor_decision(state:State)-> Literal["Monitoring Agent", "__end__"]:
+ if state['consent'] == 'yes':
+ return "Monitoring Agent"
+ else:
+ return "__end__"
+
+ # Define the two nodes we will cycle between
+ workflow.add_node("Monitoring Agent", MonitoringAgent)
+ workflow.add_node("Configuration Agent", ConfigurationAgent)
+
+ # Define edges of the graph
+ workflow.add_edge("__start__", "Monitoring Agent")
+ workflow.add_edge("Monitoring Agent", "Configuration Agent")
+ workflow.add_conditional_edges("Configuration Agent", monitor_decision)
+ return workflow
+
+def compile_workflow(graph, img_name="./images/langgraph_DLI.png"):
+ workflow = graph.compile()
+ if img_name!=None:
+ os.makedirs(os.path.dirname(img_name), exist_ok=True)
+ png_data = workflow.get_graph().draw_mermaid_png()
+ # Save the PNG data to a file
+ with open(img_name, "wb") as file:
+ file.write(png_data)
+ print("Saved graph image as ", img_name)
+ return workflow
+
+def display_graph(workflow):
+ try:
+ print(workflow.get_graph())
+ display(Image(workflow.get_graph().draw_mermaid_png()))
+ # print("SUCCESS")
+ except Exception as e:
+ print("ERROR IN GRAPH")
+ print(e)
+
+def main():
+ graph = create_graph()
+ workflow = compile_workflow(graph)
+
+ config = RunnableConfig(recursion_limit=1500)
+ start = os.path.getsize(file_path)
+
+ #input load to the agent
+ input = {
+ "messages": "Hey, can you monitor and reconfigure the network for me?",
+ "agent_id": "human",
+ "files": None,
+ "start": start,
+ "logs_filename": file_path,
+ "config_value": ["50", "50"],
+ "count": 0
+ }
+ count = 0
+ for s in workflow.stream(input, config, subgraphs=True):
+ formatted = pretty_print_message(s)
+ logging.info(formatted)
+
+if __name__ == "__main__":
+ main()
diff --git a/community/autonomous_5g_slicing_lab/agentic-llm/tools.py b/community/autonomous_5g_slicing_lab/agentic-llm/tools.py
new file mode 100644
index 00000000..3a747fd9
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/agentic-llm/tools.py
@@ -0,0 +1,95 @@
+# This file defines the tools that are used by the agents.
+import pandas as pd
+import time
+import os
+from langchain_core.tools import tool
+import subprocess
+import yaml
+import logging
+from dotenv import load_dotenv
+import gpudb
+
+
+config_file = yaml.safe_load(open('config.yaml', 'r'))
+# Configure the logger without timestamp and level tags
+logging.basicConfig(
+ filename= config_file['AGENT_LOG_FILE'], # Log file name
+ level=logging.INFO, # Log level
+ format="%(message)s" # Only log the message
+)
+
+load_dotenv("../llm-slicing-5g-lab/.env")
+
+kdbc_options = gpudb.GPUdb.Options()
+kdbc_options.username = os.environ.get("KINETICA_USERNAME")
+kdbc_options.password = os.environ.get("KINETICA_PASSWORD")
+kdbc_options.disable_auto_discovery = True
+kdbc: gpudb.GPUdb = gpudb.GPUdb(
+ host=os.environ.get("KINETICA_HOST"),
+ options=kdbc_options
+)
+
+
+@tool
+def reconfigure_network(UE: str, value_1_old: int, value_2_old: int):
+ """
+ Use this tool to reconfigure the network. The tool reconfigures network, and returns new configuration values.
+ """
+ time.sleep(2) #to improve logging
+ logging.info(f"This is reconfigure_network Tool \n")
+ logging.info(f"\n Executing reconfigure_network with UE={UE}, value_1_old={value_1_old}, value_2_old={value_2_old} \n")
+ script_path = config_file['reconfig_script_path']
+ config_value_1 = "20"
+ config_value_2 = "80"
+ args_1 = args_2 = None
+ args_1 = ["20", "20"]
+
+ if UE == "UE1":
+ args_2 = ["80","20"]
+ else:
+ args_2 = ["20","80"]
+
+ try:
+ result = subprocess.run([script_path] + args_1, check=True, text=True, capture_output=True)
+ logging.info("\nScript output args_1:\n")
+ logging.info(result.stdout)
+ if args_2!=None:
+ result = subprocess.run([script_path] + args_2, check=True, text=True, capture_output=True)
+ logging.info("\nScript output args_2:\n")
+ logging.info(result.stdout)
+
+ time.sleep(10)
+ logging.info("\n Wait for reconfiguration to kick in \n")
+ if args_2 != None:
+ return str(args_2)
+
+ return str(args_1)
+ except subprocess.CalledProcessError as e:
+ logging.info("Error occurred:")
+ logging.info(e.stderr)
+ return "Reconfiguration unsuccessful"
+
+
+@tool
+def get_packetloss_logs() -> str:
+ """
+ Get the logs to determine which UE is failing.
+ """
+ time.sleep(2) #to improve logging
+ logging.info(f"This is get_packetloss_logs Tool \n")
+ logging.info("\nRetrieving packet loss logs from database\n")
+ time.sleep(5) # wait for db to get updated
+ iperf_random_table_name: str = os.environ.get('IPERF3_RANDOM_TABLE_NAME')
+ # Just to be sure we have the latest randomly generated table name
+ load_dotenv("../llm-slicing-5g-lab/.env")
+
+ sql_query = f"SELECT lost_packets, loss_percentage, UE FROM {os.environ.get('IPERF3_RANDOM_TABLE_NAME')} ORDER BY timestamp DESC LIMIT 20;"
+ result_df: pd.DataFrame = kdbc.to_df(
+ sql=sql_query
+ )
+
+ if result_df is None or result_df.empty:
+ return "WARNING: A Problem has occurred. No results were found at this time. Please try again later."
+
+
+ return result_df.to_string(index=False)
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/.env b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/.env
new file mode 100644
index 00000000..a995f2dd
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/.env
@@ -0,0 +1,5 @@
+KINETICA_HOST="https://demo72.kinetica.com/_gpudb"
+KINETICA_USERNAME="nvidia_gtc_2025"
+KINETICA_PASSWORD="Kinetica123!"
+KINETICA_SCHEMA="nvidia_gtc_dli_2025"
+IPERF3_RANDOM_TABLE_NAME='nvidia_gtc_dli_2025.ultramicroscope_nonfreeman_necessariness_chewy_iperf3_logs'
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/5glab.png b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/5glab.png
new file mode 100644
index 00000000..6c788dab
Binary files /dev/null and b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/5glab.png differ
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/CMakeLists.txt b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/CMakeLists.txt
new file mode 100644
index 00000000..df0564de
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/CMakeLists.txt
@@ -0,0 +1,40 @@
+add_executable(xapp_mac_ctrl
+ mac_ctrl.c
+ ../../../../src/util/alg_ds/alg/defer.c
+ )
+
+ target_link_libraries(xapp_mac_ctrl
+ PUBLIC
+ e42_xapp
+ -pthread
+ -lsctp
+ -ldl
+ )
+
+add_executable(xapp_rc_slice_ctrl
+ xapp_rc_slice_ctrl.c
+ ../../../../src/util/alg_ds/alg/defer.c
+ )
+
+add_executable(xapp_rc_slice_dynamic
+ xapp_rc_slice_dynamic.c
+ ../../../../src/util/alg_ds/alg/defer.c
+)
+
+
+target_link_libraries(xapp_rc_slice_ctrl
+ PUBLIC
+ e42_xapp
+ -pthread
+ -lsctp
+ -ldl
+ )
+
+target_link_libraries(xapp_rc_slice_dynamic
+ PUBLIC
+ e42_xapp
+ -pthread
+ -lsctp
+ -ldl
+)
+
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Setup.ipynb b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Setup.ipynb
new file mode 100644
index 00000000..7fa19af4
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Setup.ipynb
@@ -0,0 +1,937 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Start 5G Network Simulator\n",
+ "\n",
+ "In this DLI you will use an Agentic Generative AI solution to solve a bandwidth allocation problem. The lab will consist of two different parts. In the first part, the lab will show you how to setup an open source 5G Network Lab consisting of the following parts:\n",
+ "- 5G Core Lab simulation by Open Air Interface: https://openairinterface.org/oai-5g-core-network-project/\n",
+ "- FlexRIC that will be connected to the gNodeB and will be used to change the bandwidth allocation for each slice in the gNodeB\n",
+ "- RAN Lab composed by a gNodeB and two Use Equipment simulation components from Open Air OAI Softmode: https://github.com/simula/openairinterface5g/blob/dreibh/simulamet-testbed/doc/RUNMODEM.md\n",
+ "- Traffic generation over the Open Air network simulator using Iperf Tool: https://iperf.fr/\n",
+ "\n",
+ "The Lab setup will start with the initialization of the 5G Core Network, then we will set up the gNodeB and the RIC connecting both via the E1 protocol. We will attach two UEs to the 5G network, each UE1 will have its own slice as seen in the diagram. Once UEs are functional, we will use the Iperf tool to generate traffic. First we will set up the Iperf server on the OAI External Network connected by the User Plane Function UPF. Then we will use the Iperf Client to generate traffic against the External Network using the UEs connection. \n",
+ "\n",
+ "\n",
+ "\n",
+ "In this Jupyter Notebook we will set the lab for the experiment. In a separate Jupyter Notebook we will build the Agentic Workflow for the experiment."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Installing Requirements\n",
+ "In this first cell we will install the requirements for the Blueprint and we will restart the kernel, so you will need to press \"yes\" to the window that will pop up"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%capture\n",
+ "!sudo apt install -y iperf3\n",
+ "!pip install -r ../requirements.txt\n",
+ "import IPython\n",
+ "IPython.Application.instance().kernel.do_shutdown(True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Installing Flexric and gNodeB"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This code will take between 7 and 8 minutes to run. It will compile the ric and gNodeB components within the DLI environment. If you want to install this lab in your computer, you just need to download the DLI directory and execute this command. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%capture\n",
+ "!chmod +x build_ric_oai_ne.sh\n",
+ "!./build_ric_oai_ne.sh"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### OAI 5G Network \n",
+ "To set up the 5G core Network funcitons we will use the docker compose comand. First, we will setup the standard network funciton for the core and then we will set up an additonal slice (slice 2) that will have its own SMF and UPF"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%capture\n",
+ "!docker compose --progress=plain -f docker-compose-oai-cn-slice1.yaml up -d\n",
+ "import time\n",
+ "time.sleep(20)\n",
+ "!docker compose --progress=plain -f docker-compose-oai-cn-slice2.yaml up -d"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Start RIC\n",
+ "\n",
+ "Then we will start the FlexRIC to be able to modify parameters in the gNodeB on an ad hoc basis"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Process started with PID 102070, logging to logs/RIC.log.\n"
+ ]
+ }
+ ],
+ "source": [
+ "import subprocess\n",
+ "import os\n",
+ "\n",
+ "# Ensure the logs directory exists\n",
+ "os.makedirs(\"logs\", exist_ok=True)\n",
+ "\n",
+ "cmd = \"./flexric/build/examples/ric/nearRT-RIC\"\n",
+ "logfile = \"logs/RIC.log\"\n",
+ "\n",
+ "# Open log file for writing and start the process\n",
+ "with open(logfile, \"a\") as log:\n",
+ " process = subprocess.Popen(\n",
+ " [\"bash\", \"-c\", f\"stdbuf -oL {cmd}\"], # stdbuf ensures real-time logging\n",
+ " stdout=log,\n",
+ " stderr=subprocess.STDOUT,\n",
+ " universal_newlines=True\n",
+ " )\n",
+ "\n",
+ "print(f\"Process started with PID {process.pid}, logging to {logfile}.\")\n",
+ "time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " Trouble Shooting - Sample output
\n",
+ " \n",
+ " If flexric starts successfully you should see a similar output in logs/RIC.log\n",
+ " ```\n",
+ " [UTIL]: Setting the config -c file to /usr/local/etc/flexric/flexric.conf\n",
+ "[UTIL]: Setting path -p for the shared libraries to /usr/local/lib/flexric/\n",
+ "[NEAR-RIC]: nearRT-RIC IP Address = 127.0.0.1, PORT = 36421\n",
+ "[NEAR-RIC]: Initializing \n",
+ "[NEAR-RIC]: Loading SM ID = 142 with def = MAC_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 143 with def = RLC_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 3 with def = ORAN-E2SM-RC \n",
+ "[NEAR-RIC]: Loading SM ID = 146 with def = TC_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 148 with def = GTP_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 145 with def = SLICE_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 2 with def = ORAN-E2SM-KPM \n",
+ "[NEAR-RIC]: Loading SM ID = 144 with def = PDCP_STATS_V0 \n",
+ "[iApp]: Initializing ... \n",
+ "[iApp]: nearRT-RIC IP Address = 127.0.0.1, PORT = 36422\n",
+ "[NEAR-RIC]: Initializing Task Manager with 2 threads \n",
+ "[E2AP]: E2 SETUP-REQUEST rx from PLMN 1. 1 Node ID 3584 RAN type ngran_gNB\n",
+ "[NEAR-RIC]: Accepting RAN function ID 2 with def = ORAN-E2SM-KPM \n",
+ "[NEAR-RIC]: Accepting RAN function ID 3 with def = ORAN-E2SM-RC \n",
+ "[NEAR-RIC]: Accepting RAN function ID 142 with def = MAC_STATS_V0 \n",
+ "[NEAR-RIC]: Accepting RAN function ID 143 with def = RLC_STATS_V0 \n",
+ "[NEAR-RIC]: Accepting RAN function ID 144 with def = PDCP_STATS_V0 \n",
+ "[NEAR-RIC]: Accepting RAN function ID 145 with def = SLICE_STATS_V0 \n",
+ "[NEAR-RIC]: Accepting RAN function ID 146 with def = TC_STATS_V0 \n",
+ "[NEAR-RIC]: Accepting RAN function ID 148 with def = GTP_STATS_V0 \n",
+ " ```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Start the gNodeB\n",
+ "Then we will run the gNodeB using the OAI softmoden software"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Process started with PID 117275, logging to logs/gNodeB.log.\n"
+ ]
+ }
+ ],
+ "source": [
+ "import subprocess\n",
+ "import os\n",
+ "\n",
+ "cmd = \"sudo ./openairinterface5g/cmake_targets/ran_build/build/nr-softmodem -O ran-conf/gnb.conf --sa --rfsim -E --gNBs.[0].min_rxtxtime 6\"\n",
+ "logfile = \"logs/gNodeB.log\"\n",
+ "\n",
+ "env = os.environ.copy()\n",
+ "env[\"LD_LIBRARY_PATH\"] = \".\"\n",
+ "\n",
+ "# Open log file for writing and start the process\n",
+ "with open(logfile, \"a\") as log:\n",
+ " process = subprocess.Popen(\n",
+ " [\"bash\", \"-c\", f\"stdbuf -oL {cmd}\"], # stdbuf ensures real-time logging\n",
+ " stdout=log,\n",
+ " stderr=subprocess.STDOUT,\n",
+ " universal_newlines=True\n",
+ " )\n",
+ "\n",
+ "print(f\"Process started with PID {process.pid}, logging to {logfile}.\")\n",
+ "time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Initialize Bandwidth 50 50 \n",
+ "The gNodeB will have initially allocated 50% of its bandwidth to each of the slices. \n",
+ "\n",
+ "- Note : Incase you get `[E2AP]: Resending Setup Request after timeout`error, rerun the `Start RIC` cell.\n",
+ "\n",
+ "***\n",
+ "Please check `./logs/RIC.log` to ensure that flexRIC is working. Incase you see a \"failed\" message, try rerunning the `Start RIC` cell above. \n",
+ "\n",
+ "Error message : \n",
+ "```\n",
+ "nearRT-RIC: /dli/task/llm-slicing-5g-lab/flexric/src/lib/e2ap/v2_03/enc/e2ap_msg_enc_asn.c:3165: e2ap_enc_e42_setup_response_asn_pdu: Assertion `sr->len_e2_nodes_conn > 0 && \"No global node conected??\"' failed.\n",
+ "```\n",
+ "\n",
+ "***"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "50+50\n",
+ "[UTIL]: Setting the config -c file to /usr/local/etc/flexric/flexric.conf\n",
+ "[UTIL]: Setting path -p for the shared libraries to /usr/local/lib/flexric/\n",
+ "[xAapp]: Initializing ... \n",
+ "[xApp]: nearRT-RIC IP Address = 127.0.0.1, PORT = 36422\n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/libslice_sm.so \n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/libmac_sm.so \n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/libkpm_sm.so \n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/librc_sm.so \n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/librlc_sm.so \n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/libtc_sm.so \n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/libgtp_sm.so \n",
+ "[E2 AGENT]: Opening plugin from path = /usr/local/lib/flexric/libpdcp_sm.so \n",
+ "[NEAR-RIC]: Loading SM ID = 145 with def = SLICE_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 142 with def = MAC_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 2 with def = ORAN-E2SM-KPM \n",
+ "[NEAR-RIC]: Loading SM ID = 3 with def = ORAN-E2SM-RC \n",
+ "[NEAR-RIC]: Loading SM ID = 143 with def = RLC_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 146 with def = TC_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 148 with def = GTP_STATS_V0 \n",
+ "[NEAR-RIC]: Loading SM ID = 144 with def = PDCP_STATS_V0 \n",
+ "[xApp]: DB filename = /tmp/xapp_db_1747219577414412 \n",
+ " [xApp]: E42 SETUP-REQUEST tx\n",
+ "[xApp]: E42 SETUP-RESPONSE rx \n",
+ "[xApp]: xApp ID = 7 \n",
+ "[xApp]: Registered E2 Nodes = 1 \n",
+ "Connected E2 nodes = 1\n",
+ "Setting PRB Ratio to 50:50\n",
+ "[xApp]: CONTROL-REQUEST tx \n",
+ "[xApp]: CONTROL ACK rx\n",
+ "[xApp]: Successfully received CONTROL-ACK \n",
+ "[xApp]: Control Loop Latency: 828 us\n",
+ "[xApp]: Sucessfully stopped \n",
+ "Test xApp run SUCCESSFULLY\n"
+ ]
+ }
+ ],
+ "source": [
+ "!./change_rc_slice.sh 50 50\n",
+ "time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Start the UE\n",
+ "After we will create a User Equipment Simulator and attach it to the gNodeB. Following cell creates UE1 and UE2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import time\n",
+ "import subprocess\n",
+ "import logging\n",
+ "from typing import Optional, List\n",
+ "\n",
+ "import colorlog\n",
+ "\n",
+ "# Configure colored logging.\n",
+ "handler = colorlog.StreamHandler()\n",
+ "handler.setFormatter(colorlog.ColoredFormatter(\n",
+ " fmt=\"%(log_color)s%(asctime)s %(levelname)s: %(message)s\",\n",
+ " datefmt=\"%Y-%m-%d %H:%M:%S\",\n",
+ " log_colors={\n",
+ " 'DEBUG': 'blue',\n",
+ " 'INFO': 'green',\n",
+ " 'WARNING': 'yellow',\n",
+ " 'ERROR': 'red',\n",
+ " 'CRITICAL': 'red,bg_white',\n",
+ " }\n",
+ "))\n",
+ "logger = colorlog.getLogger(__name__)\n",
+ "logger.addHandler(handler)\n",
+ "logger.setLevel(logging.DEBUG)\n",
+ "logger.propagate = False\n",
+ "\n",
+ "def start_async_process(name: str, cmd: str, logfile: str) -> Optional[subprocess.Popen]:\n",
+ " \"\"\"\n",
+ " Start an asynchronous process and log its status.\n",
+ "\n",
+ " Args:\n",
+ " name: Name of the process.\n",
+ " cmd: The command to run.\n",
+ " logfile: Path to the log file.\n",
+ "\n",
+ " Returns:\n",
+ " The subprocess.Popen object if the process started successfully;\n",
+ " None otherwise.\n",
+ " \"\"\"\n",
+ " logger.info(\"Starting process %s with command: %s\", name, cmd)\n",
+ " try:\n",
+ " with open(logfile, \"a\") as log:\n",
+ " process = subprocess.Popen(\n",
+ " [\"bash\", \"-c\", f\"stdbuf -oL {cmd}\"],\n",
+ " stdout=log,\n",
+ " stderr=subprocess.STDOUT,\n",
+ " universal_newlines=True,\n",
+ " )\n",
+ " if process.pid:\n",
+ " logger.info(\"Process %s started with PID %s, logging to %s\", name, process.pid, logfile)\n",
+ " return process\n",
+ " else:\n",
+ " logger.error(\"Process %s did not start properly.\", name)\n",
+ " return None\n",
+ " except Exception as e:\n",
+ " logger.error(\"Failed to start process %s: %s\", name, str(e))\n",
+ " return None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\u001b[32m2025-05-14 10:46:32 INFO: Starting process UE1 with command: \n",
+ " sudo ./multi_ue.sh -c1 -e & \n",
+ " sleep 5\n",
+ " sudo ip netns exec ue1 bash -c '\n",
+ " sudo LD_LIBRARY_PATH=. ./openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \\\n",
+ " --rfsimulator.serveraddr 10.201.1.100 -r 106 --numerology 1 --band 78 -C 3619200000 \\\n",
+ " --rfsim --sa -O ran-conf/ue_1.conf -E\n",
+ " '\n",
+ " \u001b[0m\n",
+ "\u001b[32m2025-05-14 10:46:32 INFO: Process UE1 started with PID 118709, logging to logs/UE1.log\u001b[0m\n",
+ "\u001b[32m2025-05-14 10:46:32 INFO: Starting process UE3 with command: \n",
+ " sudo ./multi_ue.sh -c3 -e & \n",
+ " sleep 5\n",
+ " sudo ip netns exec ue3 bash -c '\n",
+ " sudo LD_LIBRARY_PATH=. ./openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \\\n",
+ " --rfsimulator.serveraddr 10.203.1.100 -r 106 --numerology 1 --band 78 -C 3619200000 \\\n",
+ " --rfsim --sa -O ran-conf/ue_2.conf -E\n",
+ " '\n",
+ " \u001b[0m\n",
+ "\u001b[32m2025-05-14 10:46:32 INFO: Process UE3 started with PID 118712, logging to logs/UE3.log\u001b[0m\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " sudo ./multi_ue.sh -c1 -e & \n",
+ " sleep 5\n",
+ " sudo ip netns exec ue1 bash -c '\n",
+ " sudo LD_LIBRARY_PATH=. ./openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \\\n",
+ " --rfsimulator.serveraddr 10.201.1.100 -r 106 --numerology 1 --band 78 -C 3619200000 \\\n",
+ " --rfsim --sa -O ran-conf/ue_1.conf -E\n",
+ " '\n",
+ " \n",
+ "\n",
+ " sudo ./multi_ue.sh -c3 -e & \n",
+ " sleep 5\n",
+ " sudo ip netns exec ue3 bash -c '\n",
+ " sudo LD_LIBRARY_PATH=. ./openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \\\n",
+ " --rfsimulator.serveraddr 10.203.1.100 -r 106 --numerology 1 --band 78 -C 3619200000 \\\n",
+ " --rfsim --sa -O ran-conf/ue_2.conf -E\n",
+ " '\n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "def start_ue(ue_id: str, config_file: str, namespace: str, server_addr: str, port: str = \"106\") -> Optional[subprocess.Popen]:\n",
+ " \"\"\"\n",
+ " Start a UE process.\n",
+ "\n",
+ " Args:\n",
+ " ue_id: Identifier for the UE (used in command arguments and logging).\n",
+ " config_file: Path to the UE configuration file.\n",
+ " namespace: The network namespace for the UE.\n",
+ " server_addr: The server address for the UE.\n",
+ " port: The port used by the UE (default is \"106\").\n",
+ "\n",
+ " Returns:\n",
+ " The subprocess.Popen object if the process started successfully; None otherwise.\n",
+ " \"\"\"\n",
+ " cmd = f\"\"\"\n",
+ " sudo ./multi_ue.sh -c{ue_id} -e & \n",
+ " sleep 5\n",
+ " sudo ip netns exec {namespace} bash -c '\n",
+ " sudo LD_LIBRARY_PATH=. ./openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \\\\\n",
+ " --rfsimulator.serveraddr {server_addr} -r {port} --numerology 1 --band 78 -C 3619200000 \\\\\n",
+ " --rfsim --sa -O {config_file} -E\n",
+ " '\n",
+ " \"\"\"\n",
+ " logfile = f\"logs/UE{ue_id}.log\"\n",
+ " print(cmd)\n",
+ " return start_async_process(f\"UE{ue_id}\", cmd, logfile)\n",
+ "\n",
+ "ue1_process = start_ue(\"1\", \"ran-conf/ue_1.conf\", \"ue1\", \"10.201.1.100\")\n",
+ "ue2_process = start_ue(\"3\", \"ran-conf/ue_2.conf\", \"ue3\", \"10.203.1.100\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Debugging tip: Print logs for sanity check**\n",
+ "\n",
+ "```\n",
+ "tail -f logs/UE1.log\n",
+ "tail -f logs/UE3.log\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Start the Iperf Tool Server\n",
+ "Once the 5G Network Simulation is running we will start the simulation of traffic by using with tool Iperf. First we will create an Iperf Server that will be on the External Network connected via the User Plane Function. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\u001b[32m2025-05-14 10:46:38 INFO: Starting process iPerf_server1 with command: docker exec -t oai-ext-dn iperf3 -s -p 5201\u001b[0m\n",
+ "\u001b[32m2025-05-14 10:46:38 INFO: Process iPerf_server1 started with PID 119502, logging to logs/docker_iperfserver_server1.log\u001b[0m\n",
+ "\u001b[32m2025-05-14 10:46:38 INFO: Starting process iPerf_server2 with command: docker exec -t oai-ext-dn iperf3 -s -p 5202\u001b[0m\n",
+ "\u001b[32m2025-05-14 10:46:38 INFO: Process iPerf_server2 started with PID 119503, logging to logs/docker_iperfserver_server2.log\u001b[0m\n"
+ ]
+ }
+ ],
+ "source": [
+ "def start_iperf(name: str, port: str) -> Optional[subprocess.Popen]:\n",
+ " \"\"\"\n",
+ " Start an iPerf3 server process.\n",
+ "\n",
+ " Args:\n",
+ " name: Identifier for the iPerf3 instance.\n",
+ " port: Port on which the iPerf3 server should run.\n",
+ "\n",
+ " Returns:\n",
+ " The subprocess.Popen object if started successfully; None otherwise.\n",
+ " \"\"\"\n",
+ " cmd = f\"docker exec -t oai-ext-dn iperf3 -s -p {port}\"\n",
+ " logfile = f\"logs/docker_iperfserver_{name}.log\"\n",
+ " return start_async_process(f\"iPerf_{name}\", cmd, logfile)\n",
+ "\n",
+ "iperf1_process = start_iperf(\"server1\", \"5201\")\n",
+ "iperf2_process = start_iperf(\"server2\", \"5202\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Start Traffic generator and insert records in the database\n",
+ "Once every element in The Network is up and running and the Iperf server is listening in the external network. We will run two iperf clients that will be generating traffic in both UEs. These scripts will generate udp traffic from the iperf server towards the UE and will alternate speeds 30M and 120M for 100 seconds. In the following cell we will\n",
+ "\n",
+ "1. Run traffic generator to alternate between 30M and 120M\n",
+ "2. Insert UE1 and UE2 iperf logs into the Kinetica Database. Kinetica is a very fast, distributed, GPU-accelerated database with advanced analytics, visualization, geospatial, and machine learning functionality."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Generate traffic \n",
+ "\n",
+ "from datetime import datetime\n",
+ "import logging\n",
+ "import random\n",
+ "import re\n",
+ "import os\n",
+ "import subprocess\n",
+ "import threading\n",
+ "from typing import Dict, List, Pattern\n",
+ "\n",
+ "from dotenv import load_dotenv, set_key\n",
+ "from english_words import get_english_words_set\n",
+ "import gpudb\n",
+ "from gpudb import GPUdb\n",
+ "from gpudb import GPUdbColumnProperty as cp\n",
+ "from gpudb import GPUdbRecordColumn as rc\n",
+ "from IPython.display import display, HTML\n",
+ "\n",
+ "\n",
+ "class IperfRecord:\n",
+ " def __init__(\n",
+ " self,\n",
+ " record_id: str = \"\",\n",
+ " record_ue: str = None,\n",
+ " record_timestamp: str = \"\",\n",
+ " record_stream: int = None,\n",
+ " record_interval_start: float = None,\n",
+ " record_interval_end: float = None,\n",
+ " record_duration: float = 0.0,\n",
+ " record_data_transferred: float = None,\n",
+ " record_bitrate: float = None,\n",
+ " record_jitter: float = None,\n",
+ " record_lost_packets: int = None,\n",
+ " record_total_packets: int = None,\n",
+ " record_loss_percentage: float = None\n",
+ " ) -> None:\n",
+ " self.id = record_id\n",
+ " self.ue = record_ue\n",
+ " self.timestamp = record_timestamp\n",
+ " self.stream = record_stream\n",
+ " self.interval_start = record_interval_start\n",
+ " self.interval_end = record_interval_end\n",
+ " self.duration = record_duration\n",
+ " self.data_transferred = record_data_transferred\n",
+ " self.bitrate = record_bitrate\n",
+ " self.jitter = record_jitter\n",
+ " self.lost_packets = record_lost_packets\n",
+ " self.total_packets = record_total_packets\n",
+ " self.loss_percentage = record_loss_percentage\n",
+ "\n",
+ " def record_to_dict(self) -> Dict[str, str | float]:\n",
+ " return {\n",
+ " \"id\": self.id,\n",
+ " \"ue\": self.ue,\n",
+ " \"timestamp\": self.timestamp,\n",
+ " \"stream\": self.stream,\n",
+ " \"interval_start\": self.interval_start,\n",
+ " \"interval_end\": self.interval_end,\n",
+ " \"duration\": self.duration,\n",
+ " \"data_transferred\": self.data_transferred,\n",
+ " \"bitrate\": self.bitrate,\n",
+ " \"jitter\": self.jitter,\n",
+ " \"lost_packets\": self.lost_packets,\n",
+ " \"total_packets\": self.total_packets,\n",
+ " \"loss_percentage\": self.loss_percentage\n",
+ " }\n",
+ "\n",
+ "\n",
+ "def convert_bandwidth(bw_str: str) -> int:\n",
+ " \"\"\"\n",
+ " Converts a bandwidth string like \"120M\" or \"30M\" into an integer in bits per second.\n",
+ " \"\"\"\n",
+ " if bw_str.endswith(\"M\"):\n",
+ " return int(bw_str[:-1]) * 1_000_000\n",
+ " elif bw_str.endswith(\"K\"):\n",
+ " return int(bw_str[:-1]) * 1_000\n",
+ " else:\n",
+ " return int(bw_str)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " Kinetica Table: lineless_toolbuilding_squad_sciotheism_iperf3_logs \n",
+ " User: nvidia_gtc_2025 \n",
+ " Password: Kinetica123!\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\u001b[32m2025-05-14 19:25:50 INFO: CURRENT ITERATION: 0\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:26:40 INFO: CURRENT ITERATION: 1\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:26:56 INFO: CURRENT ITERATION: 2\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:27:34 INFO: CURRENT ITERATION: 3\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:28:17 INFO: CURRENT ITERATION: 4\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:51 INFO: CURRENT ITERATION: 5\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:51 INFO: CURRENT ITERATION: 6\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:51 INFO: CURRENT ITERATION: 7\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:51 INFO: CURRENT ITERATION: 8\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:51 INFO: CURRENT ITERATION: 9\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:51 INFO: CURRENT ITERATION: 10\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 11\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 12\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 13\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 14\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 15\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 16\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 17\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 18\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 19\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 20\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 21\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 22\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 23\u001b[0m\n",
+ "\u001b[32m2025-05-14 19:29:52 INFO: CURRENT ITERATION: 24\u001b[0m\n"
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "# Load environment variables and initialize Kinetica connection.\n",
+ "load_dotenv()\n",
+ "kdbc_options = GPUdb.Options()\n",
+ "kdbc_options.username = os.environ.get(\"KINETICA_USERNAME\")\n",
+ "kdbc_options.password = os.environ.get(\"KINETICA_PASSWORD\")\n",
+ "kdbc_options.disable_auto_discovery = True\n",
+ "word_list: List[str] = list(get_english_words_set(['web2'], lower=True))\n",
+ "\n",
+ "\n",
+ "def generate_random_table_name() -> str:\n",
+ " # Generate a table name with the correct schema, four random underscore-separated words, and the string \"_iperf_3_logs\"\n",
+ " fully_qualified_random_table_name: str = f\"{os.environ.get('KINETICA_SCHEMA', 'nvidia_gtc_dli_2025')}.\" + \"_\".join(random.choices(word_list, k=4)) + \"_iperf3_logs\"\n",
+ " \n",
+ " # Set our environment variable in the .env file for use by the Agents.\n",
+ " set_key(\n",
+ " dotenv_path=\"./.env\",\n",
+ " key_to_set=\"IPERF3_RANDOM_TABLE_NAME\",\n",
+ " value_to_set=fully_qualified_random_table_name,\n",
+ " quote_mode=\"always\",\n",
+ " export=False,\n",
+ " encoding=\"utf-8\"\n",
+ " )\n",
+ " return fully_qualified_random_table_name\n",
+ "\n",
+ "\n",
+ "kdbc: GPUdb = GPUdb(\n",
+ " host=os.environ.get(\"KINETICA_HOST\"),\n",
+ " options=kdbc_options\n",
+ ")\n",
+ "\n",
+ "iperf3_table_name: str = generate_random_table_name()\n",
+ "if kdbc.has_table(table_name=iperf3_table_name).table_exists:\n",
+ " kdbc.clear_table(table_name=iperf3_table_name)\n",
+ "\n",
+ "schema, table = iperf3_table_name.split('.')\n",
+ "url = f'https://demo72.kinetica.com/gadmin/#/table/{schema}/{table}'\n",
+ "user = os.environ.get(\"KINETICA_USERNAME\")\n",
+ "password = os.environ.get(\"KINETICA_PASSWORD\")\n",
+ "html_out = f'''\n",
+ " Kinetica Table: {table} \n",
+ " User: {user} \n",
+ " Password: {password}\n",
+ "'''\n",
+ "display(HTML(html_out))\n",
+ "\n",
+ "schema: List[List[str]] = [\n",
+ " [\"id\", rc._ColumnType.STRING, cp.UUID, cp.PRIMARY_KEY, cp.INIT_WITH_UUID],\n",
+ " [\"ue\", rc._ColumnType.STRING, cp.CHAR8, cp.DICT],\n",
+ " [\"timestamp\", rc._ColumnType.STRING, cp.DATETIME, cp.INIT_WITH_NOW],\n",
+ " [\"stream\", rc._ColumnType.INT, cp.INT8, cp.DICT],\n",
+ " [\"interval_start\", rc._ColumnType.FLOAT],\n",
+ " [\"interval_end\", rc._ColumnType.FLOAT],\n",
+ " [\"duration\", rc._ColumnType.FLOAT],\n",
+ " [\"data_transferred\", rc._ColumnType.FLOAT],\n",
+ " [\"bitrate\", rc._ColumnType.FLOAT],\n",
+ " [\"jitter\", rc._ColumnType.FLOAT],\n",
+ " [\"lost_packets\", rc._ColumnType.INT],\n",
+ " [\"total_packets\", rc._ColumnType.INT],\n",
+ " [\"loss_percentage\", rc._ColumnType.FLOAT]\n",
+ "]\n",
+ "kdbc_table = gpudb.GPUdbTable(\n",
+ " _type=schema,\n",
+ " name=iperf3_table_name,\n",
+ " db=kdbc\n",
+ ")\n",
+ "\n",
+ "# Precompiled regex pattern to parse iperf3 output.\n",
+ "filter_regex: str = (\n",
+ " r'^\\[ *([0-9]+)\\] +([0-9]+\\.[0-9]+)-([0-9]+\\.[0-9]+) +sec +'\n",
+ " r'([0-9\\.]+) +MBytes +([0-9\\.]+) +Mbits/sec +([0-9\\.]+) +ms +'\n",
+ " r'([0-9]+)/([0-9]+) +\\(([0-9\\.]+)%\\)$'\n",
+ ")\n",
+ "pattern: Pattern[str] = re.compile(filter_regex)\n",
+ "\n",
+ "\n",
+ "def iperf_runner(\n",
+ " namespace: str,\n",
+ " ue_name: str,\n",
+ " bind_host: str,\n",
+ " server_host: str,\n",
+ " udp_port: int,\n",
+ " bandwidth: str,\n",
+ " test_length_secs: int,\n",
+ " kdbc_table: gpudb.GPUdbTable,\n",
+ " pattern: Pattern[str],\n",
+ " log_file: str\n",
+ ") -> None:\n",
+ " \"\"\"\n",
+ " Runs iperf for one UE, parses and inserts records into Kinetica,\n",
+ " and writes each record to a dedicated log file in the specified format.\n",
+ " Exits when the iperf process finishes.\n",
+ "\n",
+ " :param namespace: The network namespace for the UE.\n",
+ " :param ue_name: A label/identifier for the UE (e.g., \"UE1\").\n",
+ " :param bind_host: IP address to bind to (iperf3 -B).\n",
+ " :param server_host: The remote iperf3 server IP address.\n",
+ " :param udp_port: The UDP port to use (iperf3 -p).\n",
+ " :param bandwidth: The bandwidth limit (e.g. \"30M\" or \"120M\").\n",
+ " :param test_length_secs: The test duration in seconds (iperf3 -t).\n",
+ " :param kdbc_table: The Kinetica table object where we insert records.\n",
+ " :param pattern: Precompiled regex to parse iperf3 output.\n",
+ " :param log_file: Path to the log file for this iperf3 process (e.g. \"logs/UE1_iperfc.log\").\n",
+ " \"\"\"\n",
+ " try:\n",
+ " iperf_cmd = (\n",
+ " f\"stdbuf -oL iperf3 \"\n",
+ " f\"-B {bind_host} \"\n",
+ " f\"-c {server_host} \"\n",
+ " f\"-p {udp_port} \"\n",
+ " f\"-R -u \"\n",
+ " f\"-b {bandwidth} \"\n",
+ " f\"-t {test_length_secs}\"\n",
+ " )\n",
+ " cmd = [\"sudo\", \"ip\", \"netns\", \"exec\", namespace, \"bash\", \"-c\", iperf_cmd]\n",
+ "\n",
+ " # Open a subprocess to run iperf3.\n",
+ " with subprocess.Popen(\n",
+ " cmd,\n",
+ " stdout=subprocess.PIPE,\n",
+ " stderr=subprocess.STDOUT,\n",
+ " universal_newlines=True,\n",
+ " bufsize=1\n",
+ " ) as proc:\n",
+ " for line in proc.stdout:\n",
+ " line = line.strip()\n",
+ " match = pattern.match(line)\n",
+ " if match:\n",
+ " # Create an IperfRecord from the parsed line.\n",
+ " iperf_record = IperfRecord(\n",
+ " record_ue=ue_name,\n",
+ " record_stream=int(match.group(1)),\n",
+ " record_interval_start=float(match.group(2)),\n",
+ " record_interval_end=float(match.group(3)),\n",
+ " record_data_transferred=float(match.group(4)),\n",
+ " record_bitrate=float(match.group(5)),\n",
+ " record_jitter=float(match.group(6)),\n",
+ " record_lost_packets=int(match.group(7)),\n",
+ " record_total_packets=int(match.group(8)),\n",
+ " record_loss_percentage=float(match.group(9))\n",
+ " )\n",
+ " # Calculate duration.\n",
+ " iperf_record.duration = iperf_record.interval_end - iperf_record.interval_start\n",
+ "\n",
+ " # Insert record into Kinetica.\n",
+ " record_dict = iperf_record.record_to_dict()\n",
+ " kdbc_table.insert_records(record_dict)\n",
+ " kdbc_table.flush_data_to_server()\n",
+ "\n",
+ " # Write the raw iperf3 output line to the dedicated log file\n",
+ " # with the format: \"[] [] \"\n",
+ " timestamp = datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n",
+ " with open(log_file, \"a\") as f:\n",
+ " f.write(f\"[{ue_name}] [{timestamp}] {line}\\n\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error running process: {e}\")\n",
+ " # When iperf3 ends, the function exits so that the main thread can handle any post-run activities.\n",
+ "\n",
+ "\n",
+ "bandwidth_ue1: str = \"30M\"\n",
+ "bandwidth_ue2: str = \"120M\"\n",
+ "bind_host_ue1: str = \"12.1.1.2\"\n",
+ "bind_host_ue2: str = \"12.1.1.130\"\n",
+ "server_host_ue1: str = \"192.168.70.135\"\n",
+ "server_host_ue2: str = \"192.168.70.135\"\n",
+ "udp_port_ue1: int = 5201\n",
+ "udp_port_ue2: int = 5202\n",
+ "test_length_secs: int = 100\n",
+ "\n",
+ "test_iterations: int = 25 # Feel free to change this as you see fit to run the log generation for a longer period of time.\n",
+ "current_iteration: int = 0\n",
+ "\n",
+ "while current_iteration < test_iterations:\n",
+ " logger.info(f\"\"\"CURRENT ITERATION: {current_iteration}\"\"\")\n",
+ " current_iteration += 1\n",
+ " \n",
+ " t1: threading.Thread = threading.Thread(\n",
+ " target=iperf_runner,\n",
+ " args=(\n",
+ " \"ue1\",\n",
+ " \"UE1\",\n",
+ " bind_host_ue1,\n",
+ " server_host_ue1,\n",
+ " udp_port_ue1,\n",
+ " bandwidth_ue1,\n",
+ " test_length_secs,\n",
+ " kdbc_table,\n",
+ " pattern,\n",
+ " \"logs/UE1_iperfc.log\"\n",
+ " ),\n",
+ " daemon=True\n",
+ " )\n",
+ "\n",
+ " t2: threading.Thread = threading.Thread(\n",
+ " target=iperf_runner,\n",
+ " args=(\n",
+ " \"ue3\",\n",
+ " \"UE3\",\n",
+ " bind_host_ue2,\n",
+ " server_host_ue2,\n",
+ " udp_port_ue2,\n",
+ " bandwidth_ue2,\n",
+ " test_length_secs,\n",
+ " kdbc_table,\n",
+ " pattern,\n",
+ " \"logs/UE2_iperfc.log\"\n",
+ " ),\n",
+ " daemon=True\n",
+ " )\n",
+ "\n",
+ " t1.start()\n",
+ " t2.start()\n",
+ "\n",
+ " t1.join()\n",
+ " t2.join()\n",
+ "\n",
+ " if bandwidth_ue1 == \"30M\":\n",
+ " bandwidth_ue1 = \"120M\"\n",
+ " else:\n",
+ " bandwidth_ue1 = \"30M\"\n",
+ "\n",
+ " if bandwidth_ue2 == \"30M\":\n",
+ " bandwidth_ue2 = \"120M\"\n",
+ " else:\n",
+ " bandwidth_ue2 = \"30M\"\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Keep the above cell running! If you want to see what is happening in the background, you can:\n",
+ "1. Check out UE1, UE2 iperf logs to see how traffic generator works, and how it leads to packet loss:\n",
+ " ```bash\n",
+ " tail -f logs/UE1_iperfc.log\n",
+ " tail -f logs/UE2_iperfc.log\n",
+ " ```\n",
+ "\n",
+ "2. Access Kinetica database, and see how wlogs are updated there real-time. Login with your username and password, mentioned in the .env file.\n",
+ "\n",
+ " - KINETICA_USERNAME=\"nvidia_gtc_2025\"\n",
+ " - KINETICA_PASSWORD=\"Kinetica123!\"\n",
+ " - KINETICA_SCHEMA=\"nvidia_gtc_dli_2025\"\n",
+ " - Table name: os.environment.get(\"IPERF3_RANDOM_TABLE_NAME\")\n",
+ " - URL : https://demo72.kinetica.com/gadmin/"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This will be the final step setting up the 5G Lab for the Agentic Workflow.\n",
+ "\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Shutdown.ipynb b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Shutdown.ipynb
new file mode 100644
index 00000000..bfa917d9
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/DLI_Lab_Shutdown.ipynb
@@ -0,0 +1,2863 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Shutting Down the Lab\n",
+ "This section is just in case you need to restart the lab. Do not execute if your lab is running properly. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "1. Shutdown traffic Generator\n",
+ "2. Shutdown iperf Server\n",
+ "3. Shutdown UEs\n",
+ "4. Shutdown eNodeB\n",
+ "5. Shutdown RIC\n",
+ "6. Shutdown 5G Core\n",
+ "7. Remove Name Spaces"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import time"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Shutdown traffic Generator"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Killing process with PID: 2179251\n",
+ "Killing process with PID: 2179253\n",
+ "All 'iperf3 processes have been terminated.\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Stop Traffic Generator EU1\n",
+ "\n",
+ "import subprocess\n",
+ "\n",
+ "def kill_openair_processes():\n",
+ " try:\n",
+ " # Get list of all running processes containing \"openair\" in the command\n",
+ " result = subprocess.run([\"pgrep\", \"-f\", \"iperf3 -B\"], capture_output=True, text=True)\n",
+ "\n",
+ " if result.stdout.strip():\n",
+ " pids = result.stdout.strip().split(\"\\n\")\n",
+ " for pid in pids:\n",
+ " print(f\"Killing process with PID: {pid}\")\n",
+ " subprocess.run([\"sudo\", \"kill\", \"-9\", pid], check=True)\n",
+ " print(\"All 'iperf3 processes have been terminated.\")\n",
+ " else:\n",
+ " print(\"No 'iperf3 -B' processes found.\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " kill_openair_processes()\n",
+ " time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Shutdown iperf Server\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "No 'iperf3 -s -p 5201' processes found.\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Stop Iperf Server 1\n",
+ "import subprocess\n",
+ "\n",
+ "def kill_openair_processes():\n",
+ " try:\n",
+ " # Get list of all running processes containing \"openair\" in the command\n",
+ " result = subprocess.run([\"pgrep\", \"-f\", \"iperf3 -s -p 5201\"], capture_output=True, text=True)\n",
+ "\n",
+ " if result.stdout.strip():\n",
+ " pids = result.stdout.strip().split(\"\\n\")\n",
+ " for pid in pids:\n",
+ " print(f\"Killing process with PID: {pid}\")\n",
+ " subprocess.run([\"sudo\", \"kill\", \"-9\", pid], check=True)\n",
+ " print(\"All 'iperf3 -s -p 5201' processes have been terminated.\")\n",
+ " else:\n",
+ " print(\"No 'iperf3 -s -p 5201' processes found.\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " kill_openair_processes()\n",
+ " time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Killing process with PID: 119503\n",
+ "Killing process with PID: 119552\n",
+ "All 'iperf3 -s -p 5202' processes have been terminated.\n"
+ ]
+ }
+ ],
+ "source": [
+ "import subprocess\n",
+ "\n",
+ "def kill_openair_processes():\n",
+ " try:\n",
+ " # Get list of all running processes containing \"openair\" in the command\n",
+ " result = subprocess.run([\"pgrep\", \"-f\", \"iperf3 -s -p 5202\"], capture_output=True, text=True)\n",
+ "\n",
+ " if result.stdout.strip():\n",
+ " pids = result.stdout.strip().split(\"\\n\")\n",
+ " for pid in pids:\n",
+ " print(f\"Killing process with PID: {pid}\")\n",
+ " subprocess.run([\"sudo\", \"kill\", \"-9\", pid], check=True)\n",
+ " print(\"All 'iperf3 -s -p 5202' processes have been terminated.\")\n",
+ " else:\n",
+ " print(\"No 'iperf3 -s -p 5202' processes found.\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " kill_openair_processes()\n",
+ " time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Shutdown UEs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Killing process with PID: 118709\n",
+ "Killing process with PID: 119431\n",
+ "Killing process with PID: 119433\n",
+ "Killing process with PID: 119435\n",
+ "Killing process with PID: 119437\n",
+ "Killing process with PID: 119442\n",
+ "All 'ue_1' processes have been terminated.\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Stop UE1\n",
+ "import subprocess\n",
+ "\n",
+ "def kill_openair_processes():\n",
+ " try:\n",
+ " # Get list of all running processes containing \"openair\" in the command\n",
+ " result = subprocess.run([\"pgrep\", \"-f\", \"ue_1\"], capture_output=True, text=True)\n",
+ "\n",
+ " if result.stdout.strip():\n",
+ " pids = result.stdout.strip().split(\"\\n\")\n",
+ " for pid in pids:\n",
+ " print(f\"Killing process with PID: {pid}\")\n",
+ " subprocess.run([\"sudo\", \"kill\", \"-9\", pid], check=True)\n",
+ " print(\"All 'ue_1' processes have been terminated.\")\n",
+ " else:\n",
+ " print(\"No 'ue_1' processes found.\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " kill_openair_processes()\n",
+ " time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Killing process with PID: 118712\n",
+ "Killing process with PID: 119432\n",
+ "Killing process with PID: 119434\n",
+ "Killing process with PID: 119436\n",
+ "Killing process with PID: 119438\n",
+ "Killing process with PID: 119446\n",
+ "All 'ue_2' processes have been terminated.\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Stop UE2 \n",
+ "\n",
+ "import subprocess\n",
+ "\n",
+ "def kill_openair_processes():\n",
+ " try:\n",
+ " # Get list of all running processes containing \"openair\" in the command\n",
+ " result = subprocess.run([\"pgrep\", \"-f\", \"ue_2\"], capture_output=True, text=True)\n",
+ "\n",
+ " if result.stdout.strip():\n",
+ " pids = result.stdout.strip().split(\"\\n\")\n",
+ " for pid in pids:\n",
+ " print(f\"Killing process with PID: {pid}\")\n",
+ " subprocess.run([\"sudo\", \"kill\", \"-9\", pid], check=True)\n",
+ " print(\"All 'ue_2' processes have been terminated.\")\n",
+ " else:\n",
+ " print(\"No 'ue_2' processes found.\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " kill_openair_processes()\n",
+ " time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Shutdown eNodeB"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Killing process with PID: 117275\n",
+ "Killing process with PID: 117276\n",
+ "Killing process with PID: 117277\n",
+ "All 'gnb.conf' processes have been terminated.\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Kill the gNodeB = Work on this\n",
+ "import subprocess\n",
+ "\n",
+ "def kill_openair_processes():\n",
+ " try:\n",
+ " # Get list of all running processes containing \"openair\" in the command\n",
+ " result = subprocess.run([\"pgrep\", \"-f\", \"gnb.conf\"], capture_output=True, text=True)\n",
+ "\n",
+ " if result.stdout.strip():\n",
+ " pids = result.stdout.strip().split(\"\\n\")\n",
+ " for pid in pids:\n",
+ " print(f\"Killing process with PID: {pid}\")\n",
+ " subprocess.run([\"sudo\", \"kill\", \"-9\", pid], check=True)\n",
+ " print(\"All 'gnb.conf' processes have been terminated.\")\n",
+ " else:\n",
+ " print(\"No 'gnb.conf' processes found.\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " kill_openair_processes()\n",
+ " time.sleep(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Shutdown RIC"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Killing process with PID: 102070\n",
+ "All 'nearRT-RIC' processes have been terminated.\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Kill the RIC process\n",
+ "import subprocess\n",
+ "\n",
+ "def kill_openair_processes():\n",
+ " try:\n",
+ " # Get list of all running processes containing \"openair\" in the command\n",
+ " result = subprocess.run([\"pgrep\", \"-f\", \"nearRT-RIC\"], capture_output=True, text=True)\n",
+ "\n",
+ " if result.stdout.strip():\n",
+ " pids = result.stdout.strip().split(\"\\n\")\n",
+ " for pid in pids:\n",
+ " print(f\"Killing process with PID: {pid}\")\n",
+ " subprocess.run([\"sudo\", \"kill\", \"-9\", pid], check=True)\n",
+ " print(\"All 'nearRT-RIC' processes have been terminated.\")\n",
+ " else:\n",
+ " print(\"No 'nearRT-RIC' processes found.\")\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ "\n",
+ "if __name__ == \"__main__\":\n",
+ " kill_openair_processes()\n",
+ " time.sleep(5)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Stop 5G Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[33mWARN\u001b[0m[0000] /home/ubuntu/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice1.yaml: `version` is obsolete \n",
+ "\u001b[1A\u001b[1B\u001b[0G\u001b[?25l[+] Running 1/0\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nssf Stopping \u001b[34m0.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-upf-slice1 Stopping \u001b[34m0.1s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/4\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nssf Stopping \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-upf-slice1 Stopping \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/4\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nssf Stopping \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-upf-slice1 Stopping \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/4\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-upf-slice1 Stopping \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/4\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.6s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.7s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.8s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m0.9s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.0s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.1s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.3s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m0.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.6s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.7s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.8s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m1.9s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.0s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.1s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.3s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m1.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.6s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.7s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.8s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m2.9s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.0s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.1s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.3s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m2.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m3.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.6s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m3.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.7s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m3.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.8s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-smf-slice1 Stopping \u001b[34m3.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m3.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m0.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m0.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m0.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m0.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-amf Stopping \u001b[34m0.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-amf Stopping \u001b[34m0.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m4.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m1.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m1.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m1.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m1.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m1.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m1.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m1.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-amf Stopping \u001b[34m1.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-amf Stopping \u001b[34m1.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m5.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m2.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m2.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m2.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m2.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m2.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m2.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m2.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m2.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-amf Stopping \u001b[34m2.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-amf Stopping \u001b[34m2.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m6.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m3.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m3.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m3.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m3.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m3.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m3.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m3.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m3.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-amf Stopping \u001b[34m3.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-amf Stopping \u001b[34m3.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m7.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m4.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m4.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m4.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m4.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m4.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m4.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m4.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m4.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-amf Stopping \u001b[34m4.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-amf Stopping \u001b[34m4.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m8.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m5.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m5.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m5.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m5.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m5.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m5.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m5.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m5.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-amf Stopping \u001b[34m5.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-amf Stopping \u001b[34m5.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-ext-dn Stopping \u001b[34m9.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m6.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-ext-dn Stopping \u001b[34m10.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m6.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ext-dn Stopping \u001b[34m10.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m6.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ext-dn Stopping \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m6.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m6.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m6.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m6.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m6.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-amf Stopping \u001b[34m6.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-amf Stopping \u001b[34m6.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-amf Stopping \u001b[34m7.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-amf Stopping \u001b[34m7.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-amf Stopping \u001b[34m7.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-amf Stopping \u001b[34m7.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-amf Stopping \u001b[34m7.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-amf Stopping \u001b[34m7.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-amf Stopping \u001b[34m7.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 5/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-amf Stopping \u001b[34m7.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 6/6\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ausf Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 6/7\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-ausf Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 6/7\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-ausf Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 7/7\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 7/8\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 7/8\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 8/8\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m0.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 8/9\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 8/9\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 8/9\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 9/9\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m0.1s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container mysql Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 9/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container mysql Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 9/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container mysql Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 9/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Removing \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container mysql Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container mysql Stopping \u001b[34m0.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container mysql Stopping \u001b[34m0.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container mysql Stopping \u001b[34m0.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container mysql Stopping \u001b[34m0.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container mysql Stopping \u001b[34m0.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container mysql Stopping \u001b[34m1.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container mysql Stopping \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 10/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container mysql Stopping \u001b[34m1.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 12/11\n",
+ " \u001b[32m✔\u001b[0m Container oai-nssf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-pcf \u001b[32mRemoved\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ext-dn \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice1 \u001b[32mRemoved\u001b[0m \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-amf \u001b[32mRemoved\u001b[0m \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.2s \u001b[0m\n",
+ " \u001b[33m\u001b[1m!\u001b[0m Network demo-oai-public-net \u001b[33m\u001b[1mResource ...\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[33mWARN\u001b[0m[0000] /home/ubuntu/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice2.yaml: `version` is obsolete \n",
+ "\u001b[1A\u001b[1B\u001b[0G\u001b[?25l[+] Running 0/0\n",
+ " \u001b[33m⠋\u001b[0m Container oai-upf-slice2 Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 0/1\n",
+ " \u001b[33m⠙\u001b[0m Container oai-upf-slice2 Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 0/1\n",
+ " \u001b[33m⠹\u001b[0m Container oai-upf-slice2 Removing \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 1/1\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 2/2\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Network demo-oai-public-net Removing \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Network demo-oai-public-net Removing \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Network demo-oai-public-net Removing \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 3/3\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Network demo-oai-public-net \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[1A\u001b[1B\u001b[0G\u001b[?25l[+] Running 0/1\n",
+ " \u001b[33m⠋\u001b[0m Container oai-ausf Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 1/2\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m0.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m0.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m0.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m0.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m0.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m0.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m1.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m1.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m1.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m1.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m1.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m1.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m1.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m1.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m1.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m2.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m2.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m2.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m2.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m2.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m2.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m2.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m2.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m2.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m2.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m3.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m3.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m3.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m3.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m3.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m3.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m3.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m3.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m3.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m3.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m4.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m4.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m4.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m4.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m4.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m4.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m4.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m4.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m4.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m4.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m5.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m5.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m5.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m5.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m5.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m5.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m5.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m5.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m5.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m5.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m6.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m6.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m6.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m6.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m6.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m6.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m6.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m6.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m6.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m6.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m7.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m7.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m7.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m7.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m7.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m7.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m7.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m7.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m7.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m7.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m8.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m8.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m8.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m8.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m8.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m8.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m8.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m8.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m8.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m8.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m9.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m9.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m9.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udm Stopping \u001b[34m9.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udm Stopping \u001b[34m9.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udm Stopping \u001b[34m9.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udm Stopping \u001b[34m9.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udm Stopping \u001b[34m9.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udm Stopping \u001b[34m9.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udm Stopping \u001b[34m9.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udm Stopping \u001b[34m10.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udm Stopping \u001b[34m10.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udm Stopping \u001b[34m10.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 2/3\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m0.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m0.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m0.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m0.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m0.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m1.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m1.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m1.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m1.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m1.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m1.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m1.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m1.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m1.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m2.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m2.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m2.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m2.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m2.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m2.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m2.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m2.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m2.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m2.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m3.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m3.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m3.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m3.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m3.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m3.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m3.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m3.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m3.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m3.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m4.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m4.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m4.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m4.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m4.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m4.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m4.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m4.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m4.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m4.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m5.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m5.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m5.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m5.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m5.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m5.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m5.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m5.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m5.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m5.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m6.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m6.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m6.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m6.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m6.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m6.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m6.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m6.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m6.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m6.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m7.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m7.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m7.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m7.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m7.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m7.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m7.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m7.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m7.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m7.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m8.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m8.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m8.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m8.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m8.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m8.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m8.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m8.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m8.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m8.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m9.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m9.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m9.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-udr Stopping \u001b[34m9.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-udr Stopping \u001b[34m9.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-udr Stopping \u001b[34m9.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-udr Stopping \u001b[34m9.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-udr Stopping \u001b[34m9.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-udr Stopping \u001b[34m9.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-udr Stopping \u001b[34m9.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-udr Stopping \u001b[34m10.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-udr Stopping \u001b[34m10.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 2/3\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-udr Stopping \u001b[34m10.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 3/5\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m0.0s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container mysql Stopping \u001b[34m0.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m0.1s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container mysql Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container mysql Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container mysql Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m0.4s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container mysql Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m0.5s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container mysql Stopping \u001b[34m0.5s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m0.6s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container mysql Stopping \u001b[34m0.6s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m0.7s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container mysql Stopping \u001b[34m0.7s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m0.8s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container mysql Stopping \u001b[34m0.8s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m0.9s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container mysql Stopping \u001b[34m0.9s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 3/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m1.0s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container mysql Stopping \u001b[34m1.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m1.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m1.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m1.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m1.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m1.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m1.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m1.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m1.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m1.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m2.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m2.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m2.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m2.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m2.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m2.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m2.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m2.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m2.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m2.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m3.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m3.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m3.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m3.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m3.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m3.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m3.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m3.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m3.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m3.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m4.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m4.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m4.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m4.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m4.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m4.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m4.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m4.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m4.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m4.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m5.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m5.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m5.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m5.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m5.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m5.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m5.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m5.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m5.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m5.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m6.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m6.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m6.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m6.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m6.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m6.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m6.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m6.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m6.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m6.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m7.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m7.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m7.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m7.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m7.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m7.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m7.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m7.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m7.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m7.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m8.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m8.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m8.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m8.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m8.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m8.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m8.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m8.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m8.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m8.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m9.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m9.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m9.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-nrf Stopping \u001b[34m9.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠼\u001b[0m Container oai-nrf Stopping \u001b[34m9.4s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠴\u001b[0m Container oai-nrf Stopping \u001b[34m9.5s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠦\u001b[0m Container oai-nrf Stopping \u001b[34m9.6s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠧\u001b[0m Container oai-nrf Stopping \u001b[34m9.7s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠇\u001b[0m Container oai-nrf Stopping \u001b[34m9.8s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠏\u001b[0m Container oai-nrf Stopping \u001b[34m9.9s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-nrf Stopping \u001b[34m10.0s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-nrf Stopping \u001b[34m10.1s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 4/5\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-nrf Stopping \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 6/6\n",
+ " \u001b[32m✔\u001b[0m Container oai-ausf \u001b[32mRemoved\u001b[0m \u001b[34m0.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udm \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-udr \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-nrf \u001b[32mRemoved\u001b[0m \u001b[34m10.2s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container mysql \u001b[32mRemoved\u001b[0m \u001b[34m1.1s \u001b[0m\n",
+ " \u001b[33m\u001b[1m!\u001b[0m Network demo-oai-public-net \u001b[33m\u001b[1mResource ...\u001b[0m \u001b[34m0.0s \u001b[0m\n",
+ "\u001b[?25h\u001b[33mWARN\u001b[0m[0000] /home/nvidia/x-fx-84-v1/task1/notebooks/llm-slicing-5g-lab/docker-compose-oai-cn-slice2.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion \n",
+ "\u001b[1A\u001b[1B\u001b[0G\u001b[?25l[+] Running 0/1\n",
+ " \u001b[33m⠋\u001b[0m Container oai-upf-slice2 Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 0/1\n",
+ " \u001b[33m⠙\u001b[0m Container oai-upf-slice2 Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 0/1\n",
+ " \u001b[33m⠹\u001b[0m Container oai-upf-slice2 Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 1/2\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠋\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.1s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠙\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.2s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠹\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.3s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l[+] Running 1/2\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[33m⠸\u001b[0m Container oai-smf-slice2 Stopping \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h\u001b[1A\u001b[1A\u001b[1A\u001b[0G\u001b[?25l\u001b[34m[+] Running 2/2\u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-upf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.3s \u001b[0m\n",
+ " \u001b[32m✔\u001b[0m Container oai-smf-slice2 \u001b[32mRemoved\u001b[0m \u001b[34m0.4s \u001b[0m\n",
+ "\u001b[?25h"
+ ]
+ }
+ ],
+ "source": [
+ "!docker compose -f docker-compose-oai-cn-slice1.yaml down\n",
+ "!docker compose -f docker-compose-oai-cn-slice2.yaml down"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "deleting namespace for UE ID 1 name ue1\n",
+ "deleting namespace for UE ID 3 name ue3\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "deleting namespace for UE ID 3 name ue3\n"
+ ]
+ }
+ ],
+ "source": [
+ "!sudo ./multi_ue.sh -d1 \n",
+ "!sudo ./multi_ue.sh -d3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/build_ric_oai.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/build_ric_oai.sh
new file mode 100755
index 00000000..db5429dc
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/build_ric_oai.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+
+# Script to build OpenAirInterface5G and FlexRIC
+
+# Exit on any error
+set -e
+
+# Define base directory
+BASE_DIR="$(pwd)"
+
+# Function to check if a command succeeded
+check_status() {
+ if [ $? -ne 0 ]; then
+ echo "Error: $1 failed. Exiting."
+ exit 1
+ fi
+}
+
+echo "Starting OpenAirInterface5G build process..."
+
+# Navigate to openairinterface5g directory
+cd "$BASE_DIR/openairinterface5g" || {
+ echo "Error: Cannot find openairinterface5g directory"
+ exit 1
+}
+
+# Navigate to cmake_targets
+cd cmake_targets || {
+ echo "Error: Cannot find cmake_targets directory"
+ exit 1
+}
+
+# Install dependencies
+echo "Installing dependencies..."
+./build_oai -I
+check_status "Dependency installation"
+
+# Build OAI with specified options
+echo "Building OAI with SIMU, gNB, nrUE, and E2 support..."
+./build_oai -c -C -w SIMU --gNB --nrUE --build-e2 --ninja
+check_status "OAI build"
+
+echo "OpenAirInterface5G build completed."
+
+# Build FlexRIC
+echo "Starting FlexRIC build process..."
+cd "$BASE_DIR/flexric" || {
+ echo "Error: Cannot find flexric directory"
+ exit 1
+}
+
+# Create and enter build directory
+mkdir -p build
+cd build || {
+ echo "Error: Cannot create or enter build directory"
+ exit 1
+}
+
+# Configure with CMake
+echo "Configuring FlexRIC with CMake..."
+cmake -DXAPP_MULTILANGUAGE=OFF ..
+check_status "CMake configuration"
+
+# Compile with make
+echo "Compiling FlexRIC..."
+make -j8
+check_status "FlexRIC compilation"
+
+# Install
+echo "Installing FlexRIC..."
+make install
+check_status "FlexRIC installation"
+
+echo "Build and installation completed successfully!"
\ No newline at end of file
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/build_ric_oai_ne.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/build_ric_oai_ne.sh
new file mode 100755
index 00000000..6810fb7d
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/build_ric_oai_ne.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+set -e # Exit immediately if any command fails
+
+# Save the initial directory
+INITIAL_DIR=$(pwd)
+
+# Step 0: Install necessary compilers (gcc-12, g++-12)
+echo ">>> Updating apt and installing gcc-12, g++-12..."
+sudo apt update
+sudo apt install -y gcc-12 g++-12
+sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
+sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100
+
+# Step 1: Clone and build openairinterface5g
+echo ">>> Cloning and building openairinterface5g..."
+git clone https://gitlab.eurecom.fr/oai/openairinterface5g
+cd openairinterface5g || { echo "Failed to enter openairinterface5g directory"; exit 1; }
+git checkout slicing-spring-of-code
+cd cmake_targets || { echo "Failed to enter cmake_targets"; exit 1; }
+
+# Build openairinterface5g
+./build_oai -I
+./build_oai -c -C -w SIMU --gNB --nrUE --build-e2 --ninja
+
+# Step 2: Go back to the initial directory
+cd "$INITIAL_DIR" || { echo "Failed to return to initial directory"; exit 1; }
+
+# Step 3: Clone and build flexric
+echo ">>> Cloning and building flexric..."
+git clone https://gitlab.eurecom.fr/mosaic5g/flexric
+cd flexric || { echo "Failed to enter flexric directory"; exit 1; }
+git checkout slicing-spring-of-code
+
+# Step 4: Copy necessary files
+cp "$INITIAL_DIR/xapp_rc_slice_dynamic.c" examples/xApp/c/ctrl/ || { echo "Failed to copy xapp_rc_slice_dynamic.c"; exit 1; }
+cp "$INITIAL_DIR/CMakeLists.txt" examples/xApp/c/ctrl/ || { echo "Failed to copy CMakeLists.txt"; exit 1; }
+
+# Step 5: Build flexric
+mkdir -p build && cd build
+cmake -DXAPP_MULTILANGUAGE=OFF ..
+make -j8
+sudo make install
+
+echo ">>> All steps completed successfully!"
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/change_rc_slice.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/change_rc_slice.sh
new file mode 100755
index 00000000..2a6d3b60
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/change_rc_slice.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# 1 = slice 1 Ratio
+# 2 = slice 2 Ratio
+
+parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
+
+cd "$parent_path"
+
+if [ -n "$1" ] && [ -n "$2" ]; then
+
+ sum=$1+$2
+ echo $sum
+ #if [ "$sum" -gt 100 ]; then
+ # echo "The sum of both ratios must not be greater than 100"
+ # exit()
+ #fi
+
+ export SLICE1_RATIO=$1
+ export SLICE2_RATIO=$2
+else
+ echo "You did not specify the slicing ratios, using default 80:20"
+fi
+
+./flexric/build/examples/xApp/c/ctrl/xapp_rc_slice_dynamic
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/basic_slice1_config.yaml b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/basic_slice1_config.yaml
new file mode 100644
index 00000000..dfe6869f
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/basic_slice1_config.yaml
@@ -0,0 +1,230 @@
+################################################################################
+# Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The OpenAirInterface Software Alliance licenses this file to You under
+# the OAI Public License, Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.openairinterface.org/?page_id=698
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#-------------------------------------------------------------------------------
+# For more information about the OpenAirInterface (OAI) Software Alliance:
+# contact@openairinterface.org
+################################################################################
+
+# OAI CN Configuration File
+### This file can be used by all OAI NFs
+### Some fields are specific to an NF and will be ignored by other NFs
+
+## NOTE ON YAML ANCHORS ##
+# We use YAML anchors to ease the configuration and to avoid duplicating parts of the configuration.
+# This is especially true for the SNSSAIs, as we have to define them for multiple NFs.
+# Please note that the use of anchors is not mandatory, and you can define the SNSSAI in each NF yourself.
+# You can read more about anchors here: https://yaml.org/spec/1.2.2/#anchors-and-aliases
+
+############# Common configuration
+
+# Log level for all the NFs
+log_level:
+ general: debug
+
+# If you enable registration, the other NFs will use the NRF discovery mechanism
+register_nf:
+ general: yes
+
+http_version: 2
+
+############## SBI Interfaces
+### Each NF takes its local SBI interfaces and remote interfaces from here, unless it gets them using NRF discovery mechanisms
+nfs:
+ amf:
+ host: oai-amf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ n2:
+ interface_name: eth0
+ port: 38412
+ smf:
+ host: oai-smf-slice1
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ n4:
+ interface_name: eth0
+ port: 8805
+ upf:
+ host: oai-upf-slice1
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ n3:
+ interface_name: eth0
+ port: 2152
+ n4:
+ interface_name: eth0
+ port: 8805
+ n6:
+ interface_name: eth0
+ n9:
+ interface_name: eth0
+ port: 2152
+ udm:
+ host: oai-udm
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ udr:
+ host: oai-udr
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ ausf:
+ host: oai-ausf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ nrf:
+ host: oai-nrf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ pcf:
+ host: oai-pcf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ nssf:
+ host: oai-nssf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+
+#### Common for UDR and AMF
+database:
+ host: mysql
+ user: test
+ type: mysql
+ password: test
+ database_name: oai_db
+ generate_random: true
+ connection_timeout: 300 # seconds
+
+############## NF-specific configuration
+amf:
+ amf_name: "OAI-AMF"
+ # This really depends on if we want to keep the "mini" version or not
+ support_features_options:
+ enable_simple_scenario: no # "no" by default with the normal deployment scenarios with AMF/SMF/UPF/AUSF/UDM/UDR/NRF.
+ # set it to "yes" to use with the minimalist deployment scenario (including only AMF/SMF/UPF) by using the internal AUSF/UDM implemented inside AMF.
+ # There's no NRF in this scenario, SMF info is taken from "nfs" section.
+ enable_nssf: yes
+ enable_smf_selection: yes
+ relative_capacity: 30
+ statistics_timer_interval: 20 # in seconds
+ emergency_support: false
+ served_guami_list:
+ - mcc: 001
+ mnc: 01
+ amf_region_id: 01
+ amf_set_id: 001
+ amf_pointer: 01
+ plmn_support_list:
+ - mcc: 001
+ mnc: 01
+ tac: 0x0001
+ nssai:
+ - sst: 1
+ sd: 000001 # in hex
+ - sst: 1
+ sd: 000005 # in hex
+ supported_integrity_algorithms:
+ - "NIA0"
+ - "NIA1"
+ - "NIA2"
+ supported_encryption_algorithms:
+ - "NEA0"
+ - "NEA1"
+ - "NEA2"
+
+smf:
+ ue_mtu: 1500
+ support_features:
+ use_local_subscription_info: yes # Use infos from local_subscription_info or from UDM
+ use_local_pcc_rules: no # Use infos from local_pcc_rules or from PCF
+ # we resolve from NRF, this is just to configure usage_reporting
+ upfs:
+ - host: oai-upf
+ config:
+ enable_usage_reporting: no
+ enable_qers: no
+ ue_dns:
+ primary_ipv4: "172.21.3.100"
+ primary_ipv6: "2001:4860:4860::8888"
+ secondary_ipv4: "8.8.8.8"
+ secondary_ipv6: "2001:4860:4860::8888"
+ ims:
+ pcscf_ipv4: "127.0.0.1"
+ pcscf_ipv6: "fe80::7915:f408:1787:db8b"
+ # the DNN you configure here should be configured in "dnns"
+ # follows the SmfInfo datatype from 3GPP TS 29.510
+ smf_info:
+ sNssaiSmfInfoList:
+ - sNssai:
+ sst: 1
+ sd: "000001"
+ dnnSmfInfoList:
+ - dnn: "oai"
+ local_subscription_infos:
+ - single_nssai:
+ sst: 1
+ sd: "000001"
+ dnn: "oai"
+ qos_profile:
+ 5qi: 9
+ session_ambr_ul: "200Mbps"
+ session_ambr_dl: "400Mbps"
+
+upf:
+ support_features:
+ enable_bpf_datapath: no # If "on": BPF is used as datapath else simpleswitch is used, DEFAULT= off
+ enable_snat: yes # If "on": Source natting is done for UE, DEFAULT= off
+ remote_n6_gw: localhost # Dummy host since simple-switch does not use N6 GW
+ smfs:
+ - host: oai-smf # To be used for PFCP association in case of no-NRF
+ upf_info:
+ sNssaiUpfInfoList:
+ - sNssai:
+ sst: 1
+ sd: "000001"
+ dnnUpfInfoList:
+ - dnn: "oai"
+
+## DNN configuration
+dnns:
+ - dnn: "oai"
+ pdu_session_type: "IPV4"
+ ipv4_subnet: "12.1.1.0/25"
+
+pcf:
+ local_policy:
+ policy_decisions_path: /openair-pcf/policies/policy_decisions
+ pcc_rules_path: /openair-pcf/policies/pcc_rules
+ traffic_rules_path: /openair-pcf/policies/traffic_rules
+ qos_data_path: /openair-pcf/policies/qos_data
\ No newline at end of file
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/basic_slice2_config.yaml b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/basic_slice2_config.yaml
new file mode 100644
index 00000000..188423bd
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/basic_slice2_config.yaml
@@ -0,0 +1,178 @@
+################################################################################
+# Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The OpenAirInterface Software Alliance licenses this file to You under
+# the OAI Public License, Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.openairinterface.org/?page_id=698
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#-------------------------------------------------------------------------------
+# For more information about the OpenAirInterface (OAI) Software Alliance:
+# contact@openairinterface.org
+################################################################################
+
+# OAI CN Configuration File
+### This file can be used by all OAI NFs
+### Some fields are specific to an NF and will be ignored by other NFs
+
+## NOTE ON YAML ANCHORS ##
+# We use YAML anchors to ease the configuration and to avoid duplicating parts of the configuration.
+# This is especially true for the SNSSAIs, as we have to define them for multiple NFs.
+# Please note that the use of anchors is not mandatory, and you can define the SNSSAI in each NF yourself.
+# You can read more about anchors here: https://yaml.org/spec/1.2.2/#anchors-and-aliases
+
+############# Common configuration
+
+# Log level for all the NFs
+log_level:
+ general: debug
+
+# If you enable registration, the other NFs will use the NRF discovery mechanism
+register_nf:
+ general: yes
+
+http_version: 2
+
+############## SBI Interfaces
+### Each NF takes its local SBI interfaces and remote interfaces from here, unless it gets them using NRF discovery mechanisms
+nfs:
+ amf:
+ host: oai-amf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ n2:
+ interface_name: eth0
+ port: 38412
+ smf:
+ host: oai-smf-slice2
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ n4:
+ interface_name: eth0
+ port: 8805
+ upf:
+ host: oai-upf-slice2
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ n3:
+ interface_name: eth0
+ port: 2152
+ n4:
+ interface_name: eth0
+ port: 8805
+ n6:
+ interface_name: eth0
+ n9:
+ interface_name: eth0
+ port: 2152
+ udm:
+ host: oai-udm
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ udr:
+ host: oai-udr
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ ausf:
+ host: oai-ausf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ nrf:
+ host: oai-nrf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ pcf:
+ host: oai-pcf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+ nssf:
+ host: oai-nssf
+ sbi:
+ port: 8080
+ api_version: v1
+ interface_name: eth0
+
+smf:
+ ue_mtu: 1500
+ support_features:
+ use_local_subscription_info: yes # Use infos from local_subscription_info or from UDM
+ use_local_pcc_rules: no # Use infos from local_pcc_rules or from PCF
+ # we resolve from NRF, this is just to configure usage_reporting
+ upfs:
+ - host: oai-upf
+ config:
+ enable_usage_reporting: no
+ enable_qers: no
+ ue_dns:
+ primary_ipv4: "172.21.3.100"
+ primary_ipv6: "2001:4860:4860::8888"
+ secondary_ipv4: "8.8.8.8"
+ secondary_ipv6: "2001:4860:4860::8888"
+ ims:
+ pcscf_ipv4: "127.0.0.1"
+ pcscf_ipv6: "fe80::7915:f408:1787:db8b"
+ # the DNN you configure here should be configured in "dnns"
+ # follows the SmfInfo datatype from 3GPP TS 29.510
+ smf_info:
+ sNssaiSmfInfoList:
+ - sNssai:
+ sst: 1
+ sd: "000005"
+ dnnSmfInfoList:
+ - dnn: "oai2"
+ local_subscription_infos:
+ - single_nssai:
+ sst: 1
+ sd: "000005"
+ dnn: "oai2"
+ qos_profile:
+ 5qi: 9
+ session_ambr_ul: "200Mbps"
+ session_ambr_dl: "400Mbps"
+
+upf:
+ support_features:
+ enable_bpf_datapath: no # If "on": BPF is used as datapath else simpleswitch is used, DEFAULT= off
+ enable_snat: yes # If "on": Source natting is done for UE, DEFAULT= off
+ remote_n6_gw: localhost # Dummy host since simple-switch does not use N6 GW
+ smfs:
+ - host: oai-smf # To be used for PFCP association in case of no-NRF
+ upf_info:
+ sNssaiUpfInfoList:
+ - sNssai:
+ sst: 1
+ sd: "000005"
+ dnnUpfInfoList:
+ - dnn: "oai2"
+
+
+## DNN configuration
+dnns:
+ - dnn: "oai2"
+ pdu_session_type: "IPV4"
+ ipv4_subnet: "12.1.1.128/25"
+
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/nssf_slice_config.yaml b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/nssf_slice_config.yaml
new file mode 100644
index 00000000..a76a424e
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/conf/nssf_slice_config.yaml
@@ -0,0 +1,46 @@
+# Reference:- TS 29.531 R16.0.0., Section- 6.1.6 Data Model
+info:
+ version: 1.4.0
+ description: OAI-NSSF Release v1.4.0
+configuration:
+ nsiInfoList:
+ - snssai:
+ sst: 1
+ sd: '000001'
+ nsiInformationList:
+ nrfId: http://192.168.70.130:8080/nnrf-disc/v1/nf-instances
+ nsiId: '11'
+ - snssai:
+ sst: 1
+ sd: '000005'
+ nsiInformationList:
+ nrfId: http://192.168.70.130:8080/nnrf-disc/v1/nf-instances
+ nsiId: '12'
+ taInfoList:
+ - tai:
+ plmnId:
+ mcc: '001'
+ mnc: '01'
+ tac: '1'
+ supportedSnssaiList:
+ - sst: 1
+ sd: '000001'
+ - sst: 11
+ sd: '000005'
+ amfInfoList:
+ - targetAmfSet: oai5gcn.mcc001.mnc01.regionid001.setid1.3gppnetwork.org
+ nrfAmfSet: http://192.168.70.130:8080/nnrf-disc/v1/nf-instances'
+ nrfAmfSetNfMgtUri: http://192.168.70.130:8080/nnrf-nfm/v1/nf-instances
+ amfList:
+ - nfId: 405e8251-cc5a-45dd-a494-efb9eaf1cd58
+ supportedNssaiAvailabilityData:
+ tai:
+ plmnId:
+ mcc: 001cd ..
+ mnc: 01
+ tac: 0x0001
+ supportedSnssaiList:
+ - sst: 1
+ sd: "000001"
+ - sst: 1
+ sd: "000005"
\ No newline at end of file
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/database/oai_db2.sql b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/database/oai_db2.sql
new file mode 100755
index 00000000..f1c985de
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/database/oai_db2.sql
@@ -0,0 +1,326 @@
+-- phpMyAdmin SQL Dump
+-- version 5.1.0
+-- https://www.phpmyadmin.net/
+--
+-- Host: 172.16.200.10:3306
+-- Generation Time: Mar 22, 2021 at 10:31 AM
+-- Server version: 5.7.33
+-- PHP Version: 7.4.15
+
+SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
+START TRANSACTION;
+SET time_zone = "+00:00";
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+
+--
+-- Database: `oai_db`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `AccessAndMobilitySubscriptionData`
+--
+
+CREATE TABLE `AccessAndMobilitySubscriptionData` (
+ `ueid` varchar(15) NOT NULL,
+ `servingPlmnid` varchar(15) NOT NULL,
+ `supportedFeatures` varchar(50) DEFAULT NULL,
+ `gpsis` json DEFAULT NULL,
+ `internalGroupIds` json DEFAULT NULL,
+ `sharedVnGroupDataIds` json DEFAULT NULL,
+ `subscribedUeAmbr` json DEFAULT NULL,
+ `nssai` json DEFAULT NULL,
+ `ratRestrictions` json DEFAULT NULL,
+ `forbiddenAreas` json DEFAULT NULL,
+ `serviceAreaRestriction` json DEFAULT NULL,
+ `coreNetworkTypeRestrictions` json DEFAULT NULL,
+ `rfspIndex` int(10) DEFAULT NULL,
+ `subsRegTimer` int(10) DEFAULT NULL,
+ `ueUsageType` int(10) DEFAULT NULL,
+ `mpsPriority` tinyint(1) DEFAULT NULL,
+ `mcsPriority` tinyint(1) DEFAULT NULL,
+ `activeTime` int(10) DEFAULT NULL,
+ `sorInfo` json DEFAULT NULL,
+ `sorInfoExpectInd` tinyint(1) DEFAULT NULL,
+ `sorafRetrieval` tinyint(1) DEFAULT NULL,
+ `sorUpdateIndicatorList` json DEFAULT NULL,
+ `upuInfo` json DEFAULT NULL,
+ `micoAllowed` tinyint(1) DEFAULT NULL,
+ `sharedAmDataIds` json DEFAULT NULL,
+ `odbPacketServices` json DEFAULT NULL,
+ `serviceGapTime` int(10) DEFAULT NULL,
+ `mdtUserConsent` json DEFAULT NULL,
+ `mdtConfiguration` json DEFAULT NULL,
+ `traceData` json DEFAULT NULL,
+ `cagData` json DEFAULT NULL,
+ `stnSr` varchar(50) DEFAULT NULL,
+ `cMsisdn` varchar(50) DEFAULT NULL,
+ `nbIoTUePriority` int(10) DEFAULT NULL,
+ `nssaiInclusionAllowed` tinyint(1) DEFAULT NULL,
+ `rgWirelineCharacteristics` varchar(50) DEFAULT NULL,
+ `ecRestrictionDataWb` json DEFAULT NULL,
+ `ecRestrictionDataNb` tinyint(1) DEFAULT NULL,
+ `expectedUeBehaviourList` json DEFAULT NULL,
+ `primaryRatRestrictions` json DEFAULT NULL,
+ `secondaryRatRestrictions` json DEFAULT NULL,
+ `edrxParametersList` json DEFAULT NULL,
+ `ptwParametersList` json DEFAULT NULL,
+ `iabOperationAllowed` tinyint(1) DEFAULT NULL,
+ `wirelineForbiddenAreas` json DEFAULT NULL,
+ `wirelineServiceAreaRestriction` json DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `Amf3GppAccessRegistration`
+--
+
+CREATE TABLE `Amf3GppAccessRegistration` (
+ `ueid` varchar(15) NOT NULL,
+ `amfInstanceId` varchar(50) NOT NULL,
+ `supportedFeatures` varchar(50) DEFAULT NULL,
+ `purgeFlag` tinyint(1) DEFAULT NULL,
+ `pei` varchar(50) DEFAULT NULL,
+ `imsVoPs` json DEFAULT NULL,
+ `deregCallbackUri` varchar(50) NOT NULL,
+ `amfServiceNameDereg` json DEFAULT NULL,
+ `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL,
+ `amfServiceNamePcscfRest` json DEFAULT NULL,
+ `initialRegistrationInd` tinyint(1) DEFAULT NULL,
+ `guami` json NOT NULL,
+ `backupAmfInfo` json DEFAULT NULL,
+ `drFlag` tinyint(1) DEFAULT NULL,
+ `ratType` json NOT NULL,
+ `urrpIndicator` tinyint(1) DEFAULT NULL,
+ `amfEeSubscriptionId` varchar(50) DEFAULT NULL,
+ `epsInterworkingInfo` json DEFAULT NULL,
+ `ueSrvccCapability` tinyint(1) DEFAULT NULL,
+ `registrationTime` varchar(50) DEFAULT NULL,
+ `vgmlcAddress` json DEFAULT NULL,
+ `contextInfo` json DEFAULT NULL,
+ `noEeSubscriptionInd` tinyint(1) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `AuthenticationStatus`
+--
+
+CREATE TABLE `AuthenticationStatus` (
+ `ueid` varchar(20) NOT NULL,
+ `nfInstanceId` varchar(50) NOT NULL,
+ `success` tinyint(1) NOT NULL,
+ `timeStamp` varchar(50) NOT NULL,
+ `authType` varchar(25) NOT NULL,
+ `servingNetworkName` varchar(50) NOT NULL,
+ `authRemovalInd` tinyint(1) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `AuthenticationSubscription`
+--
+
+CREATE TABLE `AuthenticationSubscription` (
+ `ueid` varchar(20) NOT NULL,
+ `authenticationMethod` varchar(25) NOT NULL,
+ `encPermanentKey` varchar(50) DEFAULT NULL,
+ `protectionParameterId` varchar(50) DEFAULT NULL,
+ `sequenceNumber` json DEFAULT NULL,
+ `authenticationManagementField` varchar(50) DEFAULT NULL,
+ `algorithmId` varchar(50) DEFAULT NULL,
+ `encOpcKey` varchar(50) DEFAULT NULL,
+ `encTopcKey` varchar(50) DEFAULT NULL,
+ `vectorGenerationInHss` tinyint(1) DEFAULT NULL,
+ `n5gcAuthMethod` varchar(15) DEFAULT NULL,
+ `rgAuthenticationInd` tinyint(1) DEFAULT NULL,
+ `supi` varchar(20) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `AuthenticationSubscription`
+--
+
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+ ('001010000000001', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '001010000000001');
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+ ('001010000000002', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '001010000000002');
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+ ('001010000000003', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '001010000000003');
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+ ('001010000000004', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '001010000000004');
+INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
+ ('001010000010775', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '001010000010775');
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SdmSubscriptions`
+--
+
+CREATE TABLE `SdmSubscriptions` (
+ `ueid` varchar(15) NOT NULL,
+ `subsId` int(10) UNSIGNED NOT NULL,
+ `nfInstanceId` varchar(50) NOT NULL,
+ `implicitUnsubscribe` tinyint(1) DEFAULT NULL,
+ `expires` varchar(50) DEFAULT NULL,
+ `callbackReference` varchar(50) NOT NULL,
+ `amfServiceName` json DEFAULT NULL,
+ `monitoredResourceUris` json NOT NULL,
+ `singleNssai` json DEFAULT NULL,
+ `dnn` varchar(50) DEFAULT NULL,
+ `subscriptionId` varchar(50) DEFAULT NULL,
+ `plmnId` json DEFAULT NULL,
+ `immediateReport` tinyint(1) DEFAULT NULL,
+ `report` json DEFAULT NULL,
+ `supportedFeatures` varchar(50) DEFAULT NULL,
+ `contextInfo` json DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SessionManagementSubscriptionData`
+--
+
+CREATE TABLE `SessionManagementSubscriptionData` (
+ `ueid` varchar(15) NOT NULL,
+ `servingPlmnid` varchar(15) NOT NULL,
+ `singleNssai` json NOT NULL,
+ `dnnConfigurations` json DEFAULT NULL,
+ `internalGroupIds` json DEFAULT NULL,
+ `sharedVnGroupDataIds` json DEFAULT NULL,
+ `sharedDnnConfigurationsId` varchar(50) DEFAULT NULL,
+ `odbPacketServices` json DEFAULT NULL,
+ `traceData` json DEFAULT NULL,
+ `sharedTraceDataId` varchar(50) DEFAULT NULL,
+ `expectedUeBehavioursList` json DEFAULT NULL,
+ `suggestedPacketNumDlList` json DEFAULT NULL,
+ `3gppChargingCharacteristics` varchar(50) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `SessionManagementSubscriptionData`
+--
+
+INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
+('001010000000001', '00101', '{\"sst\": 1, \"sd\": \"000001\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
+INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
+('001010000000002', '00101', '{\"sst\": 1, \"sd\": \"000005\"}','{\"oai2\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}},\"ims\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4V6\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 2,\"arp\":{\"priorityLevel\": 15,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"}}}');
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SmfRegistrations`
+--
+
+CREATE TABLE `SmfRegistrations` (
+ `ueid` varchar(15) NOT NULL,
+ `subpduSessionId` int(10) NOT NULL,
+ `smfInstanceId` varchar(50) NOT NULL,
+ `smfSetId` varchar(50) DEFAULT NULL,
+ `supportedFeatures` varchar(50) DEFAULT NULL,
+ `pduSessionId` int(10) NOT NULL,
+ `singleNssai` json NOT NULL,
+ `dnn` varchar(50) DEFAULT NULL,
+ `emergencyServices` tinyint(1) DEFAULT NULL,
+ `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL,
+ `plmnId` json NOT NULL,
+ `pgwFqdn` varchar(50) DEFAULT NULL,
+ `epdgInd` tinyint(1) DEFAULT NULL,
+ `deregCallbackUri` varchar(50) DEFAULT NULL,
+ `registrationReason` json DEFAULT NULL,
+ `registrationTime` varchar(50) DEFAULT NULL,
+ `contextInfo` json DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `SmfSelectionSubscriptionData`
+--
+
+CREATE TABLE `SmfSelectionSubscriptionData` (
+ `ueid` varchar(15) NOT NULL,
+ `servingPlmnid` varchar(15) NOT NULL,
+ `supportedFeatures` varchar(50) DEFAULT NULL,
+ `subscribedSnssaiInfos` json DEFAULT NULL,
+ `sharedSnssaiInfosId` varchar(50) DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Indexes for dumped tables
+--
+
+--
+-- Indexes for table `AccessAndMobilitySubscriptionData`
+--
+ALTER TABLE `AccessAndMobilitySubscriptionData`
+ ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE;
+
+--
+-- Indexes for table `Amf3GppAccessRegistration`
+--
+ALTER TABLE `Amf3GppAccessRegistration`
+ ADD PRIMARY KEY (`ueid`);
+
+--
+-- Indexes for table `AuthenticationStatus`
+--
+ALTER TABLE `AuthenticationStatus`
+ ADD PRIMARY KEY (`ueid`);
+
+--
+-- Indexes for table `AuthenticationSubscription`
+--
+ALTER TABLE `AuthenticationSubscription`
+ ADD PRIMARY KEY (`ueid`);
+
+--
+-- Indexes for table `SdmSubscriptions`
+--
+ALTER TABLE `SdmSubscriptions`
+ ADD PRIMARY KEY (`subsId`,`ueid`) USING BTREE;
+
+--
+-- Indexes for table `SessionManagementSubscriptionData`
+--
+ALTER TABLE `SessionManagementSubscriptionData`
+ ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE;
+
+--
+-- Indexes for table `SmfRegistrations`
+--
+ALTER TABLE `SmfRegistrations`
+ ADD PRIMARY KEY (`ueid`,`subpduSessionId`) USING BTREE;
+
+--
+-- Indexes for table `SmfSelectionSubscriptionData`
+--
+ALTER TABLE `SmfSelectionSubscriptionData`
+ ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE;
+
+--
+-- AUTO_INCREMENT for dumped tables
+--
+
+--
+-- AUTO_INCREMENT for table `SdmSubscriptions`
+--
+ALTER TABLE `SdmSubscriptions`
+ MODIFY `subsId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
+COMMIT;
+
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice1.yaml b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice1.yaml
new file mode 100644
index 00000000..156d7956
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice1.yaml
@@ -0,0 +1,202 @@
+version: '2.3'
+services:
+ mysql:
+ container_name: "mysql"
+ image: mysql:8.0
+ volumes:
+ - ${OAIR_ROOT:-.}/database/oai_db2.sql:/docker-entrypoint-initdb.d/oai_db.sql
+ - ${OAIR_ROOT:-.}/healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh
+ environment:
+ - TZ=Europe/Paris
+ - MYSQL_DATABASE=oai_db
+ - MYSQL_USER=test
+ - MYSQL_PASSWORD=test
+ - MYSQL_ROOT_PASSWORD=linux
+ healthcheck:
+ test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
+ interval: 10s
+ timeout: 5s
+ retries: 30
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.131
+ oai-udr:
+ container_name: "oai-udr"
+ image: oaisoftwarealliance/oai-udr:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-udr/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - mysql
+ - oai-nrf
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.136
+ oai-udm:
+ container_name: "oai-udm"
+ image: oaisoftwarealliance/oai-udm:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-udm/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - oai-udr
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.137
+ oai-ausf:
+ container_name: "oai-ausf"
+ image: oaisoftwarealliance/oai-ausf:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-ausf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - oai-udm
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.138
+ oai-nrf:
+ container_name: "oai-nrf"
+ image: oaisoftwarealliance/oai-nrf:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-nrf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.130
+ oai-amf:
+ container_name: "oai-amf"
+ image: oaisoftwarealliance/oai-amf:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ # - 38412/sctp
+ extra_hosts:
+ - "oai-nrf:192.168.70.131"
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-amf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - mysql
+ - oai-nrf
+ - oai-ausf
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.132
+ oai-smf-slice1:
+ container_name: "oai-smf-slice1"
+ image: oaisoftwarealliance/oai-smf:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ - 8805/udp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-smf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - oai-nrf
+ - oai-amf
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.133
+ oai-pcf:
+ container_name: "oai-pcf"
+ image: oaisoftwarealliance/oai-pcf:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ volumes:
+ - ${OAIR_ROOT:-.}/policies/qos:/openair-pcf/policies
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-pcf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - oai-nrf
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.139
+ oai-upf-slice1:
+ container_name: "oai-upf-slice1"
+ image: oaisoftwarealliance/oai-upf:v2.1.0
+ expose:
+ - 2152/udp
+ - 8805/udp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-upf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - oai-nrf
+ - oai-smf-slice1
+ cap_add:
+ - NET_ADMIN
+ - SYS_ADMIN
+ cap_drop:
+ - ALL
+ privileged: true
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.134
+
+ oai-ext-dn:
+ privileged: true
+ init: false
+ container_name: oai-ext-dn
+ image: oaisoftwarealliance/trf-gen-cn5g:latest
+ entrypoint: /bin/bash -c \
+ "ip route add 12.1.1.0/25 via 192.168.70.134 dev eth0;"\
+ "ip route add 12.1.1.128/25 via 192.168.70.143 dev eth0;"\
+ "ip route; sleep infinity"
+ healthcheck:
+ test: /bin/bash -c "ip r | grep 12.1.1"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.135
+ oai-nssf:
+ container_name: "oai-nssf"
+ image: oaisoftwarealliance/oai-nssf:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice1_config.yaml:/openair-nssf/etc/config.yaml
+ - ${OAIR_ROOT:-.}/conf/nssf_slice_config.yaml:/openair-nssf/etc/nssf_slice_config.yaml
+ cap_add:
+ - NET_ADMIN
+ - SYS_ADMIN
+ cap_drop:
+ - ALL
+ privileged: true
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.140
+
+networks:
+ public_net:
+ driver: bridge
+ name: demo-oai-public-net
+ ipam:
+ config:
+ - subnet: 192.168.70.0/24
+ driver_opts:
+ com.docker.network.bridge.name: "demo-oai"
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice2.yaml b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice2.yaml
new file mode 100644
index 00000000..4458aa62
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/docker-compose-oai-cn-slice2.yaml
@@ -0,0 +1,48 @@
+version: '2.3'
+services:
+ oai-smf-slice2:
+ container_name: "oai-smf-slice2"
+ image: oaisoftwarealliance/oai-smf:v2.1.0
+ expose:
+ - 80/tcp
+ - 8080/tcp
+ - 8805/udp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice2_config.yaml:/openair-smf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.142
+
+ oai-upf-slice2:
+ container_name: "oai-upf-slice2"
+ image: oaisoftwarealliance/oai-upf:v2.1.0
+ expose:
+ - 2152/udp
+ - 8805/udp
+ volumes:
+ - ${OAIR_ROOT:-.}/conf/basic_slice2_config.yaml:/openair-upf/etc/config.yaml
+ environment:
+ - TZ=Europe/Paris
+ depends_on:
+ - oai-smf-slice2
+ cap_add:
+ - NET_ADMIN
+ - SYS_ADMIN
+ cap_drop:
+ - ALL
+ privileged: true
+ networks:
+ public_net:
+ ipv4_address: 192.168.70.143
+
+networks:
+ public_net:
+ driver: bridge
+ name: demo-oai-public-net
+ ipam:
+ config:
+ - subnet: 192.168.70.0/24
+ driver_opts:
+ com.docker.network.bridge.name: "demo-oai"
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/entrypoint.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/entrypoint.sh
new file mode 100644
index 00000000..91fa0037
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/entrypoint.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+set -e
+
+cwd=$(pwd)
+
+echo "Installing/Building flexric"
+cd $cwd/flexric/build && rm -rf *
+cd $cwd/flexric && mkdir -p build && cd build \
+ && cmake .. -DXAPP_C_INSTALL=TRUE -DE2AP_VERSION="E2AP_V2" \
+ -DCMAKE_C_FLAGS="-Wa,--noexecstack" \
+ && make -j8 && make install
+cd $cwd
+
+echo "Installing/Building openairinterface5g"
+cd ./openairinterface5g/ && source ./oaienv && source ./cmake_targets/tools/build_helper && install_asn1c_from_source
+cd $cwd
+
+echo "Starting FlexRIC RIC..."
+stdbuf -oL ./flexric/build/examples/ric/nearRT-RIC > logs/RIC.log 2>&1 &
+RIC_PID=$!
+sleep 2
+
+echo "Starting gNodeB..."
+cd ./openairinterface5g/
+source ./oaienv
+./cmake_targets/ran_build/build/nr-softmodem -O ran-conf/gnb.conf --sa --rfsim -E --gNBs.[0].min_rxtxtime 6 > ../logs/gNodeB.log 2>&1 &
+GNB_PID=$!
+cd ..
+
+echo "Setting initial bandwidth allocation to 50/50..."
+./change_rc_slice.sh 50 50
+
+echo "Starting UE1..."
+./multi_ue.sh -c1 -e &
+sleep 5
+ip netns exec ue1 bash -c 'LD_LIBRARY_PATH=. ./openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem --rfsimulator.serveraddr 10.201.1.100 -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa -O ran-conf/ue_1.conf -E' > logs/UE1.log 2>&1 &
+
+echo "Starting UE2..."
+./multi_ue.sh -c3 -e &
+sleep 5
+ip netns exec ue3 bash -c 'LD_LIBRARY_PATH=. ./openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem --rfsimulator.serveraddr 10.203.1.100 -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa -O ran-conf/ue_2.conf -E' > logs/UE2.log 2>&1 &
+
+echo "Starting iperf servers..."
+docker exec -t oai-ext-dn iperf3 -s -p 5201 > logs/docker_iperfserver1.log 2>&1 &
+docker exec -t oai-ext-dn iperf3 -s -p 5202 > logs/docker_iperfserver2.log 2>&1 &
+
+echo "Starting traffic generators..."
+stdbuf -oL ./traffic_generator_ue1.sh > logs/traffic_generator_ue1.log 2>&1 &
+stdbuf -oL ./traffic_generator_ue2.sh > logs/traffic_generator_ue2.log 2>&1 &
+
+echo "Starting monitoring processes..."
+python3 ./monitor_script_1.py > logs/monitor_script_1.log 2>&1 &
+python3 ./monitor_script_2.py > logs/monitor_script_2.log 2>&1 &
+
+echo "5G Lab setup complete. FlexRIC RIC PID: $RIC_PID, gNodeB PID: $GNB_PID"
+echo "Press Ctrl+C to terminate the lab."
+while true; do sleep 60; done
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/CMakeLists.txt b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/CMakeLists.txt
new file mode 100644
index 00000000..df0564de
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/CMakeLists.txt
@@ -0,0 +1,40 @@
+add_executable(xapp_mac_ctrl
+ mac_ctrl.c
+ ../../../../src/util/alg_ds/alg/defer.c
+ )
+
+ target_link_libraries(xapp_mac_ctrl
+ PUBLIC
+ e42_xapp
+ -pthread
+ -lsctp
+ -ldl
+ )
+
+add_executable(xapp_rc_slice_ctrl
+ xapp_rc_slice_ctrl.c
+ ../../../../src/util/alg_ds/alg/defer.c
+ )
+
+add_executable(xapp_rc_slice_dynamic
+ xapp_rc_slice_dynamic.c
+ ../../../../src/util/alg_ds/alg/defer.c
+)
+
+
+target_link_libraries(xapp_rc_slice_ctrl
+ PUBLIC
+ e42_xapp
+ -pthread
+ -lsctp
+ -ldl
+ )
+
+target_link_libraries(xapp_rc_slice_dynamic
+ PUBLIC
+ e42_xapp
+ -pthread
+ -lsctp
+ -ldl
+)
+
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/setup.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/setup.sh
new file mode 100755
index 00000000..a9c25425
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/setup.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+## TO BE RAN FROM ..
+cp ./extra_files/xapp_rc_slice_dynamic.c ./flexric/examples/xApp/c/ctrl/
+cp ./extra_files/CMakeLists.txt ./flexric/examples/xApp/c/ctrl/
\ No newline at end of file
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/xapp_rc_slice_dynamic.c b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/xapp_rc_slice_dynamic.c
new file mode 100644
index 00000000..afd9f3a7
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/extra_files/xapp_rc_slice_dynamic.c
@@ -0,0 +1,361 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#include "../../../../src/xApp/e42_xapp_api.h"
+#include "../../../../src/sm/rc_sm/ie/ir/ran_param_struct.h"
+#include "../../../../src/sm/rc_sm/ie/ir/ran_param_list.h"
+#include "../../../../src/util/time_now_us.h"
+#include "../../../../src/util/alg_ds/ds/lock_guard/lock_guard.h"
+#include "../../../../src/sm/rc_sm/rc_sm_id.h"
+#include
+#include
+#include
+#include
+
+typedef enum{
+ DRX_parameter_configuration_7_6_3_1 = 1,
+ SR_periodicity_configuration_7_6_3_1 = 2,
+ SPS_parameters_configuration_7_6_3_1 = 3,
+ Configured_grant_control_7_6_3_1 = 4,
+ CQI_table_configuration_7_6_3_1 = 5,
+ Slice_level_PRB_quotal_7_6_3_1 = 6,
+} rc_ctrl_service_style_2_act_id_e;
+
+static
+e2sm_rc_ctrl_hdr_frmt_1_t gen_rc_ctrl_hdr_frmt_1(ue_id_e2sm_t ue_id, uint32_t ric_style_type, uint16_t ctrl_act_id)
+{
+ e2sm_rc_ctrl_hdr_frmt_1_t dst = {0};
+
+ // 6.2.2.6
+ dst.ue_id = cp_ue_id_e2sm(&ue_id);
+
+ dst.ric_style_type = ric_style_type;
+ dst.ctrl_act_id = ctrl_act_id;
+
+ return dst;
+}
+
+static
+e2sm_rc_ctrl_hdr_t gen_rc_ctrl_hdr(e2sm_rc_ctrl_hdr_e hdr_frmt, ue_id_e2sm_t ue_id, uint32_t ric_style_type, uint16_t ctrl_act_id)
+{
+ e2sm_rc_ctrl_hdr_t dst = {0};
+
+ if (hdr_frmt == FORMAT_1_E2SM_RC_CTRL_HDR) {
+ dst.format = FORMAT_1_E2SM_RC_CTRL_HDR;
+ dst.frmt_1 = gen_rc_ctrl_hdr_frmt_1(ue_id, ric_style_type, ctrl_act_id);
+ } else {
+ assert(0!=0 && "not implemented the fill func for this ctrl hdr frmt");
+ }
+
+ return dst;
+}
+
+typedef enum {
+ RRM_Policy_Ratio_List_8_4_3_6 = 1,
+ RRM_Policy_Ratio_Group_8_4_3_6 = 2,
+ RRM_Policy_8_4_3_6 = 3,
+ RRM_Policy_Member_List_8_4_3_6 = 4,
+ RRM_Policy_Member_8_4_3_6 = 5,
+ PLMN_Identity_8_4_3_6 = 6,
+ S_NSSAI_8_4_3_6 = 7,
+ SST_8_4_3_6 = 8,
+ SD_8_4_3_6 = 9,
+ Min_PRB_Policy_Ratio_8_4_3_6 = 10,
+ Max_PRB_Policy_Ratio_8_4_3_6 = 11,
+ Dedicated_PRB_Policy_Ratio_8_4_3_6 = 12,
+} slice_level_PRB_quota_param_id_e;
+
+static
+void gen_rrm_policy_ratio_group(lst_ran_param_t* RRM_Policy_Ratio_Group,
+ const char* sst_str,
+ const char* sd_str,
+ int min_ratio_prb,
+ int dedicated_ratio_prb,
+ int max_ratio_prb)
+{
+ // RRM Policy Ratio Group, STRUCTURE (RRM Policy Ratio List -> RRM Policy Ratio Group)
+ // lst_ran_param_t* RRM_Policy_Ratio_Group = &RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param[0];
+ // RRM_Policy_Ratio_Group->ran_param_id = RRM_Policy_Ratio_Group_8_4_3_6;
+ RRM_Policy_Ratio_Group->ran_param_struct.sz_ran_param_struct = 4;
+ RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct = calloc(4, sizeof(seq_ran_param_t));
+ assert(RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct != NULL && "Memory exhausted");
+ // RRM Policy, STRUCTURE (RRM Policy Ratio Group -> RRM Policy)
+ seq_ran_param_t* RRM_Policy = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[0];
+ RRM_Policy->ran_param_id = RRM_Policy_8_4_3_6;
+ RRM_Policy->ran_param_val.type = STRUCTURE_RAN_PARAMETER_VAL_TYPE;
+ RRM_Policy->ran_param_val.strct = calloc(1, sizeof(ran_param_struct_t));
+ assert(RRM_Policy->ran_param_val.strct != NULL && "Memory exhausted");
+ RRM_Policy->ran_param_val.strct->sz_ran_param_struct = 1;
+ RRM_Policy->ran_param_val.strct->ran_param_struct = calloc(1, sizeof(seq_ran_param_t));
+ assert(RRM_Policy->ran_param_val.strct->ran_param_struct != NULL && "Memory exhausted");
+ // RRM Policy Member List, LIST (RRM Policy -> RRM Policy Member List)
+ seq_ran_param_t* RRM_Policy_Member_List = &RRM_Policy->ran_param_val.strct->ran_param_struct[0];
+ RRM_Policy_Member_List->ran_param_id = RRM_Policy_Member_List_8_4_3_6;
+ RRM_Policy_Member_List->ran_param_val.type = LIST_RAN_PARAMETER_VAL_TYPE;
+ RRM_Policy_Member_List->ran_param_val.lst = calloc(1, sizeof(ran_param_list_t));
+ assert(RRM_Policy_Member_List->ran_param_val.lst != NULL && "Memory exhausted");
+ RRM_Policy_Member_List->ran_param_val.lst->sz_lst_ran_param = 1;
+ RRM_Policy_Member_List->ran_param_val.lst->lst_ran_param = calloc(1, sizeof(lst_ran_param_t));
+ assert(RRM_Policy_Member_List->ran_param_val.lst->lst_ran_param != NULL && "Memory exhausted");
+ // RRM Policy Member, STRUCTURE (RRM Policy Member List -> RRM Policy Member)
+ lst_ran_param_t* RRM_Policy_Member = &RRM_Policy_Member_List->ran_param_val.lst->lst_ran_param[0];
+ // RRM_Policy_Member->ran_param_id = RRM_Policy_Member_8_4_3_6;
+ RRM_Policy_Member->ran_param_struct.sz_ran_param_struct = 2;
+ RRM_Policy_Member->ran_param_struct.ran_param_struct = calloc(2, sizeof(seq_ran_param_t));
+ assert(RRM_Policy_Member->ran_param_struct.ran_param_struct != NULL && "Memory exhausted");
+ // PLMN Identity, ELEMENT (RRM Policy Member -> PLMN Identity)
+ seq_ran_param_t* PLMN_Identity = &RRM_Policy_Member->ran_param_struct.ran_param_struct[0];
+ PLMN_Identity->ran_param_id = PLMN_Identity_8_4_3_6;
+ PLMN_Identity->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ PLMN_Identity->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(PLMN_Identity->ran_param_val.flag_false != NULL && "Memory exhausted");
+ PLMN_Identity->ran_param_val.flag_false->type = OCTET_STRING_RAN_PARAMETER_VALUE;
+ char plmnid_str[] = "00101";
+ byte_array_t plmn_id = cp_str_to_ba(plmnid_str); // TODO
+ PLMN_Identity->ran_param_val.flag_false->octet_str_ran.len = plmn_id.len;
+ PLMN_Identity->ran_param_val.flag_false->octet_str_ran.buf = plmn_id.buf;
+ // S-NSSAI, STRUCTURE (RRM Policy Member -> S-NSSAI)
+ seq_ran_param_t* S_NSSAI = &RRM_Policy_Member->ran_param_struct.ran_param_struct[1];
+ S_NSSAI->ran_param_id = S_NSSAI_8_4_3_6;
+ S_NSSAI->ran_param_val.type = STRUCTURE_RAN_PARAMETER_VAL_TYPE;
+ S_NSSAI->ran_param_val.strct = calloc(1, sizeof(ran_param_struct_t));
+ assert(S_NSSAI->ran_param_val.strct != NULL && "Memory exhausted");
+ S_NSSAI->ran_param_val.strct->sz_ran_param_struct = 2;
+ S_NSSAI->ran_param_val.strct->ran_param_struct = calloc(2, sizeof(seq_ran_param_t));
+ // SST, ELEMENT (S-NSSAI -> SST)
+ seq_ran_param_t* SST = &S_NSSAI->ran_param_val.strct->ran_param_struct[0];
+ SST->ran_param_id = SST_8_4_3_6;
+ SST->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ SST->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(SST->ran_param_val.flag_false != NULL && "Memory exhausted");
+ SST->ran_param_val.flag_false->type = OCTET_STRING_RAN_PARAMETER_VALUE;
+ // char sst_str[] = "1";
+ byte_array_t sst = cp_str_to_ba(sst_str); //TODO
+ SST->ran_param_val.flag_false->octet_str_ran.len = sst.len;
+ SST->ran_param_val.flag_false->octet_str_ran.buf = sst.buf;
+ // SD, ELEMENT (S-NSSAI -> SD)
+ seq_ran_param_t* SD = &S_NSSAI->ran_param_val.strct->ran_param_struct[1];
+ SD->ran_param_id = SD_8_4_3_6;
+ SD->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ SD->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(SD->ran_param_val.flag_false != NULL && "Memory exhausted");
+ SD->ran_param_val.flag_false->type = OCTET_STRING_RAN_PARAMETER_VALUE;
+ // char sd_str[] = "0";
+ byte_array_t sd = cp_str_to_ba(sd_str); //TODO
+ SD->ran_param_val.flag_false->octet_str_ran.len = sd.len;
+ SD->ran_param_val.flag_false->octet_str_ran.buf = sd.buf;
+ // Min PRB Policy Ratio, ELEMENT (RRM Policy Ratio Group -> Min PRB Policy Ratio)
+ seq_ran_param_t* Min_PRB_Policy_Ratio = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[1];
+ Min_PRB_Policy_Ratio->ran_param_id = Min_PRB_Policy_Ratio_8_4_3_6;
+ Min_PRB_Policy_Ratio->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ Min_PRB_Policy_Ratio->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(Min_PRB_Policy_Ratio->ran_param_val.flag_false != NULL && "Memory exhausted");
+ Min_PRB_Policy_Ratio->ran_param_val.flag_false->type = INTEGER_RAN_PARAMETER_VALUE;
+ // TODO: not handle this value in OAI
+ Min_PRB_Policy_Ratio->ran_param_val.flag_false->int_ran = min_ratio_prb;
+ // Max PRB Policy Ratio, ELEMENT (RRM Policy Ratio Group -> Max PRB Policy Ratio)
+ seq_ran_param_t* Max_PRB_Policy_Ratio = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[2];
+ Max_PRB_Policy_Ratio->ran_param_id = Max_PRB_Policy_Ratio_8_4_3_6;
+ Max_PRB_Policy_Ratio->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ Max_PRB_Policy_Ratio->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(Max_PRB_Policy_Ratio->ran_param_val.flag_false != NULL && "Memory exhausted");
+ Max_PRB_Policy_Ratio->ran_param_val.flag_false->type = INTEGER_RAN_PARAMETER_VALUE;
+ // TODO: not handle this value in OAI
+ Max_PRB_Policy_Ratio->ran_param_val.flag_false->int_ran = max_ratio_prb;
+ // Dedicated PRB Policy Ratio, ELEMENT (RRM Policy Ratio Group -> Dedicated PRB Policy Ratio)
+ seq_ran_param_t* Dedicated_PRB_Policy_Ratio = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[3];
+ Dedicated_PRB_Policy_Ratio->ran_param_id = Dedicated_PRB_Policy_Ratio_8_4_3_6;
+ Dedicated_PRB_Policy_Ratio->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false != NULL && "Memory exhausted");
+ Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false->type = INTEGER_RAN_PARAMETER_VALUE;
+ Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false->int_ran = dedicated_ratio_prb;
+
+ return;
+}
+
+static
+void gen_rrm_policy_ratio_list(seq_ran_param_t* RRM_Policy_Ratio_List)
+{
+ int num_slice = 2;
+
+ int slice1_ratio = 20;
+ int slice2_ratio = 80;
+ const char* slice_1_ratio_env = getenv("SLICE1_RATIO");
+ const char* slice_2_ratio_env = getenv("SLICE2_RATIO");
+ if (slice_1_ratio_env != NULL)
+ {
+ slice1_ratio = atoi(slice_1_ratio_env);
+ }
+ if (slice_2_ratio_env != NULL)
+ {
+ slice2_ratio = atoi(slice_2_ratio_env);
+ }
+
+ if ((slice1_ratio + slice2_ratio) > 100)
+ {
+ printf("Combined ratio of both slices must not be greater than 100. Set to 50:50\n");
+ slice1_ratio = 50;
+ slice2_ratio = 50;
+ }
+
+ // seq_ran_param_t* RRM_Policy_Ratio_List = &dst.ran_param[0];
+ RRM_Policy_Ratio_List->ran_param_id = RRM_Policy_Ratio_List_8_4_3_6;
+ RRM_Policy_Ratio_List->ran_param_val.type = LIST_RAN_PARAMETER_VAL_TYPE;
+ RRM_Policy_Ratio_List->ran_param_val.lst = calloc(1, sizeof(ran_param_list_t));
+ assert(RRM_Policy_Ratio_List->ran_param_val.lst != NULL && "Memory exhausted");
+ RRM_Policy_Ratio_List->ran_param_val.lst->sz_lst_ran_param = num_slice;
+ RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param = calloc(num_slice, sizeof(lst_ran_param_t));
+ assert(RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param != NULL && "Memory exhausted");
+
+ const char* sst_str[] = {"1", "1"};
+ const char* sd_str[] = {"1", "5"};
+
+
+ int dedicated_ratio_prb[] = {slice1_ratio, slice2_ratio};
+
+ printf("Setting PRB Ratio to %d:%d\n", slice1_ratio, slice2_ratio);
+
+ for (int i = 0; i < num_slice; i++) {
+ gen_rrm_policy_ratio_group(&RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param[i],
+ sst_str[i],
+ sd_str[i],
+ 0, dedicated_ratio_prb[i], 0);
+ }
+
+ return;
+}
+
+static
+e2sm_rc_ctrl_msg_frmt_1_t gen_rc_ctrl_msg_frmt_1_slice_level_PRB_quota()
+{
+ e2sm_rc_ctrl_msg_frmt_1_t dst = {0};
+
+ // 8.4.3.6
+ // RRM Policy Ratio List, LIST (len 1)
+ // > RRM Policy Ratio Group, STRUCTURE (len 4)
+ // >> RRM Policy, STRUCTURE (len 1)
+ // >>> RRM Policy Member List, LIST (len 1)
+ // >>>> RRM Policy Member, STRUCTURE (len 2)
+ // >>>>> PLMN Identity, ELEMENT
+ // >>>>> S-NSSAI, STRUCTURE (len 2)
+ // >>>>>> SST, ELEMENT
+ // >>>>>> SD, ELEMENT
+ // >> Min PRB Policy Ratio, ELEMENT
+ // >> Max PRB Policy Ratio, ELEMENT
+ // >> Dedicated PRB Policy Ratio, ELEMENT
+
+
+ // RRM Policy Ratio List, LIST
+ dst.sz_ran_param = 1;
+ dst.ran_param = calloc(1, sizeof(seq_ran_param_t));
+ assert(dst.ran_param != NULL && "Memory exhausted");
+ gen_rrm_policy_ratio_list(&dst.ran_param[0]);
+
+ return dst;
+}
+
+static
+e2sm_rc_ctrl_msg_t gen_rc_ctrl_msg(e2sm_rc_ctrl_msg_e msg_frmt)
+{
+ e2sm_rc_ctrl_msg_t dst = {0};
+
+ if (msg_frmt == FORMAT_1_E2SM_RC_CTRL_MSG) {
+ dst.format = msg_frmt;
+ dst.frmt_1 = gen_rc_ctrl_msg_frmt_1_slice_level_PRB_quota();
+ } else {
+ assert(0!=0 && "not implemented the fill func for this ctrl msg frmt");
+ }
+
+ return dst;
+}
+
+static
+ue_id_e2sm_t gen_rc_ue_id(ue_id_e2sm_e type)
+{
+ ue_id_e2sm_t ue_id = {0};
+ if (type == GNB_UE_ID_E2SM) {
+ ue_id.type = GNB_UE_ID_E2SM;
+ // TODO
+ ue_id.gnb.amf_ue_ngap_id = 0;
+ ue_id.gnb.guami.plmn_id.mcc = 1;
+ ue_id.gnb.guami.plmn_id.mnc = 1;
+ ue_id.gnb.guami.plmn_id.mnc_digit_len = 2;
+ ue_id.gnb.guami.amf_region_id = 0;
+ ue_id.gnb.guami.amf_set_id = 0;
+ ue_id.gnb.guami.amf_ptr = 0;
+ } else {
+ assert(0!=0 && "not supported UE ID type");
+ }
+ return ue_id;
+}
+
+int main(int argc, char *argv[])
+{
+ fr_args_t args = init_fr_args(argc, argv);
+ //defer({ free_fr_args(&args); });
+
+ //Init the xApp
+ init_xapp_api(&args);
+ sleep(1);
+
+ e2_node_arr_xapp_t nodes = e2_nodes_xapp_api();
+ defer({ free_e2_node_arr_xapp(&nodes); });
+ assert(nodes.len > 0);
+ printf("Connected E2 nodes = %d\n", nodes.len);
+
+ ////////////
+ // START RC
+ ////////////
+
+ // RC Control
+ // CONTROL Service Style 2: Radio Resource Allocation Control
+ // Action ID 6: Slice-level PRB quota
+ // E2SM-RC Control Header Format 1
+ // E2SM-RC Control Message Format 1
+ rc_ctrl_req_data_t rc_ctrl = {0};
+ ue_id_e2sm_t ue_id = gen_rc_ue_id(GNB_UE_ID_E2SM);
+
+ rc_ctrl.hdr = gen_rc_ctrl_hdr(FORMAT_1_E2SM_RC_CTRL_HDR, ue_id, 2, Slice_level_PRB_quotal_7_6_3_1);
+ rc_ctrl.msg = gen_rc_ctrl_msg(FORMAT_1_E2SM_RC_CTRL_MSG);
+
+ int64_t st = time_now_us();
+ for(size_t i =0; i < nodes.len; ++i){
+ control_sm_xapp_api(&nodes.n[i].id, SM_RC_ID, &rc_ctrl);
+ }
+ printf("[xApp]: Control Loop Latency: %ld us\n", time_now_us() - st);
+ free_rc_ctrl_req_data(&rc_ctrl);
+
+ ////////////
+ // END RC
+ ////////////
+
+ sleep(5);
+
+
+ //Stop the xApp
+ while(try_stop_xapp_api() == false)
+ usleep(1000);
+
+ printf("Test xApp run SUCCESSFULLY\n");
+
+}
+
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/healthscripts/mysql-healthcheck2.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/healthscripts/mysql-healthcheck2.sh
new file mode 100755
index 00000000..6fa1728f
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/healthscripts/mysql-healthcheck2.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+set -eo pipefail
+
+if [ "$MYSQL_ROOT_PASSWORD" ] && [ -z "$MYSQL_USER" ] && [ -z "$MYSQL_PASSWORD" ]; then
+ echo >&2 'Healthcheck error: cannot determine root password (and MYSQL_USER and MYSQL_PASSWORD were not set)'
+ exit 0
+fi
+
+host="$(hostname --ip-address || echo '127.0.0.1')"
+user="${MYSQL_USER:-root}"
+export MYSQL_PWD="${MYSQL_PASSWORD:-$MYSQL_ROOT_PASSWORD}"
+
+args=(
+ # force mysql to not use the local "mysqld.sock" (test "external" connectivity)
+ -h"$host"
+ -u"$user"
+ --silent
+)
+
+STATUS=0
+if command -v mysqladmin &> /dev/null; then
+ if mysqladmin "${args[@]}" ping > /dev/null; then
+ database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM AuthenticationSubscription;")
+ if [[ -z $database_check ]]; then
+ echo "Healthcheck error: oai_db not populated"
+ STATUS=1
+ fi
+ STATUS=0
+ else
+ echo "Healthcheck error: Mysql port inactive"
+ STATUS=1
+ fi
+else
+ if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then
+ database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM AuthenticationSubscription;")
+ if [[ -z $database_check ]]; then
+ echo "Healthcheck error: oai_db not populated"
+ STATUS=1
+ fi
+ STATUS=0
+ else
+ echo "Healthcheck error: Mysql port inactive"
+ STATUS=1
+ fi
+fi
+exit $STATUS
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/install_ric_flexric.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/install_ric_flexric.sh
new file mode 100644
index 00000000..ed726d3a
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/install_ric_flexric.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# Save the initial directory
+INITIAL_DIR=$(pwd)
+
+# Step 1: Clone and build openairinterface5g
+git clone https://gitlab.eurecom.fr/oai/openairinterface5g
+cd openairinterface5g || { echo "Failed to enter openairinterface5g directory"; exit 1; }
+git checkout slicing-spring-of-code
+cd cmake_targets || { echo "Failed to enter cmake_targets"; exit 1; }
+
+# Build openairinterface5g
+./build_oai -I
+./build_oai -c -C -w SIMU --gNB --nrUE --build-e2 --ninja
+
+# Step 2: Go back to the initial directory
+cd "$INITIAL_DIR" || { echo "Failed to return to initial directory"; exit 1; }
+
+# Step 3: Clone and build flexric
+git clone https://gitlab.eurecom.fr/mosaic5g/flexric
+cd flexric || { echo "Failed to enter flexric directory"; exit 1; }
+git checkout slicing-spring-of-code
+
+# Step 4: Copy necessary files
+cp "$INITIAL_DIR/xapp_rc_slice_dynamic.c" examples/xApp/c/ctrl/ || { echo "Failed to copy xapp_rc_slice_dynamic.c"; exit 1; }
+cp "$INITIAL_DIR/CMakeLists.txt" examples/xApp/c/ctrl/ || { echo "Failed to copy CMakeLists.txt"; exit 1; }
+
+# Step 5: Build flexric
+mkdir -p build && cd build
+cmake -DXAPP_MULTILANGUAGE=OFF ..
+make -j8
+make install
+
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/multi_ue.sh b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/multi_ue.sh
new file mode 100755
index 00000000..6083260b
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/multi_ue.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+ue_id=-1
+
+create_namespace() {
+ ue_id=$1
+ local name="ue$ue_id"
+ echo "creating namespace for UE ID ${ue_id} name ${name}"
+ ip netns add $name
+ ip link add v-eth$ue_id type veth peer name v-ue$ue_id
+ ip link set v-ue$ue_id netns $name
+ BASE_IP=$((200+ue_id))
+ ip addr add 10.$BASE_IP.1.100/24 dev v-eth$ue_id
+ ip link set v-eth$ue_id up
+ iptables -t nat -A POSTROUTING -s 10.$BASE_IP.1.0/255.255.255.0 -o lo -j MASQUERADE
+ iptables -A FORWARD -i lo -o v-eth$ue_id -j ACCEPT
+ iptables -A FORWARD -o lo -i v-eth$ue_id -j ACCEPT
+ ip netns exec $name ip link set dev lo up
+ ip netns exec $name ip addr add 10.$BASE_IP.1.$ue_id/24 dev v-ue$ue_id
+ ip netns exec $name ip link set v-ue$ue_id up
+}
+
+delete_namespace() {
+ local ue_id=$1
+ local name="ue$ue_id"
+ echo "deleting namespace for UE ID ${ue_id} name ${name}"
+ ip link delete v-eth$ue_id
+ ip netns delete $name
+}
+
+list_namespaces() {
+ ip netns list
+}
+
+open_namespace() {
+ if [[ $ue_id -lt 1 ]]; then echo "error: no last UE processed"; exit 1; fi
+ local name="ue$ue_id"
+ echo "opening shell in namespace ${name}"
+ echo "type 'ip netns exec $name bash' in additional terminals"
+ ip netns exec $name bash
+}
+
+usage () {
+ echo "$1 -c : create namespace \"ue\""
+ echo "$1 -d : delete namespace \"ue\""
+ echo "$1 -e : execute shell in last processed namespace"
+ echo "$1 -l : list namespaces"
+ echo "$1 -o : open shell in namespace \"ue\""
+}
+
+prog_name=$(basename $0)
+
+if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root"; exit 1; fi
+if [[ $# -eq 0 ]]; then echo "error: no parameters given"; usage $prog_name; exit 1; fi
+
+while getopts c:d:ehlo: cmd
+do
+ case "${cmd}" in
+ c) create_namespace ${OPTARG};;
+ d) delete_namespace ${OPTARG};;
+ e) open_namespace; exit;;
+ h) usage ${prog_name}; exit;;
+ l) list_namespaces;;
+ o) ue_id=${OPTARG}; open_namespace;;
+ /?) echo "Invalid option"; usage ${prog_name}; exit;;
+ esac
+done
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrL1_UE_stats-0.log b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrL1_UE_stats-0.log
new file mode 100644
index 00000000..4a531f44
Binary files /dev/null and b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrL1_UE_stats-0.log differ
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrL1_stats.log b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrL1_stats.log
new file mode 100644
index 00000000..602cb1ae
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrL1_stats.log
@@ -0,0 +1,22 @@
+Blacklisted PRBs 0/106
+ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
+ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
+ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
+ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
+ 0. 0. 0. 0. 0. 0.
+max_IO = 0 (0), min_I0 = 0 (0), avg_I0 = 0 dB
+PRACH I0 = 0.0 dB
+
+LSCH RNTI 12f1: current_Qm 2, current_RI 1, total_bytes TX 1702867412
+ULSCH RNTI 12f1, 802: ulsch_power[0] 50,9 ulsch_noise_power[0] 0.0, sync_pos 2
+ round_trials 183157(0.0e+00):0(0.0e+00):0(0.0e+00):0, DTX 0, current_Qm 0, current_RI 0, total_bytes RX/SCHED 0/0
+
+0e+00):0, DTX 0, current_Qm 0, current_RI 0, total_bytes RX/SCHED 0/0
+ULSCH RNTI 12f1, 545: ulsch_power[0] 50,9 ulsch_noise_power[0] 0.0, sync_pos 1
+ round_trials 183132(0.0e+00):0(0.0e+00):0(0.0e+00):0, DTX 0, current_Qm 0, current_RI 0, total_bytes RX/SCHED 0/0
+
+
+
+
+
+
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrMAC_stats.log b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrMAC_stats.log
new file mode 100644
index 00000000..ff012862
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrMAC_stats.log
@@ -0,0 +1,2 @@
+
+ Name Total Per Trials Num Trials CPU_F_GHz 2.000292
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrRRC_stats.log b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrRRC_stats.log
new file mode 100644
index 00000000..f09fb36a
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/nrRRC_stats.log
@@ -0,0 +1,4 @@
+
+1 connected DUs
+[1] DU ID 3584 (gNB-OAI) integrated DU-CU: nrCellID 12345678, PCI 0, SSB ARFCN 641280
+ TDD: band 78 ARFCN 640008 SCS 30 (kHz) PRB 106
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/channelmod_rfsimu.conf b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/channelmod_rfsimu.conf
new file mode 100644
index 00000000..5d287592
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/channelmod_rfsimu.conf
@@ -0,0 +1,65 @@
+#/* configuration for channel modelisation */
+#/* To be included in main config file when */
+#/* channel modelisation is used (rfsimulator with chanmod options enabled) */
+channelmod = {
+ max_chan=10;
+ modellist="modellist_rfsimu_1";
+ modellist_rfsimu_1 = (
+ {
+ model_name = "rfsimu_channel_enB0"
+ type = "AWGN"; #"TDL_D";
+ ploss_dB = 0;
+ noise_power_dB = -10;
+ forgetfact = 0;
+ offset = 0; # 16 samples -> 80 m -> 1 TA
+ ds_tdl = 0; #0.13;
+ },
+ {
+ model_name = "rfsimu_channel_ue0"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = -10;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0; #0.03;
+ },
+ {
+ model_name = "rfsimu_channel_ue1"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = -12;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0; #0.03;
+ }
+ );
+ modellist_rfsimu_2 = (
+ {
+ model_name = "rfsimu_channel_ue0"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = 0;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ },
+ {
+ model_name = "rfsimu_channel_ue1"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = 0;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ },
+ {
+ model_name = "rfsimu_channel_ue2"
+ type = "AWGN";
+ ploss_dB = 0;
+ noise_power_dB = 0;
+ forgetfact = 0;
+ offset = 0;
+ ds_tdl = 0;
+ }
+ );
+};
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/gnb.conf b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/gnb.conf
new file mode 100644
index 00000000..78b7b00b
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/gnb.conf
@@ -0,0 +1,269 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+ gNB_name = "gNB-OAI";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+ plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({sst = 1; sd = 0x000001; }, {sst = 1; sd = 0x000005; }) });
+
+ nr_cellid = 12345678L;
+
+ ////////// Physical parameters:
+
+ do_CSIRS = 1;
+ do_SRS = 1;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 641280;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640008;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 106;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=27,L=48 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 1;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 12;
+ initialDLBWPsearchSpaceZero = 0;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 106;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 1;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 13;
+ preambleReceivedTargetPower = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ ssb_periodicityServingCell = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 1;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 1;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 6;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// AMF parameters:
+ amf_ip_address = ( { ipv4 = "192.168.70.132";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+ GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
+ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.1/24";
+ GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
+ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.1/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+
+ }
+);
+
+MACRLCs = (
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 150;
+ pucch_TargetSNRx10 = 200;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ prach_dtx_threshold = 120;
+ pucch0_dtx_threshold = 100;
+ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 12;
+ att_rx = 12;
+ bands = [78];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ eNB_instances = [0];
+ #beamforming 1x4 matrix:
+ bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+ clock_src = "internal";
+}
+);
+
+THREAD_STRUCT = (
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+ serveraddr = "server";
+ serverport = 4043;
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+ IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+ drb_ciphering = "yes";
+ drb_integrity = "no";
+};
+
+log_config :
+{
+ global_log_level ="info";
+ hw_log_level ="info";
+ phy_log_level ="info";
+ mac_log_level ="info";
+ rlc_log_level ="info";
+ pdcp_log_level ="info";
+ rrc_log_level ="info";
+ ngap_log_level ="debug";
+ f1ap_log_level ="debug";
+};
+
+e2_agent = {
+ near_ric_ip_addr = "127.0.0.1";
+ sm_dir = "/usr/local/lib/flexric/"
+};
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_1.conf b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_1.conf
new file mode 100644
index 00000000..a7b9797e
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_1.conf
@@ -0,0 +1,31 @@
+sa=1;
+rfsim=1;
+
+uicc0 = {
+ imsi = "001010000000001";
+ key = "fec86ba6eb707ed08905757b1bb44b8f";
+ opc= "C42449363BBAD02B66D16BC975D77CC1";
+ dnn= "oai";
+ nssai_sst=1;
+ nssai_sd=0x000001;
+}
+
+telnetsrv = {
+ listenport = 9091
+ histfile = "~/history.telnetsrv"
+}
+
+rfsimulator :
+{
+ serveraddr = "127.0.0.1";
+ serverport = 4043;
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+};
+
+log_config = {
+ sdap_log_level = "info";
+ rlc_log_level = "info";
+};
+
+@include "channelmod_rfsimu.conf"
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_1_slice2.conf b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_1_slice2.conf
new file mode 100644
index 00000000..82c1dcd5
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_1_slice2.conf
@@ -0,0 +1,31 @@
+sa=1;
+rfsim=1;
+
+uicc0 = {
+ imsi = "001010000000001";
+ key = "fec86ba6eb707ed08905757b1bb44b8f";
+ opc= "C42449363BBAD02B66D16BC975D77CC1";
+ dnn= "oai2";
+ nssai_sst=1;
+ nssai_sd=0x000005;
+}
+
+telnetsrv = {
+ listenport = 9091
+ histfile = "~/history.telnetsrv"
+}
+
+rfsimulator :
+{
+ serveraddr = "127.0.0.1";
+ serverport = 4043;
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+};
+
+log_config = {
+ sdap_log_level = "info";
+ rlc_log_level = "info";
+};
+
+@include "channelmod_rfsimu.conf"
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_2.conf b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_2.conf
new file mode 100644
index 00000000..97867258
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/ran-conf/ue_2.conf
@@ -0,0 +1,31 @@
+sa=1;
+rfsim=1;
+
+uicc0 = {
+ imsi = "001010000000002";
+ key = "fec86ba6eb707ed08905757b1bb44b8f";
+ opc= "C42449363BBAD02B66D16BC975D77CC1";
+ dnn= "oai2";
+ nssai_sst=1;
+ nssai_sd=0x000005;
+}
+
+telnetsrv = {
+ listenport = 9091
+ histfile = "~/history.telnetsrv"
+}
+
+rfsimulator :
+{
+ serveraddr = "127.0.0.1";
+ serverport = 4043;
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+};
+
+log_config = {
+ sdap_log_level = "info";
+ rlc_log_level = "info";
+};
+
+@include "channelmod_rfsimu.conf
\ No newline at end of file
diff --git a/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/xapp_rc_slice_dynamic.c b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/xapp_rc_slice_dynamic.c
new file mode 100644
index 00000000..afd9f3a7
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/llm-slicing-5g-lab/xapp_rc_slice_dynamic.c
@@ -0,0 +1,361 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#include "../../../../src/xApp/e42_xapp_api.h"
+#include "../../../../src/sm/rc_sm/ie/ir/ran_param_struct.h"
+#include "../../../../src/sm/rc_sm/ie/ir/ran_param_list.h"
+#include "../../../../src/util/time_now_us.h"
+#include "../../../../src/util/alg_ds/ds/lock_guard/lock_guard.h"
+#include "../../../../src/sm/rc_sm/rc_sm_id.h"
+#include
+#include
+#include
+#include
+
+typedef enum{
+ DRX_parameter_configuration_7_6_3_1 = 1,
+ SR_periodicity_configuration_7_6_3_1 = 2,
+ SPS_parameters_configuration_7_6_3_1 = 3,
+ Configured_grant_control_7_6_3_1 = 4,
+ CQI_table_configuration_7_6_3_1 = 5,
+ Slice_level_PRB_quotal_7_6_3_1 = 6,
+} rc_ctrl_service_style_2_act_id_e;
+
+static
+e2sm_rc_ctrl_hdr_frmt_1_t gen_rc_ctrl_hdr_frmt_1(ue_id_e2sm_t ue_id, uint32_t ric_style_type, uint16_t ctrl_act_id)
+{
+ e2sm_rc_ctrl_hdr_frmt_1_t dst = {0};
+
+ // 6.2.2.6
+ dst.ue_id = cp_ue_id_e2sm(&ue_id);
+
+ dst.ric_style_type = ric_style_type;
+ dst.ctrl_act_id = ctrl_act_id;
+
+ return dst;
+}
+
+static
+e2sm_rc_ctrl_hdr_t gen_rc_ctrl_hdr(e2sm_rc_ctrl_hdr_e hdr_frmt, ue_id_e2sm_t ue_id, uint32_t ric_style_type, uint16_t ctrl_act_id)
+{
+ e2sm_rc_ctrl_hdr_t dst = {0};
+
+ if (hdr_frmt == FORMAT_1_E2SM_RC_CTRL_HDR) {
+ dst.format = FORMAT_1_E2SM_RC_CTRL_HDR;
+ dst.frmt_1 = gen_rc_ctrl_hdr_frmt_1(ue_id, ric_style_type, ctrl_act_id);
+ } else {
+ assert(0!=0 && "not implemented the fill func for this ctrl hdr frmt");
+ }
+
+ return dst;
+}
+
+typedef enum {
+ RRM_Policy_Ratio_List_8_4_3_6 = 1,
+ RRM_Policy_Ratio_Group_8_4_3_6 = 2,
+ RRM_Policy_8_4_3_6 = 3,
+ RRM_Policy_Member_List_8_4_3_6 = 4,
+ RRM_Policy_Member_8_4_3_6 = 5,
+ PLMN_Identity_8_4_3_6 = 6,
+ S_NSSAI_8_4_3_6 = 7,
+ SST_8_4_3_6 = 8,
+ SD_8_4_3_6 = 9,
+ Min_PRB_Policy_Ratio_8_4_3_6 = 10,
+ Max_PRB_Policy_Ratio_8_4_3_6 = 11,
+ Dedicated_PRB_Policy_Ratio_8_4_3_6 = 12,
+} slice_level_PRB_quota_param_id_e;
+
+static
+void gen_rrm_policy_ratio_group(lst_ran_param_t* RRM_Policy_Ratio_Group,
+ const char* sst_str,
+ const char* sd_str,
+ int min_ratio_prb,
+ int dedicated_ratio_prb,
+ int max_ratio_prb)
+{
+ // RRM Policy Ratio Group, STRUCTURE (RRM Policy Ratio List -> RRM Policy Ratio Group)
+ // lst_ran_param_t* RRM_Policy_Ratio_Group = &RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param[0];
+ // RRM_Policy_Ratio_Group->ran_param_id = RRM_Policy_Ratio_Group_8_4_3_6;
+ RRM_Policy_Ratio_Group->ran_param_struct.sz_ran_param_struct = 4;
+ RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct = calloc(4, sizeof(seq_ran_param_t));
+ assert(RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct != NULL && "Memory exhausted");
+ // RRM Policy, STRUCTURE (RRM Policy Ratio Group -> RRM Policy)
+ seq_ran_param_t* RRM_Policy = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[0];
+ RRM_Policy->ran_param_id = RRM_Policy_8_4_3_6;
+ RRM_Policy->ran_param_val.type = STRUCTURE_RAN_PARAMETER_VAL_TYPE;
+ RRM_Policy->ran_param_val.strct = calloc(1, sizeof(ran_param_struct_t));
+ assert(RRM_Policy->ran_param_val.strct != NULL && "Memory exhausted");
+ RRM_Policy->ran_param_val.strct->sz_ran_param_struct = 1;
+ RRM_Policy->ran_param_val.strct->ran_param_struct = calloc(1, sizeof(seq_ran_param_t));
+ assert(RRM_Policy->ran_param_val.strct->ran_param_struct != NULL && "Memory exhausted");
+ // RRM Policy Member List, LIST (RRM Policy -> RRM Policy Member List)
+ seq_ran_param_t* RRM_Policy_Member_List = &RRM_Policy->ran_param_val.strct->ran_param_struct[0];
+ RRM_Policy_Member_List->ran_param_id = RRM_Policy_Member_List_8_4_3_6;
+ RRM_Policy_Member_List->ran_param_val.type = LIST_RAN_PARAMETER_VAL_TYPE;
+ RRM_Policy_Member_List->ran_param_val.lst = calloc(1, sizeof(ran_param_list_t));
+ assert(RRM_Policy_Member_List->ran_param_val.lst != NULL && "Memory exhausted");
+ RRM_Policy_Member_List->ran_param_val.lst->sz_lst_ran_param = 1;
+ RRM_Policy_Member_List->ran_param_val.lst->lst_ran_param = calloc(1, sizeof(lst_ran_param_t));
+ assert(RRM_Policy_Member_List->ran_param_val.lst->lst_ran_param != NULL && "Memory exhausted");
+ // RRM Policy Member, STRUCTURE (RRM Policy Member List -> RRM Policy Member)
+ lst_ran_param_t* RRM_Policy_Member = &RRM_Policy_Member_List->ran_param_val.lst->lst_ran_param[0];
+ // RRM_Policy_Member->ran_param_id = RRM_Policy_Member_8_4_3_6;
+ RRM_Policy_Member->ran_param_struct.sz_ran_param_struct = 2;
+ RRM_Policy_Member->ran_param_struct.ran_param_struct = calloc(2, sizeof(seq_ran_param_t));
+ assert(RRM_Policy_Member->ran_param_struct.ran_param_struct != NULL && "Memory exhausted");
+ // PLMN Identity, ELEMENT (RRM Policy Member -> PLMN Identity)
+ seq_ran_param_t* PLMN_Identity = &RRM_Policy_Member->ran_param_struct.ran_param_struct[0];
+ PLMN_Identity->ran_param_id = PLMN_Identity_8_4_3_6;
+ PLMN_Identity->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ PLMN_Identity->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(PLMN_Identity->ran_param_val.flag_false != NULL && "Memory exhausted");
+ PLMN_Identity->ran_param_val.flag_false->type = OCTET_STRING_RAN_PARAMETER_VALUE;
+ char plmnid_str[] = "00101";
+ byte_array_t plmn_id = cp_str_to_ba(plmnid_str); // TODO
+ PLMN_Identity->ran_param_val.flag_false->octet_str_ran.len = plmn_id.len;
+ PLMN_Identity->ran_param_val.flag_false->octet_str_ran.buf = plmn_id.buf;
+ // S-NSSAI, STRUCTURE (RRM Policy Member -> S-NSSAI)
+ seq_ran_param_t* S_NSSAI = &RRM_Policy_Member->ran_param_struct.ran_param_struct[1];
+ S_NSSAI->ran_param_id = S_NSSAI_8_4_3_6;
+ S_NSSAI->ran_param_val.type = STRUCTURE_RAN_PARAMETER_VAL_TYPE;
+ S_NSSAI->ran_param_val.strct = calloc(1, sizeof(ran_param_struct_t));
+ assert(S_NSSAI->ran_param_val.strct != NULL && "Memory exhausted");
+ S_NSSAI->ran_param_val.strct->sz_ran_param_struct = 2;
+ S_NSSAI->ran_param_val.strct->ran_param_struct = calloc(2, sizeof(seq_ran_param_t));
+ // SST, ELEMENT (S-NSSAI -> SST)
+ seq_ran_param_t* SST = &S_NSSAI->ran_param_val.strct->ran_param_struct[0];
+ SST->ran_param_id = SST_8_4_3_6;
+ SST->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ SST->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(SST->ran_param_val.flag_false != NULL && "Memory exhausted");
+ SST->ran_param_val.flag_false->type = OCTET_STRING_RAN_PARAMETER_VALUE;
+ // char sst_str[] = "1";
+ byte_array_t sst = cp_str_to_ba(sst_str); //TODO
+ SST->ran_param_val.flag_false->octet_str_ran.len = sst.len;
+ SST->ran_param_val.flag_false->octet_str_ran.buf = sst.buf;
+ // SD, ELEMENT (S-NSSAI -> SD)
+ seq_ran_param_t* SD = &S_NSSAI->ran_param_val.strct->ran_param_struct[1];
+ SD->ran_param_id = SD_8_4_3_6;
+ SD->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ SD->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(SD->ran_param_val.flag_false != NULL && "Memory exhausted");
+ SD->ran_param_val.flag_false->type = OCTET_STRING_RAN_PARAMETER_VALUE;
+ // char sd_str[] = "0";
+ byte_array_t sd = cp_str_to_ba(sd_str); //TODO
+ SD->ran_param_val.flag_false->octet_str_ran.len = sd.len;
+ SD->ran_param_val.flag_false->octet_str_ran.buf = sd.buf;
+ // Min PRB Policy Ratio, ELEMENT (RRM Policy Ratio Group -> Min PRB Policy Ratio)
+ seq_ran_param_t* Min_PRB_Policy_Ratio = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[1];
+ Min_PRB_Policy_Ratio->ran_param_id = Min_PRB_Policy_Ratio_8_4_3_6;
+ Min_PRB_Policy_Ratio->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ Min_PRB_Policy_Ratio->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(Min_PRB_Policy_Ratio->ran_param_val.flag_false != NULL && "Memory exhausted");
+ Min_PRB_Policy_Ratio->ran_param_val.flag_false->type = INTEGER_RAN_PARAMETER_VALUE;
+ // TODO: not handle this value in OAI
+ Min_PRB_Policy_Ratio->ran_param_val.flag_false->int_ran = min_ratio_prb;
+ // Max PRB Policy Ratio, ELEMENT (RRM Policy Ratio Group -> Max PRB Policy Ratio)
+ seq_ran_param_t* Max_PRB_Policy_Ratio = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[2];
+ Max_PRB_Policy_Ratio->ran_param_id = Max_PRB_Policy_Ratio_8_4_3_6;
+ Max_PRB_Policy_Ratio->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ Max_PRB_Policy_Ratio->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(Max_PRB_Policy_Ratio->ran_param_val.flag_false != NULL && "Memory exhausted");
+ Max_PRB_Policy_Ratio->ran_param_val.flag_false->type = INTEGER_RAN_PARAMETER_VALUE;
+ // TODO: not handle this value in OAI
+ Max_PRB_Policy_Ratio->ran_param_val.flag_false->int_ran = max_ratio_prb;
+ // Dedicated PRB Policy Ratio, ELEMENT (RRM Policy Ratio Group -> Dedicated PRB Policy Ratio)
+ seq_ran_param_t* Dedicated_PRB_Policy_Ratio = &RRM_Policy_Ratio_Group->ran_param_struct.ran_param_struct[3];
+ Dedicated_PRB_Policy_Ratio->ran_param_id = Dedicated_PRB_Policy_Ratio_8_4_3_6;
+ Dedicated_PRB_Policy_Ratio->ran_param_val.type = ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE;
+ Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false = calloc(1, sizeof(ran_parameter_value_t));
+ assert(Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false != NULL && "Memory exhausted");
+ Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false->type = INTEGER_RAN_PARAMETER_VALUE;
+ Dedicated_PRB_Policy_Ratio->ran_param_val.flag_false->int_ran = dedicated_ratio_prb;
+
+ return;
+}
+
+static
+void gen_rrm_policy_ratio_list(seq_ran_param_t* RRM_Policy_Ratio_List)
+{
+ int num_slice = 2;
+
+ int slice1_ratio = 20;
+ int slice2_ratio = 80;
+ const char* slice_1_ratio_env = getenv("SLICE1_RATIO");
+ const char* slice_2_ratio_env = getenv("SLICE2_RATIO");
+ if (slice_1_ratio_env != NULL)
+ {
+ slice1_ratio = atoi(slice_1_ratio_env);
+ }
+ if (slice_2_ratio_env != NULL)
+ {
+ slice2_ratio = atoi(slice_2_ratio_env);
+ }
+
+ if ((slice1_ratio + slice2_ratio) > 100)
+ {
+ printf("Combined ratio of both slices must not be greater than 100. Set to 50:50\n");
+ slice1_ratio = 50;
+ slice2_ratio = 50;
+ }
+
+ // seq_ran_param_t* RRM_Policy_Ratio_List = &dst.ran_param[0];
+ RRM_Policy_Ratio_List->ran_param_id = RRM_Policy_Ratio_List_8_4_3_6;
+ RRM_Policy_Ratio_List->ran_param_val.type = LIST_RAN_PARAMETER_VAL_TYPE;
+ RRM_Policy_Ratio_List->ran_param_val.lst = calloc(1, sizeof(ran_param_list_t));
+ assert(RRM_Policy_Ratio_List->ran_param_val.lst != NULL && "Memory exhausted");
+ RRM_Policy_Ratio_List->ran_param_val.lst->sz_lst_ran_param = num_slice;
+ RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param = calloc(num_slice, sizeof(lst_ran_param_t));
+ assert(RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param != NULL && "Memory exhausted");
+
+ const char* sst_str[] = {"1", "1"};
+ const char* sd_str[] = {"1", "5"};
+
+
+ int dedicated_ratio_prb[] = {slice1_ratio, slice2_ratio};
+
+ printf("Setting PRB Ratio to %d:%d\n", slice1_ratio, slice2_ratio);
+
+ for (int i = 0; i < num_slice; i++) {
+ gen_rrm_policy_ratio_group(&RRM_Policy_Ratio_List->ran_param_val.lst->lst_ran_param[i],
+ sst_str[i],
+ sd_str[i],
+ 0, dedicated_ratio_prb[i], 0);
+ }
+
+ return;
+}
+
+static
+e2sm_rc_ctrl_msg_frmt_1_t gen_rc_ctrl_msg_frmt_1_slice_level_PRB_quota()
+{
+ e2sm_rc_ctrl_msg_frmt_1_t dst = {0};
+
+ // 8.4.3.6
+ // RRM Policy Ratio List, LIST (len 1)
+ // > RRM Policy Ratio Group, STRUCTURE (len 4)
+ // >> RRM Policy, STRUCTURE (len 1)
+ // >>> RRM Policy Member List, LIST (len 1)
+ // >>>> RRM Policy Member, STRUCTURE (len 2)
+ // >>>>> PLMN Identity, ELEMENT
+ // >>>>> S-NSSAI, STRUCTURE (len 2)
+ // >>>>>> SST, ELEMENT
+ // >>>>>> SD, ELEMENT
+ // >> Min PRB Policy Ratio, ELEMENT
+ // >> Max PRB Policy Ratio, ELEMENT
+ // >> Dedicated PRB Policy Ratio, ELEMENT
+
+
+ // RRM Policy Ratio List, LIST
+ dst.sz_ran_param = 1;
+ dst.ran_param = calloc(1, sizeof(seq_ran_param_t));
+ assert(dst.ran_param != NULL && "Memory exhausted");
+ gen_rrm_policy_ratio_list(&dst.ran_param[0]);
+
+ return dst;
+}
+
+static
+e2sm_rc_ctrl_msg_t gen_rc_ctrl_msg(e2sm_rc_ctrl_msg_e msg_frmt)
+{
+ e2sm_rc_ctrl_msg_t dst = {0};
+
+ if (msg_frmt == FORMAT_1_E2SM_RC_CTRL_MSG) {
+ dst.format = msg_frmt;
+ dst.frmt_1 = gen_rc_ctrl_msg_frmt_1_slice_level_PRB_quota();
+ } else {
+ assert(0!=0 && "not implemented the fill func for this ctrl msg frmt");
+ }
+
+ return dst;
+}
+
+static
+ue_id_e2sm_t gen_rc_ue_id(ue_id_e2sm_e type)
+{
+ ue_id_e2sm_t ue_id = {0};
+ if (type == GNB_UE_ID_E2SM) {
+ ue_id.type = GNB_UE_ID_E2SM;
+ // TODO
+ ue_id.gnb.amf_ue_ngap_id = 0;
+ ue_id.gnb.guami.plmn_id.mcc = 1;
+ ue_id.gnb.guami.plmn_id.mnc = 1;
+ ue_id.gnb.guami.plmn_id.mnc_digit_len = 2;
+ ue_id.gnb.guami.amf_region_id = 0;
+ ue_id.gnb.guami.amf_set_id = 0;
+ ue_id.gnb.guami.amf_ptr = 0;
+ } else {
+ assert(0!=0 && "not supported UE ID type");
+ }
+ return ue_id;
+}
+
+int main(int argc, char *argv[])
+{
+ fr_args_t args = init_fr_args(argc, argv);
+ //defer({ free_fr_args(&args); });
+
+ //Init the xApp
+ init_xapp_api(&args);
+ sleep(1);
+
+ e2_node_arr_xapp_t nodes = e2_nodes_xapp_api();
+ defer({ free_e2_node_arr_xapp(&nodes); });
+ assert(nodes.len > 0);
+ printf("Connected E2 nodes = %d\n", nodes.len);
+
+ ////////////
+ // START RC
+ ////////////
+
+ // RC Control
+ // CONTROL Service Style 2: Radio Resource Allocation Control
+ // Action ID 6: Slice-level PRB quota
+ // E2SM-RC Control Header Format 1
+ // E2SM-RC Control Message Format 1
+ rc_ctrl_req_data_t rc_ctrl = {0};
+ ue_id_e2sm_t ue_id = gen_rc_ue_id(GNB_UE_ID_E2SM);
+
+ rc_ctrl.hdr = gen_rc_ctrl_hdr(FORMAT_1_E2SM_RC_CTRL_HDR, ue_id, 2, Slice_level_PRB_quotal_7_6_3_1);
+ rc_ctrl.msg = gen_rc_ctrl_msg(FORMAT_1_E2SM_RC_CTRL_MSG);
+
+ int64_t st = time_now_us();
+ for(size_t i =0; i < nodes.len; ++i){
+ control_sm_xapp_api(&nodes.n[i].id, SM_RC_ID, &rc_ctrl);
+ }
+ printf("[xApp]: Control Loop Latency: %ld us\n", time_now_us() - st);
+ free_rc_ctrl_req_data(&rc_ctrl);
+
+ ////////////
+ // END RC
+ ////////////
+
+ sleep(5);
+
+
+ //Stop the xApp
+ while(try_stop_xapp_api() == false)
+ usleep(1000);
+
+ printf("Test xApp run SUCCESSFULLY\n");
+
+}
+
diff --git a/community/autonomous_5g_slicing_lab/requirements.txt b/community/autonomous_5g_slicing_lab/requirements.txt
new file mode 100644
index 00000000..c637273d
--- /dev/null
+++ b/community/autonomous_5g_slicing_lab/requirements.txt
@@ -0,0 +1,24 @@
+colorama==0.4.4
+colorlog==6.9.0
+gitlab==1.0.2
+gpudb==7.2.2.7
+ipython==8.12.3
+langchain_core==0.3.56
+langchain_nvidia_ai_endpoints==0.3.9
+langgraph==0.3.34
+matplotlib==3.10.1
+numpy==1.23
+pandas==2.2.3
+paramiko==3.5.1
+pexpect==4.9.0
+pymysql==1.1.1
+pyroute2==0.9.1
+pyserial==3.5
+pyshark==0.6
+python-dotenv==1.1.0
+PyYAML==6.0.2
+streamlit==1.44.1
+watchdog==6.0.0
+english-words==2.0.1
+tqdm==4.66.5
+typeguard==4.2.1
\ No newline at end of file