# Data Management Software

Nodeum is designed for organizations that need high-performance, reliable, and secure data storage. It automates data transfers between different storage systems.

### Storage Levels

**1. Primary Storage**

* The main layer for data production.
* Requires ultra-fast disks, low latency, and high IOPS.

**2. Secondary Storage**

* Holds data transferred from primary storage, used less frequently.
* Can include NAS, private cloud, public cloud, or tape library, all accessible via a unified interface.

### Addressing Storage Challenges

In today's hybrid storage environment, data storage management solutions are essential. They unify different storage formats like disks, tapes, and cloud services.

### Handling Increasing Data Volumes

The exponential growth in data due to digitalization affects many industries, particularly research centers. Effective data management is now critical.

### Key Features

* Manages data mobility and organization efficiently.
* Streamlines workflows for all data movements.
* Provides detailed logs and reports for full visibility and control, ensuring data security and integrity.


# Getting Started

## Hardware and Software Preparation Guide

### Step 1: Hardware Preparation

* Prepare an x86 server for installing the Linux OS and Nodeum Software.
* Confirm device compatibility using the Nodeum compatibility matrix.

### Step 2: Linux Operating System Deployment

* Install the Linux Operating System.
* Verify all services are running. Access the menu under Settings > Services for detailed service status.

### Step 3: Nodeum Software Configuration

* Add the Nodeum Software license. Without a license, access is available, but task execution is restricted.

{% content-ref url="/pages/dA0fJ7VqrGLMrAwn80ol" %}
[License Application](/data-mover/console/system-settings/license-application)
{% endcontent-ref %}

### Step 4: Initial Configuration

* Set up time, DNS, and hostname.

{% content-ref url="/pages/G0U2v1tuOpWvzKGgqHLm" %}
[Date & Time](/data-archiving/console/system-settings/date-and-time)
{% endcontent-ref %}

{% content-ref url="/pages/3rUyN6RlCC13ySdNMdH7" %}
[Hostname and DNS Configuration](/data-archiving/console/system-settings/hostname-and-dns-configuration)
{% endcontent-ref %}

* Configure the necessary cache for active archive workflow.

{% hint style="warning" %}
Required for active archive Workflow
{% endhint %}

{% content-ref url="/pages/z2ktAQrDRT0s5fAL2JjI" %}
[Cache Configuration Requirements](/data-archiving/container/cache-configuration-requirements)
{% endcontent-ref %}

* Set up the required container for active archive workflow.

{% content-ref url="/pages/F8fJcctG26tkIp3xnjno" %}
[Container](/data-archiving/container)
{% endcontent-ref %}

### Step 5: Storage Configuration

* Configure Storage Devices (NAS, Cloud, Tape).

{% content-ref url="/pages/sg6HLWsM47s2tEgZwGHO" %}
[Primary Storage Configuration](/data-archiving/console/primary-storage-configuration)
{% endcontent-ref %}

{% content-ref url="/pages/AaD9TYKSLhtI6GgXnNgR" %}
[Tape Library Configuration](/data-archiving/console/system-settings/tape-library-configuration)
{% endcontent-ref %}

{% content-ref url="/pages/fIsYz1YPTVWwYVmChu6z" %}
[Object Storage Configuration](/data-archiving/console/system-settings/object-storage-configuration)
{% endcontent-ref %}

{% content-ref url="/pages/1FSI5byUEtp2Tu8lce0v" %}
[NAS Storage Configuration](/data-archiving/console/system-settings/nas-storage-configuration)
{% endcontent-ref %}

* Define a storage pool to manage storage classes and orchestrate policy-based tasks.&#x20;

{% hint style="info" %}
Note: Storage pool configuration is essential before setting up workflows.
{% endhint %}

{% content-ref url="/pages/XgLRHqAMYbE8uimOjrTu" %}
[Pool Management](/data-archiving/console/pool-management)
{% endcontent-ref %}

### Step 6: User and Backup Setup

* Configure user accounts.

{% content-ref url="/pages/MMrtUmyizrzgOAbxd0hs" %}
[User Management](/data-archiving/console/system-settings/user-management)
{% endcontent-ref %}

* Set up the internal Nodeum backup system.

{% content-ref url="/pages/HTRyZGlvKN2d6KA7aaGX" %}
[Backup & Restore](/data-archiving/system-reliability/backup-and-restore)
{% endcontent-ref %}


# Architecture

Standalone and high-availability deployment models for Nodeum, including redundancy, heartbeat monitoring, and failover/fallback behavior.

***

### **Standalone System Overview**

This implementation is tailored to maximize the efficiency of a standalone x86 server, leveraging available hardware resources for scalable performance. The system is optimized to deliver robust internal hardware protection through multiple network connections and RAID disk controllers.

<figure><img src="/files/PAV5y7qfOtO9kyKNfBJ4" alt="" width="563"><figcaption></figcaption></figure>

### **High Availability**

A High Availability (HA) cluster addresses system reliability by detecting hardware and software failures on the primary node. It automatically restarts Nodeum services on a backup node, removing the need for admin interventions. Nodeum clusters are designed to ensure redundancy and eliminate single points of failure. A heartbeat mechanism continuously monitors the health and status of each node. Metadata and configurations stored in databases and files are replicated across nodes, allowing seamless failover and fallback processes.

<figure><img src="/files/qgmMfxyJOz5xIylO903U" alt="" width="563"><figcaption></figcaption></figure>


# Install & Deploy

Install or update Nodeum with Ansible playbooks, including prerequisites and pre-deployment checks.

Install Nodeum using the supported deployment method for this product line.

Before you run an install or upgrade:

* Validate OS and sizing requirements in [Compatibility](/data-archiving/compatibility-guide).
* Prepare the host (DNS, time sync, basic configuration) in [Getting Started](/data-archiving/getting-started).
* Check the [FAQ ](/faq/advanced-settings-proxy-configuration)

### Deployment options

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-type="users" data-multiple></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td></td><td>Ansible based installation</td><td></td><td></td><td><a href="/spaces/gzbGsZqZH8Ro8zxRYgwn/pages/k0O7BcvIaVggywyjw80n">/spaces/gzbGsZqZH8Ro8zxRYgwn/pages/k0O7BcvIaVggywyjw80n</a></td></tr></tbody></table>


# Ansible based installation

## Prerequisites

Nodeum is compatible with the RHEL, Rocky, and AlmaLinux families. Please refer to the software requirements for further details.

**Installing Nodeum Software**

Nodeum can be installed on either a physical server or a virtual machine. To learn more about hardware requirements, please refer to the official documentation. The installation process uses an Ansible Playbook/

### Checklist

1. **DNS Resolution**: Ensure DNS resolution is functioning correctly.
2. **Server Time**: Verify the server's time is accurately configured.
3. **Packages**: `unzip` - `tar` - `wget` applications have to installed
4. **Rights & Privileges:** Execute the installation as root to get all required priviledges.

### Requirements

<details>

<summary>Install requirements for EL8 (RHEL, Rocky Linux, AlmaLinux)</summary>

Ensure `Python 3.9` is installed

```bash
$ ls /usr/bin/python* -l
lrwxrwxrwx. 1 root root 9 Apr 25 2025 /usr/bin/python -> ./python3
lrwxrwxrwx. 1 root root 9 Apr 25 2025 /usr/bin/python3 -> python3.9
-rwxr-xr-x. 1 root root 15448 Apr 25 2025 /usr/bin/python3.9
```

If not install it:

```bash
$ dnf install python39
```

Installation of pip linked to python 3.9

```bash
$ dnf install python-pip
$ pip install pip --upgrade
```

Install Ansible. `ansible-core` must be 2.15 or later and earlier than 2.19.

```bash
$ pip install ansible
```

Verify the `ansible` version and the associated collections

```bash
$ ansible --version
ansible [core 2.15.13]
  config file = /root/v1-101-1/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.9.25 (main, Dec 18 2025, 08:36:10) [GCC 8.5.0 20210514 (Red Hat 8.5.0-28)] (/usr/bin/python3.9)
  jinja version = 3.1.6
  libyaml = True

$ ansible-galaxy collection list | grep -E "community.general|community.crypto|ansible.utils|community.mongodb|gluster.gluster|community.mysql"
ansible.utils                 2.12.0
community.crypto              2.16.1
community.general             7.5.2
community.mongodb             1.6.3
community.mysql               3.8.0
gluster.gluster               1.0.2
```

</details>

<details>

<summary>Install requirements for EL9 (RHEL, Rocky Linux, AlmaLinux)</summary>

Ensure `Python 3.9` is installed

```bash
$ ls /usr/bin/python* -l
lrwxrwxrwx. 1 root root 9 Apr 25 2025 /usr/bin/python -> ./python3
lrwxrwxrwx. 1 root root 9 Apr 25 2025 /usr/bin/python3 -> python3.9
-rwxr-xr-x. 1 root root 15448 Apr 25 2025 /usr/bin/python3.9
```

If not install it:

```bash
$ dnf install python39
```

Installation of pip linked to python 3.9

```bash
$ dnf install python-pip
$ pip install pip --upgrade
```

Install Ansible. `ansible-core` must be 2.15 or later and earlier than 2.19.

```bash
$ pip install ansible
```

Verify the `ansible` version and the associated collections

```bash
$ ansible --version
ansible [core 2.15.13]
  config file = /root/v1-101-0/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.9.21 (main, Feb 10 2025, 00:00:00) [GCC 11.5.0 20240719 (Red Hat 11.5.0-5)] (/usr/bin/python3)
  jinja version = 3.1.6
  libyaml = True
$ ansible-galaxy collection list | grep -E "community.general|community.crypto|ansible.utils|community.mongodb|gluster.gluster|community.mysql"
ansible.utils                 2.12.0
community.crypto              2.16.1
community.general             7.5.2
community.mongodb             1.6.3
community.mysql               3.8.0
gluster.gluster               1.0.2
```

Upgrade the `community.general` collection is lower than `8.2.0`

{% hint style="info" %}
community.general.dnf\_config\_manager is required for CRB. The module has been introduced in community.general 8.2.0. It does not exist in 7.5.2.
{% endhint %}

```bash
$ ansible-galaxy collection install community.general --upgrade
$ ansible-galaxy collection list community.general

# /root/.ansible/collections/ansible_collections
Collection        Version
----------------- -------
community.general 13.0.1

# /usr/local/lib/python3.9/site-packages/ansible_collections
Collection        Version
----------------- -------
community.general 7.5.2
```

</details>

<details>

<summary>Install requirements for Ubuntu 22.04 LTS</summary>

Ensure `Python 3.10` is installed

```bash
$ ls /usr/bin/python3* -l
lrwxrwxrwx 1 root root      10 Aug  8  2024 /usr/bin/python3 -> python3.10
lrwxrwxrwx 1 root root      17 Aug  8  2024 /usr/bin/python3-config -> python3.10-config
-rwxr-xr-x 1 root root 5937704 Mar  3 11:56 /usr/bin/python3.10
lrwxrwxrwx 1 root root      34 Mar  3 11:56 /usr/bin/python3.10-config -> x86_64-linux-gnu-python3.10-config
```

If not install it:

```bash
$ apt install python3.10
```

Installation of pip linked to python 3.10

```bash
$ apt install python3-pip
$ pip3 install pip3 --upgrade
```

Install Ansible. `ansible-core` must be 2.15 or later and earlier than 2.19.

```bash
$ pip3 install ansible
```

Verify the `ansible` version and the associated collections

```bash
$ ansible --version
ansible [core 2.17.14]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.10/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.10.12 (main, Mar  3 2026, 11:56:32) [GCC 11.4.0] (/usr/bin/python3)
  jinja version = 3.0.3
  libyaml = True

$ ansible-galaxy collection list | grep -E "community.general|community.crypto|ansible.utils|community.mongodb|gluster.gluster|community.mysql"
ansible.utils                            4.1.0  
community.crypto                         2.22.3 
community.general                        9.5.2  
community.mongodb                        1.7.8  
community.mysql                          3.11.0 
```

Install the `gluster.gluster` collection

```bash
$ ansible-galaxy collection install gluster.gluster
```

</details>

<details>

<summary>Install requirements for Ubuntu 24.04 LTS</summary>

Ensure `Python 3.12` is installed

```bash
$ ls /usr/bin/python3* -l
lrwxrwxrwx 1 root root      10 Nov 12  2025 /usr/bin/python3 -> python3.12
-rwxr-xr-x 1 root root 8020928 Mar 23 19:04 /usr/bin/python3.12
lrwxrwxrwx 1 root root      34 Mar 23 19:04 /usr/bin/python3.12-config -> x86_64-linux-gnu-python3.12-config
lrwxrwxrwx 1 root root      17 Nov 12  2025 /usr/bin/python3-config -> python3.12-config
```

If not install it:

```bash
$ apt install python3.12
```

Installation of pip linked to python 3.10

```bash
$ apt install python3-pip
$ pip3 install pip3 --upgrade
```

Install Ansible. `ansible-core` must be 2.15 or later and earlier than 2.19.

```bash
$ pip3 install "ansible-core<2.19" "ansible" --break-system-packages
```

Verify the `ansible` version and the associated collections

```bash
$ ansible --version
ansible [core 2.18.17]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.12/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.12.3 (main, Mar 23 2026, 19:04:32) [GCC 13.3.0] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True

$ ansible-galaxy collection list | grep -E "community.general|community.crypto|ansible.utils|community.mongodb|gluster.gluster|community.mysql"
ansible.utils                            5.1.2
community.crypto                         2.26.6
community.general                        10.7.6
community.mongodb                        1.7.10
community.mysql                          3.16.1
```

Install the `gluster.gluster` collection

```bash
$ ansible-galaxy collection install gluster.gluster
```

</details>

{% hint style="danger" %}
**Multi-nodes deployment:** Python installation and pip3 upgrade must be performed on all nodes.

**SELinux:** SELinux will be disabled during the Ansible deployment. Be ready to reboot the system afterward.
{% endhint %}

## Nodeum Installation and Update Guide

To install or update Nodeum, follow these steps. Ensure the host has unrestricted internet access.

Download the Nodeum ansible package:

```bash
$ wget get.nodeum.io/public/nodeum-v1-100.x.tar.gz
```

Extract the downloaded package:

```bash
$ tar -xvzf /root/nodeum-xxx.tar.gz
```

Navigate to the extracted directory:

```bash
$ cd v1-100.x-xx
```

Run the NODEUM ansible playbooks:

```bash
$ ansible-playbook install.yml
```

After the installation completes, the output should show no failed results:

```bash
....

TASK [nodeum.nrpe : Install check_nrpe client for testing] ***************************************************************************************************************
skipping: [srv01]

TASK [nodeum.nrpe : Test Nodeum services check via NRPE] *****************************************************************************************************************
skipping: [srv01]

TASK [nodeum.nrpe : Display NRPE test results] ***************************************************************************************************************************
skipping: [srv01]

TASK [nodeum.nrpe : Fail if NRPE test failed] ****************************************************************************************************************************
skipping: [srv01]

PLAY [keepalived] ********************************************************************************************************************************************************
skipping: no hosts matched

PLAY [lsyncd] ************************************************************************************************************************************************************
skipping: no hosts matched

PLAY RECAP ***************************************************************************************************************************************************************
srv01                      : ok=343  changed=67   unreachable=0    failed=0    skipped=198  rescued=0    ignored=2

```

Nodeum is now ready to use. Access it via your browser at `http://your-nodeum-ip-address/` or using the DNS name.

{% hint style="info" %}
If you are unable to access the Console via the default HTTP port, a local firewall might be active. To resolve this, configure the firewall to allow access through the HTTP/HTTPS protocols.
{% endhint %}


# Console

Nodeum offers a user-friendly graphical console for monitoring storage and system activities through various options like email and SNMP. This console includes a rich graphical user interface, enhancing the functionality of the nd command line tool with additional features. It simplifies administration tasks such as Workflow Definition, Storage Configuration, Reporting, Log Monitoring, and overall system configuration. This interface is integrated into the Nodeum Services.

### Compatibility guidelines

Web Based Interface designed in HTML5, Nodeum provides the best of its capabilities in using Chrome or Firefox as browser.

### Role-Based Access Control (RBAC)

The Console provides two distinct user profiles for utilizing, managing, and administering Nodeum.

<table><thead><tr><th></th><th width="127">Catalog</th><th width="215">Workflow Management</th><th>Trend Analytic</th></tr></thead><tbody><tr><td>Standard End-User</td><td>yes</td><td>no</td><td>no</td></tr><tr><td>Administrator User</td><td>yes</td><td>yes</td><td>yes</td></tr></tbody></table>

###


# Login

### How to access to the Console?

You can browse the Console Administration with your favorite browser through this URL: `http://<your server address>`.

By default an administrator profile is defined with the following credential:

`` Default Login : `admin` ``

`` Default Password : `password` ``

<figure><img src="/files/H2GT9KdX6jueg3BPehRI" alt=""><figcaption></figcaption></figure>

Connect with this credential to create your own user profile.

{% hint style="danger" %}
**Recommendation:** Update the admin password in settings immediately.
{% endhint %}

## How to change the admin password?

To change the default Admin password, navigate to the `System` page, select `User Management`, then go to `Web`, and set a new password.

<figure><img src="/files/JLVjqnJDv52cukzOfJXl" alt=""><figcaption><p>System User Management Settings</p></figcaption></figure>

## Type of User

Two roles are available: admin and user.\
Here is the access:&#x20;

<figure><img src="/files/AUanU7tghoitlRPrOsEQ" alt=""><figcaption></figcaption></figure>


# Dashboard & Reports

The Administrator user has a global overview about the Data Management activities.

By default, multiple widgets display information about files, volume, and task reports. You can add, remove, or rearrange these widgets as needed.

<figure><img src="/files/7kYAv5ty2gZg0cw5UMNi" alt=""><figcaption></figcaption></figure>

## Trend Analytic

### Overview

Administrators need to manage the storage location of their data efficiently. This feature offers a dynamic reporting system that includes:

* **Detailed Reports & KPIs:** Track storage usage based on criteria such as creation date, last access date, and data location.
* **Comprehensive Analysis:** Provides insights by users, user groups, categories, data types, and file sizes.
* **Deep Dive Analytics:** Offers in-depth examination into specifics of users, user groups, data type categories, and file sizes.

### Storage Global Overview

**Global Overview of Data Storage Classification**

In today's data-driven environment, effective storage management is crucial for maintaining operational efficiency. This overview classifies stored data by type, focusing on three key storage solutions: Network Attached Storage (NAS), Cloud storage, and Tape storage.

#### Storage Types:

1. **Network Attached Storage (NAS):**
   * NAS devices provide a centralized location for storing files accessible over a network.
   * Ideal for small to medium-sized enterprises needing scalable and efficient data storage.
2. **Cloud Storage:**
   * Services like Amazon S3 offer flexible, scalable, and remote storage solutions.
   * Suitable for businesses requiring high availability and disaster recovery options.
3. **Tape Storage:**
   * Tape drives offer cost-effective long-term storage solutions.
   * Best suited for archival purposes and storing large volumes of data that are infrequently accessed.

By understanding these storage types, organizations can effectively manage their data and resources, optimizing both accessibility and cost-efficiency.

<div data-full-width="false"><figure><img src="/files/XUfZ3IFh7n2Y6kK8b7pM" alt=""><figcaption></figcaption></figure></div>

### Data Life cycle

### Understanding the Impact of Data Archiving Policies

Analyze your data archiving (active archive) strategies by exploring the types of data stored and their respective storage solutions. This overview provides insights into the lifecycle of your data, presenting information categorized by both file size and type.

**Example:** Manage storage for containers using an active archive workflow.

<figure><img src="/files/XfuWaOvJKJKGnWDVtroj" alt=""><figcaption></figcaption></figure>

### Tape Reporting

The Tape Reporting feature in Nodeum offers crucial insights into the usage of tapes and tape drives. Its goal is to enhance data integrity and streamline tape management by gathering information via TapeAlert error reporting. TapeAlert is an industry standard for monitoring the status and detecting issues in tape devices and drives directly from the tapes.

<figure><img src="/files/PDfXNlQP3JCJAOiZJTGY" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Helps in the prevention of any problems on Tapes or Tape Drives.
{% endhint %}

<details>

<summary>Tape Drive Information Reporting</summary>

* <mark style="color:blue;">Load operations</mark> : Number of times the drive has been loaded in its lifetime.
* <mark style="color:blue;">Meters processed</mark> : Total number of meters of tape that have been processed by the drive mechanism in either direction.
* <mark style="color:blue;">Power-on cycles</mark> : Total number of times the drive has detected a power-on event.
* <mark style="color:blue;">Power-on time</mark> : Number of seconds the drive has been powered on over its lifetime.
* <mark style="color:blue;">Read errors</mark> : total number of error errors that could not be corrected by ECC, no servo error was reported, and the error was not a transient error. Each count represents one block in error that was not corrected but was recovered by ERPs and successfully written.
* <mark style="color:blue;">Read processed</mark> : Each count represents a kebibyte (1024 bytes) of data processed across the host interface during read-type commands.
* <mark style="color:blue;">Read retries</mark> : Total number of read temps
* <mark style="color:blue;">Write errors :</mark> The total number of write errors that could not be corrected by ECC, no servo error was reported, and the error was not a transient error. Each count represents one block in error that was not corrected, but was recovered by ERPs and successfully written.
* <mark style="color:blue;">Write processed</mark> : Each count represents a kebibyte (1024 bytes) of data processed across the host interface during write-type commands.
* <mark style="color:blue;">Write retries</mark> : Total number of write temps

</details>

<details>

<summary>Tape information Reporting</summary>

* <mark style="color:blue;">Bytes Read</mark> : The total number of bytes of data read to tape
* <mark style="color:blue;">Bytes Written</mark> : The total number of bytes of data written to tape
* <mark style="color:blue;">Compression Enabled</mark> : Indication of whether logical blocks will be compressed before they are written to the medium. The value reported indicates the current state of the device and does not indicate that logical blocks previously written to the medium were compressed. "yes" indicates that logical blocks will be compressed before being written to the medium during write type commands. "no" indicates that logical blocks will not be compressed before being written to the medium during write type commands.
* <mark style="color:blue;">Datasets read</mark> : The total number of data sets read from the medium in the volume over the lifetime of the volume.
* <mark style="color:blue;">Datasets written</mark> : The total number of data sets written to the medium in the volume over the lifetime of the volume.
* <mark style="color:blue;">Mount time</mark> : Time in milliseconds from the time when the system would first report GOOD status to a "TEST UNIT READY" command upon successful completion of a load operation until the system did not detect a volume present.
* <mark style="color:blue;">Read Compression Ratio</mark> : The average data compression ratio multiplied by 100 for all user data read from the medium since the last time this parameter was reset to zero. This parameter may include user data that was read from the medium but not returned to the application client (e.g., data that was read as part of a read ahead operation). The calculation is (number of bytes transferred out of the logical object buffer to an application client ÷ the number of bytes in logical objects read from the medium) x 100
* <mark style="color:blue;">Read Retries</mark> : Total number of read temps
* <mark style="color:blue;">Ready time</mark> : Time in milliseconds from the time the system was able to process medium access commands until the system started the processing of an unload operation.
* <mark style="color:blue;">Tapes Mounts (#)</mark> : The total number of successful cartridge unloads performed during the lifetime of a cartridge. This field may not be updated for mounts that occur with the volume physically write-protected.
* <mark style="color:blue;">Unrecovered Read Errors</mark> : The total number of times that a read type command was terminated with CHECK CONDITION status and a sense key of MEDIUM ERROR or HARDWARE ERROR over the lifetime of the volume.
* <mark style="color:blue;">Unrecovered Write Errors</mark> : The total number of times that a write type command was terminated with CHECK CONDITION status and a sense key of MEDIUM ERROR or HARDWARE ERROR over the lifetime of the volume.
* <mark style="color:blue;">Write Compression Ratio</mark> : The average data compression ratio multiplied by 100 for all user data written by the device since the last time this parameter was reset to zero. The calculation is (number of bytes transferred from an application client into the logical object buffer ÷ the number of bytes in logical objects written to the medium) x 100
* <mark style="color:blue;">Write Retries</mark> : Total number of write temps

</details>

#### Forget a tape

While you forget a tape, Nodeum removes all data related to the selected tape from the catalog and indexation engine. &#x20;

The contents physically stored in the tapes will stay available, but these are not anymore available from Nodeum, the tape status is seen as 'Unknown'.

{% hint style="danger" %}
To execute the operation to forget a tapes, it is mandatory that the tape is not anymore in the Tape Library or the tape is located into an I/O slot.
{% endhint %}

The forget feature is available in this menu:

> Trend analytic -> Tape Reporting

Select the tape you wish for Nodeum to forget, click the three dots on the right, and choose "Forget" from the list.

<figure><img src="/files/kFdGH4itIgQSRGwIbyP4" alt=""><figcaption></figcaption></figure>

#### Tape Status

Understanding the different lifecycle stages of tapes is crucial for maintaining data integrity and efficient tape management.

#### Barcode

<table><thead><tr><th width="160" align="center">Barcode</th><th>Description</th></tr></thead><tbody><tr><td align="center"><img src="/files/02WRPGtSkuVDj2frJoXs" alt="" data-size="original"></td><td>To prepare the tape for use, format the LTFS partition as it is currently unrecognized</td></tr><tr><td align="center"><img src="/files/xDuT9A3JarPqNBV4kp4J" alt="" data-size="original"></td><td>The tape is ready and can be used</td></tr><tr><td align="center"><img src="/files/LSpUSUCtV1hDOgLhPCRi" alt="" data-size="original"></td><td>The tape has a write protection enabled</td></tr><tr><td align="center"><img src="/files/nOroBqu7w6F2ogQ8455R" alt="" data-size="original"></td><td>The tape's capacity is full, no space left</td></tr></tbody></table>

#### Protect

<table><thead><tr><th width="165" align="center">Protect</th><th>Description</th></tr></thead><tbody><tr><td align="center"><img src="/files/g2o8cBgyn1ZwHFYTbXeN" alt="" data-size="original"></td><td>No tape protection is set</td></tr><tr><td align="center"><img src="/files/1ANrFZ6u34l6I3VYkR6Z" alt="" data-size="original"></td><td>The tape is protected by Nodeum software in using the lock feature</td></tr><tr><td align="center"><img src="/files/u6CPVSBLJPulS1eR6uNN" alt="" data-size="original"></td><td>The tape's physical write protection lock is enabled</td></tr><tr><td align="center"><img src="/files/ysOHTJIpNdhNAT3Pd0iP" alt="" data-size="original"></td><td>Nodeum software and physical write protection are both enabled</td></tr></tbody></table>

#### Status

<table><thead><tr><th width="236" align="center">Status</th><th>Description</th></tr></thead><tbody><tr><td align="center"><img src="/files/Sd7Ms2uENum2GW6qV8uC" alt="" data-size="original"></td><td>The tape is in good condition and ready</td></tr><tr><td align="center"><img src="/files/V3gKLFPY8A9IUla9cvz3" alt="" data-size="original"></td><td>The tape is flagged for review; a tape verification task must be performed</td></tr></tbody></table>


# Catalog

## Content Catalog

The catalog provides comprehensive control and traceability of all files managed by Nodeum within workflow orchestration. It includes files from primary storage added to the inventory, which is crucial for using the TCO Calculator prior to workflow management.

### Access and Storage Interface

Through a user-friendly interface, users can access data across various storage spaces:

* **Cache Storage**
* **Nearline Archive**: Data archiving on tapes.
* **Cold Archive**: Data protection on tapes.
* **Cloud and S3 Object Storage**

Fast search capabilities are enabled by utilizing both embedded file metadata and business metadata.

### Secure and Flexible Access

The system offers a secure method for external users to access the infrastructure, using access rights or as part of a more advanced access portal. This feature can be configured as a self-service option or with stricter controls, facilitating data sharing directly from within the Nodeum infrastructure.

### Indexed Content

The indexation engine offers native capabilities for indexing all metadata related to contents, tasks, reports, and data management statistics. By creating an index, it enables fast searching throughout the solution rather than searching through text.

The solution includes both a Solr-indexed engine and a Nodeum indexation engine service. The latter is designed to export all defined information from SQL and NoSQL databases to Solr, facilitating index creation.

The engine runs automatically.

{% hint style="info" %}
Sometimes, it's required to index the catalog.&#x20;
{% endhint %}

### User Management

The catalog uses the end user access rights to provide an easy and secure self-service portal. Any end user is allowed to manage their data straight through the Nodeum Ecosystem.

### Data Lifecycle Information <a href="#catalog-datalifecycle" id="catalog-datalifecycle"></a>

When opening a tile, all details about the file is available including its lifecycle. This display the different processed copies.

<img src="https://www.nodeum.io/hs-fs/hubfs/datelifecycle.png?width=2880&#x26;name=datelifecycle.png" alt="data lifecycle on files" width="2880">

#### Information Description

<table><thead><tr><th width="295">Value</th><th>Description</th></tr></thead><tbody><tr><td>Path</td><td>Path of the folder or file </td></tr><tr><td>Creation Date</td><td><ul><li>Creation date of Files or Folder </li><li>Place of Store (Primary Storage and its name)</li></ul></td></tr><tr><td>Last Modification Date</td><td>Last modification date of files or folfer and its size </td></tr><tr><td>Type of Task (Offline , active  Copy/move)</td><td><p>Ex. : it is the date of last offline copy done </p><p>You can see the following details :</p><ol><li>Target where the data are stored for NAS/Cloud backup</li><li>Volume if the file/Folder is store on Tape</li><li>Pool Name </li><li>Rule : name of task runned</li></ol></td></tr><tr><td>In cache</td><td><p>The file or folder are save in Active archive workflows.</p><p>The data is in cache save on a specfic container.<br>The user can open the files/Folder directly and bring modification.</p></td></tr></tbody></table>

### Search bar integration

The search bar is integrated into the catalog and some reports, including the Data Lifecycle and metadata reports. It helps you find data quickly and easily. You can use multiple filters to refine your search.

| Filter to refine the search                                                                          |                                                                                                                                                                   |
| ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Keywords                                                                                             |                                                                                                                                                                   |
| From File x size to x size                                                                           |                                                                                                                                                                   |
| From Change Date xx to                                                                               |                                                                                                                                                                   |
| From Modification Date xx to                                                                         |                                                                                                                                                                   |
| From Access Date xx to                                                                               |                                                                                                                                                                   |
| Container                                                                                            | Choose a Container from the list                                                                                                                                  |
| Primary Storage and if needed apply some filters to affine the selection (type of storage, pool..)   | <ul><li>Scanned represents the files inventoried but not used by workflow manager</li><li>Workflow represents the files managed by workflow into Nodeum</li></ul> |
| Secondary Storage and if needed apply some filters to affine the selection (type of storage, pool..) |                                                                                                                                                                   |
| Path                                                                                                 | complete the full path of the file                                                                                                                                |
| all levels                                                                                           | Only for the path, you see all files and folders                                                                                                                  |

&#x20;But you can also search data with special command :&#x20;

| Property list                   | Definition                         |
| ------------------------------- | ---------------------------------- |
| file\_id\_l                     | It is the internal file identifier |
| file\_parent\_id\_l             |                                    |
| file\_name\_s                   |                                    |
| file\_parent\_path\_s           |                                    |
| file\_base\_name\_s             |                                    |
| file\_extension\_s              |                                    |
| file\_size\_l                   |                                    |
| file\_type\_i                   |                                    |
| file\_change\_dt                |                                    |
| file\_modification\_dt          |                                    |
| file\_access\_dt                |                                    |
| file\_extern\_b                 |                                    |
| file\_in\_cache\_b              |                                    |
| file\_in\_cache\_dt             |                                    |
| file\_out\_cache\_dt            |                                    |
| user\_owner\_id\_l              |                                    |
| user\_can\_read\_b              |                                    |
| user\_can\_write\_b             |                                    |
| user\_can\_execute\_b           |                                    |
| group\_owner\_id\_l             |                                    |
| group\_can\_read\_b             |                                    |
| group\_can\_write\_b            |                                    |
| group\_can\_execute\_b          |                                    |
| other\_can\_read\_b             |                                    |
| other\_can\_write\_b            |                                    |
| other\_can\_execute\_b          |                                    |
| on\_primary\_pool\_b            |                                    |
| on\_secondary\_pool\_b          |                                    |
| prim\_id\_l                     |                                    |
| prim\_name\_s                   |                                    |
| prim\_container\_name\_s        |                                    |
| prim\_container\_id\_l          |                                    |
| prim\_container\_comment\_t     |                                    |
| prim\_pool\_name\_s             |                                    |
| prim\_pool\_id\_l               |                                    |
| prim\_pool\_comment\_t          |                                    |
| prim\_pool\_type\_i             |                                    |
| prim\_pool\_content\_i          |                                    |
| prim\_nas\_share\_name\_s       |                                    |
| prim\_nas\_share\_id\_l         |                                    |
| prim\_nas\_name\_s              |                                    |
| prim\_nas\_id\_l                |                                    |
| prim\_nas\_type\_i              |                                    |
| prim\_nas\_comment\_t           |                                    |
| prim\_nas\_price\_d             |                                    |
| prim\_cloud\_bucket\_name\_s    |                                    |
| prim\_cloud\_bucket\_id\_l      |                                    |
| prim\_cloud\_bucket\_price\_d   |                                    |
| prim\_cloud\_connector\_name\_s |                                    |
| prim\_cloud\_connector\_id\_l   |                                    |
| prim\_cloud\_connector\_type\_i |                                    |

This information create command in the search that you can complete manually after choosing filter(s).

{% hint style="info" %}
Example of Command to afine the keysearch :

\* file\_name:test

\* to get only folder : file\_type:0&#x20;

\*  to get only files : file\_type:1  to get only files

\* Checking if file or folder are in cache : file\_in\_cache:1

\* Checking if files or folder are not in cache : file\_in\_cache:0
{% endhint %}

### Basket

End-Users can initiate Data Archiving or Data Protection workflows directly from the Catalog using the basket. This accelerates operations by utilizing the Catalog's search and filtering capabilities.

<figure><img src="/files/1iRaDAAV6qdORLPymw9p" alt=""><figcaption><p>Basket</p></figcaption></figure>

### Authorization to User Admin

It is possible to grant the admin account permission to view all items in the catalog.

<table><thead><tr><th width="265.3333333333333">Type</th><th width="327">Description</th><th>Example</th></tr></thead><tbody><tr><td>Administrator see everything </td><td><p>if it is enable : allow all "<em>administrator accounts</em>" to see all contents which are in the catalog.  </p><p></p><p>If it is disable, the "administrator accounts" will not see the files they are not granted to see.</p></td><td> </td></tr><tr><td>Default Filter</td><td>to hide in the catalog the hidden files (.*)</td><td>-file_name:(.*)</td></tr></tbody></table>

### Force an indexation

Navigate to the System menu and select Settings to initiate an indexation.

| Type of Indexaton | Description                                        |
| ----------------- | -------------------------------------------------- |
| Full              | a Full which will launch a complete new Indexation |


# Data Mover Management

The centralized dashboard enables users to monitor task progress with real-time updates on data status. Users can define unlimited tasks simultaneously to move, archive, and protect data across various storage tiers.&#x20;

Task management features provide control and visibility.

To start, first create a task

&#x20;and choose a workflow&#x20;

1. <mark style="color:blue;">Data Archiving</mark>
2. <mark style="color:blue;">Data Protection</mark>
3. <mark style="color:blue;">Data Migration</mark>

Each workflow has its own settings:

* [ ] <mark style="color:green;">Actions</mark>
* [ ] <mark style="color:green;">Source</mark>
* [ ] <mark style="color:green;">Destination</mark>
* [ ] <mark style="color:green;">Granular File Selection</mark>
* [ ] <mark style="color:green;">Scheduler</mark>
* [ ] <mark style="color:green;">Filter</mark>&#x20;
* [ ] <mark style="color:green;">Advanced Setting : Priority, Metadata Management, …</mark>

### Data Protection / Offline Archive&#x20;

#### Definition

Data Protection or Offline Archiving task secures selected data on a dedicated storage tier. Data accessibility is managed by the administrator behind the workflow. It allows only the data to be read or retrieved online.&#x20;

Depending on the medium chosen, data can be physically moved off-site. This requires human intervention to retrieve the data online.&#x20;

Users have the option of running an offline workflow that will copy or move the data to a secondary storage pool.

#### <mark style="background-color:green;">Why to use this workflow?</mark>

1. Protect stored content that is online (online means "modifiable" by users or applications). Workflow allows these data to be copied according to defined criteria.
2. Archive data on a disconnected media, with the possibility of get it online - offsite.

#### Traceability

A complete traceability is kept. &#x20;

User/administrator have an overview of their data mobility even if the data has been secure offline.

In case of tape library, data can even be move out of the library (off site).  All contents are stored in open format, under common standards.

#### Available Criteria

<table><thead><tr><th width="226">Source</th><th width="255">Destination</th><th>Type of action  Mover </th></tr></thead><tbody><tr><td><p>Primary Storage :</p><ul><li>Nas</li><li>Object Storage</li></ul></td><td><p>Secondary Storage :</p><ul><li>Tape Pools</li><li>Cloud Pools</li><li>Nas Pools</li></ul></td><td><p></p><ol><li>Copy</li><li><a data-footnote-ref href="#user-content-fn-1">Move</a></li><li>Erase</li></ol><p></p></td></tr><tr><td>Container </td><td><p>Secondary Storage :</p><ul><li>Tape Pools</li><li>Cloud Pools</li><li>Nas Pools</li></ul></td><td><ol><li>Copy</li><li>Move</li><li>Erase</li></ol></td></tr><tr><td>Restore Source</td><td>Destination </td><td><ol><li>Move </li></ol></td></tr><tr><td>Tape Pools</td><td><ul><li>Container (cache)</li><li>Primary Storage (NAS or Object Storage)</li></ul></td><td><ol><li>Copy</li><li>Move</li></ol></td></tr><tr><td>Cloud Pools</td><td><ul><li>Container (cache)</li><li>Primary Storage (NAS or Object Storage)</li><li>Cloud Pool</li></ul></td><td><ol><li>Copy</li><li>Move</li></ol></td></tr><tr><td>Nas Pools</td><td><ul><li>Container (cache)</li><li>Primary Storage (NAS or Object Storage)</li><li>Nas Pool</li></ul></td><td><ol><li>Copy</li><li>Move</li></ol></td></tr><tr><td>Task</td><td><ul><li>Container (cache)</li><li>Primary Storage (NAS or Object Storage)</li></ul></td><td><ol><li>Copy</li><li>Move</li></ol></td></tr><tr><td>From Reference File</td><td><ul><li>Container (cache)</li><li>Primary Storage (NAS or Object Storage)</li></ul></td><td><ol><li>Copy</li><li>Move</li></ol></td></tr></tbody></table>

#### Specific Option

| Option                       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Remove also selected folders | <p></p><p>This option lets you delete the original folder structure after a <strong>Move</strong> operation.</p><ul><li>It is only available in an <strong>Offline Archive – Move</strong> workflow from <strong>primary storage to tape storage</strong>.</li><li>By default, folders are kept in place, but their contents are moved (leaving them empty).</li><li>If you enable <strong>“Remove also selected folders”</strong>, both the files <strong>and</strong> their original folders will be removed from primary storage.</li></ul> |

### Data Archiving / Active Archive

{% hint style="info" %}
Before to use this workflow, make sure to configure the container and cache.  Learn more to [Container configuration section](broken://pages/e65MpRrigCgw9EoW4wYz)
{% endhint %}

#### Definition

To archive a collection of data that can be moved from an expensive primary storage tier to a secondary storage tier. The data may or may not be removed from primary storage and must remain accessible from time to time. Data archiving allows data to be stored that does not require intensive reading and writing, but can be modified or read from time to time.

#### <mark style="background-color:green;">Why to use this workflow?</mark>

Data is stored on less expensive storage media, such as object storage, tape storage or even low-cost disks. An active archive includes functionality to seamlessly move data between different storage tiers (disk - tape - cloud) so that applications or users can access it directly.

{% hint style="info" %}
This will provide movement of files from where files are stored to the destination.

* If files are in the Cache, the files are directly copied into the destination.
* If files are in another “Active Archive” Secondary Storage, the files are recovered and copied into the cache and then copied into the final destination.
  {% endhint %}

For a file directory structure, there is no change on the file presentation. Each file stay in the same folder.  Nodeum uses a Virtual File System and an internal mechanism stubbing. This means that the files always pass through the caching disk.

Data can be directly copied into the Container (SMB/NFS/S3) and then defined workflow will execute task movement linked to this container.

{% hint style="success" %}
You can migrate data efficiently by using an Active Archive Workflow, moving it from Primary Storage
{% endhint %}

## Task Monitoring

To aid in monitoring task execution, the Console offers a comprehensive monitoring feature. This feature provides a global overview of all task activities.

Three different sections are available :&#x20;

#### Upcoming task

This section shows the task(s) scheduled.  For each task, you can see detailed information including the date - time when the task will be executed.&#x20;

It is possible to skip an execution in clicking in the right cross icon.

If a task hasn't been executed properly, then you will an information saying that "task execution missed for one or multiple occurence".

<figure><img src="/files/h6TaTWFA9P3WVfczj0uM" alt=""><figcaption></figcaption></figure>

#### Running task

This section provides the list of the task(s) which are currently running. &#x20;

For each of these tasks, you can

1. See the detail and the status.
2. Pause the task execution.
3. Resume a paused task .
4. Stop the task execution

#### History

In this section you can find all the tasks that have been completed.

<figure><img src="/files/K5K2PNJIYSz1zyjol0p5" alt=""><figcaption><p>List of tasks history</p></figcaption></figure>

## Task Report&#x20;

For each task running or finished, you can open to see the global view about the task.

To see the full informations click on the arrow beside the task:

<figure><img src="/files/ecFkdKPgXQcFY56zFlYh" alt=""><figcaption><p>List of Nodeum's tasks</p></figcaption></figure>

And have a look on the task information:

<figure><img src="/files/HfnSbNyXrNcyvdtKols3" alt=""><figcaption><p>Screenshot about a task execution</p></figcaption></figure>

Definitions of task informations :&#x20;

| Informations    | Definition                                                                                                                                     |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Timing          | <ol><li>Task starts the x date and at x hours</li><li>Elapsed time for the task</li><li>Estimated remaining time to process the task</li></ol> |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| Type            | <ol><li>Offline Archive</li><li>Active Archive</li><li>Data Exchange</li></ol>                                                                 | <p>Move or Copy to a destination:</p><p><img src="https://mt-c-storage.atlassian.net/wiki/download/attachments/1007681564/image2018-3-19_10-50-42.png?version=1&#x26;modificationDate=1547218570840&#x26;cacheVersion=1&#x26;api=v2" alt=""> Network Shared Folder named Container</p><p><img src="https://mt-c-storage.atlassian.net/wiki/download/attachments/1007681564/image2018-3-19_10-51-57.png?version=1&#x26;modificationDate=1547218571533&#x26;cacheVersion=1&#x26;api=v2" alt=""> Nas</p><p><img src="https://mt-c-storage.atlassian.net/wiki/download/attachments/1007681564/image2018-3-19_10-51-17.png?version=1&#x26;modificationDate=1547218571188&#x26;cacheVersion=1&#x26;api=v2" alt=""> Tape</p> |
| Processed size  | size of data processed                                                                                                                         |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| Processed items | Number of items of data processed                                                                                                              | To see the good process click on the tab processed items\*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| Logs            | Details of task's log                                                                                                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |

{% hint style="success" %}
Each task report  contains all files processed during the task, a downloaded copy can be exported.
{% endhint %}

### Task Log

Below is a table listing messages found in the logs, mostly arranged in the

| Message                                                                                          | Alternative value                                                                             | Definition                                                                                                                                                                                                                                                       |
| ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Task is starting                                                                                 | n/a                                                                                           | The task starts.                                                                                                                                                                                                                                                 |
| Parallel Processing mode is Enabled                                                              | Parallel Processing mode is Disabled                                                          | In Enabled mode, all processes run concurrently, unlike in Disabled mode where processes run sequentially. Disabled mode is useful                                                                                                                               |
| Initialization Process is starting                                                               | n/a                                                                                           | The process in charged of the inventory is started.                                                                                                                                                                                                              |
| License is valid                                                                                 | License is not valid (`'description of the error'`), task cannot be executed                  | It checks the validity of the Nodeum licence is valid.                                                                                                                                                                                                           |
| Task Job Limits : 100 files/job - 2 parallel job(s) - 200 parallel DBFile/job - 1000000000 B/job | <p># parallel job(s)<br># parallel DBFile/job<br># B/job</p>                                  | It defines the number of files to be processed per batch. This example means that the task will included 2 jobs; each of them will contains maximum 200 files or a size of maximum 1GB. When one of these values is reached, then another batch will be defined. |
| Incremental Mode is Configured. The process will select only new content                         | Full Mode is Configured.                                                                      | The process will select only new content or will select all files to be processed.                                                                                                                                                                               |
| Processing Order is Configured. (Ascending)                                                      | Processing Order is Configured. (Descending)                                                  | This manages the order of files processing. Best performance is Ascending.                                                                                                                                                                                       |
| Check integrity of data transfers: MD5                                                           | <p>Check integrity of data transfers: CRC32<br>Check integrity of data transfers: XXHAS64</p> | The type of integrity check is displayed.                                                                                                                                                                                                                        |
| Pool `pool name`: Tape `tape barcode`: VALID                                                     | n/a                                                                                           | This verifies if the associated pool contains a valid tape.                                                                                                                                                                                                      |
| Pool `pool name:`1 valid tape(s)                                                                 | n/a                                                                                           | This summarizes the number of valid tapes in the associated pool.                                                                                                                                                                                                |
| Main Process is starting                                                                         | n/a                                                                                           | The copy process starts.                                                                                                                                                                                                                                         |
| Finalization Process is starting                                                                 | n/a                                                                                           | The process responsible of managing the catalog changes starts.                                                                                                                                                                                                  |
| Tape `tape barcode`: is Mounted on the drive `drive s/n`                                         | n/a                                                                                           | Indicates a request to mount a tape in a tape drive.                                                                                                                                                                                                             |
| Tape `tape barcode`loaded on the drive `drive s/n` is Dismounted                                 | n/a                                                                                           | Indicates a request to dismount a tape in a tape drive.                                                                                                                                                                                                          |
| LTFS File System of the Tape `tape barcode`loaded on the drive `drive s/n` is Mounted            | n/a                                                                                           | The LTFS partition is mounted for the specified tape in the specified tape drive.                                                                                                                                                                                |
| LTFS File System of the Tape `tape barcode`loaded on the drive `drive s/n`is Umounted            | n/a                                                                                           | The LTFS partition is unmounted for the specified tape in the specified tape drive.                                                                                                                                                                              |
| Unable to Mount LTFS File System of the Tape `tape barcode`loaded on the drive `drive s/n`       | n/a                                                                                           | The tape cannot mount its LTFS file system properly.                                                                                                                                                                                                             |
| Unable to Copy a File. (Read-Only LTFS FileSystem, Try to mount it again)                        | n/a                                                                                           | <p>Indicates that the tape is mounted with Read-Only LTFS file system and can't copy the file. The task will remount another tape.<br><mark style="background-color:red;">It is highly recommended to check the tape manually.</mark></p>                        |
| Total of items/size parsed: `xxxx`(`yyy`TB)                                                      | n/a                                                                                           | This list the result of the Initialization process and list the number of files and size to be processed by the task.                                                                                                                                            |
| Total of items/size already up to date on the destination: `xxxx`(`yyy`TB)                       | n/a                                                                                           | This is the result of the verification of the number of files and the size already available at the destination.                                                                                                                                                 |
| Total of items/size to process on this schedule: `xxxx`(`yyy`TB)                                 | n/a                                                                                           | This is the summary of what will be processed during this task execution.                                                                                                                                                                                        |
| Initialization Process is finished                                                               | n/a                                                                                           | This confirms that the Initialization process is finished and then files inventory is available.                                                                                                                                                                 |
| All Files were processed on this Rule                                                            | n/a                                                                                           | This confirms that all files have been processed.                                                                                                                                                                                                                |
| Main Process is finished                                                                         | n/a                                                                                           | The Main process is finalized.                                                                                                                                                                                                                                   |
| Retry made on volume `tape barcode`: `xx`                                                        | n/a                                                                                           | Shows the number of mount retries for all the defined tape barcode.                                                                                                                                                                                              |
| Finalization Process is finished                                                                 | n/a                                                                                           | The Finalization process is finalized.                                                                                                                                                                                                                           |
| Task is finished with Success                                                                    | n/a                                                                                           | The Task is finalized.                                                                                                                                                                                                                                           |

[^1]: “Remove also selected folder” option is available for removing also the file structure after a move operation.

    This option is only available for an Offline Archive - **Move** workflow from primary storage to tape storage


# Policy-Based Task orchestration

**Data Movement Management**

The system manages and coordinates data movement tasks based on predetermined policies or rules. It facilitates handling numerous tasks, covering not only execution but also monitoring and reporting.

**Types of Workflows**

The Workflow Manager enables the creation of various data movement tasks:

* **Copy**
* **Move**

**Policies Available**

* **Data Migration**

Each task involves defining both the source storage, along with its dataset, and the destination storage.

### Execution Modes

It is possible to define multiple tasks, they are executed in parallel mode in a multi-threaded system.

Each task will execute the movement of a list of files (1 or n) and segment the processing into 3 main parts:

* Preparation phase
* Execution phase
* Finalization phase

For each task execution process, specific jobs are created. The default segmentation is defined to optimize the data processing (example of a default setting: create a job of 1 GB or 100 files maximum).

Each job will be sent into a different queue system. A dispatching engine will coordinate the processing of each job in regard to the defined priority.

Then, different workers are created to do the copy of files and to do the reporting to Finalization process about the status of the copy.

&#x20;The workflow manager can execute these 3 phases in two main different modes:

* sequential processing
* parallel processing

The Data Mover always takes into account the remaining space of the destination storage. This means that if the available capacity is insufficient to store the file being copied, the operation will either result in an error message such as "stopped by system" (in the case of NAS and file systems), or it will request a new tape (for tape storage). In any case, files are never split across multiple media.

### Task Action

Each running task can be paused or stopped. If a task is paused, it can always be restarted. Pressing the stop button will stop the task. Once the stop button has been pressed, it may take a few seconds or minutes before the task is stopped. This is because the task always finishes the current job under processing.

### Extended Data Set Selector

An unlimited data set selector brings granularity to the data you have to select. Movement can be executed between any type of storage from storage where hot data are stored to cold storage.

### Path Management

For any type of data movement, the Workflow Manager always maintains the original path where the contents were originally stored.

Business applications are configured to access the same folders, even if data have been moved. It is why it is very important that when data are retrieved, they are recopied into their original folder.

Meanwhile, Nodeum offers different options to change this behavior and provides solutions to relocate the contents into another folder structure.

### Enhanced File Verification

The system now offers extended file verification through integration with third-party storage providers. This feature allows retrieval of pre-calculated checksums when files are copied to a storage device which offer the ability to generate and export these checksums. Nodeum includes this additional a process that retrieves the calculated checksums upon file copying and compares them with the checksums generated by the Nodeum data movement process.

\
Outcome includes file-level reports based on the status of each task's process items list.

### Result of Task execution&#x20;

Each task finishes with a status, each task status determines the result of the processing that has been executed. This following [table](broken://pages/DR8u4bfKcmJPfJGybryO) describes each type of status.


# Content traceability

Trace Nodeum archiving operations with audit trails, task/file statuses, and common stop or error causes.

<mark style="color:purple;">**Archiving with Nodeum**</mark>

**Traceability**

Digital archiving requires adherence to strict procedures for scanning, indexing, and storing documents securely and systematically. Nodeum provides comprehensive workflow solutions covering these key aspects.

**Secure Storage & Accessibility**

* **Indexing and Secure Storage**: Digital documents are indexed and stored securely, maintaining the original format to prevent unauthorized alterations.
* **Integrity Checks**: Optional integrity checks can be applied during the archiving process to ensure document authenticity.

**Foolproof Archiving**

* **Metadata Attachment**: Attach metadata to files for controlled and secure lifecycle management.
* **Read-Only Storage**: Archive contents onto read-only storage for additional protection.

**Document Access**

* **Monitoring and Audit Trails**: All operations are monitored, with comprehensive audit trails available.
* **Workflow Reporting**: Nodeum provides detailed reports on archiving workflows and integrity checks.

## Audit Trails for Tasks

Audit trails are critical for tracking the history and accountability of tasks. They record actions taken, by whom, and when they occurred, ensuring transparency and assisting in troubleshooting and compliance.

#### Key Benefits

* **Accountability**: Provides a clear record of who performed actions.
* **Transparency**: Enhances visibility into task progression.
* **Efficiency**: Aids in quickly identifying issues or bottlenecks.

#### Implementation Tips

* Use robust logging systems to capture detailed actions.
* Regularly review audit logs to ensure task integrity.
* Ensure compliance with any relevant regulations or standards.

Incorporating audit trails into task management can improve overall process control and reliability.

### Task Status

Each task concludes with a status, which indicates the processing outcome. Refer to the table below for descriptions of each status type.

| Status              | Definition                                                   | Action to do                                                                                                |
| ------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- |
| Done                | Task is finished with success                                | N/A                                                                                                         |
| Stop by User        | Task is stopped by a user prior to the end                   | N/A                                                                                                         |
| Finish with Warning | Task is finished but some files were not processed correctly | Review the processed files to better understand the root cause of this problem and why the message appears. |
| Stop by System      | The task is stopped by the System                            | Understand why the system stopped the task; going into the task’s log will provide the required details.    |
| Error               | The task is stopped anomaly                                  | Understand why an error occurs; going into the system log will provide the required details.                |

#### Root cause of "Stop by System" status

Below is a list of logs accessible following a system shutdown:

<table><thead><tr><th width="290.3333333333333">Log</th><th width="275">Definition</th><th>Action</th></tr></thead><tbody><tr><td>Drive %s is in Maintenance Mode. Set it Online to Start the Execution of this Task</td><td>Drive N°xx is on maintenance</td><td>Select another drive to run the task</td></tr><tr><td>Error during allocation of a scratch tape to the pool</td><td>impossible to get a tape from de scratch pool</td><td>Check if tape are in the scratch pool</td></tr><tr><td>File is not copied on any Tape on this pool</td><td>When we will reload a file and the files doesn't exist on a tape in the pool choosen</td><td></td></tr><tr><td>Invalid cloud pool</td><td>Cloud pool doesn't exist</td><td>create the cloud pool before to run the task</td></tr><tr><td>Invalid Destination or Task destination is invalid</td><td>The destination choosen doesn't exist or the connection failed</td><td>Check if the destination exist</td></tr><tr><td>Invalid NAS pool</td><td>NAS pool doesn't exist</td><td>create the NAS pool before to run the task</td></tr><tr><td>Invalid Pool</td><td>Pool choosen doesn't exist</td><td>Check if the pool exist. If not create it</td></tr><tr><td>Pool does not have a valid tape and scratch pool is empty</td><td>No tape is in the pool and no tape in scratch pool</td><td>Insert a tape in the pool. Don't forget to format it before to run the task</td></tr><tr><td>Pool does not have a valid tape and unable to get a scratch volume for this task</td><td>No tape is in the pool and impossible to get a tape in scratch pool</td><td>Insert a tape in the pool. Don't forget to format it before to run the task</td></tr><tr><td>Tape %s is not in the library</td><td>Tape Nbre xx is not in the tape library</td><td>Put the tape in the library</td></tr><tr><td>Tape destination is invalid</td><td>barcode doesn't exist. The tape haven't mount and is out of tape library</td><td></td></tr><tr><td>Tape pool destination is invalid</td><td>tape pool doesn't exist</td><td>create the tape pool before to run the task</td></tr></tbody></table>

### Files Status

<table><thead><tr><th width="164.33333333333331">Status</th><th width="307">Definition</th><th>Actions</th></tr></thead><tbody><tr><td>EACCESS</td><td>Permission Denied on File (in Source or Destination).</td><td>Check the privilege.</td></tr><tr><td>EINVAL</td><td>Invalid Argument. The device is not managed, or the device is not well configured.</td><td>Check the Configuration.</td></tr><tr><td>ENOSPC</td><td>Not enough space on the device.</td><td>Move Data from Cache to Secondary Storage</td></tr><tr><td>EROFS</td><td>The problem of writing in the file system.</td><td>Perhaps the file system is in Read-Only</td></tr><tr><td>FAILED</td><td><p>Some special characters in the name of the file could block the process of this file.</p><p>The number of characters (in the file's name) is too long.</p></td><td><p>Rename the file with appropriated character(s) and restart the task.</p><p>Check in the Primary Storage if the file is available.</p></td></tr><tr><td>FATALERR</td><td>The problem of DB update in the LTFS format.</td><td></td></tr><tr><td>GETCACHERR</td><td>The file is removed from secondary storage.</td><td></td></tr><tr><td>LTFSERR</td><td>LTFS error. Mount LTFS ERROR.</td><td>Make a tape Consistency.</td></tr><tr><td>MLERROR</td><td>Error during a data enrichment.</td><td></td></tr><tr><td>NOTEMPTY</td><td>Impossible to delete a folder empty.</td><td></td></tr><tr><td>NOFILE</td><td><ul><li>File source do not exist.</li><li>File source is not available.</li></ul><p>This situation is due because the file(s) are not on the source or the destination.</p></td><td>Check the connectivity of the Storage</td></tr><tr><td>OFFLINE</td><td><ul><li>Storage is not connected to Nodeum.</li><li>Tape barcode is not readable.</li></ul></td><td><ul><li>Connect the Storage.</li><li>Check the barcode of the tape</li></ul></td></tr><tr><td>OK</td><td>Files copy or move with Success.</td><td></td></tr><tr><td>PARTIAL</td><td>Copy did with success on a part of files</td><td></td></tr><tr><td>TAPEERR</td><td>Tape drive or Tape Library on Error.</td><td>Check if the tape library is ready.</td></tr><tr><td>UPTODATE</td><td>The same file(s) already exist in the destination.</td><td></td></tr></tbody></table>


# Filtering (Basic or Advanced)

Allows users to easily manage and organize their data movement workflows by filtering files based on specific criteria.  Handle different time - date threshold in the filter module such as : creation date, last access date, ...

Two different types of filtering are available:

* basic mode
* Advanced mode: it provides an embedded scripting editor.

#### Based on File Name

The file name and path can be used in the filtering module.

<figure><img src="/files/081lYR1CrTKUzRel01Tk" alt=""><figcaption></figcaption></figure>

#### Based on File Extension

<figure><img src="/files/QgMkYy640sU2VtrJkED5" alt=""><figcaption></figcaption></figure>

#### Based on File Size

<figure><img src="/files/qUmnzU0zQk0etAgrcupB" alt=""><figcaption></figcaption></figure>

#### Based on Boolean Operators

&#x20;Boolean operators are available. Default operator is inclusive OR, different operators can be set.

<figure><img src="/files/u4s8UVHKsyhnsFS6Carz" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/iVJLoCIvzZx6TD5IWU20" alt=""><figcaption></figcaption></figure>

### **Basic Mode** <a href="#filtering-basicmode" id="filtering-basicmode"></a>

This mode includes the capability to define expressions directly in the Console based on the following types:

<table><thead><tr><th width="206.33333333333331">Type of Filter</th><th width="215">Operator</th><th>Description</th></tr></thead><tbody><tr><td>Creation Date</td><td>Older Than<br>Earlier Than<br>Before<br>After </td><td><p>Filter the selection on when the file has been created. </p><p>It allows to select only files that have been created before or after a specific date.</p></td></tr><tr><td>File Name</td><td>Matches<br>Doesn't Match</td><td><p>It allows to filter the selection based on the name of the file.</p><p>Examples :<br>'.' for any type of character <br>'*' from 0 to infinite</p><p><em>Regex expressions are also supported.</em></p></td></tr><tr><td>File extension</td><td>Equal<br>Doesn't Match</td><td><p>It allows to filter your selection based on the file extension. </p><p>File extension name has to be defined. Example: pdf</p></td></tr><tr><td>File Path</td><td>Matches<br>Doesn't Match</td><td><p>It allows to filter your selection based on the folder(s) path.</p><p><em>Regex expressions are also supported.</em></p></td></tr><tr><td>Last access date</td><td>Older Than<br>Earlier Than<br>Before<br>After </td><td>Same but with a trigger on when the file has been accessed for the last time.</td></tr><tr><td>Last modification date</td><td>Older Than<br>Earlier Than<br>Before<br>After </td><td><p>Filter the selection on when the file has been modified for the last time. </p><p>It allows to select only files that have been modified before or after a specific date.</p></td></tr><tr><td>Size</td><td>More than<br>Less than</td><td>Filter the file selection based on the files size</td></tr></tbody></table>

### &#x20;**Advanced Mode**

This mode allows the usage of an online scripting editor to define advances filter which cannot be defined in using the simple graphical mode.

The scripting Language is "LUA" , which a known language , with online documentation available.

The scripting language supports :

* Logical Operator such as 'and' , 'or'
* Defined Functions

#### **Example of a LUA script**

```bash
--[[
This function is auto-generated.
By editing it, you might lose your filter configuration
when going back to "Basic" mode
--]]
function test ( file )
return
       filter_size(file, ">", 2344000)
       or
       filter_name(file, "\\b(\\w*archive\\w*)\\b")
       or
       filter_path(file, "\\b(\\w*archive\\w*)\\b")
       or
       filter_relative_date(file, "C", ">", 20, "D")
       or
       filter_relative_date(file, "M", ">", 20, "D")
       or
       filter_relative_date(file, "A", "<", 20, "D")
end
```

&#x20;

#### Standard filtering methods are available :

**Filtering by the size of the file**&#x20;

**Example of LUA code**

```bash
...
filter_size(file, ">", 2344000)
..
```

<table><thead><tr><th width="212">Result</th><th>The workflow will only process files with a size which is bigger than 234000KB</th></tr></thead><tbody><tr><td>file</td><td>Match the process file</td></tr><tr><td>">"</td><td>Comparison symbol</td></tr><tr><td>234000</td><td>File size</td></tr></tbody></table>

&#x20;

**Filtering by the name of the file**&#x20;

**Example of LUA code**

```bash
...
filter_path(file, "\\b(\\w*archive\\w*)\\b")
..
```

| **Results**                     | **The workflow will only process files which are located in folder with a name which contains "archive"** |
| ------------------------------- | --------------------------------------------------------------------------------------------------------- |
| file                            | Match the process file                                                                                    |
| "\\\b(\\\w\*archive\\\w\*)\\\b" | Regex expression                                                                                          |

&#x20;**Filtering by the creation date**&#x20;

**Example of LUA code**

```bash
...
filter_relative_date(file, "C", ">", 20, "D")
...
```

&#x20;

| **Result** | **The workflow will only process files with a creation date older or earlier than**     |
| ---------- | --------------------------------------------------------------------------------------- |
| file       | Match the process file                                                                  |
| "C"        | Relative to the Creation Date                                                           |
| ">"        | ">", "<" are available for (older than, earlier than)                                   |
| 20         | Number of Year, Month, Day, Hour, Minute, Second                                        |
| "D"        | "Y", "M", "D", "H", "M", "S" are available for (Year, Month, Day, Hour, Minute, Second) |

&#x20;

**Filtering by the modification date**

**Example of LUA code**

```bash
...
filter_relative_date(file, "C", ">", 20, "M")
...
```

| **Result** | **The workflow will only process files with an access date older or earlier than**      |
| ---------- | --------------------------------------------------------------------------------------- |
| file       | Match the process file                                                                  |
| "C"        | Relative to the Last Access Date                                                        |
| ">"        | ">", "<" are available for (older than, earlier than)                                   |
| 20         | Number of Year, Month, Day, Hour, Minute, Second                                        |
| "D"        | "Y", "M", "D", "H", "M", "S" are available for (Year, Month, Day, Hour, Minute, Second) |

Some addition information which can be helpful for using the feature :

* LUA WebSite : <https://www.lua.org/>
* LUA Online Script validation <https://www.tutorialspoint.com/execute_lua_online.php>
* REGEX Online validation : <https://regexr.com/>


# Scheduler

The scheduler manages time scheduling and orchestrates task execution at the specified time.

Three different modes are available:

* Manual: The task will be started manually by connected user.
* Automatic: The task will be automatically executed by the schedule, once the task is finished, the software will wait 5 minutes and restart the task after this delay. Only one execution of each task can be performed in the same time. There is no option to start twice a same task.
* Schedule: The task is executed periodically following a defined schedule.

<figure><img src="/files/hrEaQ7cqwJlJpMrqWaSW" alt=""><figcaption></figcaption></figure>


# Priority Management

The user can therefore better manage the use of its storage resources and as such, give more priority to the archiving or retrieval of important data.

The implemented priority management allow prioritization of data movement workflows in preventing that highest priority which consume all available throughput in letting other workflows waiting indefinitely.  ​

### ​​**Quality of Service (QoS)**

This involves prioritizing data movement operations based on priority level. By assigning different levels of priority to different task, you can ensure that critical demand receive the necessary resources while still providing fair access to non-critical demand.​

<figure><img src="/files/Wuq0VfYcDEGlfH2qu0Vc" alt=""><figcaption></figcaption></figure>


# Data Integrity

MD5, XXHash64, CRC32 are available

Each task execution can include a checksum integrity calculation. The objective is to prevents any loss of integrity during data transfer.&#x20;

<figure><img src="/files/4DYgUSGaCPqeK6WNPGRB" alt=""><figcaption></figcaption></figure>

The calculated checksum will be processed by files and the result will be displayed in the "Process items" result.

<figure><img src="/files/R6qpHuTf11CAFDCSzlQk" alt=""><figcaption></figcaption></figure>


# Advanced Task Management

Utilize Task Management for various scenarios by configuring it to meet your specific needs. Here are a few potential setups for achieving your goals.

## Handle multiple copies to tape

### Get tape offsite

Implement  workflow to get a set of tape offsite.

We recommend to define the two following workflows:&#x20;

* Two tasks to perform  the two copies on tape for the same dataset. The execution of two different tasks has the benefit to avoid a 'y' copy ; and perform two independent read/write operations.
* In addition, on the of the copy can be externalized ; this bring the benefit to get an offline copy of the contents and eventually yield this copy to a third party location.

### Multiple tape copies

Implement specific workflow and deal with multiple tape copies

#### **First scenario**&#x20;

Define two different workflows for data protection. This will ensure that the two copies are separate and that if one is damaged, the other will not be.

Specify a different "offline archive" pool for each workflow and associate tapes with each pool or let Nodeum retrieve tapes from the scratch pool.

For the 2 workflows: Select a primary storage: S3 or NAS as a source and select a tape pool as destination.

#### **Second scenario**

If your contents are in a container. You can protect your container on tapes too.&#x20;

For this, you have to create a data protection workflow to copy the container data to a pool "offline archive" and associate tapes for each pool or let Nodeum get tapes from the Scratch pool.

The setting for this workflow is Select data protection from source (container) to destination (tape). Dedicate an "Offline Archive" pool for each workflow and associate a set of tapes to each pool or let Nodeum automatically retrieve tapes from the Scratch pool.

Then you define a second workflow "Data Archiving" to archive the data of your Container to an Active Archive Pool of tapes. The contents will remain accessible from the Container even if the contents are stored in a pool of tape(s).

The setting for this workflow is Select Data Archiving from Source (Container) to Destination (Tape). Dedicate a pool "active archive" for each workflow and associate for a set of tapes in each pool or let Nodeum automatically retrieve tapes from the Scratch pool.


# Data Container

## How to create a Container ?

### Add a new Container

List and add new Container in the menu:

> &#x20;Data Container

<figure><img src="/files/H8fI0oG2yE4a9r0ZOX1Q" alt=""><figcaption><p>List of available Containers</p></figcaption></figure>

#### Create a new Container&#x20;

* [ ] Click on the '+' button and complete the information requested and save.

<figure><img src="/files/JcNhi6E9GHV17QHX2iFL" alt="" width="296"><figcaption><p>Form to create a container</p></figcaption></figure>

Mandatory settings:

<table><thead><tr><th width="240.33333333333331">Configuration </th><th>Description</th><th></th></tr></thead><tbody><tr><td><strong>Container Name</strong></td><td>It is the name of the Container. </td><td><p>The name is fixed at creation and cannot be altered.</p><p>If you are looking to use it as S3 target please refer to the <a href="/pages/Uoyz6GWKjWWcHK3pqtLV#container-limitations">Specifications</a> to follow the naming conventions.</p></td></tr><tr><td><strong>Comment</strong></td><td>This allows adding a description or comment.</td><td></td></tr><tr><td><strong>Advanced Settings -> Protocol Activation</strong></td><td>The 3 protocols (NFS - SMB - S3) are automatically available. </td><td>Security is applied specifically to each section per protocol.</td></tr></tbody></table>

### Advanced Setting&#x20;

**Automatic Push Data**

When set, this feature will execute automatically the push (meaning the copy) of each file written in the Container cache layer to a defined pool.

Options:

* [ ] Disable
* [ ] List of pools

To enable this option, choose a destination pool.

<figure><img src="/files/QJLDz07h1DSPtucOkuoo" alt="" width="249"><figcaption><p>Automatic Push Data</p></figcaption></figure>

{% hint style="warning" %}
When content is added to the container, it will automatically replicate to the designated location.
{% endhint %}

#### **Cache Cleaning**

Define a secondary storage target to offload contents from the cache. Activation occurs only when the cache is full or reaches its defined capacity limit.

#### **Quota**

This quota limits the maximum amount of data that can be stored in the container.

#### **Cache resources allocation**

For the container you create, specifies (in percent) the size of the cache this container can use (0 is no limit).

### Container's access Right

To set the rights and privileges for a container, click the action button on the right of its row.

<figure><img src="/files/OzuqrFHANJYhzM4DlgYb" alt=""><figcaption><p>Open the option icon and select Privileges</p></figcaption></figure>

Define container access permissions as read/write, read-only, or no access.

<figure><img src="/files/fIR153SNe0LUaNX6iwOy" alt=""><figcaption></figcaption></figure>

Choose user(s) and specify their access level:

* **Read/Write**
* **Read Only**
* \*\*No Access

Finally, you can also define default privileges for the guest account.

### Container setting with S3 protocol <a href="#datacontainerconfiguration-howtocreateacontainerwithans3protocol" id="datacontainerconfiguration-howtocreateacontainerwithans3protocol"></a>

If your application or server is configured to store data in S3, Nodeum can directly receive this data into a

To achieve this, configure the necessary parameters to enable communication between the application and Nodeum.

#### Steps to Configure S3 Access for a New Container

1. **Create a Specific User**: Begin by setting up a new user which will be granted necessary S3 access permissions.
2. **Create a Container**: Set up a new container. Assign privileges to the user created in the previous step, ensuring they have the required access permissions.
3. **Remap S3 Policies**: Update and configure the S3 policies for the container to align with your security and access protocols.
4. **Enable S3 Access**: Allow S3 access for the user. Nodeum will automatically provide you with the Key ID and password required to access S3 data.

{% hint style="info" %}
Carefully follow these steps to secure and manage your S3 access efficiently.
{% endhint %}


# Metadata Management

### Standard file attributes

Nodeum prioritizes the preservation of metadata throughout all data movement operations.

With our metadata mapping feature, you can be confident that your content, no matter its format or location, will seamlessly transition and be effectively managed.

Even if  the content locates in different storage system, Nodeum manages natively the transition of the metadata.  Data movement capabilities ensure the consistency and reliability of the metadata.

The objective is to ensure that no matter how your data is being transferred, the valuable metadata associated with it remains intact.

For file systems, extended attributes are commonly used, while for S3 compatible storage, metadata management is included in the protocol. The same applies to tape storage, where LTFS specifies how metadata should be handled.

Nodeum keep the traditional "attributes" :&#x20;

POSIX:

```iecst
modeMetaKey = "Mode"
uidMetaKey = "Uid"
gidMetaKey = "Gid"
atimeMetaKey = "Atime"
mtimeMetaKey = "Mtime"
ctimeMetaKey = "Ctime"
```

S3, metadata are set as `x-amz-meta-key`:

```iecst
x-amz-meta-mode
x-amz-meta-uid
x-amz-meta-gid
x-amz-meta-atime
x-amz-meta-mtime
x-amz-meta-ctime
```

### File metadata

Extend the capability to handle additional metadata. The solution enables users to define additional metadata that can be utilized for tagging each file. Furthermore, these additional tags can accelerate the content search process.

### Task metadata

Metadata can be set to task to classify and organize the defined tasks. It enables the expansion of tasks by incorporating specific metadata. This additional information is easily accessible within the task management and reporting modules.

You can utilize these metadata to facilitate filtering, searching, and reporting functionalities.


# Primary Storage Configuration

**Primary Storage Definition**

Primary storage refers to the storage systems and technologies designed to hold digital information that users actively use. This data is regularly accessed by applications, hardware systems, and business users.

#### Which type of Storage ?

Nodeum identifies NAS and Cloud Storage as primary storage types.

### Configuration Guide

**Connecting Primary Storage to Nodeum**

To facilitate the connection of your primary storage to Nodeum, follow these steps:

1. **Add Your Storage:**
   * Navigate to: `Settings` > `Hardware` > `Storages`
2. **Create Your Target (For NAS and Cloud Storage):**
   * Access: `Storage Services` > `NAS Storage Services` > `Cloud`
3. **Define Your Primary Storage Pool (For NAS and Cloud Storage):**
   * Go to: `Storage Services` > `Pool`

### **Mounting Primary Storage with Nodeum**

Nodeum ensures that primary storage is consistently mounted using two methods:

1. **Manual Mounting**: Access the Console and click the mount button to initiate the process.
2. **Automated Workflow**: Allow tasks to control the mounting process automatically when executed.

{% hint style="info" %}
These two methods can be used simultaneously because they are independent. The first option is letting the workflow handle the parsing. When you select source entries in the task, the system will parse them recursively.
{% endhint %}

### Storage Pool Status

<div align="left"><figure><img src="/files/EdboxrwynMMl0N9Dk2Lh" alt=""><figcaption></figcaption></figure></div>

* **On**: The storage pool is online. The primary storage is mounted and accessible by Nodeum.

<div align="left"><figure><img src="/files/RHmVckKt70XabUd89DR3" alt="" width="45"><figcaption></figcaption></figure></div>

* **Off**: The storage pool is offline. The primary storage is not mounted or accessible by Nodeum.

To change the status, click the button to mount the storage.

{% hint style="info" %}
IIf the storage does not mount, you need to investigate the root cause.

```
See the status of the service
```

```bash
// systemctl status nodeum_mount_point_scanning.service

If not running restart it

// systemctl restart nodeum_mount_point_scanning.service

```

{% endhint %}

### Mount Option

For each NAS target you create, you can easily add specific mount options. A dropdown menu is available, providing various choices. One commonly used option specifies the chunk size for data transfer.

### Primary Storage Parsing

**1. Workflow Execution Parsing**

* **Process:** Parsing occurs during task creation and execution. It uses multithreading, enabling dynamic discovery of primary storage. With each execution, the system identifies newly stored data.
* **Benefits:**
  * Provides an accurate overview of primary storage contents.
  * Prevents overloading storage with unnecessary discovery actions.

**2. Inventory Parsing for "Unknown" Storage**

* **Benefits:**
  * Offers insights into primary storage without running data movement workflows.
  * Indexes content in the catalog and provides information through dashboards, trends, and reports.
  * Aids in strategic decision-making for data management and lifecycle configuration.

Once analyzed, these insights enable the next step of implementing data movement tasks.

### Managing the Renaming of a Mount Point

When you need to rename a mount point, follow these steps:

1. Create the new mount point.
2. Unmount the previous mount point if it no longer exists on the Primary Storage.
3. In the Console administration, delete the previous target that is not available on the Primary Storage.
4. Delete the previous pool associated with the old target in the Console administration.
5. Verify tasks to ensure they reference the correct pool.


# Pool Management

### Overview

In storage management, pools are categorized into Primary and Secondary sections. A storage pool serves as an abstraction layer, facilitating task allocation and supporting various storage classes.

#### Configuration Requirements

Configure the Storage Pool prior to setting up a Workflow. The pool serves as the foundational abstraction between task movement and storage devices. It determines storage designation as primary or secondary.

#### Secondary Storage Features

For secondary storage, the pool integrates properties to organize systems based on workflow policy. Nodeum's architecture leverages storage connectors, simplifying access across NAS storage, tape libraries, object storage, and cloud storage.

#### Management and Flexibility

The Storage Manager focuses on tape management, offering logical abstraction across multiple tapes. This facilitates the archiving of large data sets without needing to prepare source directories. Pools, acting as logical volumes, enable grouping several tapes under one logical name. This allows defining multiple pools for different purposes, such as per business unit and storage type.

#### Reporting and User-Friendliness

Reporting features provide granular, pool-level displays, helping end-users navigate without delving into complex technical details. By abstracting business logic through storage pools, users can focus on workflow definitions instead of technical intricacies.

### Storage Pools Overview

**Primary Storage**

* **Purpose**: Serves as the data source.
* **Types**: Includes NAS Storage and Cloud Storage.

**Secondary Storage**

* **Purpose**: Functions as the data destination.
* **Workflow Types**:
  * **Offline Archive**: Supports NAS, Cloud, or Tape.
  * **Active Archive**: Supports NAS, Cloud, or Tape.

Understanding the difference between Primary and Secondary Storage is crucial for effective data management. Secondary Storage pools can be structured based on various Workflow Policies to optimize the management of different storage systems.

<figure><img src="/files/WmiCGbsZf0OiQs55qYfB" alt=""><figcaption><p>Schema of pool management</p></figcaption></figure>

### Pool Storage configuration

For NAS Storage and Object Storage

<figure><img src="/files/zsceA4kxFWfBpta0sx5F" alt="" width="355"><figcaption></figcaption></figure>

Navigate to: `Storage Service` > `Pool` > `NAS or Cloud Tab`

<figure><img src="/files/guWbvhZEEwQSK8OePQE0" alt=""><figcaption></figcaption></figure>

Click the button <img src="/files/rlndNmGZP41H4VFvabTl" alt="+ Button" data-size="line"> and filled-in the modal form:

<figure><img src="/files/WRv1nmEXskFMDoZusLJN" alt="" width="256"><figcaption></figcaption></figure>

### Pool Configuration for NAS & CLOUD

1. **Select a Name for the Pool**
2. **Choose a Type:**
   * Primary Storage (available only for NAS & Cloud Pool)
   * Active Archive
   * Offline Archive
3. **Specify Storage Details:**
   * For NAS Storage: Define the NAS Storage Name
   * For Object Storage: Define the Object Storage Name and Bucket
4. **Save the Form**

### Pool Configuration for Tape Storage

<div align="left"><figure><img src="/files/Vf2nkPZNPwq3kFPKQpsV" alt="" width="375"><figcaption></figcaption></figure></div>

Navigate to: `Storage Service` > `Pool` > `Tape Tab`

<figure><img src="/files/GIAEnku1j7B4d7DuGNMD" alt=""><figcaption></figcaption></figure>

Click the button <img src="/files/rlndNmGZP41H4VFvabTl" alt="+ Button" data-size="line"> and filled-in the modal form:

<figure><img src="/files/xCGn40P6NHvrzvWsatlQ" alt="" width="259"><figcaption></figcaption></figure>

#### Step 1: Name the Pool

Choose a unique and descriptive name for the pool.

#### Step 2: Select Pool Type

Choose one of the following types:

* **Active Archive**
* **Offline Archive**
* **Data Exchange** (available for tape pool only)

#### Step 3: Define the Tape Library

Specify the tape library to be used for the pool.

#### Step 4: List the Volumes

Identify and list the volumes that will be included in the pool.

#### Optional: Write Protection

You may choose to automatically set tapes to write protection when they are full.

#### Save

Complete the configuration by saving the form.


# Tape Overview

The tape overview provides a complete view of the tape library connected to Nodeum.

<figure><img src="/files/2eubcp4FplKrUBTw1rRJ" alt=""><figcaption><p>Tape Overview</p></figcaption></figure>


# TCO Calculator

Use this calculator to simulate different scenarios and directly evaluate their impact on ROI. It aids in formulating an optimal data policy for your organization by considering current or future hardware. Additionally, the calculator assists enterprises in identifying data usage patterns, distinguishing between frequently and infrequently accessed data.

<figure><img src="https://www.nodeum.io/hubfs/image-png-Nov-21-2022-03-50-16-3464-PM.png" alt=""><figcaption></figcaption></figure>

Navigate to System -> Configuration -> Storage Cost to view and enter cost details for each connected storage. Here, all storage configured in Nodeum will be displayed.

<figure><img src="/files/th5wzZmcsxh600e0wClo" alt=""><figcaption></figcaption></figure>

Click this button to access a form that helps you estimate your storage costs. There are separate forms for off-premise and on-premise storage. The off-premise form includes egress and command charges, while the on-premise form details floor space costs and energy consumption.

<figure><img src="https://www.nodeum.io/hubfs/image-png-Aug-26-2020-09-49-18-26-AM.png" alt="" width="375"><figcaption><p>Off Premise Storage Cost Calculator</p></figcaption></figure>

<figure><img src="/files/WbBnJ77mjSXhFCsUKDoa" alt="" width="563"><figcaption><p>On Premise Storage Cost Calculator</p></figcaption></figure>


# Toolbox

### File Parser

<figure><img src="https://www.nodeum.io/hubfs/image-png-Nov-21-2022-03-51-09-0642-PM.png" alt=""><figcaption></figcaption></figure>

### File Comparison Analysis

<figure><img src="https://www.nodeum.io/hubfs/image-png-Nov-21-2022-03-52-11-4289-PM.png" alt=""><figcaption></figcaption></figure>


# System Settings

### Information

> System -> Information

All information about the software configuration.

<figure><img src="/files/mWnQIPpvRbAsaz5u8lqv" alt=""><figcaption></figcaption></figure>

### License

#### Prerequisites

To generate a license, first locate the serial number for each node. This can be found in the Nodeum Console under:

> System -> Information -> License

<figure><img src="/files/TzAz6K1Kb9TcBeDMjRwO" alt=""><figcaption><p>Nodeum System Information</p></figcaption></figure>

If the Nodeum Console is unavailable, retrieve the system UUID to find the serial number using this command:

```bash
$ cat /sys/class/dmi/id/product_uuid
423e05fd-b126-4ac5-eb87-84868938e049
```

{% hint style="danger" %}
Provide the Nodeum team with the serial numbers to receive the software license key.
{% endhint %}

### Applying Your Nodeum Software License

#### How to Apply Your Nodeum Software License Key

1. Open the Nodeum Console.
2. Navigate to **System -> License**.
3. Click the **Upload License** button.
4. Choose your license key file and upload it.

The license will be automatically applied once uploaded.


# General Configuration

<figure><img src="/files/Cp3freudxkCH8cEvIIJ5" alt=""><figcaption></figcaption></figure>

### Catalog&#x20;

<figure><img src="/files/Qpwn42vp0f14vUkxUXZF" alt=""><figcaption></figcaption></figure>

**Administrator View Access**

If enabled, all Administrator accounts can view all catalog contents. If disabled, Administrators can only view files they are authorized to access. <br>

**Default Filter**

Configure filters to limit catalog visibility.

### **Cache Cleaning Parameters**

* **Cache Delay:** The default value is 900 seconds. This setting determines how many seconds must pass before a file qualifies for automatic cache cleaning.
* **Cleaning Percentage:** The default value is 5%. If the available space (free space) is less than this percentage of the total cache size, automatic cache cleaning is triggered to free up space. This is only available for Tape and Active Archive Workflow.

### Task Parameters

#### Task Management Thresholds

* **Memory Threshold**: Defaults to 80%. This is the maximum percentage of memory usage allowed before a new task cannot start.
* **Rules Threshold**: Defaults to 20 tasks. This is the maximum number of active tasks allowed before a new task cannot start.

### &#x20;Auditing configuration

> System -> Configuration

**Data Access Audit:** Review user file access for each container. Default settings are not enabled.

**Data Management Audit:** Perform an audit of user activities within the console. Default settings are not enabled.

### Debug Mode for support

**Active Debug Traces :** Enable detailed debug trace generation. This has to be enabled for troubleshooting.

{% hint style="warning" %}
&#x20;**Caution:** Enabling debug mode may lead to large file generation, potentially overloading system disk space.
{% endhint %}

## Storage Tape

<figure><img src="/files/hL4NRZN4cZmHQL4YZ0x2" alt=""><figcaption></figcaption></figure>

### Cache and Tape Management Settings

* **Cache Retention Time**: The minimum time temporary files remain in the cache before deletion. Default is 900 seconds (15 minutes).
* **Max Tapes Management**: Total tapes that can be managed by Nodeum. Adjustable with a default of 15,000.
* **LTFS Unmount Idle Time**: Duration of inactivity after which LTFS will unmount. Default is 30 minutes.
* **Tape Unmount Idle Time**: Duration of inactivity after which a tape will unmount. Default is 60 minutes.
* **Disable LTFS Compression**: LTFS compression can be disabled during formatting.

#### ACSLS Configuration Details

* **ACSLS Server IP Address**: Enter the complete IP address.
* **User ID**: Provide the user ID as defined in the ACSLS configuration.
* **Nodeum IP Address**: Specify the IP address of the Nodeum server for ACSLS connection.
* **Send Port**: Indicate the port used by ACSLS to accept requests.
* **Return Port**: Set the port for ACSLS to send back responses.
* **Server Timeout**: Define timeout duration for ACSLS to respond.
* **Start Local Port**: Specify the starting port range for environments with firewalls.
* **Max Local Port**: Determine the total number of ports, starting from the Start Local Port.
* **Timeout Local Port**: Indicate the timeout on the local port connection.

## Storage Cost

Specify the cost for any configured storage solution. Customize forms, whether the storage is on-premises or cloud-based. This is essential for using the TCO Calculator.

<figure><img src="/files/fVkhAkt4De7UNcPoJxF6" alt=""><figcaption></figcaption></figure>

### Metadata System Configuration

Define your file and task metadata to apply during workflow execution. You can configure different types of metadata, including:

* **Business Files Metadata**
* **Tasks Metadata**

<figure><img src="/files/sQRafcnp77dw4rfqXc5Q" alt=""><figcaption><p>System configuration metadata</p></figcaption></figure>

### &#x20;Business Files Metadata

Enhance your files with metadata to improve searchability and organize your data. Follow these steps to create and apply metadata during task execution:

1. **Add New Metadata**:
   * Click the button to create metadata.
   * Enter the metadata name and comments.
2. **Select Field Type**:
   * Choose from:
     * Characters
     * Multi-line Characters
     * Checkbox
     * Radio Buttons
   * For Checkbox or Radio Buttons, specify values. Press ENTER to add more values.

**Tasks Metadata**

Enhance your task metadata to improve searchability and organize your data effectively. Here's how to create and apply metadata during task execution:

1. **Create Metadata**
   * Click to add a new Task Metadata.
   * Enter the Metadata Name and provide comments about this Metadata.
   * Select the applicable task types:
     * Active Archive
     * Offline Archive
     * Data Exchange
     * Maintenance
2. **Choose Field Type**
   * Characters
   * Multi-Line Characters
   * Checkbox
   * Radio Buttons

Once defined, you can utilize this metadata in the task creation interface to enrich your files.

<figure><img src="/files/f8GlEmaUlNiFwP72ubNt" alt=""><figcaption></figcaption></figure>

## Indexation engine <a href="#configuration-dataenrichmentconfiguration" id="configuration-dataenrichmentconfiguration"></a>

Monitor the content indexation status here. Indexation is automatic, so any newly discovered content is indexed immediately. <br>

<figure><img src="/files/ruYA7Cke4OZkzBDQivZX" alt=""><figcaption></figcaption></figure>

**Manual Synchronization**

Start a manual synchronization of all content to view the number of queued operations, those currently being processed, and a list of contents being indexed.

## API Security <a href="#configuration-dataenrichmentconfiguration" id="configuration-dataenrichmentconfiguration"></a>

> System -> Configuration -> API Security

#### Definition of CORS and API Token

**Cross-Origin Resource Sharing (CORS):**

CORS is a security feature implemented by web browsers to allow controlled access to resources hosted on different domains. It enables a server to specify who can access its assets and which HTTP methods are allowed from the cross-origin requests. CORS is vital for enabling safe and secure data exchange between different web applications.

**API Token:**

An API token is a unique identifier used to authenticate a user, developer, or calling program to an API. Tokens ensure that API requests are coming from legitimate sources, providing enhanced security. It acts as a key to access the API’s data and functionalities, often replacing the need for username and password authentication.

<figure><img src="/files/EBmn11DQhUdcXQFLnVpm" alt=""><figcaption><p>System Configuration API Security</p></figcaption></figure>

#### API Cross-Origin (CORS) Configuration

In this section, you can define Cross-Origin Resource Sharing (CORS) settings for your API. You also have the option to create an API key.

**CORS Settings:**

* **Origins**: Define the authorized DNS domain, or use `*` to allow all domains.
* **Path**: Specify the API path URL, using `*` as a wildcard.
* **Methods**: Choose allowed HTTP methods, such as GET, POST, PUT, DELETE, or OPTIONS.

You can set multiple rules to tailor your CORS configuration to your needs.

<figure><img src="/files/E6GFCQraW5BYgP1NE5La" alt=""><figcaption><p>System Configuration API Cors</p></figcaption></figure>

#### API Keys Authentication Guide

API keys authentication utilizes keys to manage access to RESTful API endpoints. This guide details how to generate and configure these keys.

**Parameters**

* **qName**: A customizable name you choose.
* **qController**: Designates the controller. Use `*` as a wildcard to permit access to all endpoints.
* **qAction**: Specifies the action associated with the controller. Use `*` as a wildcard to allow access to all actions.

<figure><img src="/files/LCJgPdVYVCUCVWHO3k8m" alt=""><figcaption></figcaption></figure>

Input:

For instance, if "Scope" is defined as: Controller: files and Action: index, this indicates that the API key grants access only to the controller's files and the action named index.

<figure><img src="/files/5xTxZGREANTZtlaRKG4z" alt=""><figcaption></figcaption></figure>

After clicking the "Save" button, the generated key will be displayed. Please ensure to make a copy, as it will only be shown once.

## Reset Wizard

<figure><img src="/files/gwWfGnVP4LEgLGowxBoS" alt=""><figcaption></figcaption></figure>

#### Reset Wizard Guide

The Reset Wizard is an advanced feature designed to clean software configurations, including historical data such as executed tasks. This process involves two steps:

1. **Selection**: Choose the sections you wish to clean. After selection, an Ansible playbook will be generated.
2. **Execution**: Retrieve the playbook via an SSH session and execute it with root access.


# Date & Time

Date & Time Management Principles

* **Operating System Time**: The server OS time is set to UTC.
* **Scheduler Reference**: Nodeum's scheduler uses UTC for time references. Automatic conversions to local time are managed by the application.
* **Web Console Time**: Nodeum Web Console operates using the browser's local time.

This page helps in managing and verifying that the system's Date & Time settings are correctly configured.

## Configuration

Date & Time management follow these principles rules:

| Time                   |                                                                                            UTC                                                                                           |                                                                                    Local Browser Time                                                                                    |
| ---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| **Operating System**   | <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flat_tick_icon.svg/768px-Flat_tick_icon.svg.png" alt="File:Flat tick icon.svg - Wikimedia Commons" data-size="line"> |                                    <img src="https://cdn-icons-png.flaticon.com/512/1828/1828901.png" alt="Minus - Free signs icons" data-size="line">                                   |
| **Nodeum Web Console** |                                    <img src="https://cdn-icons-png.flaticon.com/512/1828/1828901.png" alt="Minus - Free signs icons" data-size="line">                                   | <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flat_tick_icon.svg/768px-Flat_tick_icon.svg.png" alt="File:Flat tick icon.svg - Wikimedia Commons" data-size="line"> |
| **Nodeum scheduler**   |                                                              <img src="/files/FtUDJw9bZMyJcA6I0JzQ" alt="" data-size="line">                                                             |                                                       Conversions to your local timezone are done automatically by the application.                                                      |

### Manual Configuration

#### Configuring Date & Time

1. Navigate to **System > Date & Time** in the menu.
2. Manually set the date and time.
3. Verify that the date and time are correct and properly formatted.

<figure><img src="/files/qQzi62K06sHXhvOnT4OK" alt=""><figcaption><p>System Date &#x26; Time</p></figcaption></figure>


# Backup

### System Backup

> System -> Backup

This stores all crucial details of the configured solution. In the event of a failure, the generated backup enables system restoration to its original state.

| Components                  | Description                                                                          |
| --------------------------- | ------------------------------------------------------------------------------------ |
| Databases                   | Includes SQL and NoSQL data such as file catalog, metadata, and task execution logs. |
| S3 - Swift API Keys         | Handling Authentication for S3 and Swift Storage Providers                           |
| Tasks execution log reports | File Processing History per Task                                                     |

For more details see [the failover section](/data-archiving/system-reliability/backup-and-restore)


# Services

### Check the healthy of services

> System -> Services

The administrators are easily check the healthy of Nodeum Services.&#x20;

All services are displayed.  It allows to monitor the state of each one and also to stop or start each service independently.&#x20;

Administrator can check the Nodeum services and the system services. &#x20;

### **Service Status**

* <mark style="color:green;">Green</mark> : service is running
* <mark style="color:yellow;">Yellow</mark> : The service is not running, but it is not required for normal
* <mark style="color:red;">Red</mark> : The service isn't running, but it's essential for normal operation.

| Information      | Description                                                    |
| ---------------- | -------------------------------------------------------------- |
| **Service Name** | This is the name of the service                                |
| **Version**      | This is the version of the service                             |
| **Actions**      | <ul><li>Restart the service</li><li>Stop the service</li></ul> |

<figure><img src="/files/VVOXyUP6uAGkVo4w40tW" alt=""><figcaption><p>System Service</p></figcaption></figure>

### Nodeum Services

<table><thead><tr><th width="238">Name</th><th width="376.1332600911458">Description </th><th>Mandatory</th></tr></thead><tbody><tr><td>Notification Manager</td><td>Service managing all Nodeum services supervision and inter-process communication handler</td><td>yes</td></tr><tr><td>Core Manager</td><td>Workflow Manager task orchestration and storage connection handler</td><td>yes</td></tr><tr><td>Tape Library Manager</td><td>Tape Library and Drive management</td><td>yes</td></tr><tr><td>Data Mining</td><td>Data Collector and handling system statistics analyses</td><td>yes</td></tr><tr><td>File System Virtualization</td><td>Provide global file system virtualization across storage node.</td><td>no</td></tr><tr><td>Watchdog</td><td>Service Monitoring Manager which executes the automatic restart of failing service</td><td>yes</td></tr><tr><td>Ref. File Parsing</td><td>Service which handles the xml/json file parsing</td><td>no</td></tr><tr><td>Scheduler</td><td>Task Scheduling service which manages execution of task at selected time.</td><td>yes</td></tr><tr><td>File Listing Processing</td><td>Service that manages the Primary Storage mounting and its content parsing and inventory.</td><td>yes</td></tr><tr><td>Indexation Engine</td><td>Service that sync the database with the system and index the contents</td><td>no</td></tr></tbody></table>

&#x20;System Services

<table><thead><tr><th width="155.33333333333331">Name</th><th width="393">Description</th><th>Mandatory</th></tr></thead><tbody><tr><td>Solr</td><td>Content Indexation Engine which provides fast access at each content</td><td>yes</td></tr><tr><td>NGINX</td><td>HTTP Web Service</td><td>yes</td></tr><tr><td>Delayed: Job</td><td>It executes tasks as a background process in Rails environment. It increases page rendering speed when asynchronous jobs are processed in the background. </td><td>yes</td></tr><tr><td>MySQL</td><td>Database Management</td><td>yes</td></tr><tr><td>MongoDB</td><td>Database Management</td><td>yes</td></tr><tr><td>MinIO</td><td>Data Transport - S3 Frontend Service</td><td>no</td></tr><tr><td>NFS</td><td>Data Transport - NFS Service</td><td>yes</td></tr><tr><td>SMB</td><td>Data Transport - SMB Service</td><td>yes</td></tr><tr><td>SNMP</td><td>Monitoring  - SNMP Service</td><td>yes</td></tr><tr><td>SLAPD</td><td>Authentication - SLAPD Service</td><td>yes</td></tr><tr><td>NSLCD</td><td>Authentication - NSLCD Service</td><td>yes</td></tr></tbody></table>


# Hostname and DNS Configuration

> System -> Hardware -> Network

In this section, you can configure the following three parameters:

* Hostname
* Primary DNS
* Secondary DNS

<figure><img src="/files/g3Qgv74jdLtW3qvNg1Jg" alt=""><figcaption><p>System Network</p></figcaption></figure>

{% hint style="danger" %}
For successful AD authentication, ensure the hostname is 15 characters or fewer. Properly configure DNS to ensure accurate DNS-to-IP resolution.
{% endhint %}

<br>


# NAS Storage Configuration

## SMB Storage

### Configuration

> System -> Hardware -> Storages -> NAS&#x20;

<figure><img src="/files/zGj0FUpyMhppmktqbWGS" alt=""><figcaption></figcaption></figure>

* [ ] To add a SMB Storage, click the button

<div align="center" data-full-width="true"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>

* [ ] Fill the following parameters to configure the storage :

<figure><img src="/files/UKzefmxy4bERG9ZGH0mT" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="153">Parameters</th><th>Definition</th></tr></thead><tbody><tr><td>Name</td><td>Complete the name of the storage</td></tr><tr><td>Comment</td><td> </td></tr><tr><td>Protocol</td><td>Choose the protocol SMB or NFS</td></tr><tr><td>Version</td><td><p>Choose the version of the protocol</p><p>For SMB : Version 1 - 2.1 and 3.0</p><p>For NFS : Version 3 - 4</p></td></tr><tr><td>Host</td><td>Complete the Hostname</td></tr></tbody></table>

{% hint style="warning" %}
Once, the storage is configured, you need to map the target you want connect to Nodeum to run the Workflow.
{% endhint %}

### How to map NAS Target  ?

First, go to&#x20;

> Storage Services -> NAS

To add a NAS Target

<figure><img src="/files/MrjlQA0xNltgY5y071PN" alt=""><figcaption><p>Nas Target</p></figcaption></figure>

* [ ] click the button &#x20;

<div align="center"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>

* [ ] Fill the following parameters to configure the storage :

![](https://www.nodeum.io/hubfs/image-23.png)

## NFS Storage

<div align="left"><figure><img src="/files/ZGZKDo2Ujdz9md8AooZz" alt=""><figcaption></figcaption></figure></div>

### Configuration

Go into:

> System -> Hardware -> Storages -> NAS

* [ ] To add a NFS Storage, click the button

  <div align="left" data-full-width="true"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>
* [ ] Fill the following parameters to configure the storage :&#x20;

<table><thead><tr><th width="153">Parameters</th><th>Definition</th></tr></thead><tbody><tr><td>Name</td><td>Complete the name of the storage</td></tr><tr><td>Comment</td><td> </td></tr><tr><td>Protocol</td><td>Choose the protocol SMB or NFS</td></tr><tr><td>Version</td><td><p>Choose the version of the protocol</p><p>For SMB : Version 1 - 2.1 and 3.0</p><p>For NFS : Version 3 - 4</p></td></tr><tr><td>Host</td><td>Complete the Hostname</td></tr></tbody></table>

{% hint style="info" %}
Once, the storage is configured, you need to map the target you want connect to Nodeum to run the Workflow.
{% endhint %}

### How to map NFS Target  ?

> Storage Services -> NAS

Add a NFS Target,&#x20;

* [ ] click the button &#x20;

<div align="left"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>

* [ ] Fill the following parameters to configure the storage :

{% hint style="warning" %}
If you encounter an error when attempting to mount an NFS target in a Docker deployment, such as "Can't mount nas01.domain.local:/share/volumes/data/", consider adding the `nolock` option to the mount options
{% endhint %}

## Mounted File System Storage

<div align="left"><figure><img src="/files/MKJk0SABagNlpJIapC0t" alt=""><figcaption></figcaption></figure></div>

### Configuration

Go into:

> System -> Hardware -> Storages -> NAS

* [ ] To add a new storage "Mounted File System", click the button

  <div align="left" data-full-width="true"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>
* [ ] Complete the form with this information

<div align="left"><figure><img src="/files/41lHO6bJInPlukEtQMmm" alt="" width="283"><figcaption></figcaption></figure></div>

<table><thead><tr><th width="153">Parameters</th><th>Definition</th></tr></thead><tbody><tr><td>Name*</td><td>Complete the name you <mark style="background-color:red;">define in the toml (ansible playbook)</mark>          </td></tr><tr><td>Comment</td><td> </td></tr><tr><td>Protocol</td><td>Choose unspecified <mark style="background-color:red;">(<strong>+++ Mandatory</strong>)</mark></td></tr><tr><td>Host</td><td>Complete the Hostname</td></tr></tbody></table>

{% hint style="warning" %}
Mandatory to have the same name as the name writing in the toml (parent\_name)                                               &#x20;
{% endhint %}

### How to map a Target  ?

First, go to &#x20;

> Storage Services -> NAS

To add a Target,&#x20;

* [ ] click the button &#x20;

<div align="left"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>

* [ ] Fill the following parameters to configure the storage :

![](https://www.nodeum.io/hubfs/image-23.png)

<table><thead><tr><th width="174">Parameters</th><th>Definition</th></tr></thead><tbody><tr><td>NAS Name*</td><td>Select the NAS         </td></tr><tr><td>Name*</td><td>Give a name for your target </td></tr><tr><td>Target</td><td>Use the target Path</td></tr><tr><td>Mount Options</td><td></td></tr><tr><td>Username </td><td></td></tr><tr><td>Password</td><td></td></tr></tbody></table>

## NAS Overview&#x20;

After to have configured the differents NAS Storage (SMB, NFS or Mounted File System), a complete view is provided to see the status of the NAS Storage&#x20;

### Status&#x20;

<table><thead><tr><th width="174">Status</th><th width="158.33333333333331">Definition</th><th>Comments</th></tr></thead><tbody><tr><td><img src="https://mt-c-storage.atlassian.net/wiki/download/attachments/631734295/image2019-9-16_15-26-49.png?version=1&#x26;modificationDate=1568640410526&#x26;cacheVersion=1&#x26;api=v2" alt=""></td><td>NAS is Online</td><td> </td></tr><tr><td><img src="https://mt-c-storage.atlassian.net/wiki/download/attachments/631734295/image2019-9-16_15-27-25.png?version=1&#x26;modificationDate=1568640447877&#x26;cacheVersion=1&#x26;api=v2" alt=""></td><td>NAS is Offline</td><td>To reconnect the NAS, just push on the button to refresh the connection</td></tr></tbody></table>

{% hint style="info" %}
The name of a NAS Storage is unique. &#x20;

You can't have several NAS Storage with the same Name.  If you delete a NAS Storage which are already used by workflow, the system refused to create a new NAS with the same name.
{% endhint %}

{% hint style="warning" %}
After the creation of a user, it's required to give the rights and privileges to the user to access to your NAS Storage.

If the user haven't access, the tasks and operation inside Nodeum will be impossible.
{% endhint %}

### Security Mode <a href="#primarystorageconfiguration-securitymode" id="primarystorageconfiguration-securitymode"></a>

Allowed values are in mount options if needed :

The default in mainline kernel versions prior to v3.8 was sec=ntlm.  In v3.8, the default was changed to sec=ntlmssp.

| mount options | definition                                                                                |
| ------------- | ----------------------------------------------------------------------------------------- |
| sec =         |                                                                                           |
| none          | attempt to connection as a null user (no name)                                            |
| krb5          | Use Kerberos version 5 authentication                                                     |
| krb5i         | Use Kerberos authentication and forcibly enable packet signing                            |
| ntlm          | Use NTLM password hashing                                                                 |
| ntlmi         | Use NTLM password hashing and force packet signing                                        |
| ntlmv2        | Use NTLMv2 password hashing                                                               |
| ntlmv2i       | Use NTLMv2 password hashing and force packet signing                                      |
| ntlmssp       | Use NTLMv2 password hashing encapsulated in Raw NTLMSSP message                           |
| ntlmsspi      | Use NTLMv2 password hashing encapsulated in Raw NTLMSSP message, and force packet signing |


# Object Storage Configuration

Multiple S3 compatible Cloud and Object Storage providers are supported  :

Public cloud providers :

* Amazon AWS S3 Storage
* Google Cloud Storage
* Microsoft Azure Blob Storage
* Wasabi Hot Cloud Storage

Private Cloud Providers :

* Cloudian HyperStore
* Dell EMC ECS
* OpenStack Swift
* Quantum ActiveScale
* Scality Ring
*

Generic

* Generic S3

{% hint style="warning" %}
If you don't find your S3 storage in this list, there is also a "Generic" S3 connector which is available.
{% endhint %}

## S3 Storage

### Configuration

Navigate to&#x20;

> System -> Hardware -> Storage -> Cloud&#x20;

<figure><img src="/files/Ttsvx8N4twYSIAjLvc0o" alt=""><figcaption></figcaption></figure>

* [ ] To connect to a new S3 Storage, click the button&#x20;

<div align="center"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>

* [ ] Fill the following parameters to configure the storage :&#x20;

<figure><img src="/files/6VTyKPlXmI7vTaocONTC" alt=""><figcaption></figcaption></figure>

<table data-header-hidden><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td><strong>Parameters</strong></td><td><strong>Definition</strong></td></tr><tr><td>Name</td><td>Complete the name of the storage</td></tr><tr><td>Provider</td><td>Choose a provider</td></tr><tr><td>Region</td><td>Complete the region*</td></tr><tr><td>URL</td><td>Complete the url</td></tr><tr><td>Backend</td><td>Select the backend : Rclone or S3FS</td></tr><tr><td>Mount Options</td><td></td></tr><tr><td>Access Key ID</td><td>Complete*</td></tr><tr><td>Secret access key</td><td>Complete*</td></tr></tbody></table>

{% hint style="info" %}
\*Information required, if your provider doesn't enforce the usage of region, define a value representative for you.
{% endhint %}

The name of a cloud storage is unique.  You can't have several cloud storage with the same Name.

Once, the connector is defined, the buckets will automatically appear.

## Swift Storage

#### OpenStack Swift Configuration

> System -> Hardware -> Storages -> Cloud

<figure><img src="/files/Nrp3BMLZGRSnyyrlvPH4" alt=""><figcaption></figcaption></figure>

* [ ] To create a new storage "OpenStack Swift" click on the button&#x20;

<div align="left"><figure><img src="/files/rlndNmGZP41H4VFvabTl" alt="" width="33"><figcaption></figcaption></figure></div>

* [ ] and complete the form

&#x20;

<figure><img src="/files/sERhC4KWyOAY9n2PGfpQ" alt="" width="257"><figcaption></figcaption></figure>

\-         **Name:** complete the name you define in the toml (ansible playbook)

{% hint style="warning" %}
Mandatory to have the same name as the name writing in the toml (parent\_name)
{% endhint %}

\-         **Provider:** choose OpenStack Swift <mark style="background-color:red;">(</mark><mark style="background-color:red;">**+++ Mandatory**</mark><mark style="background-color:red;">)</mark>

### How to Visualize your buckets ?

Go to&#x20;

> Storage Services -> Cloud

&#x20;At this stage, This panel display the complete overview of all Cloud Bucket.

You directly see if the bucket is Online or Offline.

### S3 As a Primary Storage

Primary Storage need to be mount before launching a task.&#x20;

To mount the storage, click on the button to connect the storage.

If you change the Backend for a primary storage bucket, it's required to reconnect the Storage (in the Storage Services cloud), for doing this operation, alt click on the button:

It's required to reconnect the Storage (in the Storage Services cloud), for doing this operation, alt click on the button:

![](https://www.nodeum.io/hs-fs/hubfs/image-png-Feb-15-2022-01-58-40-22-PM.png?width=70\&name=image-png-Feb-15-2022-01-58-40-22-PM.png)

### S3 As a Secondary Storage

Secondary storage are automatically mounted by the workflow manager.

If you change the Backend for a Secondary storage bucket, it's required to restart the service Core Manager (in settings menu).


# Tape Library Configuration

Multiple Tape Library from different vendors can be configured.

### Tape Overview <a href="#secondarystorageconfiguration-configurationofatapelibrary" id="secondarystorageconfiguration-configurationofatapelibrary"></a>

Use Nodeum to manage the tape library efficiently.

<figure><img src="/files/oYdR8nwt5pcUaz9GAwyA" alt=""><figcaption><p>Tape overview</p></figcaption></figure>

### Configuration of a Tape Library <a href="#secondarystorageconfiguration-configurationofatapelibrary" id="secondarystorageconfiguration-configurationofatapelibrary"></a>

To configure a tape library, follow these steps:

1. Navigate to: `System` -> `Hardware` -> `Storage` -> `Tape Library`
2. Click the toggle button labeled "Discover tapes libraries information"

<figure><img src="/files/xUPXxPyUfwIZSwNpUIsa" alt=""><figcaption><p>Tape Library Configuration - step1</p></figcaption></figure>

* [ ] After clicking the "Display non-configured libraries" toggle button, Nodeum searches for connections with tape libraries.

<figure><img src="/files/Bo5SUVstdNPvLnQ6r2sE" alt=""><figcaption><p>Tape Library Configuration - Step2</p></figcaption></figure>

{% hint style="success" %}
This feature will automatically detect all connected tape libraries.
{% endhint %}

<figure><img src="/files/5L9c63aioXqRUNr9tAwR" alt=""><figcaption><p>Tape Library Configuration - Step3</p></figcaption></figure>

* [ ] Choose the Tape Library you wish to configure. Complete the setup by filling in the required columns.

<table><thead><tr><th width="232">Mandatory Information</th><th>Description</th></tr></thead><tbody><tr><td>Name</td><td><em>Complete a name</em></td></tr><tr><td>Emulation </td><td><em>Select the supported emulation for your Tape Library</em></td></tr></tbody></table>

* [ ] The selected Tape Library is now configured and ready.

<figure><img src="/files/RuDfd6vwjsoCPMjoZy7F" alt=""><figcaption><p>Tape Library Configuration - Step4</p></figcaption></figure>

{% hint style="info" %}
Check the Tape Library status
{% endhint %}

| Status         | Description                                                |
| -------------- | ---------------------------------------------------------- |
| Configured     | *Tape library is configured*                               |
| Not Configured | *Tape library is not configured*                           |
| Ready          | *Tape library is connected and operational.*               |
| Not Ready      | *Tape library is either not connected or not operational.* |

{% hint style="danger" %}
To disable the automatic tape drive cleaning feature in the tape library, switch to manual mode as authorized by Nodeum.
{% endhint %}

### Tape Drive Configuration

To configure the Tape Drive(s), click the **->** icon next to the Tape Library.

<figure><img src="/files/rzJlMLlyfeFWIgt0gHJH" alt=""><figcaption><p>Tape drive Configuration - Step 1</p></figcaption></figure>

* [ ] Click the "Display non-configured drives" toggle button.

<figure><img src="/files/9H716gmIvzMDIRKwb5Ng" alt=""><figcaption><p>Tape drive Configuration - Step 2</p></figcaption></figure>

{% hint style="success" %}
Automatically detect and list all connected tape drives.
{% endhint %}

<figure><img src="/files/fR3nnsD2dTZxNKzLwu74" alt=""><figcaption><p>Tape drive Configuration - Step 3</p></figcaption></figure>

* [ ] Choose the drives to connect with the Tape Library and then save the configuration.

<figure><img src="/files/Oa8rPEUeApXpl2iHj5kF" alt=""><figcaption><p>Tape drive Configuration - Step 3</p></figcaption></figure>

{% hint style="info" %}
Verify the Status of the Tape Drives
{% endhint %}

<table><thead><tr><th width="231">Status</th><th>Description</th></tr></thead><tbody><tr><td>Configured</td><td><em>Tape drive is configured</em></td></tr><tr><td>Not configured</td><td><em>Tape drive is not configured</em></td></tr><tr><td>Online</td><td><em>Tape drive is connected and operational</em></td></tr><tr><td>Offline</td><td><em>Tape drive is connected but in maintenance mode</em></td></tr></tbody></table>

{% hint style="success" %}
Once this step is finished, go back to the Tape Library Configuration.
{% endhint %}

### Tape drive Cleaning

Before initiating a tape drive cleaning, ensure all tasks are paused. The tape library will be offline during this process, and no operations can occur concurrently.

{% hint style="danger" %}
To deactivate the automatic tape drive cleaning in the tape library, enable only manual mode as authorized by Nodeum.
{% endhint %}

### Tape drive Replacement or other materials

{% hint style="info" %}
To update the tape library when changing a tape drive, replacing a bridge, or other components, Nodeum must resynchronize to recognize new material information, such as SCSI devices.
{% endhint %}

#### &#x20;Synchronizing Tape Library and Tape Drive Devices

When updating the configuration of Tape Libraries and Tape Drives, it's essential to ensure device assignments remain accurate as they may change. Here's how to sync them effectively:

1. **Identify Current Device in Use**\
   The device currently in use appears as `/dev/sg8`.
2. **Scan for Tape Libraries**\
   Click on *Discover tapes libraries information* to initiate a scan and update the device mappings.

<figure><img src="/files/KnBQk4cwbqRz5JhVnlSm" alt=""><figcaption><p>Tape Library Synchronisation - Step 1</p></figcaption></figure>

{% hint style="info" %}
This process might take a few seconds to several minutes, based on the number of tape drives in the library.
{% endhint %}

{% hint style="success" %}
Notice the update by clicking the icon ![](/files/H5NQTY5AX2uNoaPxctLQ)  to confirm the changes.
{% endhint %}

<figure><img src="/files/Jx19QOVV6yIOzoUJFfCq" alt=""><figcaption><p>Tape Library Synchronisation - Step 2</p></figcaption></figure>

#### Tape Drives sync

The same operation can be performend into the Tape Drives configuration.

<figure><img src="/files/X183DLh5w64REhlVdlyV" alt=""><figcaption><p>Tape Drive synchronisation - Step 1</p></figcaption></figure>

The red square highlights the devices used by each tape drive:

<figure><img src="/files/pto5SgvLdyFsx1A68JgP" alt=""><figcaption><p>Tape Drive synchronisation - Step 2</p></figcaption></figure>

* [ ] Toggle *Display non-configured drives* to scan and map new devices automatically.

<figure><img src="/files/9HKE0duiCPJqxOtBWvst" alt=""><figcaption><p>Tape Drive synchronisation - Step 3</p></figcaption></figure>

### Tape Barcode Requirement <a href="#secondarystorageconfiguration-checkthestatusoftapelibrary" id="secondarystorageconfiguration-checkthestatusoftapelibrary"></a>

{% hint style="danger" %}

* Configure the Tape Library to display the entire 8-character Tape Barcode, such as ABC123Lx, where 'x' indicates the LTO version.
* Ensure each Tape Barcode is unique.
* If multiple Tape Libraries are set up, do not use identical barcodes across different Tape Libraries.
  {% endhint %}


# User Management

Two different user managements sections are available:

* Web
* Container

### Web Access

Navigate to: `System` > `User Management` > `Web`

To add a user and grant console access, navigate to the User Management Panel:

<figure><img src="/files/KH8RaJsLQoM7YiX1vMez" alt=""><figcaption></figcaption></figure>

Select a role for each user by choosing either Administrator or Standard User. Then, click "Complete the Form."

<figure><img src="/files/DaaXElsRKZj02a8dS7q2" alt=""><figcaption></figcaption></figure>

#### Default user

During the initial installation, a default user named "admin" with the ID: 1000 is created. For the first login, use this default administrator username. It is recommended to change the admin password as soon as possible.

{% hint style="info" %}
For the first connection, use the default administrator username to log in. &#x20;
{% endhint %}

### **Container Access**

Navigate to: `System` > `User Management` > `Container`

Nodeum offers a logical representation of file virtualization, creating an abstraction layer between file servers and their clients. This virtualization layer manages files and systems across different storage solutions. Access the file system through the network using standard protocols like NFS, SMB, and S3.&#x20;

For setup instructions, refer to the [Container configuration section](/data-archiving/container#privileges-definition).


# Audits

Auditing capabilities can be categorized into two distinct types.

### Data Access&#x20;

#### **Audit Container Activities**

Audit all file access within each container to ensure proper usages. Monitor and log any access or changes to any files within the container.

<figure><img src="/files/u5O0D9vDMQLQLQNyRh5D" alt=""><figcaption><p>System Audits Data Access</p></figcaption></figure>

### Data management

#### Console Activity Audit

Enable auditing of Console activities to enhance security and compliance. Regularly review logs to monitor user actions and ensure adherence to company policies. Use these insights to detect anomalies and improve operational efficiency.

<figure><img src="/files/bjah52RoAE1vQVmWU5mM" alt=""><figcaption><p>System Audit Data management</p></figcaption></figure>


# API / Developers

Software Developement Kits


# RESTful API - Terms of Use

Last modified 12th January 2024

**Important–read carefully:**

These Application Programming Interface Terms of Use (“Terms of Use”) govern your access and use of the APIs provided by Nodeum S.A., its subsidiaries and affiliates (collectively, “Nodeum”). The guides, materials, references, software and other applications or services provided by Nodeum in association with the access and use of the Nodeum APIs, together with the Nodeum APIs themselves, are collectively referred to as a suite of “Nodeum API Services”.

By accessing or using the Nodeum API Services you confirm your agreement to be bound by these Terms of Use. The Nodeum APIs may also be subject to any other agreements you have with Nodeum, including those related to your use of business-specific APIs (“Supplemental Agreements”). Additionally, if you use the Nodeum APIs as an interface to, or in conjunction with, other Nodeum products and services, then the terms of those products and services (“Nodeum Product Terms”) also apply to you and your end users. If there is a conflict between these Terms of Use and the terms of a Supplemental Agreement governing your use of an Nodeum API or Nodeum Product Terms governing your use of Nodeum's products and services, those terms will control with respect to that conflict.

Collectively, we refer to these Terms of Use, any additional applicable terms (including terms in any Supplemental Agreements and any Nodeum Product Terms) and any other applicable policies and guidelines as the "Terms."

PLEASE READ THESE TERMS OF USE CAREFULLY, AS THEY CONSTITUTE A LEGAL AGREEMENT BETWEEN YOU AND NODEUM.

### **Section 1. Access To APIs**

#### **A. Entity Access**

If you are accessing Nodeum API Services on behalf of a company, entity, or organization (collectively “entity”), then you represent and warrant that you: (a) are an authorized representative of that entity with the authority to bind such entity to the Terms; (b) have read and understand the Terms; and (c) agree to these Terms of Use on behalf of such entity. All references to “you” in these Terms of Use shall also refer to that entity.

#### **B. Registration & Credentials**

To access the Nodeum API Services, you will be issued certain credentials, which may be required to access the Nodeum APIs. You may not make credentials available to others and only you may access the Nodeum API Services with the credentials provided to you. You will not misrepresent or mask your identity or your credentials when accessing or using the Nodeum API Services.

### **Section 2. User Of APIs**

#### **A. Your End Users**

If you offer your application for use by others outside of your entity, you must maintain a user agreement and a legally compliant privacy policy for your application that is prominently identified or located where users download or access your application. You must immediately notify us in writing of any breach of your user agreement or privacy policy that impacts, or may impact, customers or users of Nodeum’s products or services.

#### **B. Compliance**

Access, implementation and use of the Nodeum API Services must be in compliance with all applicable law, regulation, third party rights (including, without limitation, laws regarding the import or export of data or software, privacy, and local laws) as well as Nodeum’s instructions. You will only use the Nodeum API Services in connection with legally permissible activities and as described in the Terms.

#### **C. API Limitations**

Nodeum sets and enforces limitations on the use of Nodeum APIs. You will not circumvent, or attempt to circumvent, such limitations as they apply to each Nodeum API or as otherwise set forth in the Terms, except as approved in writing by Nodeum. Nodeum may limit the number or nature of network calls that you or your application may make. Nodeum may change such usage limits at any time with or without notice and may use any means to enforce its usage limitations or prevent overuse of the Nodeum APIs.

#### **D. Open Source**

To facilitate your Nodeum API integration, Nodeum may make certain Software Development Kit(s) (“SDK(s)”) and/or libraries available to you under a separate open source license. You agree that any Nodeum API integration facilitated with such open source SDK(s) and/or libraries remains subject to the Terms.

#### **E. API Monitoring; Review**

We may monitor your use of the Nodeum API Services for reasons including to improve the Nodeum API Services and identify security issues or ensure compliance with the Terms. We reserve the sole right to determine whether or not your use of the Nodeum API Services is acceptable including the manner in which the Nodeum APIs are integrated into Your Products (defined below). Nodeum may collect and use usage data and information related to your use of the Nodeum API Services.

Nodeum’s review, testing, or approval of your products or services does not constitute any representation or acknowledgement by Nodeum that Your Products and/or any content therein comply with the Terms, any laws, rules, or regulations, nor does it constitute any acceptance by Nodeum of any responsibility or liability in connection such products or services, or any content therein.

#### **F. Revocation**

If you do not comply with the Terms or if in our sole discretion believe that you have attempted to exceed or circumvent any of the prohibited uses or the additional requirements or limitations described in the Terms, your ability to use the Nodeum API Services may without notice be temporarily or permanently blocked or revoked.

#### **G. Certain Prohibited Uses**

Unless permitted by applicable law or any Supplemental Agreement(s) between you and Nodeum, you will not, and will not direct, encourage, or assist any other party to: (a) license, sublicense, sell, resell, transfer, assign, distribute or otherwise provide or make available to any other party the Nodeum API Services; (b) modify or make derivative works based upon the Nodeum API Services; (c) improperly use the Nodeum API Services, including creating Internet “links” to any part of the Nodeum API Services, “framing” or “mirroring” any part of the Nodeum API Services on any other websites or systems, or “scraping” or otherwise improperly obtaining data from the Nodeum APIs; (d) reverse engineer, decompile, modify, or disassemble the Nodeum API Services; (e) send spam or otherwise duplicative or unsolicited messages with the Nodeum APIs; or (f) use the Nodeum APIs to (x) display any offensive content or any content for which you do not have the right to share with Nodeum or to display or (y) distribute unsolicited advertising or promotions, or initiate any other communication or contact with Nodeum users or partners.

In addition, you shall not, and shall not direct, encourage, or assist any other party to, access or use the Nodeum API Services to: (i) design or develop a competitive or substantially similar product or service; (ii) copy or extract any features or functionality thereof; (iii) launch or cause to be launched on or in connection with the Nodeum API Services a malicious automated program or script, including web spiders, crawlers, robots, indexers, bots, viruses or worms, or any program intended to overburden or hinder the operation and/or performance of the Nodeum API Services; (iv) attempt to gain unauthorized access to the Nodeum API Services or its related systems or networks; (v) include any underlying Nodeum platform or product with competitors in any aggregated view i.e. webpage, app, software, etc.; (vi) aggregate Nodeum’s data with competitors’ data; or (vii) parse or scrape any of Nodeum’s data; in each case other than as explicitly permitted by Nodeum in writing. You will not share with a third party (or enable a third party to use) any operational, technical or other data obtained through the use of the Nodeum API Services in any manner that is competitive to Nodeum, including, without limitation, in connection with any application, website or other product or service that also includes, features, endorses, or otherwise supports in any way a third party that provides services competitive to Nodeum’s products and services.

### **Section 3. Ownership; License**

#### **A. Ownership**

Nodeum owns all right, title and interest, including without limitation all intellectual property rights and other rights in and to its software applications (including but not limited to the Nodeum API Services), any intellectual property rights used in connection with the software applications, and other proprietary technology, including any data structures therein, accompanying documentation, and any updates or revisions to the foregoing. All rights not specifically conveyed are retained by Nodeum.

#### **B. Licenses**

Subject to your compliance with the Terms, Nodeum hereby grants you a limited, revocable, non-exclusive, non-transferable, non-assignable license to access and use the Nodeum API Services for sole purposes of developing, testing, using, and maintaining an integration of your application with the Nodeum API Services.

Nodeum may produce and distribute incidental depictions, including screenshots, video, or other content from your API client, and may use your company or product name in the course of Nodeum’s worldwide promotion, marketing, or demonstration of the Nodeum API Services you are using; you hereby grant Nodeum all necessary licenses, on a royalty-free basis, for these purposes.

Subject to the rights granted to Nodeum and limitations herein, you reserve and retain sole and exclusive ownership of all right, title, and interest in, to, and under (a) your extensions and applications, and (b) all modifications, corrections, repairs, translations, enhancements, and other derivative works and improvements of your extensions and applications, including all intellectual property rights arising therefrom or relating thereto (collectively, (a) and (b) are “Your Products”), to the extent Your Products do not infringe any of Nodeum intellectual property rights. You are solely responsible for all costs incurred by you in the creation and maintenance of Your Products.

### **Section 4. Content**

You are solely responsible for selecting all content made available through and contained in Your Products and for ensuring that such content complies with the Terms and any other requirements applicable to such content.

The Nodeum API Services may contain content owned by a third party. Nodeum shall not be held responsible for any third party content. This content accessible through Nodeum APIs and Nodeum products may be subject to the intellectual property rights of third parties. User-generated content obtained by Nodeum will be governed by Nodeum’s [user generated content policy](https://www.nodeum.io/end-user-legal-agreement).

### **Section 5. Feedback; Attribution**

#### **A. Feedback**

If you provide feedback or suggestions about Nodeum API Services, such information may be used for any purpose without obligation to you.

#### **B. Attribution**

Except where expressly stated, neither party grants the other party any right, title, or interest in or to the other party’s trade names, trademarks, service marks, logos, domain names, and other distinctive brand features (“Brand Attributes”) and you will not make any statement regarding your use of an Nodeum API Service which disparages Nodeum or its business partners.

The documentation for the Nodeum API you use may include guidelines for providing attribution to Nodeum. You agree to provide any attribution in accordance with the guidelines and as further described in our Design Guidelines, which may be updated from time to time. You can use these resources but you must not make any changes or modifications to them.

### **Section 6. Privacy**

#### **A. Confidentiality**

You may be given access to information that is confidential to Nodeum (“Nodeum Confidential Information”), which may include your credentials as well as any materials, communications or other information that are marked confidential or that would reasonably be considered confidential under the circumstances. You agree to use Nodeum Confidential Information only for the purpose of using the Nodeum API Services in accordance with the Terms, and, unless compelled by a court of applicable jurisdiction and you gave Nodeum written notice and a reasonable chance to defend its interests prior to such court compelled disclosure, you agree to not disclose any Nodeum Confidential Information to any third party without Nodeum’s prior written consent.

#### **B. Security**

You agree to implement and maintain appropriate technical, physical, and organizational measures to protect Nodeum Data and Nodeum Confidential Information against unauthorized or unlawful processing and against unauthorized loss, destruction, damage, alteration, or disclosure in the same manner that you would protect your own confidential and proprietary information but in no event using less than a reasonable degree of care.

Nodeum Confidential Information does not include information that you independently developed, that was rightfully given to you by a third party without any confidentiality obligation, or that becomes public through no fault of your own or any party under your control.

### **Section 7. Term; Termination and Survival**

#### **A. Term; Termination**

These Terms of Use will apply for as long as you access and use the Nodeum API Services. You may terminate these Terms of Use at any time by giving us notice and ceasing to access and use the Nodeum API Services. Nodeum at its sole discretion may terminate these Terms of Use at any time, including if it determines that you have violated or attempted to violate the Terms. These Terms of Use will terminate automatically in the event the Nodeum APIs you use are no longer made available to you, if your Supplemental Agreement with Nodeum is terminated or expires, or if any representations you make herein are deemed or found to be untrue.

Upon termination of these Terms of Use, you will immediately stop using the Nodeum APIs, cease all use of the Nodeum intellectual property and delete any cached or stored content and any Nodeum Data (including any Nodeum Confidential Information). Nodeum reserves the right to contact your end users to notify them of the termination of your right to use the Nodeum APIs and the Nodeum API Services.

#### **B. Survival**

The provisions set forth in these Terms of Use that, by their nature, should survive termination or expiration of these Terms of Use, will survive any expiration or termination of these Terms of Use.

### **Section 8. Relationship Of Parties**

The relationship of the parties is that of independent contractors. These Terms of Use do not create a partnership, joint venture, franchisee or other similar relationship. Neither party will make a public statement that suggests partnership with or sponsorship or endorsement by the other party without such party’s prior written approval.

The parties’ obligations under these Terms of Use are non-exclusive. Unless otherwise agreed upon separately in writing, neither party is precluded from marketing, licensing, positioning, providing and distributing its own products and services through other alliances, programs or partners. Nothing in these Terms of Use prohibits or restricts either party’s right to develop, make, use, market, license, position, provide and distribute products or services similar to or competitive with those of the other party as long as it does not breach, or attempt to breach, these Terms of Use.

### **Section 9. Representations; Indemnification; Disclaimer; Limitation Of Liability**

#### **A. Representations**

You hereby represent and warrant that you have all authority necessary to bind yourself (including your entity) to these Terms of Use and that you are not prohibited from accessing or using the Nodeum API Services in the country in which you reside. If, at any time, you do not have authority, are legally prohibited, or do not agree to these Terms of Use, then these Terms of Use are automatically terminated, and you must discontinue all access and use of the Nodeum API Services immediately.

You further represent and warrant that (a) you have the right to distribute, or otherwise make available Your Products to your end users, (b) such products comply with all applicable local, state, federal and international laws and regulations as well as applicable terms of service and privacy notices and (c) Your Products do not and will not infringe the rights of any third party.

#### **B. Indemnification**

You agree to indemnify and hold Nodeum and its officers, directors, employees, and agents harmless from and against any and all claims, demands, losses, liabilities, and expenses (including legal fees), arising out of or in connection with: (a) your use of the Nodeum API Services or information obtained through your use of the Nodeum API Services; (b) your breach or violation of the Terms or (c) your violation of the rights of any third party, including with respect to any third party content.

#### **C. Disclaimer**

THE NODEUM API SERVICES ARE PROVIDED “AS IS” AND “AS AVAILABLE”. NODEUM DISCLAIMS ALL REPRESENTATIONS AND WARRANTIES, EXPRESS, IMPLIED, OR STATUTORY, NOT EXPRESSLY SET OUT IN THESE TERMS OF USE, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN ADDITION, NODEUM MAKES NO REPRESENTATION, WARRANTY, OR GUARANTEE REGARDING THE RELIABILITY, TIMELINESS, QUALITY, SUITABILITY, OR AVAILABILITY OF THE NODEUM API SERVICES OR ANY INFORMATION REQUESTED OR OBTAINED THROUGH THE USE OF THE NODEUM API SERVICES, OR THAT THE SERVICES WILL BE UNINTERRUPTED OR ERROR-FREE. YOU AGREE THAT THE ENTIRE RISK ARISING OUT OF YOUR USE OF THE NODEUM API SERVICES, AND ANY INFORMATION REQUESTED OR OBTAINED IN CONNECTION THEREWITH, REMAINS SOLELY WITH YOU, TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE LAW.

#### **D. LIMITATIONS**

WHERE PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL NODEUM OR ANY OF ITS SERVICE PROVIDERS, SUPPLIERS OR REPRESENTATIVES (INCLUDING OFFICERS OR DIRECTORS) BE LIABLE TO YOU OR ANY THIRD PARTY UNDER ANY LEGAL OR EQUITABLE THEORY, INCLUDING BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY AND OTHERWISE, FOR ANY: (A) LOSS OF PRODUCTION, USE, BUSINESS, REVENUE OR PROFIT, OR LOSS OF DATA OR DIMINUTION IN VALUE, OR (B) CONSEQUENTIAL, INCIDENTAL, INDIRECT, EXEMPLARY, SPECIAL, ENHANCED OR PUNITIVE DAMAGES, ARISING FROM YOUR USE OF THE NODEUM API SERVICES, REGARDLESS OF WHETHER YOU OR SUCH PERSONS WERE ADVISED OF THE POSSIBILITY OF SUCH LOSSES OR DAMAGES OR SUCH LOSSES OR DAMAGES WERE OTHERWISE FORESEEABLE. THE FOREGOING LIMITATIONS WILL SURVIVE AND APPLY EVEN IF ANY LIMITED REMEDY SPECIFIED IN THESE TERMS OF USE IS FOUND TO HAVE FAILED ITS ESSENTIAL PURPOSE. NODEUM’S AGGREGATE LIABILITY UNDER THESE TERMS OF USE WILL NOT EXCEED ONE HUNDRED DOLLARS ($100).

### **Section 10. Support And Maintenance**

Nodeum may provide documentation, functional and technical design documents, and other documents that may be relevant or useful in using Nodeum API Services. Nodeum has no obligation to provide any maintenance, support, or training for set-up or use of any Nodeum API Services.

### **Section 11. Modifications**

Nodeum in its sole discretion may modify, update or discontinue the Nodeum API Services. Nodeum may also impose additional limits on certain features and services or restrict your access to parts or all of the Nodeum API Services without prior notice or liability. While we can provide no guarantee, we will try to ensure that future versions of the Nodeum APIs are backwards compatible to the immediately preceding version.

Nodeum may amend these Terms of Use from time to time. Amendments will be effective upon Nodeum’s posting of such updated Terms of Use at this location or in the amended policies or documentation related to the Nodeum APIs. Your continued access or use of the Nodeum API Services after such posting confirms your consent to be bound by these Terms of Use, as amended.

### **Section 12. Miscellaneous**

If you are using the Nodeum APIs or Nodeum API Services, these Terms of Use will be governed by the laws of Belgium, without regard to conflicts of law principles, and all claims arising out of or relating to these Terms of Use will be brought exclusively in the court of Liege, Belgium. These Terms of Use were drafted in English and the English-language version shall control in the event of a conflict with any translated version. You may not assign any of the rights or obligations under these Terms of Use, by operation of law or otherwise, without the prior written consent of Nodeum. Any attempted assignment in violation of this paragraph is void. Nodeum may exercise its rights herein in its sole discretion and without prior notice. The Terms constitute the entire agreement among the parties with respect to the subject matter and supersede and merge all prior proposals, understandings and contemporaneous communications. Any delay by Nodeum in enforcing any of its rights under these Terms of Use, including with regard to your non-compliance, shall not constitute a waiver of Nodeum’s rights to future enforcement of its rights under these Terms of Use. If any part of these Terms of Use are determined to be invalid or unenforceable by a court of competent jurisdiction, that provision will be restated and enforced to the maximum extent permissible and the remaining provisions of these Terms of Use will remain in full force and effect.


# RESTful API Guide

Use the Nodeum APIs to automate your Data Management operations.

Nodeum supports different capabilities to handle Authorization process. The objective is to grant authenticated users access to resources by verifying whether they have access permissions or not. It also allows you to restrict access privileges by granting or denying specific access to authenticated users.

## About RESTful API

The RESTful API is available in Nodeum and the usage instructions are available here below :

* How to use the API.
* A list of the available resources and their endpoints, see [REST API resources](https://www.nodeum.io/resource-api).&#x20;

## Compatibility guidelines

The HTTP API is versioned with a single number, which is currently `2`. This number symbolizes the major version number.  &#x20;

Nodeum API version changes including entire API version removal are done in tandem with major Nodeum features releases and bug fixes. All deprecations and changes between versions are listed in the documentation.

### Current status

API version v2 is the latest.

## How to use the API?

API requests must include both `api` and the API version.

For example, the root of the v4 API is at `/api/v2`.

### Valid API request

The following is a basic example of a request to the fictional `nodeum.local` endpoint:

```bash
$ curl "https://nodeum.local/api/v2/files"
```

The API uses JSON to serialize data.&#x20;

You don’t need to specify `.json` at the end of the API URL.&#x20;

### Request and response formats

For POST and PUT requests, the request body must be JSON, with the `Content-Type header` set to `application/json`.

For almost all requests, the response will be JSON.

Whether a request succeeded is indicated by the HTTP status code. A 2xx status code indicates success, whereas a 4xx or 5xx status code indicates failure.&#x20;

When a request fails, the response body is still JSON and contains additional information about the error.

The following table gives an overview of how the API functions and status code are defined:

<table><thead><tr><th width="152">Request type</th><th>Description</th></tr></thead><tbody><tr><td><code>GET</code></td><td>Access one or more resources and return the result as JSON.</td></tr><tr><td><code>POST</code></td><td>Return <code>201 Created</code> if the resource is successfully created and return the newly created resource as JSON.</td></tr><tr><td><code>GET</code> / <code>PUT</code></td><td>Return <code>200 OK</code> if the resource is accessed or modified successfully. The (modified) result is returned as JSON.</td></tr><tr><td><code>DELETE</code></td><td>Returns <code>204 No Content</code> if the resource was deleted successfully or <code>202 Accepted</code> if the resource is scheduled to be deleted.</td></tr></tbody></table>

&#x20;The following table shows the possible return codes for API requests.

<table><thead><tr><th width="281">Return values</th><th>Description</th></tr></thead><tbody><tr><td><code>200 OK</code></td><td>The <code>GET</code>, <code>PUT</code> or <code>DELETE</code> request was successful, and the resource itself is returned as JSON.</td></tr><tr><td><code>202 Accepted</code></td><td>The <code>GET</code>, <code>PUT</code> or <code>DELETE</code> request was successful, and the resource is scheduled for processing.</td></tr><tr><td><code>204 No Content</code></td><td>The server has successfully fulfilled the request, and there is no additional content to send in the response payload body.</td></tr><tr><td><code>201 Created</code></td><td>The <code>POST</code> request was successful, and the resource is returned as JSON.</td></tr><tr><td><code>304 Not Modified</code></td><td>The resource hasn’t been modified since the last request.</td></tr><tr><td><code>400 Bad Request</code></td><td>A required attribute of the API request is missing. For example, the title of an issue is not given.</td></tr><tr><td><code>401 Unauthorized</code></td><td>The user isn’t authenticated. A valid user token is necessary.</td></tr><tr><td><code>403 Forbidden</code></td><td>The request isn’t allowed. For example, the user isn’t allowed to delete a project.</td></tr><tr><td><code>404 Not Found</code></td><td>A resource couldn’t be accessed. For example, an ID for a resource couldn’t be found.</td></tr><tr><td><code>405 Method Not Allowed</code></td><td>The request isn’t supported.</td></tr><tr><td><code>409 Conflict</code></td><td>A conflicting resource already exists. For example, creating a project with a name that already exists.</td></tr><tr><td><code>422 Unprocessable</code></td><td>The entity couldn’t be processed.</td></tr><tr><td><code>429 Too Many Requests</code></td><td>The user exceeded the application rate limits.</td></tr><tr><td><code>500 Server Error</code></td><td>While handling the request, something went wrong on the server.</td></tr></tbody></table>

### Offset-based Pagination

Nodeum API supports the Offset-based pagination. This is the default method and is available on all endpoints. Sometimes, the returned result spans many pages. When listing resources, you can pass the following parameters:

<table><thead><tr><th width="135">Parameter</th><th>Description</th></tr></thead><tbody><tr><td><code>page</code></td><td>Page number (default: <code>1</code>).</td></tr><tr><td><code>per_page</code></td><td>Number of items to list per page (default: <code>20</code>, max: <code>100</code>).</td></tr></tbody></table>

### Namespaced path encoding

If using path or namespaced API requests, make sure that the `NAMESPACE/PATH` is URL-encoded : `/` is represented by `%2F.`

## Use the API from an application

<figure><img src="https://www.nodeum.io/hubfs/undefined-May-26-2023-01-13-39-6581-PM.png" alt="" width="563"><figcaption></figcaption></figure>

For executing an API requests from a client, it requires authentication, or only return public data when authentication isn’t provided.&#x20;

There are two ways you can authenticate with the Nodeum API included :

* Basic Authentication
* Advanced Authentication

### **Basic authentication**&#x20;

Basic authentication is a simple authentication scheme. The client sends HTTP requests with the `Authorization` header that contains the word `Basic` followed by a space and a base64-encoded string `username:password`.&#x20;

For example, to be authorized as `admin/p@55w0rd` the client would send this query:

{% code overflow="wrap" %}

```bash
$ curl -X GET -H "Accept: application/json" -H "Authorization: Basic YWRtaW46cEA1NXcwcmQ=" "https://nodeum.local/api/v2/tapes?limit=10"
```

{% endcode %}

{% hint style="info" %}
Because base64 is easily decoded, Basic authentication is recommended to be used together with other security mechanisms such as HTTPS/SSL.
{% endhint %}

### **Advanced Authentication**&#x20;

Two options are available in this authentication schema: API keys and JWT Token.&#x20;

{% hint style="info" %}
The authentication is recommended to be used over HTTPS (SSL).
{% endhint %}

#### **API keys**&#x20;

API keys authentication involves keys to handle the authentication. The client must send this key in the `Authorization` header that contains the word `Bearer`  followed by a space and a provided key. Access can be restricted with a scope.&#x20;

**Configuration**

In Nodeum, you have a security section where you can generate such kind of key. This is located in the menu:

> System -> Configuration -> API Security

<figure><img src="/files/Jx1zsKHPVpsqvQAGuxF8" alt=""><figcaption></figcaption></figure>

In the section, you can define the three following parameters:

* Name: This is the name of your choice.
* Controller: definition of controller, \* is a wildcard to allow access to all endpoint.
* Action: define the action related to the controller, \* is a wildcard to allow access to all endpoint.

Example, if we define as "Scope": Controller: files and Action: index, this means that the API key have only access to the controller *files* and the action as *index.*

{% hint style="info" %}
The list of Controller and Action definitions are available in the Nodeum API documentation behind each endpoints.
{% endhint %}

Different Controller and Action can be defined in order to define the key with limited access.

**Usage**

The key must be provided in your request headers, for example, to be authorized with the key `hv2ipsrv7y-JScJpV8h-x9w`  the client would send this query:

<pre class="language-bash" data-overflow="wrap"><code class="lang-bash"><strong>$ curl -X GET -H "Accept: application/json" -H "Authorization: Bearer hv2ipsrv7y-JScJpV8h-x9w" "https://nodeum.local/api/v2/tapes?limit=10" 
</strong></code></pre>

#### **Bearer authentication (also called token authentication)**

Provide your bearer token in the Authorization header when making requests to protected resources.

It is an HTTP authentication scheme that involves security tokens called bearer tokens. The name “Bearer authentication” can be understood as “give access to the bearer of this token.” The bearer token is a cryptic string, usually generated by the server in response to a login request.&#x20;

The client must send this token in the `Authorization` header when making requests to protected resources: `Authorization: Bearer <token>`

The Bearer authentication has the requirement to have the Nodeum Administration console configured in JWT mode.

For example, to be authorized with the following JWT token `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c` the client would send this query:

{% code overflow="wrap" %}

```bash
$ curl --request GET \
 --url http://localhost/api/v2/files \
 --header 'Accept: application/json' \
 --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
```

{% endcode %}

## Use the API from a Browser <a href="#configuration-cors-cross-originresourcesharing" id="configuration-cors-cross-originresourcesharing"></a>

This access involved the concept of "Cross-origin resource sharing (CORS)" which is a browser mechanism to meet browser security requirements and send requests directly to Nodeum API endpoints.

<figure><img src="https://www.nodeum.io/hs-fs/hubfs/undefined-May-26-2023-12-57-03-9738-PM.png?width=379&#x26;height=100&#x26;name=undefined-May-26-2023-12-57-03-9738-PM.png" alt="" width="563"><figcaption></figcaption></figure>

### Configuration

To configure CORS into Nodeum, you have to do login into your Nodeum Console and access the following menu:

> System -> Configuration -> API Security Section

<figure><img src="https://www.nodeum.io/hs-fs/hubfs/image-png-May-26-2023-12-41-40-4811-PM.png?width=633&#x26;height=400&#x26;name=image-png-May-26-2023-12-41-40-4811-PM.png" alt=""><figcaption></figcaption></figure>

In the Cross-Origin section, you can define the three following parameters:

* Origins : definition of the DNS domain, \* is the wildcard which will allow access from all domains.
* Path : definition of API endpoint path url , \* is a wildcard to allow access to all endpoint.
* Methods : define the HTTP request method allow. GET / POST / PUT / DELETE can be defined, multiple selections are allowed.

Multiple rules can be configured to design the authentication you need.

## Verify the API endpoint results <a href="#configuration-cors-cross-originresourcesharing" id="configuration-cors-cross-originresourcesharing"></a>

You can use Nodeum Console to validate any API call you want to use.

For doing this, you need to:

* Use a browser which include a development tool (e.g. Chrome, Firefox)
* Open the browser development tool&#x20;
* Go into Nodeum console and execute the action you want to validate
* In the Network tab of the development tool (e.g. Inspector for Chrome), you see click in the API endpoint name. Show example below
* And then you can have access to the Header, Preview and Response

<figure><img src="https://mt-c-storage.atlassian.net/wiki/download/thumbnails/1330118657/image2019-10-14_14-51-53.png?version=1&#x26;modificationDate=1571057519141&#x26;cacheVersion=1&#x26;api=v2&#x26;width=1024&#x26;height=586" alt=""><figcaption><p>Verify an API endpoint</p></figcaption></figure>

If this answer your demand, you can directly use the API endpoint call directly in your application.


# API Reference - Nodeum Data Archiving


# Users

## Open a new session

> \*\*API Key Scope\*\*: sessions / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[],"paths":{"/users/sign_in":{"post":{"summary":"Open a new session","operationId":"sign_in","description":"**API Key Scope**: sessions / create","tags":["users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sign_in"}}}},"responses":{"201":{"description":"Successful user sign in.","headers":{"Authorization":{"description":"JWT token","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/user"}}}}}}}},"components":{"schemas":{"sign_in":{"type":"object","properties":{"user":{"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"}}}}},"user":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer"},"group_id":{"type":"integer"},"username":{"type":"string"},"password":{"type":"string","description":"Creation and update only"},"email":{"type":"string"},"is_admin":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}}}}}
```

## Close the session

> \*\*API Key Scope\*\*: sessions / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/users/sign_out":{"delete":{"summary":"Close the session","operationId":"sign_out","description":"**API Key Scope**: sessions / destroy","tags":["users"],"responses":{"204":{"description":"Successful user sign out."}}}}}}
```

## Lists all configurations of current user.

> \*\*API Key Scope\*\*: configurations / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"configuration_index":{"description":"List of configurations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user_configuration_collection"}}}}},"schemas":{"user_configuration_collection":{"type":"object","properties":{"configurations":{"type":"array","items":{"$ref":"#/components/schemas/user_configuration"}},"count":{"type":"integer"}}},"user_configuration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string"},"value":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}}}},"paths":{"/users/me/configurations":{"get":{"summary":"Lists all configurations of current user.","tags":["users"],"operationId":"index_configurations","description":"**API Key Scope**: configurations / index","responses":{"200":{"$ref":"#/components/responses/configuration_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"}]}}}}
```

## Creates a new configuration value for current user.

> \*\*API Key Scope\*\*: configurations / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"configuration_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user_configuration"}}}}},"schemas":{"user_configuration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string"},"value":{"type":"string"}}}},"requestBodies":{"configuration_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/user_configuration"}}},"required":true}}},"paths":{"/users/me/configurations":{"post":{"summary":"Creates a new configuration value for current user.","operationId":"create_configuration","description":"**API Key Scope**: configurations / create","tags":["users"],"responses":{"201":{"$ref":"#/components/responses/configuration_show"}},"requestBody":{"$ref":"#/components/requestBodies/configuration_body"}}}}}
```

## Displays a specific configuration value.

> \*\*API Key Scope\*\*: configurations / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"configuration_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user_configuration"}}}}},"schemas":{"user_configuration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string"},"value":{"type":"string"}}}}},"paths":{"/users/me/configurations/{configuration_id}":{"get":{"summary":"Displays a specific configuration value.","operationId":"show_configuration","description":"**API Key Scope**: configurations / show","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/configuration_show"}}}}}}
```

## Updates a specific configuration value.

> \*\*API Key Scope\*\*: configurations / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"configuration_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user_configuration"}}}}},"schemas":{"user_configuration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string"},"value":{"type":"string"}}}},"requestBodies":{"configuration_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/user_configuration"}}},"required":true}}},"paths":{"/users/me/configurations/{configuration_id}":{"put":{"summary":"Updates a specific configuration value.","operationId":"update_configuration","description":"**API Key Scope**: configurations / update","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/configuration_show"}},"requestBody":{"$ref":"#/components/requestBodies/configuration_body"}}}}}
```

## Destroys a specific configuration value.

> \*\*API Key Scope\*\*: configurations / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/users/me/configurations/{configuration_id}":{"delete":{"summary":"Destroys a specific configuration value.","operationId":"destroy_configuration","description":"**API Key Scope**: configurations / destroy","tags":["users"],"responses":{"204":{"description":"Configuration destroyed."}}}}}}
```

## Lists all API keys of current user.

> \*\*API Key Scope\*\*: api\_keys / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"api_key_index":{"description":"List of API Keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api_key_collection"}}}}},"schemas":{"api_key_collection":{"type":"object","properties":{"api_keys":{"type":"array","items":{"$ref":"#/components/schemas/api_key"}},"count":{"type":"integer"}}},"api_key":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string","readOnly":true},"name":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}}}},"paths":{"/users/me/api_keys":{"get":{"summary":"Lists all API keys of current user.","tags":["users"],"operationId":"index_api_keys","description":"**API Key Scope**: api_keys / index","responses":{"200":{"$ref":"#/components/responses/api_key_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"}]}}}}
```

## Creates a new API Key for current user.

> \*\*API Key Scope\*\*: api\_keys / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"api_key_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api_key_full"}}}}},"schemas":{"api_key_full":{"allOf":[{"$ref":"#/components/schemas/api_key"},{"type":"object","properties":{"api_key_scopes":{"type":"array","items":{"$ref":"#/components/schemas/api_key_scope"}}}}]},"api_key":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string","readOnly":true},"name":{"type":"string"}}},"api_key_scope":{"type":"object","properties":{"controller":{"type":"string"},"action":{"type":"string"}}}},"requestBodies":{"api_key_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api_key_full"}}},"required":true}}},"paths":{"/users/me/api_keys":{"post":{"summary":"Creates a new API Key for current user.","operationId":"create_api_key","description":"**API Key Scope**: api_keys / create","tags":["users"],"responses":{"201":{"$ref":"#/components/responses/api_key_show"}},"requestBody":{"$ref":"#/components/requestBodies/api_key_body"}}}}}
```

## Displays a specific API Key with its scopes.

> \*\*API Key Scope\*\*: api\_keys / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"api_key_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api_key_full"}}}}},"schemas":{"api_key_full":{"allOf":[{"$ref":"#/components/schemas/api_key"},{"type":"object","properties":{"api_key_scopes":{"type":"array","items":{"$ref":"#/components/schemas/api_key_scope"}}}}]},"api_key":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string","readOnly":true},"name":{"type":"string"}}},"api_key_scope":{"type":"object","properties":{"controller":{"type":"string"},"action":{"type":"string"}}}}},"paths":{"/users/me/api_keys/{api_key_id}":{"get":{"summary":"Displays a specific API Key with its scopes.","operationId":"show_api_key","description":"**API Key Scope**: api_keys / show","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/api_key_show"}}}}}}
```

## Updates a specific API Key.

> \*\*API Key Scope\*\*: api\_keys / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"api_key_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api_key_full"}}}}},"schemas":{"api_key_full":{"allOf":[{"$ref":"#/components/schemas/api_key"},{"type":"object","properties":{"api_key_scopes":{"type":"array","items":{"$ref":"#/components/schemas/api_key_scope"}}}}]},"api_key":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string","readOnly":true},"name":{"type":"string"}}},"api_key_scope":{"type":"object","properties":{"controller":{"type":"string"},"action":{"type":"string"}}}},"requestBodies":{"api_key_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api_key_full"}}},"required":true}}},"paths":{"/users/me/api_keys/{api_key_id}":{"put":{"summary":"Updates a specific API Key.","operationId":"update_api_key","description":"**API Key Scope**: api_keys / update","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/api_key_show"}},"requestBody":{"$ref":"#/components/requestBodies/api_key_body"}}}}}
```

## Destroys a specific API Key.

> \*\*API Key Scope\*\*: api\_keys / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/users/me/api_keys/{api_key_id}":{"delete":{"summary":"Destroys a specific API Key.","operationId":"destroy_api_key","description":"**API Key Scope**: api_keys / destroy","tags":["users"],"responses":{"204":{"description":"API Key destroyed."}}}}}}
```

## Displays current user.

> \*\*API Key Scope\*\*: users / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"users_show":{"description":"A specific user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user"}}}},"unauthorized":{"description":"User is unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/generic_error"}}}}},"schemas":{"user":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer"},"group_id":{"type":"integer"},"username":{"type":"string"},"password":{"type":"string","description":"Creation and update only"},"email":{"type":"string"},"is_admin":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"generic_error":{"type":"object","properties":{"error":{"type":"string"}}}}},"paths":{"/users/me":{"get":{"summary":"Displays current user.","operationId":"show_current_user","description":"**API Key Scope**: users / show","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/users_show"},"401":{"$ref":"#/components/responses/unauthorized"}}}}}}
```

## Lists all users.

> \*\*API Key Scope\*\*: users / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"users_index":{"description":"List of users.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user_collection"}}}}},"schemas":{"user_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"users":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/user"}}}},"user":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer"},"group_id":{"type":"integer"},"username":{"type":"string"},"password":{"type":"string","description":"Creation and update only"},"email":{"type":"string"},"is_admin":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}}}},"paths":{"/users":{"get":{"summary":"Lists all users.","tags":["users"],"operationId":"index_users","description":"**API Key Scope**: users / index","responses":{"200":{"$ref":"#/components/responses/users_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"}]}}}}
```

## Creates a new user.

> \*\*API Key Scope\*\*: users / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"users_show":{"description":"A specific user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"user":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer"},"group_id":{"type":"integer"},"username":{"type":"string"},"password":{"type":"string","description":"Creation and update only"},"email":{"type":"string"},"is_admin":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"user_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/user"}}},"required":true}}},"paths":{"/users":{"post":{"summary":"Creates a new user.","operationId":"create_user","description":"**API Key Scope**: users / create","tags":["users"],"responses":{"201":{"$ref":"#/components/responses/users_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/user_body"}}}}}
```

## Displays a specific user.

> \*\*API Key Scope\*\*: users / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"users_show":{"description":"A specific user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user"}}}}},"schemas":{"user":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer"},"group_id":{"type":"integer"},"username":{"type":"string"},"password":{"type":"string","description":"Creation and update only"},"email":{"type":"string"},"is_admin":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}}}},"paths":{"/users/{user_id}":{"get":{"summary":"Displays a specific user.","operationId":"show_user","description":"**API Key Scope**: users / show","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/users_show"}}}}}}
```

## Updates a specific user.

> \*\*API Key Scope\*\*: users / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"users_show":{"description":"A specific user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/user"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"user":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer"},"group_id":{"type":"integer"},"username":{"type":"string"},"password":{"type":"string","description":"Creation and update only"},"email":{"type":"string"},"is_admin":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"user_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/user"}}},"required":true}}},"paths":{"/users/{user_id}":{"put":{"summary":"Updates a specific user.","operationId":"update_user","description":"**API Key Scope**: users / update","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/users_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/user_body"}}}}}
```

## Destroys a specific user.

> \*\*API Key Scope\*\*: users / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/users/{user_id}":{"delete":{"summary":"Destroys a specific user.","operationId":"destroy_user","description":"**API Key Scope**: users / destroy","tags":["users"],"responses":{"204":{"description":"Container destroyed."}}}}}}
```

## List all system users.

> \*\*API Key Scope\*\*: users / systems

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"system_users":{"description":"List of users.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/system_user_collection"}}}}},"schemas":{"system_user_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"users":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/system_user"}}}},"system_user":{"type":"object","properties":{"name":{"type":"string","readOnly":true},"uid":{"type":"integer","readOnly":true},"gid":{"type":"integer","readOnly":true},"info":{"type":"string","readOnly":true}}}}},"paths":{"/users/-/systems":{"get":{"summary":"List all system users.","operationId":"index_system_users","description":"**API Key Scope**: users / systems","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/system_users"}}}}}}
```

## List all system groups.

> \*\*API Key Scope\*\*: groups / systems

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"system_groups":{"description":"List of user groups.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/system_group_collection"}}}}},"schemas":{"system_group_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"groups":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/system_group"}}}},"system_group":{"type":"object","properties":{"name":{"type":"string","readOnly":true},"gid":{"type":"integer","readOnly":true},"users":{"type":"array","readOnly":true,"items":{"type":"string"}}}}}},"paths":{"/groups/-/systems":{"get":{"summary":"List all system groups.","operationId":"index_system_groups","description":"**API Key Scope**: groups / systems","tags":["users"],"responses":{"200":{"$ref":"#/components/responses/system_groups"}}}}}}
```


# Files

## Lists files on root.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/files":{"get":{"summary":"Lists files on root.","operationId":"index_files","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## Displays a specific file.

> \*\*API Key Scope\*\*: files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_with_path"}}}}},"schemas":{"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}}},"paths":{"/files/{file_id}":{"get":{"summary":"Displays a specific file.","operationId":"show_file","description":"**API Key Scope**: files / show","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_show"}}}}}}
```

## Lists files under a specific folder.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/files/{file_parent_id}/children":{"get":{"summary":"Lists files under a specific folder.","operationId":"files_children","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By container) Lists files on root.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/containers/{container_id}/files":{"get":{"summary":"(By container) Lists files on root.","operationId":"index_files_by_container","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By container) Displays a specific file.

> \*\*API Key Scope\*\*: files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_with_path"}}}}},"schemas":{"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}}},"paths":{"/containers/{container_id}/files/{file_id}":{"get":{"summary":"(By container) Displays a specific file.","operationId":"show_file_by_container","description":"**API Key Scope**: files / show","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_show"}}}}}}
```

## (By container) Lists files under a specific folder.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/containers/{container_id}/files/{file_parent_id}/children":{"get":{"summary":"(By container) Lists files under a specific folder.","operationId":"files_children_by_container","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By pool) Lists files on root.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/files":{"get":{"summary":"(By pool) Lists files on root.","operationId":"index_files_by_pool","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By pool) Displays a specific file.

> \*\*API Key Scope\*\*: files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_with_path"}}}}},"schemas":{"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}}},"paths":{"/pools/{pool_id}/files/{file_id}":{"get":{"summary":"(By pool) Displays a specific file.","operationId":"show_file_by_pool","description":"**API Key Scope**: files / show","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_show"}}}}}}
```

## (By pool) Displays tapes containing specific file, related to the specific pool.

> \*\*API Key Scope\*\*: files / tapes

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tapes_index":{"description":"List of tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_collection"}}}}},"schemas":{"tape_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tapes":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape"}}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}}}},"paths":{"/pools/{pool_id}/files/{file_id}/tapes":{"get":{"summary":"(By pool) Displays tapes containing specific file, related to the specific pool.","operationId":"index_tapes_by_file_by_pool","description":"**API Key Scope**: files / tapes","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/tapes_index"}}}}}}
```

## (By pool) Displays cloud buckets containing specific file, related to the specific pool.

> \*\*API Key Scope\*\*: files / cloud\_buckets

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_index":{"description":"List of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_collection"}}}}},"schemas":{"cloud_bucket_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}}},"paths":{"/pools/{pool_id}/files/{file_id}/cloud_buckets":{"get":{"summary":"(By pool) Displays cloud buckets containing specific file, related to the specific pool.","operationId":"index_cloud_buckets_by_file_by_pool","description":"**API Key Scope**: files / cloud_buckets","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_index"}}}}}}
```

## (By pool) Displays NAS Shares containing specific file, related to the specific pool.

> \*\*API Key Scope\*\*: files / nas\_shares

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_index":{"description":"List of NAS shares.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share_collection"}}}}},"schemas":{"nas_share_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"nas_shares":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nas_share"}}}},"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}}},"paths":{"/pools/{pool_id}/files/{file_id}/nas_shares":{"get":{"summary":"(By pool) Displays NAS Shares containing specific file, related to the specific pool.","operationId":"index_nas_shares_by_file_by_pool","description":"**API Key Scope**: files / nas_shares","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_index"}}}}}}
```

## (By pool) Calculate total size of files contains in a folder.

> \*\*API Key Scope\*\*: files / file\_size

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"file_size":{"description":"Sum of the file sizes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/file_size"}}}}},"schemas":{"file_size":{"type":"object","properties":{"file_size":{"type":"integer","readOnly":true}}}}},"paths":{"/pools/{pool_id}/files/{file_id}/file_size":{"get":{"summary":"(By pool) Calculate total size of files contains in a folder.","operationId":"file_size_by_folder_by_pool","description":"**API Key Scope**: files / file_size","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/file_size"}}}}}}
```

## (By pool) Lists files under a specific folder.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/files/{file_parent_id}/children":{"get":{"summary":"(By pool) Lists files under a specific folder.","operationId":"files_children_by_pool","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By pool) Lists files on root of tape of pools, specific for Data Exchange.

> \*\*API Key Scope\*\*: import\_files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"import_files_index":{"description":"List of imported files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/import_file_collection"}}}}},"schemas":{"import_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"import_files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/import_file"}}}},"import_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/import_files":{"get":{"summary":"(By pool) Lists files on root of tape of pools, specific for Data Exchange.","operationId":"index_import_files_by_pool","description":"**API Key Scope**: import_files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/import_files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"}]}}}}
```

## (By pool) Displays a specific file on tape of pools, specific for Data Exchange.

> \*\*API Key Scope\*\*: import\_files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"import_files_show":{"description":"A specific imported file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/import_file_with_path"}}}}},"schemas":{"import_file_with_path":{"allOf":[{"$ref":"#/components/schemas/import_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"import_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"}}}}},"paths":{"/pools/{pool_id}/import_files/{file_id}":{"get":{"summary":"(By pool) Displays a specific file on tape of pools, specific for Data Exchange.","operationId":"show_import_file_by_pool","description":"**API Key Scope**: import_files / show","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/import_files_show"}}}}}}
```

## (By pool) Lists files under a specific folder on tape of pools, specific for Data Exchange.

> \*\*API Key Scope\*\*: import\_files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"import_files_index":{"description":"List of imported files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/import_file_collection"}}}}},"schemas":{"import_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"import_files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/import_file"}}}},"import_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/import_files/{file_parent_id}/children":{"get":{"summary":"(By pool) Lists files under a specific folder on tape of pools, specific for Data Exchange.","operationId":"import_files_children_by_pool","description":"**API Key Scope**: import_files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/import_files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"}]}}}}
```

## (By pool) Lists files on root of tape of pools, specific for Active and Offline.

> \*\*API Key Scope\*\*: on\_tapes\_files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"on_tapes_files_index":{"description":"List of files on tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/on_tapes_file_collection"}}}}},"schemas":{"on_tapes_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"on_tapes_files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/on_tapes_file"}}}},"on_tapes_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"size":{"type":"integer","readOnly":true,"format":"int64"},"barcodes":{"type":"array","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/on_tapes_files":{"get":{"summary":"(By pool) Lists files on root of tape of pools, specific for Active and Offline.","operationId":"index_on_tapes_files_by_pool","description":"**API Key Scope**: on_tapes_files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/on_tapes_files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_size"}]}}}}
```

## (By pool) Displays a specific file on tape of pools, specific for Active and Offline.

> \*\*API Key Scope\*\*: on\_tapes\_files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"on_tapes_files_show":{"description":"A specific file on tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/on_tapes_file"}}}}},"schemas":{"on_tapes_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"size":{"type":"integer","readOnly":true,"format":"int64"},"barcodes":{"type":"array","readOnly":true,"items":{"type":"string"}}}}}},"paths":{"/pools/{pool_id}/on_tapes_files/{file_id}":{"get":{"summary":"(By pool) Displays a specific file on tape of pools, specific for Active and Offline.","operationId":"show_on_tape_file_by_pool","description":"**API Key Scope**: on_tapes_files / show","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/on_tapes_files_show"}}}}}}
```

## (By pool) Lists files under a specific folder on tape of pools, specific for Active and Offline.

> \*\*API Key Scope\*\*: on\_tapes\_files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"on_tapes_files_index":{"description":"List of files on tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/on_tapes_file_collection"}}}}},"schemas":{"on_tapes_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"on_tapes_files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/on_tapes_file"}}}},"on_tapes_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"size":{"type":"integer","readOnly":true,"format":"int64"},"barcodes":{"type":"array","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/on_tapes_files/{file_parent_id}/children":{"get":{"summary":"(By pool) Lists files under a specific folder on tape of pools, specific for Active and Offline.","operationId":"on_tapes_files_children_by_pool","description":"**API Key Scope**: on_tapes_files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/on_tapes_files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_size"}]}}}}
```

## (By task) Lists files on root.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/files":{"get":{"summary":"(By task) Lists files on root.","operationId":"index_files_by_task","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By task) Displays a specific file.

> \*\*API Key Scope\*\*: files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_with_path"}}}}},"schemas":{"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}}},"paths":{"/tasks/{task_id}/files/{file_id}":{"get":{"summary":"(By task) Displays a specific file.","operationId":"show_file_by_task","description":"**API Key Scope**: files / show","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_show"}}}}}}
```

## (By task) Displays tapes containing specific file, related to the specific task.

> \*\*API Key Scope\*\*: files / tapes

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tapes_index":{"description":"List of tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_collection"}}}}},"schemas":{"tape_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tapes":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape"}}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}}}},"paths":{"/tasks/{task_id}/files/{file_id}/tapes":{"get":{"summary":"(By task) Displays tapes containing specific file, related to the specific task.","operationId":"index_tapes_by_file_by_task","description":"**API Key Scope**: files / tapes","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/tapes_index"}}}}}}
```

## (By task) Displays cloud buckets containing specific file, related to the specific task.

> \*\*API Key Scope\*\*: files / cloud\_buckets

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_index":{"description":"List of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_collection"}}}}},"schemas":{"cloud_bucket_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}}},"paths":{"/tasks/{task_id}/files/{file_id}/cloud_buckets":{"get":{"summary":"(By task) Displays cloud buckets containing specific file, related to the specific task.","operationId":"index_cloud_buckets_by_file_by_task","description":"**API Key Scope**: files / cloud_buckets","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_index"}}}}}}
```

## (By task) Displays NAS Shares containing specific file, related to the specific task.

> \*\*API Key Scope\*\*: files / nas\_shares

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_index":{"description":"List of NAS shares.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share_collection"}}}}},"schemas":{"nas_share_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"nas_shares":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nas_share"}}}},"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}}},"paths":{"/tasks/{task_id}/files/{file_id}/nas_shares":{"get":{"summary":"(By task) Displays NAS Shares containing specific file, related to the specific task.","operationId":"index_nas_shares_by_file_by_task","description":"**API Key Scope**: files / nas_shares","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_index"}}}}}}
```

## (By task) Calculate total size of files contains in a folder.

> \*\*API Key Scope\*\*: files / file\_size

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"file_size":{"description":"Sum of the file sizes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/file_size"}}}}},"schemas":{"file_size":{"type":"object","properties":{"file_size":{"type":"integer","readOnly":true}}}}},"paths":{"/tasks/{task_id}/files/{file_id}/file_size":{"get":{"summary":"(By task) Calculate total size of files contains in a folder.","operationId":"file_size_by_folder_by_task","description":"**API Key Scope**: files / file_size","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/file_size"}}}}}}
```

## (By task) Lists files under a specific folder.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/files/{file_parent_id}/children":{"get":{"summary":"(By task) Lists files under a specific folder.","operationId":"files_children_by_task","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By task execution) Lists files on root.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/task_executions/{task_execution_id}/files":{"get":{"summary":"(By task execution) Lists files on root.","operationId":"index_files_by_task_execution","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```

## (By task execution) Displays a specific file.

> \*\*API Key Scope\*\*: files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_show":{"description":"A specific file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_with_path"}}}}},"schemas":{"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}}},"paths":{"/task_executions/{task_execution_id}/files/{file_id}":{"get":{"summary":"(By task execution) Displays a specific file.","operationId":"show_file_by_task_execution","description":"**API Key Scope**: files / show","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_show"}}}}}}
```

## (By task execution) Displays tapes containing specific file, related to the specific task.

> \*\*API Key Scope\*\*: files / tapes

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tapes_index":{"description":"List of tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_collection"}}}}},"schemas":{"tape_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tapes":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape"}}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}}}},"paths":{"/task_executions/{task_execution_id}/files/{file_id}/tapes":{"get":{"summary":"(By task execution) Displays tapes containing specific file, related to the specific task.","operationId":"index_tapes_by_file_by_task_execution","description":"**API Key Scope**: files / tapes","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/tapes_index"}}}}}}
```

## (By task execution) Displays cloud buckets containing specific file, related to the specific task.

> \*\*API Key Scope\*\*: files / cloud\_buckets

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_index":{"description":"List of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_collection"}}}}},"schemas":{"cloud_bucket_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}}},"paths":{"/task_executions/{task_execution_id}/files/{file_id}/cloud_buckets":{"get":{"summary":"(By task execution) Displays cloud buckets containing specific file, related to the specific task.","operationId":"index_cloud_buckets_by_file_by_task_execution","description":"**API Key Scope**: files / cloud_buckets","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_index"}}}}}}
```

## (By task execution) Displays NAS Shares containing specific file, related to the specific task.

> \*\*API Key Scope\*\*: files / nas\_shares

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_index":{"description":"List of NAS shares.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share_collection"}}}}},"schemas":{"nas_share_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"nas_shares":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nas_share"}}}},"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}}},"paths":{"/task_executions/{task_execution_id}/files/{file_id}/nas_shares":{"get":{"summary":"(By task execution) Displays NAS Shares containing specific file, related to the specific task.","operationId":"index_nas_shares_by_file_by_task_execution","description":"**API Key Scope**: files / nas_shares","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_index"}}}}}}
```

## (By task execution) Calculate total size of files contains in a folder.

> \*\*API Key Scope\*\*: files / file\_size

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"file_size":{"description":"Sum of the file sizes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/file_size"}}}}},"schemas":{"file_size":{"type":"object","properties":{"file_size":{"type":"integer","readOnly":true}}}}},"paths":{"/task_executions/{task_execution_id}/files/{file_id}/file_size":{"get":{"summary":"(By task execution) Calculate total size of files contains in a folder.","operationId":"file_size_by_folder_by_task_execution","description":"**API Key Scope**: files / file_size","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/file_size"}}}}}}
```

## (By task execution) Lists files under a specific folder.

> \*\*API Key Scope\*\*: files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"files_index":{"description":"List of files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nodeum_file_collection"}}}}},"schemas":{"nodeum_file_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"files":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nodeum_file"}}}},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_permission":{"name":"permission","in":"query","description":"Filter on permission","schema":{"type":"string"}},"filter_size":{"name":"size","in":"query","description":"Filter on size","schema":{"type":"string"}},"filter_change_date":{"name":"change_date","in":"query","description":"Filter on change date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_access_date":{"name":"access_date","in":"query","description":"Filter on access date","schema":{"type":"string"}},"filter_gid":{"name":"gid","in":"query","description":"Filter on gid","schema":{"type":"string"}},"filter_uid":{"name":"uid","in":"query","description":"Filter on uid","schema":{"type":"string"}},"filter_offline":{"name":"offline","in":"query","description":"Filter on file offline status","schema":{"type":"string"}},"filter_in_cache":{"name":"in_cache","in":"query","description":"Filter on file in cache status","schema":{"type":"string"}}}},"paths":{"/task_executions/{task_execution_id}/files/{file_parent_id}/children":{"get":{"summary":"(By task execution) Lists files under a specific folder.","operationId":"files_children_by_task_execution","description":"**API Key Scope**: files / index","tags":["files"],"responses":{"200":{"$ref":"#/components/responses/files_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_permission"},{"$ref":"#/components/parameters/filter_size"},{"$ref":"#/components/parameters/filter_change_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_access_date"},{"$ref":"#/components/parameters/filter_gid"},{"$ref":"#/components/parameters/filter_uid"},{"$ref":"#/components/parameters/filter_offline"},{"$ref":"#/components/parameters/filter_in_cache"}]}}}}
```


# Mounts

## List all mounted storages.

> \*\*API Key Scope\*\*: mounts / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mounts_index":{"description":"List of mounted storages.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_collection"}}}}},"schemas":{"mount_collection":{"type":"object","properties":{"mounts":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/mount_info"}}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}}}},"paths":{"/mounts":{"get":{"summary":"List all mounted storages.","operationId":"index_mounts","tags":["mounts"],"description":"**API Key Scope**: mounts / index","responses":{"200":{"$ref":"#/components/responses/mounts_index"}}}}}}
```


# Containers

## Lists all containers.

> \*\*API Key Scope\*\*: containers / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"containers_index":{"description":"List of containers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container_collection"}}}}},"schemas":{"container_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"containers":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/container"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_comment":{"name":"comment","in":"query","description":"Filter on comment","schema":{"type":"string"}},"filter_quota_total_size":{"name":"quota_total_size","in":"query","description":"Filter on quota total size","schema":{"type":"string"}},"filter_quota_on_cache":{"name":"quota_on_cache","in":"query","description":"Filter on quota on cache","schema":{"type":"string"}},"filter_stat_total_files":{"name":"stat_total_files","in":"query","description":"Filter on stat total files","schema":{"type":"string"}},"filter_stat_total_size":{"name":"stat_total_size","in":"query","description":"Filter on stat total size","schema":{"type":"string"}},"filter_stat_size_on_cache":{"name":"stat_size_on_cache","in":"query","description":"Filter on stat size on cache","schema":{"type":"string"}},"filter_guest_right":{"name":"guest_right","in":"query","description":"Filter on guest right","schema":{"type":"string"}},"filter_last_update":{"name":"last_update","in":"query","description":"Filter on last update","schema":{"type":"string"}}}},"paths":{"/containers":{"get":{"summary":"Lists all containers.","tags":["containers"],"operationId":"index_containers","description":"**API Key Scope**: containers / index","responses":{"200":{"$ref":"#/components/responses/containers_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_comment"},{"$ref":"#/components/parameters/filter_quota_total_size"},{"$ref":"#/components/parameters/filter_quota_on_cache"},{"$ref":"#/components/parameters/filter_stat_total_files"},{"$ref":"#/components/parameters/filter_stat_total_size"},{"$ref":"#/components/parameters/filter_stat_size_on_cache"},{"$ref":"#/components/parameters/filter_guest_right"},{"$ref":"#/components/parameters/filter_last_update"}]}}}}
```

## Creates a new container.

> \*\*API Key Scope\*\*: containers / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"containers_show":{"description":"A specific container.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"container_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/container"}}},"required":true}}},"paths":{"/containers":{"post":{"summary":"Creates a new container.","operationId":"create_container","description":"**API Key Scope**: containers / create","tags":["containers"],"responses":{"201":{"$ref":"#/components/responses/containers_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/container_body"}}}}}
```

## Check result of the containers reconfiguration.

> \*\*API Key Scope\*\*: containers / configure

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/containers/-/configure":{"get":{"summary":"Check result of the containers reconfiguration.","operationId":"configure_containers_result","tags":["containers"],"description":"**API Key Scope**: containers / configure","responses":{"200":{"$ref":"#/components/responses/active_job_status"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Reconfigure all containers for SMB connections.

> \*\*API Key Scope\*\*: containers / configure

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}}},"paths":{"/containers/-/configure":{"put":{"summary":"Reconfigure all containers for SMB connections.","operationId":"configure_containers","description":"**API Key Scope**: containers / configure","tags":["containers"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}}}}}}
```

## Displays a specific container.

> \*\*API Key Scope\*\*: containers / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"containers_show":{"description":"A specific container.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container"}}}}},"schemas":{"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}}}},"paths":{"/containers/{container_id}":{"get":{"summary":"Displays a specific container.","operationId":"show_container","description":"**API Key Scope**: containers / show","tags":["containers"],"responses":{"200":{"$ref":"#/components/responses/containers_show"}}}}}}
```

## Updates a specific container.

> \*\*API Key Scope\*\*: containers / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"containers_show":{"description":"A specific container.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"container_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/container"}}},"required":true}}},"paths":{"/containers/{container_id}":{"put":{"summary":"Updates a specific container.","operationId":"update_container","description":"**API Key Scope**: containers / update","tags":["containers"],"responses":{"200":{"$ref":"#/components/responses/containers_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/container_body"}}}}}
```

## Destroys a specific container.

> \*\*API Key Scope\*\*: containers / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/containers/{container_id}":{"delete":{"summary":"Destroys a specific container.","operationId":"destroy_container","description":"**API Key Scope**: containers / destroy","tags":["containers"],"responses":{"204":{"description":"Container destroyed."}}}}}}
```

## Lists all privilege on the container.

> \*\*API Key Scope\*\*: container\_privileges / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"container_privileges_index":{"description":"List of container privileges.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container_privilege_collection"}}}}},"schemas":{"container_privilege_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"container_privileges":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/container_privilege"}}}},"container_privilege":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"privilege":{"type":"string","enum":["none","read","read_write"]},"type":{"type":"string","enum":["user","group"]}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_privilege":{"name":"privilege","in":"query","description":"Filter on privilege","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}}}},"paths":{"/containers/{container_id}/container_privileges":{"get":{"summary":"Lists all privilege on the container.","tags":["containers"],"operationId":"index_container_privileges","description":"**API Key Scope**: container_privileges / index","responses":{"200":{"$ref":"#/components/responses/container_privileges_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_privilege"},{"$ref":"#/components/parameters/filter_type"}]}}}}
```

## Creates a new privilege on the container.

> \*\*API Key Scope\*\*: container\_privileges / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"container_privileges_show":{"description":"A specific container privilege.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container_privilege"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"container_privilege":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"privilege":{"type":"string","enum":["none","read","read_write"]},"type":{"type":"string","enum":["user","group"]}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"container_privilege_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/container_privilege"}}},"required":true}}},"paths":{"/containers/{container_id}/container_privileges":{"post":{"summary":"Creates a new privilege on the container.","operationId":"create_container_privilege","description":"**API Key Scope**: container_privileges / create","tags":["containers"],"responses":{"201":{"$ref":"#/components/responses/container_privileges_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/container_privilege_body"}}}}}
```

## Displays a specific privilege.

> \*\*API Key Scope\*\*: container\_privileges / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"container_privileges_show":{"description":"A specific container privilege.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container_privilege"}}}}},"schemas":{"container_privilege":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"privilege":{"type":"string","enum":["none","read","read_write"]},"type":{"type":"string","enum":["user","group"]}}}}},"paths":{"/containers/{container_id}/container_privileges/{container_privilege_id}":{"get":{"summary":"Displays a specific privilege.","operationId":"show_container_privilege","description":"**API Key Scope**: container_privileges / show","tags":["containers"],"responses":{"200":{"$ref":"#/components/responses/container_privileges_show"}}}}}}
```

## Updates a specific privilege.

> \*\*API Key Scope\*\*: container\_privileges / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"container_privileges_show":{"description":"A specific container privilege.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/container_privilege"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"container_privilege":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"privilege":{"type":"string","enum":["none","read","read_write"]},"type":{"type":"string","enum":["user","group"]}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"container_privilege_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/container_privilege"}}},"required":true}}},"paths":{"/containers/{container_id}/container_privileges/{container_privilege_id}":{"put":{"summary":"Updates a specific privilege.","operationId":"update_container_privilege","description":"**API Key Scope**: container_privileges / update","tags":["containers"],"responses":{"200":{"$ref":"#/components/responses/container_privileges_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/container_privilege_body"}}}}}
```

## Destroys a specific privilege.

> \*\*API Key Scope\*\*: container\_privileges / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/containers/{container_id}/container_privileges/{container_privilege_id}":{"delete":{"summary":"Destroys a specific privilege.","operationId":"destroy_container_privilege","description":"**API Key Scope**: container_privileges / destroy","tags":["containers"],"responses":{"204":{"description":"Container privilege destroyed."}}}}}}
```


# Tape Libraries

## Lists all tape libraries.

> \*\*API Key Scope\*\*: tape\_libraries / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_libraries_index":{"description":"List of tape libraries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_library_collection"}}}}},"schemas":{"tape_library_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tape_libraries":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape_library"}}}},"tape_library":{"allOf":[{"$ref":"#/components/schemas/tape_library_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"status":{"type":"string","readOnly":true,"enum":["offline","online"]},"ready":{"type":"boolean","readOnly":true},"price":{"type":"string"}}}]},"tape_library_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"protocol":{"type":"string","enum":["scsi","acsls"]},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string"},"stdevice":{"type":"string"},"acs":{"type":"integer"},"storage_slots":{"type":"integer"},"storage_slots_address":{"type":"integer"},"io_slots":{"type":"integer"},"io_slots_address":{"type":"integer"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_serial":{"name":"serial","in":"query","description":"Filter on serial","schema":{"type":"string"}},"filter_comment":{"name":"comment","in":"query","description":"Filter on comment","schema":{"type":"string"}},"filter_protocol":{"name":"protocol","in":"query","description":"Filter on protocol","schema":{"type":"string"}},"filter_vendor":{"name":"vendor","in":"query","description":"Filter on vendor","schema":{"type":"string"}},"filter_product":{"name":"product","in":"query","description":"Filter on product","schema":{"type":"string"}},"filter_firmware":{"name":"firmware","in":"query","description":"Filter on firmware","schema":{"type":"string"}},"filter_device":{"name":"device","in":"query","description":"Filter on device","schema":{"type":"string"}},"filter_libso":{"name":"libso","in":"query","description":"Filter on libso","schema":{"type":"string"}},"filter_acs":{"name":"acs","in":"query","description":"Filter on acs","schema":{"type":"string"}},"filter_status":{"name":"status","in":"query","description":"Filter on status","schema":{"type":"string"}},"filter_storage_slots":{"name":"storage_slots","in":"query","description":"Filter on storage slots","schema":{"type":"string"}},"filter_storage_slots_address":{"name":"storage_slots_address","in":"query","description":"Filter on storage slots address","schema":{"type":"string"}},"filter_io_slots":{"name":"io_slots","in":"query","description":"Filter on io slots","schema":{"type":"string"}},"filter_io_slots_address":{"name":"io_slots_address","in":"query","description":"Filter on io slots address","schema":{"type":"string"}},"filter_price":{"name":"price","in":"query","description":"Filter on price","schema":{"type":"string"}}}},"paths":{"/tape_libraries":{"get":{"summary":"Lists all tape libraries.","tags":["tape_libraries"],"operationId":"index_tape_libraries","description":"**API Key Scope**: tape_libraries / index","responses":{"200":{"$ref":"#/components/responses/tape_libraries_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_serial"},{"$ref":"#/components/parameters/filter_comment"},{"$ref":"#/components/parameters/filter_protocol"},{"$ref":"#/components/parameters/filter_vendor"},{"$ref":"#/components/parameters/filter_product"},{"$ref":"#/components/parameters/filter_firmware"},{"$ref":"#/components/parameters/filter_device"},{"$ref":"#/components/parameters/filter_libso"},{"$ref":"#/components/parameters/filter_acs"},{"$ref":"#/components/parameters/filter_status"},{"$ref":"#/components/parameters/filter_storage_slots"},{"$ref":"#/components/parameters/filter_storage_slots_address"},{"$ref":"#/components/parameters/filter_io_slots"},{"$ref":"#/components/parameters/filter_io_slots_address"},{"$ref":"#/components/parameters/filter_price"}]}}}}
```

## Creates a new tape library.

> \*\*API Key Scope\*\*: tape\_libraries / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_libraries_show":{"description":"A specific tape library.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_library"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_library":{"allOf":[{"$ref":"#/components/schemas/tape_library_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"status":{"type":"string","readOnly":true,"enum":["offline","online"]},"ready":{"type":"boolean","readOnly":true},"price":{"type":"string"}}}]},"tape_library_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"protocol":{"type":"string","enum":["scsi","acsls"]},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string"},"stdevice":{"type":"string"},"acs":{"type":"integer"},"storage_slots":{"type":"integer"},"storage_slots_address":{"type":"integer"},"io_slots":{"type":"integer"},"io_slots_address":{"type":"integer"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"tape_library_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_library"}}},"required":true}}},"paths":{"/tape_libraries":{"post":{"summary":"Creates a new tape library.","operationId":"create_tape_library","description":"**API Key Scope**: tape_libraries / create","tags":["tape_libraries"],"responses":{"201":{"$ref":"#/components/responses/tape_libraries_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/tape_library_body"}}}}}
```

## Lists tape libraries devices.

> \*\*API Key Scope\*\*: tape\_libraries / devices

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_libraries_devices":{"description":"List of tape libraries devices.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_library_device_collection_or_active_job_status"}}}},"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"tape_library_device_collection_or_active_job_status":{"oneOf":[{"$ref":"#/components/schemas/tape_library_device_collection"},{"$ref":"#/components/schemas/active_job_status"}]},"tape_library_device_collection":{"type":"object","properties":{"tape_libraries":{"type":"array","items":{"$ref":"#/components/schemas/tape_library_device"}}}},"tape_library_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"protocol":{"type":"string","enum":["scsi","acsls"]},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string"},"stdevice":{"type":"string"},"acs":{"type":"integer"},"storage_slots":{"type":"integer"},"storage_slots_address":{"type":"integer"},"io_slots":{"type":"integer"},"io_slots_address":{"type":"integer"}}},"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id_optional":{"name":"job_id","in":"query","description":"ID of active job","schema":{"type":"string"}}}},"paths":{"/tape_libraries/-/devices":{"get":{"summary":"Lists tape libraries devices.","operationId":"index_tape_library_devices","tags":["tape_libraries"],"description":"**API Key Scope**: tape_libraries / devices","responses":{"200":{"$ref":"#/components/responses/tape_libraries_devices"},"202":{"$ref":"#/components/responses/active_job_status"},"500":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id_optional"}]}}}}
```

## Displays a specific tape library.

> \*\*API Key Scope\*\*: tape\_libraries / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_libraries_show":{"description":"A specific tape library.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_library"}}}}},"schemas":{"tape_library":{"allOf":[{"$ref":"#/components/schemas/tape_library_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"status":{"type":"string","readOnly":true,"enum":["offline","online"]},"ready":{"type":"boolean","readOnly":true},"price":{"type":"string"}}}]},"tape_library_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"protocol":{"type":"string","enum":["scsi","acsls"]},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string"},"stdevice":{"type":"string"},"acs":{"type":"integer"},"storage_slots":{"type":"integer"},"storage_slots_address":{"type":"integer"},"io_slots":{"type":"integer"},"io_slots_address":{"type":"integer"}}}}},"paths":{"/tape_libraries/{tape_library_id}":{"get":{"summary":"Displays a specific tape library.","operationId":"show_tape_library","description":"**API Key Scope**: tape_libraries / show","tags":["tape_libraries"],"responses":{"200":{"$ref":"#/components/responses/tape_libraries_show"}}}}}}
```

## Updates a specific tape library.

> \*\*API Key Scope\*\*: tape\_libraries / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_libraries_show":{"description":"A specific tape library.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_library"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_library":{"allOf":[{"$ref":"#/components/schemas/tape_library_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"status":{"type":"string","readOnly":true,"enum":["offline","online"]},"ready":{"type":"boolean","readOnly":true},"price":{"type":"string"}}}]},"tape_library_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"protocol":{"type":"string","enum":["scsi","acsls"]},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string"},"stdevice":{"type":"string"},"acs":{"type":"integer"},"storage_slots":{"type":"integer"},"storage_slots_address":{"type":"integer"},"io_slots":{"type":"integer"},"io_slots_address":{"type":"integer"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"tape_library_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_library"}}},"required":true}}},"paths":{"/tape_libraries/{tape_library_id}":{"put":{"summary":"Updates a specific tape library.","operationId":"update_tape_library","description":"**API Key Scope**: tape_libraries / update","tags":["tape_libraries"],"responses":{"200":{"$ref":"#/components/responses/tape_libraries_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/tape_library_body"}}}}}
```

## Destroys a specific tape library.

> \*\*API Key Scope\*\*: tape\_libraries / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tape_libraries/{tape_library_id}":{"delete":{"summary":"Destroys a specific tape library.","operationId":"destroy_tape_library","description":"**API Key Scope**: tape_libraries / destroy","tags":["tape_libraries"],"responses":{"204":{"description":"Tape library destroyed."}}}}}}
```


# Tape Drives

## (By tape library) Lists all tape drives.

> \*\*API Key Scope\*\*: tape\_drives / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drives_index":{"description":"List of tape drives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive_collection"}}}}},"schemas":{"tape_drive_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tape_drives":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape_drive"}}}},"tape_drive":{"allOf":[{"$ref":"#/components/schemas/tape_drive_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"description":"This ID is not unique. Only unique among a tape library.","format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"acs":{"type":"integer"},"lsm":{"type":"integer"},"panel":{"type":"integer"},"transport":{"type":"integer"},"status":{"type":"string","readOnly":true,"enum":["maintenance","online","locked","offline"]},"full":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"use_to":{"type":"string","readOnly":true},"use_by":{"type":"string","readOnly":true},"barcode":{"type":"string","readOnly":true},"task_id":{"type":"integer","readOnly":true,"format":"int64"},"use_file_processed_size":{"type":"integer","readOnly":true,"format":"int64"},"use_file_size_to_process":{"type":"integer","readOnly":true,"format":"int64"},"use_file_name_processed":{"type":"string","readOnly":true,"format":"int64"},"bandwidth":{"type":"integer","readOnly":true,"format":"int64"}}}]},"tape_drive_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"scsi_address":{"type":"integer"},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string","description":"When saved, device may be prefixed by *n* (eg. `/dev/nst5`)"},"sgdevice":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_serial":{"name":"serial","in":"query","description":"Filter on serial","schema":{"type":"string"}},"filter_comment":{"name":"comment","in":"query","description":"Filter on comment","schema":{"type":"string"}},"filter_scsi_address":{"name":"scsi_address","in":"query","description":"Filter on scsi address","schema":{"type":"string"}},"filter_vendor":{"name":"vendor","in":"query","description":"Filter on vendor","schema":{"type":"string"}},"filter_product":{"name":"product","in":"query","description":"Filter on product","schema":{"type":"string"}},"filter_firmware":{"name":"firmware","in":"query","description":"Filter on firmware","schema":{"type":"string"}},"filter_device":{"name":"device","in":"query","description":"Filter on device","schema":{"type":"string"}},"filter_sgdevice":{"name":"sgdevice","in":"query","description":"Filter on sgdevice","schema":{"type":"string"}},"filter_libso":{"name":"libso","in":"query","description":"Filter on libso","schema":{"type":"string"}},"filter_acs":{"name":"acs","in":"query","description":"Filter on acs","schema":{"type":"string"}},"filter_lsm":{"name":"lsm","in":"query","description":"Filter on lsm","schema":{"type":"string"}},"filter_panel":{"name":"panel","in":"query","description":"Filter on panel","schema":{"type":"string"}},"filter_transport":{"name":"transport","in":"query","description":"Filter on transport","schema":{"type":"string"}},"filter_status":{"name":"status","in":"query","description":"Filter on status","schema":{"type":"string"}},"filter_full":{"name":"full","in":"query","description":"Filter on full","schema":{"type":"string"}},"filter_mount_count":{"name":"mount_count","in":"query","description":"Filter on mount count","schema":{"type":"string"}},"filter_use_to":{"name":"use_to","in":"query","description":"Filter on use to","schema":{"type":"string"}},"filter_use_by":{"name":"use_by","in":"query","description":"Filter on use by","schema":{"type":"string"}},"filter_barcode":{"name":"barcode","in":"query","description":"Filter on barcode","schema":{"type":"string"}},"filter_task_id":{"name":"task_id","in":"query","description":"Filter on task id","schema":{"type":"string"}},"filter_use_file_processed_size":{"name":"use_file_processed_size","in":"query","description":"Filter on use file processed size","schema":{"type":"string"}},"filter_use_file_size_to_process":{"name":"use_file_size_to_process","in":"query","description":"Filter on use file size to process","schema":{"type":"string"}},"filter_use_file_name_processed":{"name":"use_file_name_processed","in":"query","description":"Filter on use file name processed","schema":{"type":"string"}},"filter_bandwidth":{"name":"bandwidth","in":"query","description":"Filter on bandwidth","schema":{"type":"string"}}}},"paths":{"/tape_libraries/{tape_library_id}/tape_drives":{"get":{"summary":"(By tape library) Lists all tape drives.","operationId":"index_tape_drives_by_tape_library","description":"**API Key Scope**: tape_drives / index","tags":["tape_drives"],"responses":{"200":{"$ref":"#/components/responses/tape_drives_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_serial"},{"$ref":"#/components/parameters/filter_comment"},{"$ref":"#/components/parameters/filter_scsi_address"},{"$ref":"#/components/parameters/filter_vendor"},{"$ref":"#/components/parameters/filter_product"},{"$ref":"#/components/parameters/filter_firmware"},{"$ref":"#/components/parameters/filter_device"},{"$ref":"#/components/parameters/filter_sgdevice"},{"$ref":"#/components/parameters/filter_libso"},{"$ref":"#/components/parameters/filter_acs"},{"$ref":"#/components/parameters/filter_lsm"},{"$ref":"#/components/parameters/filter_panel"},{"$ref":"#/components/parameters/filter_transport"},{"$ref":"#/components/parameters/filter_status"},{"$ref":"#/components/parameters/filter_full"},{"$ref":"#/components/parameters/filter_mount_count"},{"$ref":"#/components/parameters/filter_use_to"},{"$ref":"#/components/parameters/filter_use_by"},{"$ref":"#/components/parameters/filter_barcode"},{"$ref":"#/components/parameters/filter_task_id"},{"$ref":"#/components/parameters/filter_use_file_processed_size"},{"$ref":"#/components/parameters/filter_use_file_size_to_process"},{"$ref":"#/components/parameters/filter_use_file_name_processed"},{"$ref":"#/components/parameters/filter_bandwidth"}]}}}}
```

## (By tape library) Creates a new tape drive.

> \*\*API Key Scope\*\*: tape\_drives / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drives_show":{"description":"A specific tape drive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_drive":{"allOf":[{"$ref":"#/components/schemas/tape_drive_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"description":"This ID is not unique. Only unique among a tape library.","format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"acs":{"type":"integer"},"lsm":{"type":"integer"},"panel":{"type":"integer"},"transport":{"type":"integer"},"status":{"type":"string","readOnly":true,"enum":["maintenance","online","locked","offline"]},"full":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"use_to":{"type":"string","readOnly":true},"use_by":{"type":"string","readOnly":true},"barcode":{"type":"string","readOnly":true},"task_id":{"type":"integer","readOnly":true,"format":"int64"},"use_file_processed_size":{"type":"integer","readOnly":true,"format":"int64"},"use_file_size_to_process":{"type":"integer","readOnly":true,"format":"int64"},"use_file_name_processed":{"type":"string","readOnly":true,"format":"int64"},"bandwidth":{"type":"integer","readOnly":true,"format":"int64"}}}]},"tape_drive_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"scsi_address":{"type":"integer"},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string","description":"When saved, device may be prefixed by *n* (eg. `/dev/nst5`)"},"sgdevice":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"tape_drive_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive"}}},"required":true}}},"paths":{"/tape_libraries/{tape_library_id}/tape_drives":{"post":{"summary":"(By tape library) Creates a new tape drive.","operationId":"create_tape_drive_by_tape_library","description":"**API Key Scope**: tape_drives / create","tags":["tape_drives"],"responses":{"201":{"$ref":"#/components/responses/tape_drives_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/tape_drive_body"}}}}}
```

## Lists tape drives devices.

> \*\*API Key Scope\*\*: tape\_drives / devices

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drives_devices":{"description":"List of tape drives devices.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive_device_collection_or_active_job_status"}}}},"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"tape_drive_device_collection_or_active_job_status":{"oneOf":[{"$ref":"#/components/schemas/tape_drive_device_collection"},{"$ref":"#/components/schemas/active_job_status"}]},"tape_drive_device_collection":{"type":"object","properties":{"tape_drives":{"type":"array","items":{"$ref":"#/components/schemas/tape_drive_device"}}}},"tape_drive_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"scsi_address":{"type":"integer"},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string","description":"When saved, device may be prefixed by *n* (eg. `/dev/nst5`)"},"sgdevice":{"type":"string"}}},"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id_optional":{"name":"job_id","in":"query","description":"ID of active job","schema":{"type":"string"}}}},"paths":{"/tape_libraries/{tape_library_id}/tape_drives/-/devices":{"get":{"summary":"Lists tape drives devices.","operationId":"index_tape_drive_devices","tags":["tape_drives"],"description":"**API Key Scope**: tape_drives / devices","responses":{"200":{"$ref":"#/components/responses/tape_drives_devices"},"202":{"$ref":"#/components/responses/active_job_status"},"500":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id_optional"}]}}}}
```

## Lists all tape drives.

> \*\*API Key Scope\*\*: tape\_drives / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drives_index":{"description":"List of tape drives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive_collection"}}}}},"schemas":{"tape_drive_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tape_drives":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape_drive"}}}},"tape_drive":{"allOf":[{"$ref":"#/components/schemas/tape_drive_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"description":"This ID is not unique. Only unique among a tape library.","format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"acs":{"type":"integer"},"lsm":{"type":"integer"},"panel":{"type":"integer"},"transport":{"type":"integer"},"status":{"type":"string","readOnly":true,"enum":["maintenance","online","locked","offline"]},"full":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"use_to":{"type":"string","readOnly":true},"use_by":{"type":"string","readOnly":true},"barcode":{"type":"string","readOnly":true},"task_id":{"type":"integer","readOnly":true,"format":"int64"},"use_file_processed_size":{"type":"integer","readOnly":true,"format":"int64"},"use_file_size_to_process":{"type":"integer","readOnly":true,"format":"int64"},"use_file_name_processed":{"type":"string","readOnly":true,"format":"int64"},"bandwidth":{"type":"integer","readOnly":true,"format":"int64"}}}]},"tape_drive_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"scsi_address":{"type":"integer"},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string","description":"When saved, device may be prefixed by *n* (eg. `/dev/nst5`)"},"sgdevice":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_tape_library_id":{"name":"tape_library_id","in":"query","description":"Filter on tape library id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_serial":{"name":"serial","in":"query","description":"Filter on serial","schema":{"type":"string"}},"filter_comment":{"name":"comment","in":"query","description":"Filter on comment","schema":{"type":"string"}},"filter_scsi_address":{"name":"scsi_address","in":"query","description":"Filter on scsi address","schema":{"type":"string"}},"filter_vendor":{"name":"vendor","in":"query","description":"Filter on vendor","schema":{"type":"string"}},"filter_product":{"name":"product","in":"query","description":"Filter on product","schema":{"type":"string"}},"filter_firmware":{"name":"firmware","in":"query","description":"Filter on firmware","schema":{"type":"string"}},"filter_device":{"name":"device","in":"query","description":"Filter on device","schema":{"type":"string"}},"filter_sgdevice":{"name":"sgdevice","in":"query","description":"Filter on sgdevice","schema":{"type":"string"}},"filter_libso":{"name":"libso","in":"query","description":"Filter on libso","schema":{"type":"string"}},"filter_acs":{"name":"acs","in":"query","description":"Filter on acs","schema":{"type":"string"}},"filter_lsm":{"name":"lsm","in":"query","description":"Filter on lsm","schema":{"type":"string"}},"filter_panel":{"name":"panel","in":"query","description":"Filter on panel","schema":{"type":"string"}},"filter_transport":{"name":"transport","in":"query","description":"Filter on transport","schema":{"type":"string"}},"filter_status":{"name":"status","in":"query","description":"Filter on status","schema":{"type":"string"}},"filter_full":{"name":"full","in":"query","description":"Filter on full","schema":{"type":"string"}},"filter_mount_count":{"name":"mount_count","in":"query","description":"Filter on mount count","schema":{"type":"string"}},"filter_use_to":{"name":"use_to","in":"query","description":"Filter on use to","schema":{"type":"string"}},"filter_use_by":{"name":"use_by","in":"query","description":"Filter on use by","schema":{"type":"string"}},"filter_barcode":{"name":"barcode","in":"query","description":"Filter on barcode","schema":{"type":"string"}},"filter_task_id":{"name":"task_id","in":"query","description":"Filter on task id","schema":{"type":"string"}},"filter_use_file_processed_size":{"name":"use_file_processed_size","in":"query","description":"Filter on use file processed size","schema":{"type":"string"}},"filter_use_file_size_to_process":{"name":"use_file_size_to_process","in":"query","description":"Filter on use file size to process","schema":{"type":"string"}},"filter_use_file_name_processed":{"name":"use_file_name_processed","in":"query","description":"Filter on use file name processed","schema":{"type":"string"}},"filter_bandwidth":{"name":"bandwidth","in":"query","description":"Filter on bandwidth","schema":{"type":"string"}}}},"paths":{"/tape_drives":{"get":{"summary":"Lists all tape drives.","tags":["tape_drives"],"operationId":"index_tape_drives","description":"**API Key Scope**: tape_drives / index","responses":{"200":{"$ref":"#/components/responses/tape_drives_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_tape_library_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_serial"},{"$ref":"#/components/parameters/filter_comment"},{"$ref":"#/components/parameters/filter_scsi_address"},{"$ref":"#/components/parameters/filter_vendor"},{"$ref":"#/components/parameters/filter_product"},{"$ref":"#/components/parameters/filter_firmware"},{"$ref":"#/components/parameters/filter_device"},{"$ref":"#/components/parameters/filter_sgdevice"},{"$ref":"#/components/parameters/filter_libso"},{"$ref":"#/components/parameters/filter_acs"},{"$ref":"#/components/parameters/filter_lsm"},{"$ref":"#/components/parameters/filter_panel"},{"$ref":"#/components/parameters/filter_transport"},{"$ref":"#/components/parameters/filter_status"},{"$ref":"#/components/parameters/filter_full"},{"$ref":"#/components/parameters/filter_mount_count"},{"$ref":"#/components/parameters/filter_use_to"},{"$ref":"#/components/parameters/filter_use_by"},{"$ref":"#/components/parameters/filter_barcode"},{"$ref":"#/components/parameters/filter_task_id"},{"$ref":"#/components/parameters/filter_use_file_processed_size"},{"$ref":"#/components/parameters/filter_use_file_size_to_process"},{"$ref":"#/components/parameters/filter_use_file_name_processed"},{"$ref":"#/components/parameters/filter_bandwidth"}]}}}}
```

## Displays a specific tape drive.

> \*\*API Key Scope\*\*: tape\_drives / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drives_show":{"description":"A specific tape drive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive"}}}}},"schemas":{"tape_drive":{"allOf":[{"$ref":"#/components/schemas/tape_drive_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"description":"This ID is not unique. Only unique among a tape library.","format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"acs":{"type":"integer"},"lsm":{"type":"integer"},"panel":{"type":"integer"},"transport":{"type":"integer"},"status":{"type":"string","readOnly":true,"enum":["maintenance","online","locked","offline"]},"full":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"use_to":{"type":"string","readOnly":true},"use_by":{"type":"string","readOnly":true},"barcode":{"type":"string","readOnly":true},"task_id":{"type":"integer","readOnly":true,"format":"int64"},"use_file_processed_size":{"type":"integer","readOnly":true,"format":"int64"},"use_file_size_to_process":{"type":"integer","readOnly":true,"format":"int64"},"use_file_name_processed":{"type":"string","readOnly":true,"format":"int64"},"bandwidth":{"type":"integer","readOnly":true,"format":"int64"}}}]},"tape_drive_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"scsi_address":{"type":"integer"},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string","description":"When saved, device may be prefixed by *n* (eg. `/dev/nst5`)"},"sgdevice":{"type":"string"}}}}},"paths":{"/tape_drives/{tape_drive_serial}":{"get":{"summary":"Displays a specific tape drive.","operationId":"show_tape_drive","description":"**API Key Scope**: tape_drives / show","tags":["tape_drives"],"responses":{"200":{"$ref":"#/components/responses/tape_drives_show"}}}}}}
```

## Updates a specific tape drive.

> \*\*API Key Scope\*\*: tape\_drives / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drives_show":{"description":"A specific tape drive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_drive":{"allOf":[{"$ref":"#/components/schemas/tape_drive_device"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"description":"This ID is not unique. Only unique among a tape library.","format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"libso":{"type":"string"},"acs":{"type":"integer"},"lsm":{"type":"integer"},"panel":{"type":"integer"},"transport":{"type":"integer"},"status":{"type":"string","readOnly":true,"enum":["maintenance","online","locked","offline"]},"full":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"use_to":{"type":"string","readOnly":true},"use_by":{"type":"string","readOnly":true},"barcode":{"type":"string","readOnly":true},"task_id":{"type":"integer","readOnly":true,"format":"int64"},"use_file_processed_size":{"type":"integer","readOnly":true,"format":"int64"},"use_file_size_to_process":{"type":"integer","readOnly":true,"format":"int64"},"use_file_name_processed":{"type":"string","readOnly":true,"format":"int64"},"bandwidth":{"type":"integer","readOnly":true,"format":"int64"}}}]},"tape_drive_device":{"type":"object","properties":{"serial":{"type":"string","readOnly":true},"scsi_address":{"type":"integer"},"vendor":{"type":"string"},"product":{"type":"string"},"firmware":{"type":"string"},"device":{"type":"string","description":"When saved, device may be prefixed by *n* (eg. `/dev/nst5`)"},"sgdevice":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"tape_drive_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive"}}},"required":true}}},"paths":{"/tape_drives/{tape_drive_serial}":{"put":{"summary":"Updates a specific tape drive.","operationId":"update_tape_drive","description":"**API Key Scope**: tape_drives / update","tags":["tape_drives"],"responses":{"200":{"$ref":"#/components/responses/tape_drives_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/tape_drive_body"}}}}}
```

## Destroys a specific tape drive.

> \*\*API Key Scope\*\*: tape\_drives / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tape_drives/{tape_drive_serial}":{"delete":{"summary":"Destroys a specific tape drive.","operationId":"destroy_tape_drive","description":"**API Key Scope**: tape_drives / destroy","tags":["tape_drives"],"responses":{"204":{"description":"Tape drive destroyed."}}}}}}
```

## Display statistic for a specific tape drive.

> \*\*API Key Scope\*\*: tape\_drive\_stats / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drive_stat_show":{"description":"A specific tape drive statistic.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive_stat"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_drive_stat":{"type":"object","properties":{"log_time":{"type":"string","readOnly":true},"serial":{"type":"string","readOnly":true},"total_corrected_write_errors":{"type":"integer","readOnly":true},"total_write_retries":{"type":"integer","readOnly":true},"total_write_kbytes_processed":{"type":"integer","readOnly":true},"total_uncorrected_write_errors":{"type":"integer","readOnly":true},"total_corrected_read_errors":{"type":"integer","readOnly":true},"total_read_retries":{"type":"integer","readOnly":true},"total_read_kbytes_processed":{"type":"integer","readOnly":true},"total_uncorrected_read_errors":{"type":"integer","readOnly":true},"total_channel_write_bytes":{"type":"integer","readOnly":true},"total_device_write_bytes":{"type":"integer","readOnly":true},"total_device_read_bytes":{"type":"integer","readOnly":true},"total_channel_read_bytes":{"type":"integer","readOnly":true},"cleaning_requested":{"type":"integer","readOnly":true},"total_mbytes_processed_since_cleaning":{"type":"integer","readOnly":true},"lifetime_load_cycles":{"type":"integer","readOnly":true},"lifetime_cleaning_cycles":{"type":"integer","readOnly":true},"lifetime_power_on_time":{"type":"integer","readOnly":true},"lifetime_volume_loads":{"type":"integer","readOnly":true},"lifetime_cleaning_operations":{"type":"integer","readOnly":true},"lifetime_power_on_hours":{"type":"integer","readOnly":true},"lifetime_medium_motion":{"type":"integer","readOnly":true},"lifetime_meters_of_tape_processed":{"type":"integer","readOnly":true},"lifetime_medium_motion_when_incompatible_medium_was_loaded":{"type":"integer","readOnly":true},"lifetime_power_on_hours_when_temperature_cond_occured":{"type":"integer","readOnly":true},"lifetime_power_on_hours_when_power_consumption_cond_occured":{"type":"integer","readOnly":true},"medium_motion_hours_last_success_cleaning":{"type":"integer","readOnly":true},"medium_motion_hours_second_success_cleaning":{"type":"integer","readOnly":true},"medium_motion_hours_third_success_cleaning":{"type":"integer","readOnly":true},"lifetime_power_on_emergency_eject_occured":{"type":"integer","readOnly":true},"lifetime_power_cycles":{"type":"integer","readOnly":true},"volume_loads_last_param_reset":{"type":"integer","readOnly":true},"hard_write_errors":{"type":"integer","readOnly":true},"hard_read_errors":{"type":"integer","readOnly":true},"read_duty_cycle":{"type":"integer","readOnly":true},"write_duty_cycle":{"type":"integer","readOnly":true},"activity_duty_cycle":{"type":"integer","readOnly":true},"volume_not_present_duty_cycle":{"type":"integer","readOnly":true},"ready_duty_cycle":{"type":"integer","readOnly":true},"accumulated_transitions_to_active":{"type":"integer","readOnly":true},"accumulated_transitions_to_idle":{"type":"integer","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/tape_drives/{tape_drive_serial}/tape_drive_stat":{"get":{"summary":"Display statistic for a specific tape drive.","operationId":"show_tape_drive_stat","description":"**API Key Scope**: tape_drive_stats / show","tags":["tape_drives"],"responses":{"200":{"$ref":"#/components/responses/tape_drive_stat_show"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## List all tape drive statistics.

> \*\*API Key Scope\*\*: tape\_drive\_stats / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_drive_stats_index":{"description":"List of tape drive statistics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_drive_stat_collection"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_drive_stat_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tape_drive_stats":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape_drive_stat"}}}},"tape_drive_stat":{"type":"object","properties":{"log_time":{"type":"string","readOnly":true},"serial":{"type":"string","readOnly":true},"total_corrected_write_errors":{"type":"integer","readOnly":true},"total_write_retries":{"type":"integer","readOnly":true},"total_write_kbytes_processed":{"type":"integer","readOnly":true},"total_uncorrected_write_errors":{"type":"integer","readOnly":true},"total_corrected_read_errors":{"type":"integer","readOnly":true},"total_read_retries":{"type":"integer","readOnly":true},"total_read_kbytes_processed":{"type":"integer","readOnly":true},"total_uncorrected_read_errors":{"type":"integer","readOnly":true},"total_channel_write_bytes":{"type":"integer","readOnly":true},"total_device_write_bytes":{"type":"integer","readOnly":true},"total_device_read_bytes":{"type":"integer","readOnly":true},"total_channel_read_bytes":{"type":"integer","readOnly":true},"cleaning_requested":{"type":"integer","readOnly":true},"total_mbytes_processed_since_cleaning":{"type":"integer","readOnly":true},"lifetime_load_cycles":{"type":"integer","readOnly":true},"lifetime_cleaning_cycles":{"type":"integer","readOnly":true},"lifetime_power_on_time":{"type":"integer","readOnly":true},"lifetime_volume_loads":{"type":"integer","readOnly":true},"lifetime_cleaning_operations":{"type":"integer","readOnly":true},"lifetime_power_on_hours":{"type":"integer","readOnly":true},"lifetime_medium_motion":{"type":"integer","readOnly":true},"lifetime_meters_of_tape_processed":{"type":"integer","readOnly":true},"lifetime_medium_motion_when_incompatible_medium_was_loaded":{"type":"integer","readOnly":true},"lifetime_power_on_hours_when_temperature_cond_occured":{"type":"integer","readOnly":true},"lifetime_power_on_hours_when_power_consumption_cond_occured":{"type":"integer","readOnly":true},"medium_motion_hours_last_success_cleaning":{"type":"integer","readOnly":true},"medium_motion_hours_second_success_cleaning":{"type":"integer","readOnly":true},"medium_motion_hours_third_success_cleaning":{"type":"integer","readOnly":true},"lifetime_power_on_emergency_eject_occured":{"type":"integer","readOnly":true},"lifetime_power_cycles":{"type":"integer","readOnly":true},"volume_loads_last_param_reset":{"type":"integer","readOnly":true},"hard_write_errors":{"type":"integer","readOnly":true},"hard_read_errors":{"type":"integer","readOnly":true},"read_duty_cycle":{"type":"integer","readOnly":true},"write_duty_cycle":{"type":"integer","readOnly":true},"activity_duty_cycle":{"type":"integer","readOnly":true},"volume_not_present_duty_cycle":{"type":"integer","readOnly":true},"ready_duty_cycle":{"type":"integer","readOnly":true},"accumulated_transitions_to_active":{"type":"integer","readOnly":true},"accumulated_transitions_to_idle":{"type":"integer","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}}}},"paths":{"/tape_drive_stats":{"get":{"summary":"List all tape drive statistics.","operationId":"index_tape_drive_stats","description":"**API Key Scope**: tape_drive_stats / index","tags":["tape_drives"],"responses":{"200":{"$ref":"#/components/responses/tape_drive_stats_index"},"404":{"$ref":"#/components/responses/not_found"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"}]}}}}
```


# Tapes

## (By tape library) Lists all tapes.

> \*\*API Key Scope\*\*: tapes / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tapes_index":{"description":"List of tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_collection"}}}}},"schemas":{"tape_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tapes":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape"}}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}},"filter_barcode":{"name":"barcode","in":"query","description":"Filter on barcode","schema":{"type":"string"}},"filter_location":{"name":"location","in":"query","description":"Filter on location","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_locked":{"name":"locked","in":"query","description":"Filter on locked","schema":{"type":"string"}},"filter_scratch":{"name":"scratch","in":"query","description":"Filter on scratch","schema":{"type":"string"}},"filter_cleaning":{"name":"cleaning","in":"query","description":"Filter on cleaning","schema":{"type":"string"}},"filter_write_protect":{"name":"write_protect","in":"query","description":"Filter on write protect","schema":{"type":"string"}},"filter_mounted":{"name":"mounted","in":"query","description":"Filter on mounted","schema":{"type":"string"}},"filter_ejected":{"name":"ejected","in":"query","description":"Filter on ejected","schema":{"type":"string"}},"filter_known":{"name":"known","in":"query","description":"Filter on known","schema":{"type":"string"}},"filter_mount_count":{"name":"mount_count","in":"query","description":"Filter on mount count","schema":{"type":"string"}},"filter_date_in":{"name":"date_in","in":"query","description":"Filter on date in","schema":{"type":"string"}},"filter_date_move":{"name":"date_move","in":"query","description":"Filter on date move","schema":{"type":"string"}},"filter_free":{"name":"free","in":"query","description":"Filter on free","schema":{"type":"string"}},"filter_max":{"name":"max","in":"query","description":"Filter on max","schema":{"type":"string"}},"filter_last_size_update":{"name":"last_size_update","in":"query","description":"Filter on last size update","schema":{"type":"string"}},"filter_last_maintenance":{"name":"last_maintenance","in":"query","description":"Filter on last maintenance","schema":{"type":"string"}},"filter_last_repack":{"name":"last_repack","in":"query","description":"Filter on last repack","schema":{"type":"string"}},"filter_repack_status":{"name":"repack_status","in":"query","description":"Filter on repack status","schema":{"type":"string"}},"filter_force_import_type":{"name":"force_import_type","in":"query","description":"Filter on force import type","schema":{"type":"string"}},"filter_need_to_check":{"name":"need_to_check","in":"query","description":"Filter on need to check","schema":{"type":"string"}}}},"paths":{"/tape_libraries/{tape_library_id}/tapes":{"get":{"summary":"(By tape library) Lists all tapes.","operationId":"index_tapes_by_tape_library","description":"**API Key Scope**: tapes / index","tags":["tapes"],"responses":{"200":{"$ref":"#/components/responses/tapes_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_pool_id"},{"$ref":"#/components/parameters/filter_barcode"},{"$ref":"#/components/parameters/filter_location"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_locked"},{"$ref":"#/components/parameters/filter_scratch"},{"$ref":"#/components/parameters/filter_cleaning"},{"$ref":"#/components/parameters/filter_write_protect"},{"$ref":"#/components/parameters/filter_mounted"},{"$ref":"#/components/parameters/filter_ejected"},{"$ref":"#/components/parameters/filter_known"},{"$ref":"#/components/parameters/filter_mount_count"},{"$ref":"#/components/parameters/filter_date_in"},{"$ref":"#/components/parameters/filter_date_move"},{"$ref":"#/components/parameters/filter_free"},{"$ref":"#/components/parameters/filter_max"},{"$ref":"#/components/parameters/filter_last_size_update"},{"$ref":"#/components/parameters/filter_last_maintenance"},{"$ref":"#/components/parameters/filter_last_repack"},{"$ref":"#/components/parameters/filter_repack_status"},{"$ref":"#/components/parameters/filter_force_import_type"},{"$ref":"#/components/parameters/filter_need_to_check"}]}}}}
```

## (By pool) Lists all tapes.

> \*\*API Key Scope\*\*: tapes / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tapes_index":{"description":"List of tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_collection"}}}}},"schemas":{"tape_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tapes":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape"}}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_tape_library_id":{"name":"tape_library_id","in":"query","description":"Filter on tape library id","schema":{"type":"string"}},"filter_barcode":{"name":"barcode","in":"query","description":"Filter on barcode","schema":{"type":"string"}},"filter_location":{"name":"location","in":"query","description":"Filter on location","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_locked":{"name":"locked","in":"query","description":"Filter on locked","schema":{"type":"string"}},"filter_scratch":{"name":"scratch","in":"query","description":"Filter on scratch","schema":{"type":"string"}},"filter_cleaning":{"name":"cleaning","in":"query","description":"Filter on cleaning","schema":{"type":"string"}},"filter_write_protect":{"name":"write_protect","in":"query","description":"Filter on write protect","schema":{"type":"string"}},"filter_mounted":{"name":"mounted","in":"query","description":"Filter on mounted","schema":{"type":"string"}},"filter_ejected":{"name":"ejected","in":"query","description":"Filter on ejected","schema":{"type":"string"}},"filter_known":{"name":"known","in":"query","description":"Filter on known","schema":{"type":"string"}},"filter_mount_count":{"name":"mount_count","in":"query","description":"Filter on mount count","schema":{"type":"string"}},"filter_date_in":{"name":"date_in","in":"query","description":"Filter on date in","schema":{"type":"string"}},"filter_date_move":{"name":"date_move","in":"query","description":"Filter on date move","schema":{"type":"string"}},"filter_free":{"name":"free","in":"query","description":"Filter on free","schema":{"type":"string"}},"filter_max":{"name":"max","in":"query","description":"Filter on max","schema":{"type":"string"}},"filter_last_size_update":{"name":"last_size_update","in":"query","description":"Filter on last size update","schema":{"type":"string"}},"filter_last_maintenance":{"name":"last_maintenance","in":"query","description":"Filter on last maintenance","schema":{"type":"string"}},"filter_last_repack":{"name":"last_repack","in":"query","description":"Filter on last repack","schema":{"type":"string"}},"filter_repack_status":{"name":"repack_status","in":"query","description":"Filter on repack status","schema":{"type":"string"}},"filter_force_import_type":{"name":"force_import_type","in":"query","description":"Filter on force import type","schema":{"type":"string"}},"filter_need_to_check":{"name":"need_to_check","in":"query","description":"Filter on need to check","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/tapes":{"get":{"summary":"(By pool) Lists all tapes.","operationId":"index_tapes_by_pool","description":"**API Key Scope**: tapes / index","tags":["tapes"],"responses":{"200":{"$ref":"#/components/responses/tapes_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_tape_library_id"},{"$ref":"#/components/parameters/filter_barcode"},{"$ref":"#/components/parameters/filter_location"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_locked"},{"$ref":"#/components/parameters/filter_scratch"},{"$ref":"#/components/parameters/filter_cleaning"},{"$ref":"#/components/parameters/filter_write_protect"},{"$ref":"#/components/parameters/filter_mounted"},{"$ref":"#/components/parameters/filter_ejected"},{"$ref":"#/components/parameters/filter_known"},{"$ref":"#/components/parameters/filter_mount_count"},{"$ref":"#/components/parameters/filter_date_in"},{"$ref":"#/components/parameters/filter_date_move"},{"$ref":"#/components/parameters/filter_free"},{"$ref":"#/components/parameters/filter_max"},{"$ref":"#/components/parameters/filter_last_size_update"},{"$ref":"#/components/parameters/filter_last_maintenance"},{"$ref":"#/components/parameters/filter_last_repack"},{"$ref":"#/components/parameters/filter_repack_status"},{"$ref":"#/components/parameters/filter_force_import_type"},{"$ref":"#/components/parameters/filter_need_to_check"}]}}}}
```

## Lists all tapes.

> \*\*API Key Scope\*\*: tapes / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tapes_index":{"description":"List of tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_collection"}}}}},"schemas":{"tape_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tapes":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape"}}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"has_locations":{"name":"has_locations","in":"query","description":"If set, only includes tapes that have/don't have any location.","schema":{"type":"boolean"}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_tape_library_id":{"name":"tape_library_id","in":"query","description":"Filter on tape library id","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}},"filter_barcode":{"name":"barcode","in":"query","description":"Filter on barcode","schema":{"type":"string"}},"filter_location":{"name":"location","in":"query","description":"Filter on location","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_locked":{"name":"locked","in":"query","description":"Filter on locked","schema":{"type":"string"}},"filter_scratch":{"name":"scratch","in":"query","description":"Filter on scratch","schema":{"type":"string"}},"filter_cleaning":{"name":"cleaning","in":"query","description":"Filter on cleaning","schema":{"type":"string"}},"filter_write_protect":{"name":"write_protect","in":"query","description":"Filter on write protect","schema":{"type":"string"}},"filter_mounted":{"name":"mounted","in":"query","description":"Filter on mounted","schema":{"type":"string"}},"filter_ejected":{"name":"ejected","in":"query","description":"Filter on ejected","schema":{"type":"string"}},"filter_known":{"name":"known","in":"query","description":"Filter on known","schema":{"type":"string"}},"filter_mount_count":{"name":"mount_count","in":"query","description":"Filter on mount count","schema":{"type":"string"}},"filter_date_in":{"name":"date_in","in":"query","description":"Filter on date in","schema":{"type":"string"}},"filter_date_move":{"name":"date_move","in":"query","description":"Filter on date move","schema":{"type":"string"}},"filter_free":{"name":"free","in":"query","description":"Filter on free","schema":{"type":"string"}},"filter_max":{"name":"max","in":"query","description":"Filter on max","schema":{"type":"string"}},"filter_last_size_update":{"name":"last_size_update","in":"query","description":"Filter on last size update","schema":{"type":"string"}},"filter_last_maintenance":{"name":"last_maintenance","in":"query","description":"Filter on last maintenance","schema":{"type":"string"}},"filter_last_repack":{"name":"last_repack","in":"query","description":"Filter on last repack","schema":{"type":"string"}},"filter_repack_status":{"name":"repack_status","in":"query","description":"Filter on repack status","schema":{"type":"string"}},"filter_force_import_type":{"name":"force_import_type","in":"query","description":"Filter on force import type","schema":{"type":"string"}},"filter_need_to_check":{"name":"need_to_check","in":"query","description":"Filter on need to check","schema":{"type":"string"}}}},"paths":{"/tapes":{"get":{"summary":"Lists all tapes.","tags":["tapes"],"operationId":"index_tapes","description":"**API Key Scope**: tapes / index","responses":{"200":{"$ref":"#/components/responses/tapes_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/has_locations"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_tape_library_id"},{"$ref":"#/components/parameters/filter_pool_id"},{"$ref":"#/components/parameters/filter_barcode"},{"$ref":"#/components/parameters/filter_location"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_locked"},{"$ref":"#/components/parameters/filter_scratch"},{"$ref":"#/components/parameters/filter_cleaning"},{"$ref":"#/components/parameters/filter_write_protect"},{"$ref":"#/components/parameters/filter_mounted"},{"$ref":"#/components/parameters/filter_ejected"},{"$ref":"#/components/parameters/filter_known"},{"$ref":"#/components/parameters/filter_mount_count"},{"$ref":"#/components/parameters/filter_date_in"},{"$ref":"#/components/parameters/filter_date_move"},{"$ref":"#/components/parameters/filter_free"},{"$ref":"#/components/parameters/filter_max"},{"$ref":"#/components/parameters/filter_last_size_update"},{"$ref":"#/components/parameters/filter_last_maintenance"},{"$ref":"#/components/parameters/filter_last_repack"},{"$ref":"#/components/parameters/filter_repack_status"},{"$ref":"#/components/parameters/filter_force_import_type"},{"$ref":"#/components/parameters/filter_need_to_check"}]}}}}
```

## Displays a specific tape.

> \*\*API Key Scope\*\*: tapes / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tapes_show":{"description":"A specific tape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/tapes/{tape_id}":{"get":{"summary":"Displays a specific tape.","operationId":"show_tape","description":"**API Key Scope**: tapes / show","tags":["tapes"],"responses":{"200":{"$ref":"#/components/responses/tapes_show"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## Destroys a specific tape. Only when it's an orphan.

> \*\*API Key Scope\*\*: tapes / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tapes/{tape_id}":{"delete":{"summary":"Destroys a specific tape. Only when it's an orphan.","operationId":"destroy_tape","description":"**API Key Scope**: tapes / destroy","tags":["tapes"],"responses":{"204":{"description":"Tape destroyed."}}}}}}
```

## Get mount status of Tape.

> \*\*API Key Scope\*\*: tapes / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/tapes/{tape_id}/mount":{"get":{"summary":"Get mount status of Tape.","operationId":"mount_status_tape","description":"**API Key Scope**: tapes / mount_status","tags":["tapes"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## Display statistic for a specific tape.

> \*\*API Key Scope\*\*: tape\_stats / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_stat_show":{"description":"A specific tape statistic.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_stat"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_stat":{"type":"object","properties":{"log_time":{"type":"string","readOnly":true},"barcode":{"type":"string","readOnly":true},"mounts":{"type":"integer","readOnly":true},"datasets_written":{"type":"integer","readOnly":true},"datasets_read":{"type":"integer","readOnly":true},"recovered_write_data_errors":{"type":"integer","readOnly":true},"unrecovered_write_data_errors":{"type":"integer","readOnly":true},"write_servo_errors":{"type":"integer","readOnly":true},"unrecovered_write_servo_errors":{"type":"integer","readOnly":true},"recovered_read_errors":{"type":"integer","readOnly":true},"unrecovered_read_errors":{"type":"integer","readOnly":true},"last_mount_unrecovered_write_errors":{"type":"integer","readOnly":true},"last_mount_unrecovered_read_errors":{"type":"integer","readOnly":true},"last_mount_mbytes_written":{"type":"integer","readOnly":true},"last_mount_mbytes_read":{"type":"integer","readOnly":true},"lifetime_mbytes_written":{"type":"integer","readOnly":true},"lifetime_mbytes_read":{"type":"integer","readOnly":true},"last_load_write_compression_ratio":{"type":"integer","readOnly":true},"last_load_read_compression_ratio":{"type":"integer","readOnly":true},"medium_mount_time":{"type":"integer","readOnly":true},"medium_ready_time":{"type":"integer","readOnly":true},"total_native_capacity":{"type":"integer","readOnly":true},"total_used_native_capacity":{"type":"integer","readOnly":true},"write_protect":{"type":"integer","readOnly":true},"worm":{"type":"integer","readOnly":true},"beginning_of_medium_passes":{"type":"integer","readOnly":true},"middle_of_tape_passes":{"type":"integer","readOnly":true},"read_compression_ratio":{"type":"integer","readOnly":true},"write_compression_ratio":{"type":"integer","readOnly":true},"mbytes_transferred_to_app_client":{"type":"integer","readOnly":true},"bytes_transferred_to_app_client":{"type":"integer","readOnly":true},"mbytes_read_from_medium":{"type":"integer","readOnly":true},"bytes_read_from_medium":{"type":"integer","readOnly":true},"mbytes_transferred_from_app_client":{"type":"integer","readOnly":true},"bytes_transferred_from_app_client":{"type":"integer","readOnly":true},"mbytes_written_to_medium":{"type":"integer","readOnly":true},"bytes_written_to_medium":{"type":"integer","readOnly":true},"data_compression_enabled":{"type":"integer","readOnly":true},"partition_0_remaining_capacity":{"type":"integer","readOnly":true},"partition_1_remaining_capacity":{"type":"integer","readOnly":true},"partition_0_maximum_capacity":{"type":"integer","readOnly":true},"partition_1_maximum_capacity":{"type":"integer","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/tapes/{tape_id}/tape_stat":{"get":{"summary":"Display statistic for a specific tape.","operationId":"show_tape_stat","description":"**API Key Scope**: tape_stats / show","tags":["tapes"],"responses":{"200":{"$ref":"#/components/responses/tape_stat_show"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## List all tape statistics.

> \*\*API Key Scope\*\*: tape\_stats / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tape_stats_index":{"description":"List of tape statistics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tape_stat_collection"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"tape_stat_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tape_stats":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/tape_stat"}}}},"tape_stat":{"type":"object","properties":{"log_time":{"type":"string","readOnly":true},"barcode":{"type":"string","readOnly":true},"mounts":{"type":"integer","readOnly":true},"datasets_written":{"type":"integer","readOnly":true},"datasets_read":{"type":"integer","readOnly":true},"recovered_write_data_errors":{"type":"integer","readOnly":true},"unrecovered_write_data_errors":{"type":"integer","readOnly":true},"write_servo_errors":{"type":"integer","readOnly":true},"unrecovered_write_servo_errors":{"type":"integer","readOnly":true},"recovered_read_errors":{"type":"integer","readOnly":true},"unrecovered_read_errors":{"type":"integer","readOnly":true},"last_mount_unrecovered_write_errors":{"type":"integer","readOnly":true},"last_mount_unrecovered_read_errors":{"type":"integer","readOnly":true},"last_mount_mbytes_written":{"type":"integer","readOnly":true},"last_mount_mbytes_read":{"type":"integer","readOnly":true},"lifetime_mbytes_written":{"type":"integer","readOnly":true},"lifetime_mbytes_read":{"type":"integer","readOnly":true},"last_load_write_compression_ratio":{"type":"integer","readOnly":true},"last_load_read_compression_ratio":{"type":"integer","readOnly":true},"medium_mount_time":{"type":"integer","readOnly":true},"medium_ready_time":{"type":"integer","readOnly":true},"total_native_capacity":{"type":"integer","readOnly":true},"total_used_native_capacity":{"type":"integer","readOnly":true},"write_protect":{"type":"integer","readOnly":true},"worm":{"type":"integer","readOnly":true},"beginning_of_medium_passes":{"type":"integer","readOnly":true},"middle_of_tape_passes":{"type":"integer","readOnly":true},"read_compression_ratio":{"type":"integer","readOnly":true},"write_compression_ratio":{"type":"integer","readOnly":true},"mbytes_transferred_to_app_client":{"type":"integer","readOnly":true},"bytes_transferred_to_app_client":{"type":"integer","readOnly":true},"mbytes_read_from_medium":{"type":"integer","readOnly":true},"bytes_read_from_medium":{"type":"integer","readOnly":true},"mbytes_transferred_from_app_client":{"type":"integer","readOnly":true},"bytes_transferred_from_app_client":{"type":"integer","readOnly":true},"mbytes_written_to_medium":{"type":"integer","readOnly":true},"bytes_written_to_medium":{"type":"integer","readOnly":true},"data_compression_enabled":{"type":"integer","readOnly":true},"partition_0_remaining_capacity":{"type":"integer","readOnly":true},"partition_1_remaining_capacity":{"type":"integer","readOnly":true},"partition_0_maximum_capacity":{"type":"integer","readOnly":true},"partition_1_maximum_capacity":{"type":"integer","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}}}},"paths":{"/tape_stats":{"get":{"summary":"List all tape statistics.","operationId":"index_tape_stats","description":"**API Key Scope**: tape_stats / index","tags":["tapes"],"responses":{"200":{"$ref":"#/components/responses/tape_stats_index"},"404":{"$ref":"#/components/responses/not_found"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"}]}}}}
```


# Pools

## Lists all pools.

> \*\*API Key Scope\*\*: pools / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"pools_index":{"description":"List of pools.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/pool_collection"}}}}},"schemas":{"pool_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"pools":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/pool"}}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_comment":{"name":"comment","in":"query","description":"Filter on comment","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_content":{"name":"content","in":"query","description":"Filter on content","schema":{"type":"string"}},"filter_primary_id":{"name":"primary_id","in":"query","description":"Filter on primary id","schema":{"type":"string"}}}},"paths":{"/pools":{"get":{"summary":"Lists all pools.","tags":["pools"],"operationId":"index_pools","description":"**API Key Scope**: pools / index","responses":{"200":{"$ref":"#/components/responses/pools_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_comment"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_content"},{"$ref":"#/components/parameters/filter_primary_id"}]}}}}
```

## Creates a new pool.

> \*\*API Key Scope\*\*: pools / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"pools_show":{"description":"A specific pool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/pool"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}},"pool_up":{"allOf":[{"$ref":"#/components/schemas/pool"},{"type":"object","properties":{"tape_ids":{"type":"array","items":{"type":"integer"}},"nas_share_ids":{"type":"array","items":{"type":"integer"}},"cloud_bucket_ids":{"type":"array","items":{"type":"integer"}}}}]}},"requestBodies":{"pool_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pool_up"}}},"required":true}}},"paths":{"/pools":{"post":{"summary":"Creates a new pool.","operationId":"create_pool","description":"**API Key Scope**: pools / create","tags":["pools"],"responses":{"201":{"$ref":"#/components/responses/pools_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/pool_body"}}}}}
```

## Displays a specific pool.

> \*\*API Key Scope\*\*: pools / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"pools_show":{"description":"A specific pool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/pool"}}}}},"schemas":{"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}}}},"paths":{"/pools/{pool_id}":{"get":{"summary":"Displays a specific pool.","operationId":"show_pool","description":"**API Key Scope**: pools / show","tags":["pools"],"responses":{"200":{"$ref":"#/components/responses/pools_show"}}}}}}
```

## Updates a specific pool.

> \*\*API Key Scope\*\*: pools / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"pools_show":{"description":"A specific pool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/pool"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}},"pool_up":{"allOf":[{"$ref":"#/components/schemas/pool"},{"type":"object","properties":{"tape_ids":{"type":"array","items":{"type":"integer"}},"nas_share_ids":{"type":"array","items":{"type":"integer"}},"cloud_bucket_ids":{"type":"array","items":{"type":"integer"}}}}]}},"requestBodies":{"pool_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/pool_up"}}},"required":true}}},"paths":{"/pools/{pool_id}":{"put":{"summary":"Updates a specific pool.","operationId":"update_pool","description":"**API Key Scope**: pools / update","tags":["pools"],"responses":{"200":{"$ref":"#/components/responses/pools_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/pool_body"}}}}}
```

## Destroys a specific tape pool.

> \*\*API Key Scope\*\*: pools / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/pools/{pool_id}":{"delete":{"summary":"Destroys a specific tape pool.","operationId":"destroy_pool","description":"**API Key Scope**: pools / destroy","tags":["pools"],"responses":{"204":{"description":"Pool destroyed."}}}}}}
```

## Displays the primary pool scan status.

> \*\*API Key Scope\*\*: primary\_scans / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"primary_scan_show":{"description":"The primary pool scan status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/primary_scan"}}}}},"schemas":{"primary_scan":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer"},"enabled":{"type":"boolean"},"operand":{"type":"number"},"unit":{"type":"string","enum":["minutes","hours","days","weeks","months","years"]}}}}},"paths":{"/pools/{pool_id}/primary_scan":{"get":{"summary":"Displays the primary pool scan status.","operationId":"show_primary_scan","description":"**API Key Scope**: primary_scans / show","tags":["pools"],"responses":{"200":{"$ref":"#/components/responses/primary_scan_show"}}}}}}
```

## Set a new primary pool scan option.

> \*\*API Key Scope\*\*: primary\_scans / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"primary_scan_show":{"description":"The primary pool scan status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/primary_scan"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"primary_scan":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer"},"enabled":{"type":"boolean"},"operand":{"type":"number"},"unit":{"type":"string","enum":["minutes","hours","days","weeks","months","years"]}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"primary_scan_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/primary_scan"}}},"required":true}}},"paths":{"/pools/{pool_id}/primary_scan":{"post":{"summary":"Set a new primary pool scan option.","operationId":"create_primary_scan","description":"**API Key Scope**: primary_scans / create","tags":["pools"],"responses":{"201":{"$ref":"#/components/responses/primary_scan_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/primary_scan_body"}}}}}
```

## Updates the existing primary pool scan option.

> \*\*API Key Scope\*\*: primary\_scans / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"primary_scan_show":{"description":"The primary pool scan status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/primary_scan"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"primary_scan":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer"},"enabled":{"type":"boolean"},"operand":{"type":"number"},"unit":{"type":"string","enum":["minutes","hours","days","weeks","months","years"]}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"primary_scan_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/primary_scan"}}},"required":true}}},"paths":{"/pools/{pool_id}/primary_scan":{"put":{"summary":"Updates the existing primary pool scan option.","operationId":"update_primary_scan","description":"**API Key Scope**: primary_scans / update","tags":["pools"],"responses":{"200":{"$ref":"#/components/responses/primary_scan_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/primary_scan_body"}}}}}
```

## Disable the primary pool scan.

> \*\*API Key Scope\*\*: primary\_scans / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/pools/{pool_id}/primary_scan":{"delete":{"summary":"Disable the primary pool scan.","operationId":"destroy_primary_scan","description":"**API Key Scope**: primary_scans / destroy","tags":["pools"],"responses":{"204":{"description":"Primary pool scan disabled."}}}}}}
```

## Synchronize a primary after a scan (for internal use only).

> \*\*API Key Scope\*\*: pools / sync\_primary

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"parameters":{"sync_primary_tx":{"name":"tx","in":"query","description":"New transaction number.","required":true,"schema":{"type":"integer"}}}},"paths":{"/pools/{pool_id}/sync":{"post":{"summary":"Synchronize a primary after a scan (for internal use only).","operationId":"sync_primary_pool","description":"**API Key Scope**: pools / sync_primary","tags":["pools"],"responses":{"204":{"description":"Synchronization triggered."}},"parameters":[{"$ref":"#/components/parameters/sync_primary_tx"}]}}}}
```

## Get mount status of Pool.

> \*\*API Key Scope\*\*: pools / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/pools/{pool_id}/mount":{"get":{"summary":"Get mount status of Pool.","operationId":"mount_status_pool","description":"**API Key Scope**: pools / mount_status","tags":["pools"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## Mount Pool.

> \*\*API Key Scope\*\*: pools / mount

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/pools/{pool_id}/mount":{"put":{"summary":"Mount Pool.","operationId":"mount_pool","description":"**API Key Scope**: pools / mount","tags":["pools"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## Unmount Pool.

> \*\*API Key Scope\*\*: pools / unmount

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/pools/{pool_id}/mount":{"delete":{"summary":"Unmount Pool.","operationId":"unmount_pool","description":"**API Key Scope**: pools / unmount","tags":["pools"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```


# Cloud Connectors

## Lists all cloud connectors.

> \*\*API Key Scope\*\*: cloud\_connectors / index  \
> Optional API Key Explicit Scope: cloud\_connectors / get\_secret\_key

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_connectors_index":{"description":"List of cloud connectors.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_connector_collection"}}}}},"schemas":{"cloud_connector_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"cloud_connectors":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_connector"}}}},"cloud_connector":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"url":{"type":"string"},"url_proxy":{"type":"string"},"provider":{"type":"string","enum":["generic_s3","amazon_aws_s3","cloudian_hyperstore","scality_ring","dell_emc_ecs","azure","google_cloud_storage","openstack_swift","wasabi","quantum_activescale","datacore_swarm"]},"region":{"type":"string"},"access_key":{"type":"string"},"secret_key":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_url":{"name":"url","in":"query","description":"Filter on url","schema":{"type":"string"}},"filter_url_proxy":{"name":"url_proxy","in":"query","description":"Filter on url proxy","schema":{"type":"string"}},"filter_provider":{"name":"provider","in":"query","description":"Filter on provider","schema":{"type":"string"}},"filter_region":{"name":"region","in":"query","description":"Filter on region","schema":{"type":"string"}},"filter_access_key":{"name":"access_key","in":"query","description":"Filter on access key","schema":{"type":"string"}}}},"paths":{"/cloud_connectors":{"get":{"summary":"Lists all cloud connectors.","tags":["cloud_connectors"],"operationId":"index_cloud_connectors","description":"**API Key Scope**: cloud_connectors / index  \nOptional API Key Explicit Scope: cloud_connectors / get_secret_key","responses":{"200":{"$ref":"#/components/responses/cloud_connectors_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_url"},{"$ref":"#/components/parameters/filter_url_proxy"},{"$ref":"#/components/parameters/filter_provider"},{"$ref":"#/components/parameters/filter_region"},{"$ref":"#/components/parameters/filter_access_key"}]}}}}
```

## Creates a new cloud connector.

> \*\*API Key Scope\*\*: cloud\_connectors / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_connectors_show":{"description":"A specific cloud connector.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_connector"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_connector":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"url":{"type":"string"},"url_proxy":{"type":"string"},"provider":{"type":"string","enum":["generic_s3","amazon_aws_s3","cloudian_hyperstore","scality_ring","dell_emc_ecs","azure","google_cloud_storage","openstack_swift","wasabi","quantum_activescale","datacore_swarm"]},"region":{"type":"string"},"access_key":{"type":"string"},"secret_key":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"cloud_connector_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_connector"}}},"required":true}}},"paths":{"/cloud_connectors":{"post":{"summary":"Creates a new cloud connector.","operationId":"create_cloud_connector","description":"**API Key Scope**: cloud_connectors / create","tags":["cloud_connectors"],"responses":{"201":{"$ref":"#/components/responses/cloud_connectors_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/cloud_connector_body"}}}}}
```

## Check result of cloud connector test job.

> \*\*API Key Scope\*\*: cloud\_connectors / test

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_sync":{"description":"Simple list of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_simple_collection"}}}},"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"cloud_bucket_simple_collection":{"type":"object","properties":{"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/cloud_connectors/-/test":{"get":{"summary":"Check result of cloud connector test job.","operationId":"test_result_cloud_connector","tags":["cloud_connectors"],"description":"**API Key Scope**: cloud_connectors / test","responses":{"200":{"$ref":"#/components/responses/cloud_buckets_sync"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Test an unsaved cloud connector.

> \*\*API Key Scope\*\*: cloud\_connectors / test

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}},"cloud_connector":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"url":{"type":"string"},"url_proxy":{"type":"string"},"provider":{"type":"string","enum":["generic_s3","amazon_aws_s3","cloudian_hyperstore","scality_ring","dell_emc_ecs","azure","google_cloud_storage","openstack_swift","wasabi","quantum_activescale","datacore_swarm"]},"region":{"type":"string"},"access_key":{"type":"string"},"secret_key":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}},"requestBodies":{"cloud_connector_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_connector"}}},"required":true}}},"paths":{"/cloud_connectors/-/test":{"put":{"summary":"Test an unsaved cloud connector.","operationId":"test_cloud_connector","description":"**API Key Scope**: cloud_connectors / test","tags":["cloud_connectors"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}},"requestBody":{"$ref":"#/components/requestBodies/cloud_connector_body"}}}}}
```

## Displays a specific cloud connector.

> \*\*API Key Scope\*\*: cloud\_connectors / show  \
> Optional API Key Explicit Scope: cloud\_connectors / get\_secret\_key

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_connectors_show":{"description":"A specific cloud connector.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_connector"}}}}},"schemas":{"cloud_connector":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"url":{"type":"string"},"url_proxy":{"type":"string"},"provider":{"type":"string","enum":["generic_s3","amazon_aws_s3","cloudian_hyperstore","scality_ring","dell_emc_ecs","azure","google_cloud_storage","openstack_swift","wasabi","quantum_activescale","datacore_swarm"]},"region":{"type":"string"},"access_key":{"type":"string"},"secret_key":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}}},"paths":{"/cloud_connectors/{cloud_connector_id}":{"get":{"summary":"Displays a specific cloud connector.","operationId":"show_cloud_connector","description":"**API Key Scope**: cloud_connectors / show  \nOptional API Key Explicit Scope: cloud_connectors / get_secret_key","tags":["cloud_connectors"],"responses":{"200":{"$ref":"#/components/responses/cloud_connectors_show"}}}}}}
```

## Updates a specific cloud connector.

> \*\*API Key Scope\*\*: cloud\_connectors / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_connectors_show":{"description":"A specific cloud connector.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_connector"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_connector":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"url":{"type":"string"},"url_proxy":{"type":"string"},"provider":{"type":"string","enum":["generic_s3","amazon_aws_s3","cloudian_hyperstore","scality_ring","dell_emc_ecs","azure","google_cloud_storage","openstack_swift","wasabi","quantum_activescale","datacore_swarm"]},"region":{"type":"string"},"access_key":{"type":"string"},"secret_key":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"cloud_connector_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_connector"}}},"required":true}}},"paths":{"/cloud_connectors/{cloud_connector_id}":{"put":{"summary":"Updates a specific cloud connector.","operationId":"update_cloud_connector","description":"**API Key Scope**: cloud_connectors / update","tags":["cloud_connectors"],"responses":{"200":{"$ref":"#/components/responses/cloud_connectors_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/cloud_connector_body"}}}}}
```

## Destroys a specific cloud connector.

> \*\*API Key Scope\*\*: cloud\_connectors / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/cloud_connectors/{cloud_connector_id}":{"delete":{"summary":"Destroys a specific cloud connector.","operationId":"destroy_cloud_connector","description":"**API Key Scope**: cloud_connectors / destroy","tags":["cloud_connectors"],"responses":{"204":{"description":"Cloud connector destroyed."}}}}}}
```


# Cloud Buckets

## (By cloud connector) Lists all cloud buckets.

> \*\*API Key Scope\*\*: cloud\_buckets / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_index":{"description":"List of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_collection"}}}}},"schemas":{"cloud_bucket_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_location":{"name":"location","in":"query","description":"Filter on location","schema":{"type":"string"}},"filter_price":{"name":"price","in":"query","description":"Filter on price","schema":{"type":"string"}}}},"paths":{"/cloud_connectors/{cloud_connector_id}/cloud_buckets":{"get":{"summary":"(By cloud connector) Lists all cloud buckets.","operationId":"index_cloud_buckets_by_cloud_connector","description":"**API Key Scope**: cloud_buckets / index","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_pool_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_location"},{"$ref":"#/components/parameters/filter_price"}]}}}}
```

## Check result of cloud connector sync job.

> \*\*API Key Scope\*\*: cloud\_buckets / sync

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_sync":{"description":"Simple list of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_simple_collection"}}}},"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"cloud_bucket_simple_collection":{"type":"object","properties":{"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/cloud_connectors/{cloud_connector_id}/cloud_buckets/-/sync":{"get":{"summary":"Check result of cloud connector sync job.","operationId":"sync_result_cloud_buckets","tags":["cloud_buckets"],"description":"**API Key Scope**: cloud_buckets / sync","responses":{"200":{"$ref":"#/components/responses/cloud_buckets_sync"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Synchronize internal cloud buckets with their remote equivalent.

> \*\*API Key Scope\*\*: cloud\_buckets / sync

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}}},"paths":{"/cloud_connectors/{cloud_connector_id}/cloud_buckets/-/sync":{"put":{"summary":"Synchronize internal cloud buckets with their remote equivalent.","operationId":"sync_cloud_buckets","description":"**API Key Scope**: cloud_buckets / sync","tags":["cloud_buckets"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}}}}}}
```

## (By cloud connector) Displays a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_show":{"description":"A specific cloud bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/cloud_connectors/{cloud_connector_id}/cloud_buckets/{cloud_bucket_id}":{"get":{"summary":"(By cloud connector) Displays a specific cloud bucket.","operationId":"show_cloud_bucket_by_cloud_connector","description":"**API Key Scope**: cloud_buckets / show","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_show"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## (By cloud connector) Updates a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_show":{"description":"A specific cloud bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"cloud_bucket_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}},"required":true}}},"paths":{"/cloud_connectors/{cloud_connector_id}/cloud_buckets/{cloud_bucket_id}":{"put":{"summary":"(By cloud connector) Updates a specific cloud bucket.","operationId":"update_cloud_bucket_by_cloud_connector","description":"**API Key Scope**: cloud_buckets / update","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_show"},"404":{"$ref":"#/components/responses/not_found"}},"requestBody":{"$ref":"#/components/requestBodies/cloud_bucket_body"}}}}}
```

## (By cloud connector) Get mount status of Cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/cloud_connectors/{cloud_connector_id}/cloud_buckets/{cloud_bucket_id}/mount":{"get":{"summary":"(By cloud connector) Get mount status of Cloud bucket.","operationId":"mount_status_cloud_bucket_by_cloud_connector","description":"**API Key Scope**: cloud_buckets / mount_status","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## (By pool) Lists all cloud buckets from pool.

> \*\*API Key Scope\*\*: cloud\_buckets / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_index":{"description":"List of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_collection"}}}}},"schemas":{"cloud_bucket_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_cloud_connector_id":{"name":"cloud_connector_id","in":"query","description":"Filter on cloud connector id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_location":{"name":"location","in":"query","description":"Filter on location","schema":{"type":"string"}},"filter_price":{"name":"price","in":"query","description":"Filter on price","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/cloud_buckets":{"get":{"summary":"(By pool) Lists all cloud buckets from pool.","operationId":"index_cloud_buckets_by_pool","description":"**API Key Scope**: cloud_buckets / index","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_cloud_connector_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_location"},{"$ref":"#/components/parameters/filter_price"}]}}}}
```

## (By pool) Displays a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_show":{"description":"A specific cloud bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/pools/{pool_id}/cloud_buckets/{cloud_bucket_id}":{"get":{"summary":"(By pool) Displays a specific cloud bucket.","operationId":"show_cloud_bucket_by_pool","description":"**API Key Scope**: cloud_buckets / show","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_show"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## (By pool) Updates a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_show":{"description":"A specific cloud bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"cloud_bucket_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}},"required":true}}},"paths":{"/pools/{pool_id}/cloud_buckets/{cloud_bucket_id}":{"put":{"summary":"(By pool) Updates a specific cloud bucket.","operationId":"update_cloud_bucket_by_pool","description":"**API Key Scope**: cloud_buckets / update","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_show"},"404":{"$ref":"#/components/responses/not_found"}},"requestBody":{"$ref":"#/components/requestBodies/cloud_bucket_body"}}}}}
```

## (By pool) Get mount status of Cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/pools/{pool_id}/cloud_buckets/{cloud_bucket_id}/mount":{"get":{"summary":"(By pool) Get mount status of Cloud bucket.","operationId":"mount_status_cloud_bucket_by_pool","description":"**API Key Scope**: cloud_buckets / mount_status","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## Lists all cloud buckets.

> \*\*API Key Scope\*\*: cloud\_buckets / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_index":{"description":"List of cloud buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket_collection"}}}}},"schemas":{"cloud_bucket_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"cloud_buckets":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/cloud_bucket"}}}},"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_cloud_connector_id":{"name":"cloud_connector_id","in":"query","description":"Filter on cloud connector id","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_location":{"name":"location","in":"query","description":"Filter on location","schema":{"type":"string"}},"filter_price":{"name":"price","in":"query","description":"Filter on price","schema":{"type":"string"}}}},"paths":{"/cloud_buckets":{"get":{"summary":"Lists all cloud buckets.","tags":["cloud_buckets"],"operationId":"index_cloud_buckets","description":"**API Key Scope**: cloud_buckets / index","responses":{"200":{"$ref":"#/components/responses/cloud_buckets_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_cloud_connector_id"},{"$ref":"#/components/parameters/filter_pool_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_location"},{"$ref":"#/components/parameters/filter_price"}]}}}}
```

## Creates a new cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_show":{"description":"A specific cloud bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"cloud_bucket_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}},"required":true}}},"paths":{"/cloud_buckets":{"post":{"summary":"Creates a new cloud bucket.","operationId":"create_cloud_bucket","description":"**API Key Scope**: cloud_buckets / create","tags":["cloud_buckets"],"responses":{"201":{"$ref":"#/components/responses/cloud_buckets_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/cloud_bucket_body"}}}}}
```

## Displays a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_show":{"description":"A specific cloud bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/cloud_buckets/{cloud_bucket_id}":{"get":{"summary":"Displays a specific cloud bucket.","operationId":"show_cloud_bucket","description":"**API Key Scope**: cloud_buckets / show","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_show"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## Updates a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"cloud_buckets_show":{"description":"A specific cloud bucket.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"cloud_bucket":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"cloud_connector_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"location":{"type":"string","readOnly":true},"price":{"type":"string"},"options":{"type":"string","description":"S3FS mounting options, separated by comma"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"cloud_bucket_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cloud_bucket"}}},"required":true}}},"paths":{"/cloud_buckets/{cloud_bucket_id}":{"put":{"summary":"Updates a specific cloud bucket.","operationId":"update_cloud_bucket","description":"**API Key Scope**: cloud_buckets / update","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/cloud_buckets_show"},"404":{"$ref":"#/components/responses/not_found"}},"requestBody":{"$ref":"#/components/requestBodies/cloud_bucket_body"}}}}}
```

## Destroys a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_bucket / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/cloud_buckets/{cloud_bucket_id}":{"delete":{"summary":"Destroys a specific cloud bucket.","operationId":"destroy_cloud_bucket","description":"**API Key Scope**: cloud_bucket / destroy","tags":["cloud_buckets"],"responses":{"204":{"description":"cloud bucket destroyed."}}}}}}
```

## Upload a config file for a specific cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / update\_config\_file

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/cloud_buckets/{cloud_bucket_id}/config_file":{"put":{"summary":"Upload a config file for a specific cloud bucket.","operationId":"update_config_file_cloud_bucket","description":"**API Key Scope**: cloud_buckets / update_config_file","tags":["cloud_buckets"],"responses":{"200":{"description":"Remote URI","content":{"application/json":{"schema":{"type":"string"}}}},"404":{"$ref":"#/components/responses/not_found"}},"requestBody":{"content":{"multipart/form-data":{"schema":{"required":["config_file"],"properties":{"config_file":{"type":"string","description":"Config file to upload.","format":"binary"}}}}},"required":true}}}}}
```

## Get mount status of Cloud bucket.

> \*\*API Key Scope\*\*: cloud\_buckets / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/cloud_buckets/{cloud_bucket_id}/mount":{"get":{"summary":"Get mount status of Cloud bucket.","operationId":"mount_status_cloud_bucket","description":"**API Key Scope**: cloud_buckets / mount_status","tags":["cloud_buckets"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```


# Nas

## Lists all NAS.

> \*\*API Key Scope\*\*: nas / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_index":{"description":"List of NAS.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_collection"}}}}},"schemas":{"nas_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"nas":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nas"}}}},"nas":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"host":{"type":"string"},"type":{"type":"string","enum":["smb_v1","smb_v2_1","smb_v3","nfs_v3","nfs_v4"]},"comment":{"type":"string"},"price":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_comment":{"name":"comment","in":"query","description":"Filter on comment","schema":{"type":"string"}},"filter_host":{"name":"host","in":"query","description":"Filter on host","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_price":{"name":"price","in":"query","description":"Filter on price","schema":{"type":"string"}}}},"paths":{"/nas":{"get":{"summary":"Lists all NAS.","tags":["nas"],"operationId":"index_nas","description":"**API Key Scope**: nas / index","responses":{"200":{"$ref":"#/components/responses/nas_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_comment"},{"$ref":"#/components/parameters/filter_host"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_price"}]}}}}
```

## Creates a new NAS.

> \*\*API Key Scope\*\*: nas / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_show":{"description":"A specific NAS.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"nas":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"host":{"type":"string"},"type":{"type":"string","enum":["smb_v1","smb_v2_1","smb_v3","nfs_v3","nfs_v4"]},"comment":{"type":"string"},"price":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"nas_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas"}}},"required":true}}},"paths":{"/nas":{"post":{"summary":"Creates a new NAS.","operationId":"create_nas","description":"**API Key Scope**: nas / create","tags":["nas"],"responses":{"201":{"$ref":"#/components/responses/nas_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/nas_body"}}}}}
```

## Displays a specific NAS.

> \*\*API Key Scope\*\*: nas / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_show":{"description":"A specific NAS.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas"}}}}},"schemas":{"nas":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"host":{"type":"string"},"type":{"type":"string","enum":["smb_v1","smb_v2_1","smb_v3","nfs_v3","nfs_v4"]},"comment":{"type":"string"},"price":{"type":"string"}}}}},"paths":{"/nas/{nas_id}":{"get":{"summary":"Displays a specific NAS.","operationId":"show_nas","description":"**API Key Scope**: nas / show","tags":["nas"],"responses":{"200":{"$ref":"#/components/responses/nas_show"}}}}}}
```

## Updates a specific NAS.

> \*\*API Key Scope\*\*: nas / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_show":{"description":"A specific NAS.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"nas":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"host":{"type":"string"},"type":{"type":"string","enum":["smb_v1","smb_v2_1","smb_v3","nfs_v3","nfs_v4"]},"comment":{"type":"string"},"price":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"nas_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas"}}},"required":true}}},"paths":{"/nas/{nas_id}":{"put":{"summary":"Updates a specific NAS.","operationId":"update_nas","description":"**API Key Scope**: nas / update","tags":["nas"],"responses":{"200":{"$ref":"#/components/responses/nas_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/nas_body"}}}}}
```

## Destroys a specific NAS.

> \*\*API Key Scope\*\*: nas / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/nas/{nas_id}":{"delete":{"summary":"Destroys a specific NAS.","operationId":"destroy_nas","description":"**API Key Scope**: nas / destroy","tags":["nas"],"responses":{"204":{"description":"NAS destroyed."}}}}}}
```


# Nas Shares

## (By NAS) Lists all NAS shares.

> \*\*API Key Scope\*\*: nas\_shares / index  \
> Optional API Key Explicit Scope: nas\_shares / get\_password

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_index":{"description":"List of NAS shares.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share_collection"}}}}},"schemas":{"nas_share_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"nas_shares":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nas_share"}}}},"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_path":{"name":"path","in":"query","description":"Filter on path","schema":{"type":"string"}},"filter_options":{"name":"options","in":"query","description":"Filter on options","schema":{"type":"string"}},"filter_username":{"name":"username","in":"query","description":"Filter on username","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}}}},"paths":{"/nas/{nas_id}/nas_shares":{"get":{"summary":"(By NAS) Lists all NAS shares.","operationId":"index_nas_shares_by_nas","tags":["nas_shares"],"description":"**API Key Scope**: nas_shares / index  \nOptional API Key Explicit Scope: nas_shares / get_password","responses":{"200":{"$ref":"#/components/responses/nas_shares_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_path"},{"$ref":"#/components/parameters/filter_options"},{"$ref":"#/components/parameters/filter_username"},{"$ref":"#/components/parameters/filter_pool_id"}]}}}}
```

## (By NAS) Creates a new NAS share.

> \*\*API Key Scope\*\*: nas\_shares / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_show":{"description":"A specific NAS share.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"nas_share_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}},"required":true}}},"paths":{"/nas/{nas_id}/nas_shares":{"post":{"summary":"(By NAS) Creates a new NAS share.","operationId":"create_nas_share_by_nas","description":"**API Key Scope**: nas_shares / create","tags":["nas_shares"],"responses":{"201":{"$ref":"#/components/responses/nas_shares_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/nas_share_body"}}}}}
```

## Check result of a NAS Share test job.

> \*\*API Key Scope\*\*: nas\_shares / test

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/nas/{nas_id}/nas_shares/-/test":{"get":{"summary":"Check result of a NAS Share test job.","operationId":"test_result_nas_share","tags":["nas_shares"],"description":"**API Key Scope**: nas_shares / test","responses":{"200":{"$ref":"#/components/responses/active_job_status"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Test an unsaved NAS Share.

> \*\*API Key Scope\*\*: nas\_shares / test

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}},"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}},"requestBodies":{"nas_share_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}},"required":true}}},"paths":{"/nas/{nas_id}/nas_shares/-/test":{"put":{"summary":"Test an unsaved NAS Share.","operationId":"test_nas_share","description":"**API Key Scope**: nas_shares / test","tags":["nas_shares"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}},"requestBody":{"$ref":"#/components/requestBodies/nas_share_body"}}}}}
```

## (By NAS) Displays a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / show  \
> Optional API Key Explicit Scope: nas\_shares / get\_password

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_show":{"description":"A specific NAS share.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}}}},"schemas":{"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}}},"paths":{"/nas/{nas_id}/nas_shares/{nas_share_id}":{"get":{"summary":"(By NAS) Displays a specific NAS share.","operationId":"show_nas_share_by_nas","description":"**API Key Scope**: nas_shares / show  \nOptional API Key Explicit Scope: nas_shares / get_password","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_show"}}}}}}
```

## (By NAS) Updates a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_show":{"description":"A specific NAS share.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"nas_share_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}},"required":true}}},"paths":{"/nas/{nas_id}/nas_shares/{nas_share_id}":{"put":{"summary":"(By NAS) Updates a specific NAS share.","operationId":"update_nas_share_by_nas","description":"**API Key Scope**: nas_shares / update","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/nas_share_body"}}}}}
```

## (By NAS) Destroys a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/nas/{nas_id}/nas_shares/{nas_share_id}":{"delete":{"summary":"(By NAS) Destroys a specific NAS share.","operationId":"destroy_nas_share_by_nas","description":"**API Key Scope**: nas_shares / destroy","tags":["nas_shares"],"responses":{"204":{"description":"NAS share destroyed."}}}}}}
```

## (By NAS) Get mount status of NAS Share.

> \*\*API Key Scope\*\*: nas\_shares / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/nas/{nas_id}/nas_shares/{nas_share_id}/mount":{"get":{"summary":"(By NAS) Get mount status of NAS Share.","operationId":"mount_status_nas_share_by_nas","description":"**API Key Scope**: nas_shares / mount_status","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## Lists all NAS shares.

> \*\*API Key Scope\*\*: nas\_shares / index  \
> Optional API Key Explicit Scope: nas\_shares / get\_password

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_index":{"description":"List of NAS shares.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share_collection"}}}}},"schemas":{"nas_share_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"nas_shares":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nas_share"}}}},"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_path":{"name":"path","in":"query","description":"Filter on path","schema":{"type":"string"}},"filter_options":{"name":"options","in":"query","description":"Filter on options","schema":{"type":"string"}},"filter_username":{"name":"username","in":"query","description":"Filter on username","schema":{"type":"string"}},"filter_nas_id":{"name":"nas_id","in":"query","description":"Filter on NAS id","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}}}},"paths":{"/nas_shares":{"get":{"summary":"Lists all NAS shares.","tags":["nas_shares"],"operationId":"index_nas_shares","description":"**API Key Scope**: nas_shares / index  \nOptional API Key Explicit Scope: nas_shares / get_password","responses":{"200":{"$ref":"#/components/responses/nas_shares_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_path"},{"$ref":"#/components/parameters/filter_options"},{"$ref":"#/components/parameters/filter_username"},{"$ref":"#/components/parameters/filter_nas_id"},{"$ref":"#/components/parameters/filter_pool_id"}]}}}}
```

## Displays a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / show  \
> Optional API Key Explicit Scope: nas\_shares / get\_password

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_show":{"description":"A specific NAS share.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}}}},"schemas":{"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}}},"paths":{"/nas_shares/{nas_share_id}":{"get":{"summary":"Displays a specific NAS share.","operationId":"show_nas_share","description":"**API Key Scope**: nas_shares / show  \nOptional API Key Explicit Scope: nas_shares / get_password","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_show"}}}}}}
```

## Updates a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_show":{"description":"A specific NAS share.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"nas_share_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}},"required":true}}},"paths":{"/nas_shares/{nas_share_id}":{"put":{"summary":"Updates a specific NAS share.","operationId":"update_nas_share","description":"**API Key Scope**: nas_shares / update","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/nas_share_body"}}}}}
```

## Destroys a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/nas_shares/{nas_share_id}":{"delete":{"summary":"Destroys a specific NAS share.","operationId":"destroy_nas_share","description":"**API Key Scope**: nas_shares / destroy","tags":["nas_shares"],"responses":{"204":{"description":"NAS share destroyed."}}}}}}
```

## Get mount status of NAS Share.

> \*\*API Key Scope\*\*: nas\_shares / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/nas_shares/{nas_share_id}/mount":{"get":{"summary":"Get mount status of NAS Share.","operationId":"mount_status_nas_share","description":"**API Key Scope**: nas_shares / mount_status","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```

## (By pool) Lists all NAS shares from pool.

> \*\*API Key Scope\*\*: nas\_shares / index  \
> Optional API Key Explicit Scope: nas\_shares / get\_password

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_index":{"description":"List of NAS shares.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share_collection"}}}}},"schemas":{"nas_share_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"nas_shares":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/nas_share"}}}},"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_path":{"name":"path","in":"query","description":"Filter on path","schema":{"type":"string"}},"filter_options":{"name":"options","in":"query","description":"Filter on options","schema":{"type":"string"}},"filter_username":{"name":"username","in":"query","description":"Filter on username","schema":{"type":"string"}},"filter_nas_id":{"name":"nas_id","in":"query","description":"Filter on NAS id","schema":{"type":"string"}}}},"paths":{"/pools/{pool_id}/nas_shares":{"get":{"summary":"(By pool) Lists all NAS shares from pool.","operationId":"index_nas_shares_by_pool","description":"**API Key Scope**: nas_shares / index  \nOptional API Key Explicit Scope: nas_shares / get_password","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_path"},{"$ref":"#/components/parameters/filter_options"},{"$ref":"#/components/parameters/filter_username"},{"$ref":"#/components/parameters/filter_nas_id"}]}}}}
```

## (By pool) Displays a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / show  \
> Optional API Key Explicit Scope: nas\_shares / get\_password

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_show":{"description":"A specific NAS share.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}}}},"schemas":{"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}}}},"paths":{"/pools/{pool_id}/nas_shares/{nas_share_id}":{"get":{"summary":"(By pool) Displays a specific NAS share.","operationId":"show_nas_share_by_pool","description":"**API Key Scope**: nas_shares / show  \nOptional API Key Explicit Scope: nas_shares / get_password","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_show"}}}}}}
```

## (By pool) Updates a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"nas_shares_show":{"description":"A specific NAS share.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"nas_share":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"nas_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"name":{"type":"string"},"path":{"type":"string"},"options":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"file_count":{"type":"integer","readOnly":true,"format":"int64"},"file_size_sum":{"type":"integer","readOnly":true,"format":"int64"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"nas_share_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/nas_share"}}},"required":true}}},"paths":{"/pools/{pool_id}/nas_shares/{nas_share_id}":{"put":{"summary":"(By pool) Updates a specific NAS share.","operationId":"update_nas_share_by_pool","description":"**API Key Scope**: nas_shares / update","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/nas_shares_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/nas_share_body"}}}}}
```

## (By pool) Destroys a specific NAS share.

> \*\*API Key Scope\*\*: nas\_shares / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/pools/{pool_id}/nas_shares/{nas_share_id}":{"delete":{"summary":"(By pool) Destroys a specific NAS share.","operationId":"destroy_nas_share_by_pool","description":"**API Key Scope**: nas_shares / destroy","tags":["nas_shares"],"responses":{"204":{"description":"NAS share destroyed."}}}}}}
```

## (By pool) Get mount status of NAS Share.

> \*\*API Key Scope\*\*: nas\_shares / mount\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"mount_status":{"description":"Mount status of storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/mount_status"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"mount_status":{"type":"object","properties":{"mounted":{"type":"boolean","readOnly":true},"message":{"type":"string","readOnly":true},"status":{"$ref":"#/components/schemas/mount_info"}}},"mount_info":{"type":"object","properties":{"id":{"type":"integer"},"major_minor":{"type":"string"},"target":{"type":"string"},"source":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["cifs","nfs","nfs4","fuse.s3fs","fuse.rclone","fuse.core_fuse","fuse"]},"pool_id":{"type":"integer"},"pool_name":{"type":"string"},"nas_id":{"type":"integer"},"nas_name":{"type":"string"},"nas_share_id":{"type":"integer"},"nas_share_name":{"type":"string"},"cloud_connector_id":{"type":"integer"},"cloud_connector_name":{"type":"string"},"cloud_bucket_id":{"type":"integer"},"cloud_bucket_name":{"type":"string"},"tape_id":{"type":"integer"},"tape_barcode":{"type":"string"},"tape_library_id":{"type":"integer"},"tape_library_name":{"type":"string"},"tape_library_serial":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/pools/{pool_id}/nas_shares/{nas_share_id}/mount":{"get":{"summary":"(By pool) Get mount status of NAS Share.","operationId":"mount_status_nas_share_by_pool","description":"**API Key Scope**: nas_shares / mount_status","tags":["nas_shares"],"responses":{"200":{"$ref":"#/components/responses/mount_status"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```


# Tasks

## Lists all tasks.

> \*\*API Key Scope\*\*: tasks / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tasks_index":{"description":"List of tasks.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_collection"}}}}},"schemas":{"task_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"tasks":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task"}}}},"task":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"workflow_type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","data_migration","maintenance","data_enrichment"]},"workflow_action":{"type":"string","enum":["copy","move","erase","scan","rehydratation","format","check_consistency","duplication","cache_cleaning","ejection","get_index","full_backup","incremental_backup","restore","speedtest"]},"source_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"destination_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"priority":{"type":"integer"},"conflict_resolution":{"type":"string","enum":["rename","overwrite","ignore"]},"action":{"type":"string","readOnly":true,"enum":["noop","run","pause","stop","resume"]},"activate":{"type":"integer"},"creation_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"creation_username":{"type":"string","readOnly":true},"modification_username":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["not_activated","done","in_progress","error","paused","stopped_by_system","in_queue","finished_with_warnings","calculating","stopped_by_user"]},"progress":{"type":"integer"},"job_started":{"type":"string","readOnly":true,"format":"date-time"},"job_finished":{"type":"string","readOnly":true,"format":"date-time"},"processed_size":{"type":"integer","readOnly":true,"format":"int64"},"to_process_size":{"type":"integer","readOnly":true,"format":"int64"},"delete":{"type":"integer"},"local_server_path":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"all":{"name":"all","in":"query","description":"For admin only, display also resources by other users.","schema":{"type":"boolean"}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_comment":{"name":"comment","in":"query","description":"Filter on comment","schema":{"type":"string"}},"filter_workflow_type":{"name":"workflow_type","in":"query","description":"Filter on task workflow type","schema":{"type":"string"}},"filter_workflow_action":{"name":"workflow_action","in":"query","description":"Filter on task workflow action","schema":{"type":"string"}},"filter_source_type":{"name":"source_type","in":"query","description":"Filter on task source type","schema":{"type":"string"}},"filter_destination_type":{"name":"destination_type","in":"query","description":"Filter on task destination type","schema":{"type":"string"}},"filter_priority":{"name":"priority","in":"query","description":"Filter on priority","schema":{"type":"string"}},"filter_conflict_resolution":{"name":"conflict_resolution","in":"query","description":"Filter on conflict resolution","schema":{"type":"string"}},"filter_action":{"name":"action","in":"query","description":"Filter on action","schema":{"type":"string"}},"filter_activate":{"name":"activate","in":"query","description":"Filter on activate","schema":{"type":"string"}},"filter_creation_date":{"name":"creation_date","in":"query","description":"Filter on creation date","schema":{"type":"string"}},"filter_creation_username":{"name":"creation_username","in":"query","description":"Filter on creation username","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_modification_username":{"name":"modification_username","in":"query","description":"Filter on modification username","schema":{"type":"string"}},"filter_job_started":{"name":"job_started","in":"query","description":"Filter on job started","schema":{"type":"string"}},"filter_job_finished":{"name":"job_finished","in":"query","description":"Filter on job finished","schema":{"type":"string"}},"filter_status":{"name":"status","in":"query","description":"Filter on status","schema":{"type":"string"}},"filter_processed_size":{"name":"processed_size","in":"query","description":"Filter on processed size","schema":{"type":"string"}},"filter_to_process_size":{"name":"to_process_size","in":"query","description":"Filter on to process size","schema":{"type":"string"}},"filter_source_pool_id":{"name":"source_pool_id","in":"query","description":"Filter on task source pool id","schema":{"type":"string"}},"filter_source_pool_name":{"name":"source_pool_name","in":"query","description":"Filter on task source pool name","schema":{"type":"string"}},"filter_source_tape_id":{"name":"source_tape_id","in":"query","description":"Filter on task source tape id","schema":{"type":"string"}},"filter_source_tape_barcode":{"name":"source_tape_barcode","in":"query","description":"Filter on task source tape barcode","schema":{"type":"string"}},"filter_destination_pool_id":{"name":"destination_pool_id","in":"query","description":"Filter on task destination pool id","schema":{"type":"string"}},"filter_destination_pool_name":{"name":"destination_pool_name","in":"query","description":"Filter on task destination pool name","schema":{"type":"string"}},"filter_destination_tape_id":{"name":"destination_tape_id","in":"query","description":"Filter on task destination tape id","schema":{"type":"string"}},"filter_destination_tape_barcode":{"name":"destination_tape_barcode","in":"query","description":"Filter on task destination tape barcode","schema":{"type":"string"}}}},"paths":{"/tasks":{"get":{"summary":"Lists all tasks.","tags":["tasks"],"operationId":"index_tasks","description":"**API Key Scope**: tasks / index","responses":{"200":{"$ref":"#/components/responses/tasks_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/all"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_comment"},{"$ref":"#/components/parameters/filter_workflow_type"},{"$ref":"#/components/parameters/filter_workflow_action"},{"$ref":"#/components/parameters/filter_source_type"},{"$ref":"#/components/parameters/filter_destination_type"},{"$ref":"#/components/parameters/filter_priority"},{"$ref":"#/components/parameters/filter_conflict_resolution"},{"$ref":"#/components/parameters/filter_action"},{"$ref":"#/components/parameters/filter_activate"},{"$ref":"#/components/parameters/filter_creation_date"},{"$ref":"#/components/parameters/filter_creation_username"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_modification_username"},{"$ref":"#/components/parameters/filter_job_started"},{"$ref":"#/components/parameters/filter_job_finished"},{"$ref":"#/components/parameters/filter_status"},{"$ref":"#/components/parameters/filter_processed_size"},{"$ref":"#/components/parameters/filter_to_process_size"},{"$ref":"#/components/parameters/filter_source_pool_id"},{"$ref":"#/components/parameters/filter_source_pool_name"},{"$ref":"#/components/parameters/filter_source_tape_id"},{"$ref":"#/components/parameters/filter_source_tape_barcode"},{"$ref":"#/components/parameters/filter_destination_pool_id"},{"$ref":"#/components/parameters/filter_destination_pool_name"},{"$ref":"#/components/parameters/filter_destination_tape_id"},{"$ref":"#/components/parameters/filter_destination_tape_barcode"}]}}}}
```

## Creates a new task.

> \*\*API Key Scope\*\*: tasks / create<br>

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tasks_show":{"description":"A specific task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"workflow_type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","data_migration","maintenance","data_enrichment"]},"workflow_action":{"type":"string","enum":["copy","move","erase","scan","rehydratation","format","check_consistency","duplication","cache_cleaning","ejection","get_index","full_backup","incremental_backup","restore","speedtest"]},"source_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"destination_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"priority":{"type":"integer"},"conflict_resolution":{"type":"string","enum":["rename","overwrite","ignore"]},"action":{"type":"string","readOnly":true,"enum":["noop","run","pause","stop","resume"]},"activate":{"type":"integer"},"creation_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"creation_username":{"type":"string","readOnly":true},"modification_username":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["not_activated","done","in_progress","error","paused","stopped_by_system","in_queue","finished_with_warnings","calculating","stopped_by_user"]},"progress":{"type":"integer"},"job_started":{"type":"string","readOnly":true,"format":"date-time"},"job_finished":{"type":"string","readOnly":true,"format":"date-time"},"processed_size":{"type":"integer","readOnly":true,"format":"int64"},"to_process_size":{"type":"integer","readOnly":true,"format":"int64"},"delete":{"type":"integer"},"local_server_path":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task"}}},"required":true}}},"paths":{"/tasks":{"post":{"summary":"Creates a new task.","operationId":"create_task","description":"**API Key Scope**: tasks / create\n","tags":["tasks"],"responses":{"201":{"$ref":"#/components/responses/tasks_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_body"}}}}}
```

## Displays a specific task.

> \*\*API Key Scope\*\*: tasks / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tasks_show":{"description":"A specific task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task"}}}}},"schemas":{"task":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"workflow_type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","data_migration","maintenance","data_enrichment"]},"workflow_action":{"type":"string","enum":["copy","move","erase","scan","rehydratation","format","check_consistency","duplication","cache_cleaning","ejection","get_index","full_backup","incremental_backup","restore","speedtest"]},"source_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"destination_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"priority":{"type":"integer"},"conflict_resolution":{"type":"string","enum":["rename","overwrite","ignore"]},"action":{"type":"string","readOnly":true,"enum":["noop","run","pause","stop","resume"]},"activate":{"type":"integer"},"creation_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"creation_username":{"type":"string","readOnly":true},"modification_username":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["not_activated","done","in_progress","error","paused","stopped_by_system","in_queue","finished_with_warnings","calculating","stopped_by_user"]},"progress":{"type":"integer"},"job_started":{"type":"string","readOnly":true,"format":"date-time"},"job_finished":{"type":"string","readOnly":true,"format":"date-time"},"processed_size":{"type":"integer","readOnly":true,"format":"int64"},"to_process_size":{"type":"integer","readOnly":true,"format":"int64"},"delete":{"type":"integer"},"local_server_path":{"type":"string"}}}}},"paths":{"/tasks/{task_id}":{"get":{"summary":"Displays a specific task.","operationId":"show_task","description":"**API Key Scope**: tasks / show","tags":["tasks"],"responses":{"200":{"$ref":"#/components/responses/tasks_show"}}}}}}
```

## Updates a specific task.

> \*\*API Key Scope\*\*: tasks / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"tasks_show":{"description":"A specific task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"workflow_type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","data_migration","maintenance","data_enrichment"]},"workflow_action":{"type":"string","enum":["copy","move","erase","scan","rehydratation","format","check_consistency","duplication","cache_cleaning","ejection","get_index","full_backup","incremental_backup","restore","speedtest"]},"source_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"destination_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"priority":{"type":"integer"},"conflict_resolution":{"type":"string","enum":["rename","overwrite","ignore"]},"action":{"type":"string","readOnly":true,"enum":["noop","run","pause","stop","resume"]},"activate":{"type":"integer"},"creation_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"creation_username":{"type":"string","readOnly":true},"modification_username":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["not_activated","done","in_progress","error","paused","stopped_by_system","in_queue","finished_with_warnings","calculating","stopped_by_user"]},"progress":{"type":"integer"},"job_started":{"type":"string","readOnly":true,"format":"date-time"},"job_finished":{"type":"string","readOnly":true,"format":"date-time"},"processed_size":{"type":"integer","readOnly":true,"format":"int64"},"to_process_size":{"type":"integer","readOnly":true,"format":"int64"},"delete":{"type":"integer"},"local_server_path":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task"}}},"required":true}}},"paths":{"/tasks/{task_id}":{"put":{"summary":"Updates a specific task.","operationId":"update_task","description":"**API Key Scope**: tasks / update","tags":["tasks"],"responses":{"200":{"$ref":"#/components/responses/tasks_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_body"}}}}}
```

## Destroys a specific task.

> \*\*API Key Scope\*\*: tasks / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tasks/{task_id}":{"delete":{"summary":"Destroys a specific task.","operationId":"destroy_task","description":"**API Key Scope**: tasks / destroy","tags":["tasks"],"responses":{"204":{"description":"Task destroyed."}}}}}}
```

## Check result of a task run request.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/action/run":{"get":{"summary":"Check result of a task run request.","operationId":"run_task_result","tags":["tasks"],"description":"**API Key Scope**: tasks / action","responses":{"200":{"$ref":"#/components/responses/active_job_status"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Run a task.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}}},"paths":{"/tasks/{task_id}/action/run":{"put":{"summary":"Run a task.","operationId":"run_task","description":"**API Key Scope**: tasks / action","tags":["tasks"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}}}}}}
```

## Check result of a task pause request.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/action/pause":{"get":{"summary":"Check result of a task pause request.","operationId":"pause_task_result","tags":["tasks"],"description":"**API Key Scope**: tasks / action","responses":{"200":{"$ref":"#/components/responses/active_job_status"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Pause a task.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}}},"paths":{"/tasks/{task_id}/action/pause":{"put":{"summary":"Pause a task.","operationId":"pause_task","description":"**API Key Scope**: tasks / action","tags":["tasks"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}}}}}}
```

## Check result of a task stop request.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/action/stop":{"get":{"summary":"Check result of a task stop request.","operationId":"stop_task_result","tags":["tasks"],"description":"**API Key Scope**: tasks / action","responses":{"200":{"$ref":"#/components/responses/active_job_status"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Stop a task.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}}},"paths":{"/tasks/{task_id}/action/stop":{"put":{"summary":"Stop a task.","operationId":"stop_task","description":"**API Key Scope**: tasks / action","tags":["tasks"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}}}}}}
```

## Check result of a task resume request.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/action/resume":{"get":{"summary":"Check result of a task resume request.","operationId":"resume_task_result","tags":["tasks"],"description":"**API Key Scope**: tasks / action","responses":{"200":{"$ref":"#/components/responses/active_job_status"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Resume a task.

> \*\*API Key Scope\*\*: tasks / action

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}}},"paths":{"/tasks/{task_id}/action/resume":{"put":{"summary":"Resume a task.","operationId":"resume_task","description":"**API Key Scope**: tasks / action","tags":["tasks"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}}}}}}
```


# Task Sources

## Lists all task sources.

> \*\*API Key Scope\*\*: task\_sources / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_sources_index":{"description":"List of task sources.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_source_collection"}}}}},"schemas":{"task_source_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_sources":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_source_down"}}}},"task_source_down":{"allOf":[{"$ref":"#/components/schemas/task_source_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"file":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"import_file":{"$ref":"#/components/schemas/import_file_with_path"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_source_up":{"type":"object","properties":{"file_id":{"type":"integer","format":"int64"},"file_path":{"type":"string"},"range":{"maxItems":2,"minItems":2,"type":"array","items":{"type":"integer","format":"int64"}},"import_file_id":{"type":"integer","format":"int64"},"import_file_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"import_file_with_path":{"allOf":[{"$ref":"#/components/schemas/import_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"import_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_file_id":{"name":"file_id","in":"query","description":"Filter on file id","schema":{"type":"string"}},"filter_import_file_id":{"name":"import_file_id","in":"query","description":"Filter on import file id","schema":{"type":"string"}},"filter_tape_id":{"name":"tape_id","in":"query","description":"Filter on tape id","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/task_sources":{"get":{"summary":"Lists all task sources.","tags":["task_sources"],"operationId":"index_task_sources","description":"**API Key Scope**: task_sources / index","responses":{"200":{"$ref":"#/components/responses/task_sources_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_file_id"},{"$ref":"#/components/parameters/filter_import_file_id"},{"$ref":"#/components/parameters/filter_tape_id"},{"$ref":"#/components/parameters/filter_pool_id"}]}}}}
```

## Creates a new task source.

> \*\*API Key Scope\*\*: task\_sources / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_sources_show":{"description":"A specific task source.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_source_down"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_source_down":{"allOf":[{"$ref":"#/components/schemas/task_source_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"file":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"import_file":{"$ref":"#/components/schemas/import_file_with_path"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_source_up":{"type":"object","properties":{"file_id":{"type":"integer","format":"int64"},"file_path":{"type":"string"},"range":{"maxItems":2,"minItems":2,"type":"array","items":{"type":"integer","format":"int64"}},"import_file_id":{"type":"integer","format":"int64"},"import_file_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"import_file_with_path":{"allOf":[{"$ref":"#/components/schemas/import_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"import_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_source_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_source_up"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_sources":{"post":{"summary":"Creates a new task source.","operationId":"create_task_source","description":"**API Key Scope**: task_sources / create","tags":["task_sources"],"responses":{"201":{"$ref":"#/components/responses/task_sources_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_source_body"}}}}}
```

## Displays a specific task source.

> \*\*API Key Scope\*\*: task\_sources / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_sources_show":{"description":"A specific task source.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_source_down"}}}}},"schemas":{"task_source_down":{"allOf":[{"$ref":"#/components/schemas/task_source_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"file":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"import_file":{"$ref":"#/components/schemas/import_file_with_path"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_source_up":{"type":"object","properties":{"file_id":{"type":"integer","format":"int64"},"file_path":{"type":"string"},"range":{"maxItems":2,"minItems":2,"type":"array","items":{"type":"integer","format":"int64"}},"import_file_id":{"type":"integer","format":"int64"},"import_file_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"import_file_with_path":{"allOf":[{"$ref":"#/components/schemas/import_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"import_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}}}},"paths":{"/tasks/{task_id}/task_sources/{task_source_id}":{"get":{"summary":"Displays a specific task source.","operationId":"show_task_source","description":"**API Key Scope**: task_sources / show","tags":["task_sources"],"responses":{"200":{"$ref":"#/components/responses/task_sources_show"}}}}}}
```

## Updates a specific task source.

> \*\*API Key Scope\*\*: task\_sources / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_sources_show":{"description":"A specific task source.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_source_down"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_source_down":{"allOf":[{"$ref":"#/components/schemas/task_source_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"file":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"import_file":{"$ref":"#/components/schemas/import_file_with_path"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_source_up":{"type":"object","properties":{"file_id":{"type":"integer","format":"int64"},"file_path":{"type":"string"},"range":{"maxItems":2,"minItems":2,"type":"array","items":{"type":"integer","format":"int64"}},"import_file_id":{"type":"integer","format":"int64"},"import_file_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"import_file_with_path":{"allOf":[{"$ref":"#/components/schemas/import_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"import_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_source_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_source_up"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_sources/{task_source_id}":{"put":{"summary":"Updates a specific task source.","operationId":"update_task_source","description":"**API Key Scope**: task_sources / update","tags":["task_sources"],"responses":{"200":{"$ref":"#/components/responses/task_sources_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_source_body"}}}}}
```

## Destroys a specific task source.

> \*\*API Key Scope\*\*: task\_sources / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tasks/{task_id}/task_sources/{task_source_id}":{"delete":{"summary":"Destroys a specific task source.","operationId":"destroy_task_source","description":"**API Key Scope**: task_sources / destroy","tags":["task_sources"],"responses":{"204":{"description":"Task source destroyed."}}}}}}
```


# Task Destinations

## Lists all task destinations.

> \*\*API Key Scope\*\*: task\_destinations / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_folder_id":{"name":"folder_id","in":"query","description":"Filter on folder id","schema":{"type":"string"}},"filter_tape_id":{"name":"tape_id","in":"query","description":"Filter on tape id","schema":{"type":"string"}},"filter_pool_id":{"name":"pool_id","in":"query","description":"Filter on a pool id","schema":{"type":"string"}}},"responses":{"task_destinations_index":{"description":"List of task destinations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_destination_collection"}}}}},"schemas":{"task_destination_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_destinations":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_destination_down"}}}},"task_destination_down":{"allOf":[{"$ref":"#/components/schemas/task_destination_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"folder":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_destination_up":{"type":"object","properties":{"folder_id":{"type":"integer","format":"int64"},"folder_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}}}},"paths":{"/tasks/{task_id}/task_destinations":{"get":{"summary":"Lists all task destinations.","operationId":"index_task_destinations","tags":["task_destinations"],"description":"**API Key Scope**: task_destinations / index","parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_folder_id"},{"$ref":"#/components/parameters/filter_tape_id"},{"$ref":"#/components/parameters/filter_pool_id"}],"responses":{"200":{"$ref":"#/components/responses/task_destinations_index"}}}}}}
```

## Creates a new task destination.

> \*\*API Key Scope\*\*: task\_destinations / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_destinations_show":{"description":"A specific task destination.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_destination_down"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_destination_down":{"allOf":[{"$ref":"#/components/schemas/task_destination_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"folder":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_destination_up":{"type":"object","properties":{"folder_id":{"type":"integer","format":"int64"},"folder_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_destination_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_destination_up"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_destinations":{"post":{"summary":"Creates a new task destination.","operationId":"create_task_destination","description":"**API Key Scope**: task_destinations / create","tags":["task_destinations"],"responses":{"201":{"$ref":"#/components/responses/task_destinations_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_destination_body"}}}}}
```

## Displays a specific task destination.

> \*\*API Key Scope\*\*: task\_destinations / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_destinations_show":{"description":"A specific task destination.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_destination_down"}}}}},"schemas":{"task_destination_down":{"allOf":[{"$ref":"#/components/schemas/task_destination_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"folder":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_destination_up":{"type":"object","properties":{"folder_id":{"type":"integer","format":"int64"},"folder_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}}}},"paths":{"/tasks/{task_id}/task_destinations/{task_destination_id}":{"get":{"summary":"Displays a specific task destination.","operationId":"show_task_destination","description":"**API Key Scope**: task_destinations / show","tags":["task_destinations"],"responses":{"200":{"$ref":"#/components/responses/task_destinations_show"}}}}}}
```

## Updates a specific task destination.

> \*\*API Key Scope\*\*: task\_destinations / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_destinations_show":{"description":"A specific task destination.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_destination_down"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_destination_down":{"allOf":[{"$ref":"#/components/schemas/task_destination_up"},{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"folder":{"$ref":"#/components/schemas/nodeum_file_with_path"},"container":{"$ref":"#/components/schemas/container"},"tape":{"$ref":"#/components/schemas/tape"},"pool":{"$ref":"#/components/schemas/pool"}}}]},"task_destination_up":{"type":"object","properties":{"folder_id":{"type":"integer","format":"int64"},"folder_path":{"type":"string"},"tape_id":{"type":"integer","format":"int64"},"tape_barcode":{"type":"string"},"pool_id":{"type":"integer"},"pool_name":{"type":"string"}}},"nodeum_file_with_path":{"allOf":[{"$ref":"#/components/schemas/nodeum_file"},{"type":"object","properties":{"file_path":{"type":"string","readOnly":true}}}]},"nodeum_file":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string","readOnly":true},"parent":{"type":"integer","readOnly":true,"format":"int64"},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","readOnly":true,"enum":["file","folder"]},"permission":{"type":"integer","readOnly":true},"size":{"type":"integer","readOnly":true,"format":"int64"},"change_date":{"type":"string","readOnly":true,"format":"date-time"},"modification_date":{"type":"string","readOnly":true,"format":"date-time"},"access_date":{"type":"string","readOnly":true,"format":"date-time"},"uid":{"type":"integer","readOnly":true,"format":"int64"},"gid":{"type":"integer","readOnly":true,"format":"int64"},"in_cache":{"type":"string","readOnly":true,"enum":["out_of_cache","in_cache","deleted"]},"offline":{"type":"string","readOnly":true,"enum":["online","offline_out_of_lib","offline"]},"extern":{"type":"integer","readOnly":true},"checksums":{"type":"array","description":"Checksums on the specific location. Does not apply to all API calls","readOnly":true,"items":{"type":"string"}},"tapes":{"type":"array","description":"Tape barcode on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"cloud_buckets":{"type":"array","description":"Cloud bucket names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}},"nas_shares":{"type":"array","description":"NAS Share names on the specific location. Does not apply on folders. Only available on related API calls","readOnly":true,"items":{"type":"string"}}}},"container":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"name":{"type":"string"},"comment":{"type":"string"},"push_pool_id":{"type":"integer","format":"int64"},"cleaning_pool_id":{"type":"integer","format":"int64"},"quota_total_size":{"type":"integer","format":"int64"},"quota_on_cache":{"type":"integer","format":"int64"},"stat_total_files":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_count":{"type":"integer","readOnly":true,"format":"int64"},"stat_total_size":{"type":"integer","readOnly":true,"format":"int64"},"stat_size_on_cache":{"type":"integer","readOnly":true,"format":"int64"},"only_on_cache_file_size_sum":{"type":"integer","readOnly":true,"format":"int64"},"guest_right":{"type":"string","enum":["none","read","read_write"]},"last_update":{"type":"string","readOnly":true,"format":"date-time"},"protocol_smb":{"type":"boolean"},"protocol_nfs":{"type":"boolean"},"protocol_s3":{"type":"boolean"}}},"tape":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"tape_library_id":{"type":"integer","readOnly":true,"format":"int64"},"pool_id":{"type":"integer","readOnly":true},"barcode":{"type":"string","readOnly":true},"location":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true,"enum":["unknown","data","cleaning","diagnostic","data_lto1","data_lto2","data_lto3","data_lto4","data_lto5","data_lto6","data_lto7","data_lto8","data_lto8m","data_lto9","data_lto10","data_lto11","data_lto12"]},"locked":{"type":"integer","readOnly":true},"scratch":{"type":"integer","readOnly":true},"cleaning":{"type":"integer","readOnly":true},"write_protect":{"type":"array","items":{"type":"string","enum":["logical_locked","physical_locked"]},"readOnly":true},"mounted":{"type":"integer","readOnly":true},"ejected":{"type":"integer","readOnly":true},"known":{"type":"integer","readOnly":true},"mount_count":{"type":"integer","readOnly":true},"date_in":{"type":"string","readOnly":true,"format":"date-time"},"date_move":{"type":"string","readOnly":true,"format":"date-time"},"free":{"type":"integer","readOnly":true,"format":"int64"},"max":{"type":"integer","readOnly":true,"format":"int64"},"last_size_update":{"type":"string","readOnly":true,"format":"date-time"},"last_maintenance":{"type":"string","readOnly":true,"format":"date-time"},"last_repack":{"type":"string","readOnly":true,"format":"date-time"},"repack_status":{"type":"integer","readOnly":true},"force_import_type":{"type":"integer","readOnly":true},"need_to_check":{"type":"integer","readOnly":true}}},"pool":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string"},"comment":{"type":"string"},"type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","scratch","data_enrichment","primary"]},"content":{"type":"string","enum":["tape","cloud","nas"]},"primary_id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","description":"For pool of tapes, used to link to a tape library id","format":"int64"},"tape_write_protect_when_full":{"type":"boolean","description":"For pool of tapes, set the tape in write-protect when it became full"},"storage_extra_data":{"$ref":"#/components/schemas/storage_extra_data","description":"Additional storage metadata"}}},"storage_extra_data":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"storage_id":{"type":"integer","format":"int64"},"storage_type":{"type":"integer","enum":[1,2,3,4,5,6,7,8,9]},"data":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_destination_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_destination_up"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_destinations/{task_destination_id}":{"put":{"summary":"Updates a specific task destination.","operationId":"update_task_destination","description":"**API Key Scope**: task_destinations / update","tags":["task_destinations"],"responses":{"200":{"$ref":"#/components/responses/task_destinations_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_destination_body"}}}}}
```

## Destroys a specific task destination.

> \*\*API Key Scope\*\*: task\_destinations / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tasks/{task_id}/task_destinations/{task_destination_id}":{"delete":{"summary":"Destroys a specific task destination.","operationId":"destroy_task_destination","description":"**API Key Scope**: task_destinations / destroy","tags":["task_destinations"],"responses":{"204":{"description":"Task destination destroyed."}}}}}}
```


# Task Schedules

## Lists all task schedules.

> \*\*API Key Scope\*\*: task\_schedules / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_schedules_index":{"description":"List of task schedules.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_schedule_collection"}}}}},"schemas":{"task_schedule_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_schedules":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_schedule"}}}},"task_schedule":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"task_id":{"type":"integer","format":"int64"},"rrule":{"type":"string"},"done":{"type":"boolean"},"next":{"type":"string","readOnly":true},"missed_count":{"type":"integer","readOnly":true},"skipped_count":{"type":"integer","readOnly":true},"missed_last":{"type":"string","readOnly":true},"missed_first":{"type":"string","readOnly":true}}}},"parameters":{"with_next_schedule":{"name":"with_next","in":"query","description":"Display the next scheduled date, and information about missing executions.","schema":{"type":"boolean","default":true}},"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_rrule":{"name":"rrule","in":"query","description":"Filter on RRule of schedule","schema":{"type":"string"}},"filter_done":{"name":"done","in":"query","description":"Filter on done schedule","schema":{"type":"string"}},"filter_task_id":{"name":"task_id","in":"query","description":"Filter on task id","schema":{"type":"string"}}}},"paths":{"/task_schedules":{"get":{"summary":"Lists all task schedules.","tags":["task_schedules"],"operationId":"index_task_schedules","description":"**API Key Scope**: task_schedules / index","responses":{"200":{"$ref":"#/components/responses/task_schedules_index"}},"parameters":[{"$ref":"#/components/parameters/with_next_schedule"},{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_rrule"},{"$ref":"#/components/parameters/filter_done"},{"$ref":"#/components/parameters/filter_task_id"}]}}}}
```

## Displays the task schedule.

> \*\*API Key Scope\*\*: task\_schedules / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_schedule_show":{"description":"A specific task schedule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_schedule"}}}}},"schemas":{"task_schedule":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"task_id":{"type":"integer","format":"int64"},"rrule":{"type":"string"},"done":{"type":"boolean"},"next":{"type":"string","readOnly":true},"missed_count":{"type":"integer","readOnly":true},"skipped_count":{"type":"integer","readOnly":true},"missed_last":{"type":"string","readOnly":true},"missed_first":{"type":"string","readOnly":true}}}}},"paths":{"/tasks/{task_id}/task_schedule":{"get":{"summary":"Displays the task schedule.","operationId":"show_task_schedule","description":"**API Key Scope**: task_schedules / show","tags":["task_schedules"],"responses":{"200":{"$ref":"#/components/responses/task_schedule_show"}}}}}}
```

## Creates a new task schedule. Only one should be created.

> \*\*API Key Scope\*\*: task\_schedules / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_schedule_show":{"description":"A specific task schedule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_schedule"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_schedule":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"task_id":{"type":"integer","format":"int64"},"rrule":{"type":"string"},"done":{"type":"boolean"},"next":{"type":"string","readOnly":true},"missed_count":{"type":"integer","readOnly":true},"skipped_count":{"type":"integer","readOnly":true},"missed_last":{"type":"string","readOnly":true},"missed_first":{"type":"string","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_schedule_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_schedule"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_schedule":{"post":{"summary":"Creates a new task schedule. Only one should be created.","operationId":"create_task_schedule","description":"**API Key Scope**: task_schedules / create","tags":["task_schedules"],"responses":{"201":{"$ref":"#/components/responses/task_schedule_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_schedule_body"}}}}}
```

## Updates the existing task schedule.

> \*\*API Key Scope\*\*: task\_schedules / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_schedule_show":{"description":"A specific task schedule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_schedule"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_schedule":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"task_id":{"type":"integer","format":"int64"},"rrule":{"type":"string"},"done":{"type":"boolean"},"next":{"type":"string","readOnly":true},"missed_count":{"type":"integer","readOnly":true},"skipped_count":{"type":"integer","readOnly":true},"missed_last":{"type":"string","readOnly":true},"missed_first":{"type":"string","readOnly":true}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_schedule_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_schedule"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_schedule":{"put":{"summary":"Updates the existing task schedule.","operationId":"update_task_schedule","description":"**API Key Scope**: task_schedules / update","tags":["task_schedules"],"responses":{"200":{"$ref":"#/components/responses/task_schedule_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_schedule_body"}}}}}
```

## Destroys the task schedule.

> \*\*API Key Scope\*\*: task\_schedules / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tasks/{task_id}/task_schedule":{"delete":{"summary":"Destroys the task schedule.","operationId":"destroy_task_schedule","description":"**API Key Scope**: task_schedules / destroy","tags":["task_schedules"],"responses":{"204":{"description":"Task schedule destroyed."}}}}}}
```


# Task Options

## Lists all task options.

> \*\*API Key Scope\*\*: task\_options / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_options_index":{"description":"List of task options.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_option_collection"}}}}},"schemas":{"task_option_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_options":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_option"}}}},"task_option":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["file_checksum","reset_file_date","reset_folder_date","rename_to","execution_task_id","selected_drive","parallel_processing","task_id","full_report","processing_order","rehydration_usage_threshold","rehydration_deleted_files_threshold","learning_type","learning_threshold","tape_to_scratch","eject_tape_after","barcodes","overwrite","soft_erase","limit_nb_files_per_job","limit_nb_parallel_job","limit_nb_parallel_db_file","limit_max_size_per_job","ignore_common_path","remove_selected_folders","vault_to_s3_glacier","restoration_expiry_days","retrieval_option","speedtest_size","speedtest_iterations","set_tape_readonly","set_task_notification","tape_duplication_action","selected_drive_2","backup_report","task_template","norenaming","after_copy_verification","preserve_acl","restore_acl","create_reminder_txt","backup_replication","conflict_resolution"]},"value":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_value":{"name":"value","in":"query","description":"Filter on value","schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/task_options":{"get":{"summary":"Lists all task options.","tags":["task_options"],"operationId":"index_task_options","description":"**API Key Scope**: task_options / index","responses":{"200":{"$ref":"#/components/responses/task_options_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_value"}]}}}}
```

## Creates a new task option.

> \*\*API Key Scope\*\*: task\_options / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_options_show":{"description":"A specific task option.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_option"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_option":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["file_checksum","reset_file_date","reset_folder_date","rename_to","execution_task_id","selected_drive","parallel_processing","task_id","full_report","processing_order","rehydration_usage_threshold","rehydration_deleted_files_threshold","learning_type","learning_threshold","tape_to_scratch","eject_tape_after","barcodes","overwrite","soft_erase","limit_nb_files_per_job","limit_nb_parallel_job","limit_nb_parallel_db_file","limit_max_size_per_job","ignore_common_path","remove_selected_folders","vault_to_s3_glacier","restoration_expiry_days","retrieval_option","speedtest_size","speedtest_iterations","set_tape_readonly","set_task_notification","tape_duplication_action","selected_drive_2","backup_report","task_template","norenaming","after_copy_verification","preserve_acl","restore_acl","create_reminder_txt","backup_replication","conflict_resolution"]},"value":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_option_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_option"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_options":{"post":{"summary":"Creates a new task option.","operationId":"create_task_option","description":"**API Key Scope**: task_options / create","tags":["task_options"],"responses":{"201":{"$ref":"#/components/responses/task_options_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_option_body"}}}}}
```

## Displays a specific task option.

> \*\*API Key Scope\*\*: task\_options / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_options_show":{"description":"A specific task option.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_option"}}}}},"schemas":{"task_option":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["file_checksum","reset_file_date","reset_folder_date","rename_to","execution_task_id","selected_drive","parallel_processing","task_id","full_report","processing_order","rehydration_usage_threshold","rehydration_deleted_files_threshold","learning_type","learning_threshold","tape_to_scratch","eject_tape_after","barcodes","overwrite","soft_erase","limit_nb_files_per_job","limit_nb_parallel_job","limit_nb_parallel_db_file","limit_max_size_per_job","ignore_common_path","remove_selected_folders","vault_to_s3_glacier","restoration_expiry_days","retrieval_option","speedtest_size","speedtest_iterations","set_tape_readonly","set_task_notification","tape_duplication_action","selected_drive_2","backup_report","task_template","norenaming","after_copy_verification","preserve_acl","restore_acl","create_reminder_txt","backup_replication","conflict_resolution"]},"value":{"type":"string"}}}}},"paths":{"/tasks/{task_id}/task_options/{task_option_id}":{"get":{"summary":"Displays a specific task option.","operationId":"show_task_option","description":"**API Key Scope**: task_options / show","tags":["task_options"],"responses":{"200":{"$ref":"#/components/responses/task_options_show"}}}}}}
```

## Updates a specific task option.

> \*\*API Key Scope\*\*: task\_options / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_options_show":{"description":"A specific task option.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_option"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_option":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["file_checksum","reset_file_date","reset_folder_date","rename_to","execution_task_id","selected_drive","parallel_processing","task_id","full_report","processing_order","rehydration_usage_threshold","rehydration_deleted_files_threshold","learning_type","learning_threshold","tape_to_scratch","eject_tape_after","barcodes","overwrite","soft_erase","limit_nb_files_per_job","limit_nb_parallel_job","limit_nb_parallel_db_file","limit_max_size_per_job","ignore_common_path","remove_selected_folders","vault_to_s3_glacier","restoration_expiry_days","retrieval_option","speedtest_size","speedtest_iterations","set_tape_readonly","set_task_notification","tape_duplication_action","selected_drive_2","backup_report","task_template","norenaming","after_copy_verification","preserve_acl","restore_acl","create_reminder_txt","backup_replication","conflict_resolution"]},"value":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_option_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_option"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_options/{task_option_id}":{"put":{"summary":"Updates a specific task option.","operationId":"update_task_option","description":"**API Key Scope**: task_options / update","tags":["task_options"],"responses":{"200":{"$ref":"#/components/responses/task_options_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_option_body"}}}}}
```

## Destroys a specific task option.

> \*\*API Key Scope\*\*: task\_options / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tasks/{task_id}/task_options/{task_option_id}":{"delete":{"summary":"Destroys a specific task option.","operationId":"destroy_task_option","description":"**API Key Scope**: task_options / destroy","tags":["task_options"],"responses":{"204":{"description":"Task option destroyed."}}}}}}
```


# Task Callbacks

## Lists all task callbacks.

> \*\*API Key Scope\*\*: task\_callbacks / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_callbacks_index":{"description":"List of task callbacks.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_callback_collection"}}}}},"schemas":{"task_callback_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_callbacks":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_callback"}}}},"task_callback":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["filter"]},"script":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_type":{"name":"type","in":"query","description":"Filter on type","schema":{"type":"string"}},"filter_script":{"name":"script","in":"query","description":"Filter on task callback script","schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/task_callbacks":{"get":{"summary":"Lists all task callbacks.","tags":["task_callbacks"],"operationId":"index_task_callbacks","description":"**API Key Scope**: task_callbacks / index","responses":{"200":{"$ref":"#/components/responses/task_callbacks_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_type"},{"$ref":"#/components/parameters/filter_script"}]}}}}
```

## Creates a new task callback.

> \*\*API Key Scope\*\*: task\_callbacks / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_callbacks_show":{"description":"A specific task callback.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_callback"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_callback":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["filter"]},"script":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_callback_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_callback"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_callbacks":{"post":{"summary":"Creates a new task callback.","operationId":"create_task_callback","description":"**API Key Scope**: task_callbacks / create","tags":["task_callbacks"],"responses":{"201":{"$ref":"#/components/responses/task_callbacks_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_callback_body"}}}}}
```

## Displays a specific task callback.

> \*\*API Key Scope\*\*: task\_callbacks / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_callbacks_show":{"description":"A specific task callback.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_callback"}}}}},"schemas":{"task_callback":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["filter"]},"script":{"type":"string"}}}}},"paths":{"/tasks/{task_id}/task_callbacks/{task_callback_id}":{"get":{"summary":"Displays a specific task callback.","operationId":"show_task_callback","description":"**API Key Scope**: task_callbacks / show","tags":["task_callbacks"],"responses":{"200":{"$ref":"#/components/responses/task_callbacks_show"}}}}}}
```

## Updates a specific task callback.

> \*\*API Key Scope\*\*: task\_callbacks / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_callbacks_show":{"description":"A specific task callback.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_callback"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_callback":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"type":{"type":"string","enum":["filter"]},"script":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_callback_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_callback"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_callbacks/{task_callback_id}":{"put":{"summary":"Updates a specific task callback.","operationId":"update_task_callback","description":"**API Key Scope**: task_callbacks / update","tags":["task_callbacks"],"responses":{"200":{"$ref":"#/components/responses/task_callbacks_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_callback_body"}}}}}
```

## Destroys a specific task callback.

> \*\*API Key Scope\*\*: task\_callbacks / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tasks/{task_id}/task_callbacks/{task_callback_id}":{"delete":{"summary":"Destroys a specific task callback.","operationId":"destroy_task_callback","description":"**API Key Scope**: task_callbacks / destroy","tags":["task_callbacks"],"responses":{"204":{"description":"Task callback destroyed."}}}}}}
```


# Task Metadata

## Lists all task metadata.

> \*\*API Key Scope\*\*: task\_metadata / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_metadata_index":{"description":"List of task metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadatum_collection"}}}}},"schemas":{"task_metadatum_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_metadata":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_metadatum"}}}},"task_metadatum":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"value":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_key":{"name":"key","in":"query","description":"Filter on key","schema":{"type":"string"}},"filter_value":{"name":"value","in":"query","description":"Filter on value","schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/task_metadata":{"get":{"summary":"Lists all task metadata.","tags":["task_metadata"],"operationId":"index_task_metadata","description":"**API Key Scope**: task_metadata / index","responses":{"200":{"$ref":"#/components/responses/task_metadata_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_key"},{"$ref":"#/components/parameters/filter_value"}]}}}}
```

## Creates a new task metadatum.

> \*\*API Key Scope\*\*: task\_metadata / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_metadata_show":{"description":"A specific task metadatum.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadatum"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_metadatum":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"value":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_metadatum_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadatum"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_metadata":{"post":{"summary":"Creates a new task metadatum.","operationId":"create_task_metadatum","description":"**API Key Scope**: task_metadata / create","tags":["task_metadata"],"responses":{"201":{"$ref":"#/components/responses/task_metadata_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_metadatum_body"}}}}}
```

## Displays a specific task metadatum.

> \*\*API Key Scope\*\*: task\_metadata / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_metadata_show":{"description":"A specific task metadatum.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadatum"}}}}},"schemas":{"task_metadatum":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"value":{"type":"string"}}}}},"paths":{"/tasks/{task_id}/task_metadata/{task_metadatum_id}":{"get":{"summary":"Displays a specific task metadatum.","operationId":"show_task_metadatum","description":"**API Key Scope**: task_metadata / show","tags":["task_metadata"],"responses":{"200":{"$ref":"#/components/responses/task_metadata_show"}}}}}}
```

## Updates a specific task metadatum.

> \*\*API Key Scope\*\*: task\_metadata / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_metadata_show":{"description":"A specific task metadatum.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadatum"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_metadatum":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"value":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"task_metadatum_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadatum"}}},"required":true}}},"paths":{"/tasks/{task_id}/task_metadata/{task_metadatum_id}":{"put":{"summary":"Updates a specific task metadatum.","operationId":"update_task_metadatum","description":"**API Key Scope**: task_metadata / update","tags":["task_metadata"],"responses":{"200":{"$ref":"#/components/responses/task_metadata_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/task_metadatum_body"}}}}}
```

## Destroys a specific task metadatum.

> \*\*API Key Scope\*\*: task\_metadata / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/tasks/{task_id}/task_metadata/{task_metadatum_id}":{"delete":{"summary":"Destroys a specific task metadatum.","operationId":"destroy_task_metadatum","description":"**API Key Scope**: task_metadata / destroy","tags":["task_metadata"],"responses":{"204":{"description":"Task metadatum destroyed."}}}}}}
```


# Task Executions

## (By task) Lists all task executions.

> \*\*API Key Scope\*\*: task\_executions / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_executions_index":{"description":"List of task executions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_execution_collection"}}}}},"schemas":{"task_execution_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_executions":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_execution"}}}},"task_execution":{"type":"object","properties":{"id":{"type":"string"},"task_id":{"type":"integer","format":"int64"},"name":{"type":"string"},"workflow_type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","data_migration","maintenance","data_enrichment"]},"workflow_action":{"type":"string","enum":["copy","move","erase","scan","rehydratation","format","check_consistency","duplication","cache_cleaning","ejection","get_index","full_backup","incremental_backup","restore","speedtest"]},"source_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"destination_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"status":{"type":"string","enum":["not_activated","done","in_progress","error","paused","stopped_by_system","in_queue","finished_with_warnings","calculating","stopped_by_user"]},"progress":{"type":"integer"},"log_time":{"type":"string"},"job_started":{"type":"string"},"job_finished":{"type":"string"},"to_process_size":{"type":"integer","format":"int64"},"processed_size":{"type":"integer","format":"int64"},"to_process_files":{"type":"integer","format":"int64"},"processed_files":{"type":"integer","format":"int64"},"finalized_files":{"type":"integer","format":"int64"},"estimation_time":{"type":"integer"},"bandwidth":{"type":"integer","format":"int64"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_workflow_type":{"name":"workflow_type","in":"query","description":"Filter on task workflow type","schema":{"type":"string"}},"filter_workflow_action":{"name":"workflow_action","in":"query","description":"Filter on task workflow action","schema":{"type":"string"}},"filter_source_type":{"name":"source_type","in":"query","description":"Filter on task source type","schema":{"type":"string"}},"filter_destination_type":{"name":"destination_type","in":"query","description":"Filter on task destination type","schema":{"type":"string"}},"filter_status":{"name":"status","in":"query","description":"Filter on status","schema":{"type":"string"}},"filter_log_time":{"name":"log_time","in":"query","description":"Filter on log time","schema":{"type":"string"}},"filter_job_started":{"name":"job_started","in":"query","description":"Filter on job started","schema":{"type":"string"}},"filter_job_finished":{"name":"job_finished","in":"query","description":"Filter on job finished","schema":{"type":"string"}},"filter_to_process_size":{"name":"to_process_size","in":"query","description":"Filter on to process size","schema":{"type":"string"}},"filter_processed_size":{"name":"processed_size","in":"query","description":"Filter on processed size","schema":{"type":"string"}},"filter_to_process_files":{"name":"to_process_files","in":"query","description":"Filter on to process files","schema":{"type":"string"}},"filter_processed_files":{"name":"processed_files","in":"query","description":"Filter on processed files","schema":{"type":"string"}},"filter_finalized_files":{"name":"finalized_files","in":"query","description":"Filter on finalized files","schema":{"type":"string"}},"filter_estimation_time":{"name":"estimation_time","in":"query","description":"Filter on estimation time","schema":{"type":"string"}},"filter_bandwidth":{"name":"bandwidth","in":"query","description":"Filter on bandwidth","schema":{"type":"string"}}}},"paths":{"/tasks/{task_id}/task_executions":{"get":{"summary":"(By task) Lists all task executions.","operationId":"index_task_executions_by_task","description":"**API Key Scope**: task_executions / index","tags":["task_executions"],"responses":{"200":{"$ref":"#/components/responses/task_executions_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_workflow_type"},{"$ref":"#/components/parameters/filter_workflow_action"},{"$ref":"#/components/parameters/filter_source_type"},{"$ref":"#/components/parameters/filter_destination_type"},{"$ref":"#/components/parameters/filter_status"},{"$ref":"#/components/parameters/filter_log_time"},{"$ref":"#/components/parameters/filter_job_started"},{"$ref":"#/components/parameters/filter_job_finished"},{"$ref":"#/components/parameters/filter_to_process_size"},{"$ref":"#/components/parameters/filter_processed_size"},{"$ref":"#/components/parameters/filter_to_process_files"},{"$ref":"#/components/parameters/filter_processed_files"},{"$ref":"#/components/parameters/filter_finalized_files"},{"$ref":"#/components/parameters/filter_estimation_time"},{"$ref":"#/components/parameters/filter_bandwidth"}]}}}}
```

## Lists all task executions.

> \*\*API Key Scope\*\*: task\_executions / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_executions_index":{"description":"List of task executions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_execution_collection"}}}}},"schemas":{"task_execution_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_executions":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_execution"}}}},"task_execution":{"type":"object","properties":{"id":{"type":"string"},"task_id":{"type":"integer","format":"int64"},"name":{"type":"string"},"workflow_type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","data_migration","maintenance","data_enrichment"]},"workflow_action":{"type":"string","enum":["copy","move","erase","scan","rehydratation","format","check_consistency","duplication","cache_cleaning","ejection","get_index","full_backup","incremental_backup","restore","speedtest"]},"source_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"destination_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"status":{"type":"string","enum":["not_activated","done","in_progress","error","paused","stopped_by_system","in_queue","finished_with_warnings","calculating","stopped_by_user"]},"progress":{"type":"integer"},"log_time":{"type":"string"},"job_started":{"type":"string"},"job_finished":{"type":"string"},"to_process_size":{"type":"integer","format":"int64"},"processed_size":{"type":"integer","format":"int64"},"to_process_files":{"type":"integer","format":"int64"},"processed_files":{"type":"integer","format":"int64"},"finalized_files":{"type":"integer","format":"int64"},"estimation_time":{"type":"integer"},"bandwidth":{"type":"integer","format":"int64"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"complete_list":{"name":"complete_list","in":"query","description":"If `false`, only includes the last correct execution of a task.","schema":{"type":"boolean","default":true}},"filter_id":{"name":"id","in":"query","description":"Filter on id","schema":{"type":"string"}},"filter_task_id":{"name":"task_id","in":"query","description":"Filter on task id","schema":{"type":"string"}},"filter_name":{"name":"name","in":"query","description":"Filter on name","schema":{"type":"string"}},"filter_workflow_type":{"name":"workflow_type","in":"query","description":"Filter on task workflow type","schema":{"type":"string"}},"filter_workflow_action":{"name":"workflow_action","in":"query","description":"Filter on task workflow action","schema":{"type":"string"}},"filter_source_type":{"name":"source_type","in":"query","description":"Filter on task source type","schema":{"type":"string"}},"filter_destination_type":{"name":"destination_type","in":"query","description":"Filter on task destination type","schema":{"type":"string"}},"filter_status":{"name":"status","in":"query","description":"Filter on status","schema":{"type":"string"}},"filter_log_time":{"name":"log_time","in":"query","description":"Filter on log time","schema":{"type":"string"}},"filter_job_started":{"name":"job_started","in":"query","description":"Filter on job started","schema":{"type":"string"}},"filter_job_finished":{"name":"job_finished","in":"query","description":"Filter on job finished","schema":{"type":"string"}},"filter_creation_date":{"name":"creation_date","in":"query","description":"Filter on creation date","schema":{"type":"string"}},"filter_modification_date":{"name":"modification_date","in":"query","description":"Filter on modification date","schema":{"type":"string"}},"filter_to_process_size":{"name":"to_process_size","in":"query","description":"Filter on to process size","schema":{"type":"string"}},"filter_processed_size":{"name":"processed_size","in":"query","description":"Filter on processed size","schema":{"type":"string"}},"filter_to_process_files":{"name":"to_process_files","in":"query","description":"Filter on to process files","schema":{"type":"string"}},"filter_processed_files":{"name":"processed_files","in":"query","description":"Filter on processed files","schema":{"type":"string"}},"filter_finalized_files":{"name":"finalized_files","in":"query","description":"Filter on finalized files","schema":{"type":"string"}},"filter_estimation_time":{"name":"estimation_time","in":"query","description":"Filter on estimation time","schema":{"type":"string"}},"filter_bandwidth":{"name":"bandwidth","in":"query","description":"Filter on bandwidth","schema":{"type":"string"}}}},"paths":{"/task_executions":{"get":{"summary":"Lists all task executions.","tags":["task_executions"],"operationId":"index_task_executions","description":"**API Key Scope**: task_executions / index","responses":{"200":{"$ref":"#/components/responses/task_executions_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/complete_list"},{"$ref":"#/components/parameters/filter_id"},{"$ref":"#/components/parameters/filter_task_id"},{"$ref":"#/components/parameters/filter_name"},{"$ref":"#/components/parameters/filter_workflow_type"},{"$ref":"#/components/parameters/filter_workflow_action"},{"$ref":"#/components/parameters/filter_source_type"},{"$ref":"#/components/parameters/filter_destination_type"},{"$ref":"#/components/parameters/filter_status"},{"$ref":"#/components/parameters/filter_log_time"},{"$ref":"#/components/parameters/filter_job_started"},{"$ref":"#/components/parameters/filter_job_finished"},{"$ref":"#/components/parameters/filter_creation_date"},{"$ref":"#/components/parameters/filter_modification_date"},{"$ref":"#/components/parameters/filter_to_process_size"},{"$ref":"#/components/parameters/filter_processed_size"},{"$ref":"#/components/parameters/filter_to_process_files"},{"$ref":"#/components/parameters/filter_processed_files"},{"$ref":"#/components/parameters/filter_finalized_files"},{"$ref":"#/components/parameters/filter_estimation_time"},{"$ref":"#/components/parameters/filter_bandwidth"}]}}}}
```

## Displays a specific task execution.

> \*\*API Key Scope\*\*: task\_executions / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_executions_show":{"description":"A specific task execution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_execution"}}}},"not_found":{"description":"The requested resource was not found. The detailed error will be of type `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"task_execution":{"type":"object","properties":{"id":{"type":"string"},"task_id":{"type":"integer","format":"int64"},"name":{"type":"string"},"workflow_type":{"type":"string","enum":["active_archive","offline_archive","data_exchange","data_migration","maintenance","data_enrichment"]},"workflow_action":{"type":"string","enum":["copy","move","erase","scan","rehydratation","format","check_consistency","duplication","cache_cleaning","ejection","get_index","full_backup","incremental_backup","restore","speedtest"]},"source_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"destination_type":{"type":"string","enum":["container","primary_nas","secondary_nas","primary_cloud","secondary_cloud","secondary_tape"]},"status":{"type":"string","enum":["not_activated","done","in_progress","error","paused","stopped_by_system","in_queue","finished_with_warnings","calculating","stopped_by_user"]},"progress":{"type":"integer"},"log_time":{"type":"string"},"job_started":{"type":"string"},"job_finished":{"type":"string"},"to_process_size":{"type":"integer","format":"int64"},"processed_size":{"type":"integer","format":"int64"},"to_process_files":{"type":"integer","format":"int64"},"processed_files":{"type":"integer","format":"int64"},"finalized_files":{"type":"integer","format":"int64"},"estimation_time":{"type":"integer"},"bandwidth":{"type":"integer","format":"int64"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}}},"paths":{"/task_executions/{task_execution_id}":{"get":{"summary":"Displays a specific task execution.","operationId":"show_task_execution","description":"**API Key Scope**: task_executions / show","tags":["task_executions"],"responses":{"200":{"$ref":"#/components/responses/task_executions_show"},"404":{"$ref":"#/components/responses/not_found"}}}}}}
```


# Systems

## Check result of a download traces job.

> \*\*API Key Scope\*\*: systems / download\_traces

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"download_traces":{"description":"A completed job for downloading traces.","content":{"application/json":{"schema":{"type":"string","format":"binary"}},"application/tar+gzip":{"schema":{"type":"string","format":"binary"}}}},"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/systems/download_traces":{"get":{"summary":"Check result of a download traces job.","operationId":"result_download_traces","tags":["systems"],"description":"**API Key Scope**: systems / download_traces","responses":{"200":{"$ref":"#/components/responses/download_traces"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Trigger a download traces request.

> \*\*API Key Scope\*\*: systems / download\_traces

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"download_traces_type":{"name":"type","in":"query","description":"Type of traces to download","required":true,"schema":{"type":"string","enum":["interface","core","data_mining","fuse","library_manager","manager","watchdog","system","all"]}}}},"paths":{"/systems/download_traces":{"put":{"summary":"Trigger a download traces request.","operationId":"trigger_download_traces","description":"**API Key Scope**: systems / download_traces","tags":["systems"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/download_traces_type"}]}}}}
```

## POST /systems/reset/generate\_vars

> Creates a YAML file with selected tables and downloads it

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"requestBodies":{"reset_form":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/reset"}}},"required":true}},"schemas":{"reset":{"type":"object","properties":{"sections":{"type":"array","description":"sections selected for reset","items":{"required":["value"],"type":"object","properties":{"value":{"type":"string","enum":["full","nas_config","nas_storage","nas_pools","tapes_libs","tapes_drives","tapes_pools","clouds_config","clouds_storage","clouds_pools","tasks","history","templates","containers","catalog","web_users","logs","audits","statistics","traces"]},"after":{"type":"string","description":"after date-time criteria for history reset","format":"date-time"},"before":{"type":"string","description":"before date-time criteria for history reset","format":"date-time"}}}}}}},"responses":{"reset":{"description":"The var file created","content":{"application/x-yaml":{"schema":{"type":"string","format":"binary"}}}}}},"paths":{"/systems/reset/generate_vars":{"post":{"summary":"Creates a YAML file with selected tables and downloads it","operationId":"download_reset_vars","tags":["systems"],"requestBody":{"$ref":"#/components/requestBodies/reset_form"},"responses":{"200":{"$ref":"#/components/responses/reset"}}}}}}
```


# Statistics

## Get statistics about files, grouped by date

> \*\*API Key Scope\*\*: statistics / by\_date

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_date":{"description":"Statistics grouped by date.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_date_facet"}}}}},"schemas":{"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}}}},"paths":{"/statistics/by_date":{"get":{"summary":"Get statistics about files, grouped by date","operationId":"statistics_by_date","description":"**API Key Scope**: statistics / by_date","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_date"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"}]}}}}
```

## Get statistics about files, grouped by primary storages

> \*\*API Key Scope\*\*: statistics / by\_primary\_name

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_primary_name":{"description":"Statistics grouped by primary names.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_primary_facet"}}}}},"schemas":{"by_primary_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"prim_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_primary_name":{"get":{"summary":"Get statistics about files, grouped by primary storages","operationId":"statistics_by_primary_name","description":"**API Key Scope**: statistics / by_primary_name","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_primary_name"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by primary storage

> \*\*API Key Scope\*\*: statistics / by\_primary\_storage

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_primary_storage":{"description":"Statistics grouped by primary storages.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_primary_storage_facet"}}}}},"schemas":{"by_primary_storage_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/type_to_primary_facets"}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"type_to_primary_facets":{"type":"object","properties":{"on_primary_container":{"$ref":"#/components/schemas/by_primary_type_facet"},"on_primary_nas":{"$ref":"#/components/schemas/by_primary_type_facet"},"on_primary_public_cloud":{"$ref":"#/components/schemas/by_primary_type_facet"},"on_primary_object_cloud":{"$ref":"#/components/schemas/by_primary_type_facet"}}},"by_primary_type_facet":{"allOf":[{"$ref":"#/components/schemas/by_date_facet"},{"type":"object","properties":{"prim_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_primary_storage":{"get":{"summary":"Get statistics about files, grouped by primary storage","operationId":"statistics_by_primary_storage","description":"**API Key Scope**: statistics / by_primary_storage","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_primary_storage"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by primary Cloud

> \*\*API Key Scope\*\*: statistics / by\_primary\_cloud

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_primary_cloud":{"description":"Statistics grouped by primary clouds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_primary_cloud_facet"}}}}},"schemas":{"by_primary_cloud_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"prim_cloud_connector_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"prim_cloud_bucket_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"prim_pool_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_primary_cloud":{"get":{"summary":"Get statistics about files, grouped by primary Cloud","operationId":"statistics_by_primary_cloud","description":"**API Key Scope**: statistics / by_primary_cloud","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_primary_cloud"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by primary NAS

> \*\*API Key Scope\*\*: statistics / by\_primary\_nas

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_primary_nas":{"description":"Statistics grouped by primary NAS.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_primary_nas_facet"}}}}},"schemas":{"by_primary_nas_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"prim_nas_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"prim_nas_share_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"prim_pool_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_primary_nas":{"get":{"summary":"Get statistics about files, grouped by primary NAS","operationId":"statistics_by_primary_nas","description":"**API Key Scope**: statistics / by_primary_nas","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_primary_nas"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by secondary storage

> \*\*API Key Scope\*\*: statistics / by\_secondary\_storage

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_secondary_storage":{"description":"Statistics grouped by secondary storages.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_secondary_storage_facet"}}}}},"schemas":{"by_secondary_storage_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/type_to_secondary_facets"}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"type_to_secondary_facets":{"type":"object","properties":{"on_secondary_nas":{"$ref":"#/components/schemas/by_secondary_type_facet"},"on_secondary_public_cloud":{"$ref":"#/components/schemas/by_secondary_type_facet"},"on_secondary_object_cloud":{"$ref":"#/components/schemas/by_secondary_type_facet"},"on_secondary_tape":{"$ref":"#/components/schemas/by_secondary_type_facet"},"on_any_secondary":{"$ref":"#/components/schemas/by_secondary_type_facet"},"on_no_secondary":{"$ref":"#/components/schemas/by_secondary_type_facet"}}},"by_secondary_type_facet":{"allOf":[{"$ref":"#/components/schemas/by_date_facet"},{"type":"object","properties":{"sec_pool_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_secondary_storage":{"get":{"summary":"Get statistics about files, grouped by secondary storage","operationId":"statistics_by_secondary_storage","description":"**API Key Scope**: statistics / by_secondary_storage","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_secondary_storage"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by secondary Tape

> \*\*API Key Scope\*\*: statistics / by\_secondary\_tape

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_secondary_tape":{"description":"Statistics grouped by secondary tapes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_secondary_tape_facet"}}}}},"schemas":{"by_secondary_tape_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"sec_tape_library_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"sec_tape_barcode_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"sec_pool_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_secondary_tape":{"get":{"summary":"Get statistics about files, grouped by secondary Tape","operationId":"statistics_by_secondary_tape","description":"**API Key Scope**: statistics / by_secondary_tape","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_secondary_tape"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by secondary Cloud

> \*\*API Key Scope\*\*: statistics / by\_secondary\_cloud

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_secondary_cloud":{"description":"Statistics grouped by secondary clouds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_secondary_cloud_facet"}}}}},"schemas":{"by_secondary_cloud_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"sec_cloud_connector_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"sec_cloud_bucket_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"sec_pool_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_secondary_cloud":{"get":{"summary":"Get statistics about files, grouped by secondary Cloud","operationId":"statistics_by_secondary_cloud","description":"**API Key Scope**: statistics / by_secondary_cloud","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_secondary_cloud"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by secondary NAS

> \*\*API Key Scope\*\*: statistics / by\_secondary\_nas

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_secondary_nas":{"description":"Statistics grouped by secondary NAS.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_secondary_nas_facet"}}}}},"schemas":{"by_secondary_nas_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"sec_nas_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"sec_nas_share_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"},"sec_pool_name_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_secondary_nas":{"get":{"summary":"Get statistics about files, grouped by secondary NAS","operationId":"statistics_by_secondary_nas","description":"**API Key Scope**: statistics / by_secondary_nas","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_secondary_nas"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by owner (user)

> \*\*API Key Scope\*\*: statistics / by\_user\_owner

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_user_owner":{"description":"Statistics grouped by users.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_user_owner_facet"}}}}},"schemas":{"by_user_owner_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"user_owner_id_l":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_user_owner":{"get":{"summary":"Get statistics about files, grouped by owner (user)","operationId":"statistics_by_user_owner","description":"**API Key Scope**: statistics / by_user_owner","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_user_owner"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by owner (group)

> \*\*API Key Scope\*\*: statistics / by\_group\_owner

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_group_owner":{"description":"Statistics grouped by user groups.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_group_owner_facet"}}}}},"schemas":{"by_group_owner_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"group_owner_id_l":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_group_owner":{"get":{"summary":"Get statistics about files, grouped by owner (group)","operationId":"statistics_by_group_owner","description":"**API Key Scope**: statistics / by_group_owner","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_group_owner"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by file extension

> \*\*API Key Scope\*\*: statistics / by\_file\_extension

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_file_extension":{"description":"Statistics grouped by file extensions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_file_extension_facet"}}}}},"schemas":{"by_file_extension_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"type":"object","properties":{"file_extension_s":{"$ref":"#/components/schemas/by_date_facet_buckets"}}}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"by_date_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_date_facet_bucket"}}}},"by_date_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"description":"integer or string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_file_extension":{"get":{"summary":"Get statistics about files, grouped by file extension","operationId":"statistics_by_file_extension","description":"**API Key Scope**: statistics / by_file_extension","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_file_extension"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about files, grouped by size

> \*\*API Key Scope\*\*: statistics / by\_size

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_size":{"description":"Statistics grouped by sizes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_size_facet"}}}}},"schemas":{"by_size_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/size_to_date_facets"}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"size_to_date_facets":{"type":"object","properties":{"less_100_kb":{"$ref":"#/components/schemas/by_date_facet"},"less_1_mb":{"$ref":"#/components/schemas/by_date_facet"},"less_10_mb":{"$ref":"#/components/schemas/by_date_facet"},"less_100_mb":{"$ref":"#/components/schemas/by_date_facet"},"less_1_gb":{"$ref":"#/components/schemas/by_date_facet"},"less_10_gb":{"$ref":"#/components/schemas/by_date_facet"},"less_100_gb":{"$ref":"#/components/schemas/by_date_facet"},"more_100_gb":{"$ref":"#/components/schemas/by_date_facet"}}},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}}}},"paths":{"/statistics/by_size":{"get":{"summary":"Get statistics about files, grouped by size","operationId":"statistics_by_size","description":"**API Key Scope**: statistics / by_size","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_size"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"}]}}}}
```

## Get statistics about files, grouped by metadata

> \*\*API Key Scope\*\*: statistics / by\_metadata

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"by_metadata":{"description":"Statistics grouped by metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_metadata_facet"}}}}},"schemas":{"by_metadata_facet":{"allOf":[{"$ref":"#/components/schemas/by_date_facet"},{"type":"object","properties":{"meta_key_s":{"$ref":"#/components/schemas/by_metadata_key_buckets"}}}]},"by_date_facet":{"allOf":[{"$ref":"#/components/schemas/file_facet"},{"$ref":"#/components/schemas/date_to_file_facets"}]},"file_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"files_count":{"type":"integer","readOnly":true},"file_size_sum":{"type":"integer","readOnly":true},"cost":{"type":"number","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"date_to_file_facets":{"type":"object","properties":{"in_cache":{"$ref":"#/components/schemas/file_facet"},"less_1_week":{"$ref":"#/components/schemas/file_facet"},"less_1_month":{"$ref":"#/components/schemas/file_facet"},"less_3_months":{"$ref":"#/components/schemas/file_facet"},"less_6_months":{"$ref":"#/components/schemas/file_facet"},"less_1_year":{"$ref":"#/components/schemas/file_facet"},"less_2_years":{"$ref":"#/components/schemas/file_facet"},"more_2_years":{"$ref":"#/components/schemas/file_facet"}}},"by_metadata_key_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_metadata_key_bucket"}}}},"by_metadata_key_bucket":{"allOf":[{"$ref":"#/components/schemas/by_metadata_bucket"},{"type":"object","properties":{"meta_value_t":{"$ref":"#/components/schemas/by_metadata_value_buckets"}}}]},"by_metadata_bucket":{"allOf":[{"type":"object","properties":{"val":{"type":"string"}}},{"$ref":"#/components/schemas/by_date_facet"}]},"by_metadata_value_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_metadata_bucket"}}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"facet_date_attr":{"name":"date_attr","in":"query","description":"Type of date to facet on","schema":{"type":"string","enum":["file_change_dt","file_modification_dt","file_access_dt"]}},"file_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet","schema":{"type":"string","default":"count","enum":["count","files_count","file_size_sum","cost"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/by_metadata":{"get":{"summary":"Get statistics about files, grouped by metadata","operationId":"statistics_by_metadata","description":"**API Key Scope**: statistics / by_metadata","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/by_metadata"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/facet_date_attr"},{"$ref":"#/components/parameters/file_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about tasks executions, grouped by workflow

> \*\*API Key Scope\*\*: statistics / task\_by\_workflow

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_by_workflow":{"description":"Statistics for tasks grouped by workflows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_task_workflow_facet"}}}}},"schemas":{"by_task_workflow_facet":{"allOf":[{"$ref":"#/components/schemas/task_facet"},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/task_by_workflow_buckets"}}}]},"task_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"to_process_size_sum":{"type":"integer","readOnly":true},"processed_size_sum":{"type":"integer","readOnly":true},"to_process_files_sum":{"type":"integer","readOnly":true},"processed_files_sum":{"type":"integer","readOnly":true},"finalized_files_sum":{"type":"integer","readOnly":true},"bandwidth_avg":{"type":"integer","readOnly":true},"bandwidth_count":{"type":"integer","readOnly":true},"tasks_count":{"type":"integer","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"task_by_workflow_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/task_by_workflow_bucket"}}}},"task_by_workflow_bucket":{"allOf":[{"type":"object","properties":{"val":{"type":"integer"},"action":{"$ref":"#/components/schemas/task_facet_buckets"}}},{"$ref":"#/components/schemas/task_facet"}]},"task_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/task_facet_bucket"}}}},"task_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"type":"integer"}}},{"$ref":"#/components/schemas/task_facet"}]}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}}}},"paths":{"/statistics/task_by_workflow":{"get":{"summary":"Get statistics about tasks executions, grouped by workflow","operationId":"statistics_task_by_workflow","description":"**API Key Scope**: statistics / task_by_workflow","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/task_by_workflow"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"}]}}}}
```

## Get statistics about tasks executions, grouped by status

> \*\*API Key Scope\*\*: statistics / task\_by\_status

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_by_status":{"description":"Statistics for tasks grouped by status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_task_status_facet"}}}}},"schemas":{"by_task_status_facet":{"allOf":[{"$ref":"#/components/schemas/task_facet"},{"type":"object","properties":{"status":{"$ref":"#/components/schemas/task_facet_buckets"}}}]},"task_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"to_process_size_sum":{"type":"integer","readOnly":true},"processed_size_sum":{"type":"integer","readOnly":true},"to_process_files_sum":{"type":"integer","readOnly":true},"processed_files_sum":{"type":"integer","readOnly":true},"finalized_files_sum":{"type":"integer","readOnly":true},"bandwidth_avg":{"type":"integer","readOnly":true},"bandwidth_count":{"type":"integer","readOnly":true},"tasks_count":{"type":"integer","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"task_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/task_facet_bucket"}}}},"task_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"type":"integer"}}},{"$ref":"#/components/schemas/task_facet"}]}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}}}},"paths":{"/statistics/task_by_status":{"get":{"summary":"Get statistics about tasks executions, grouped by status","operationId":"statistics_task_by_status","description":"**API Key Scope**: statistics / task_by_status","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/task_by_status"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"}]}}}}
```

## Get statistics about tasks executions, grouped by source and destination

> \*\*API Key Scope\*\*: statistics / task\_by\_storage

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_by_storage":{"description":"Statistics for tasks grouped by storages.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_task_storage_facet"}}}}},"schemas":{"by_task_storage_facet":{"allOf":[{"$ref":"#/components/schemas/task_facet"},{"type":"object","properties":{"source":{"$ref":"#/components/schemas/task_facet_buckets"},"destination":{"$ref":"#/components/schemas/task_facet_buckets"}}}]},"task_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"to_process_size_sum":{"type":"integer","readOnly":true},"processed_size_sum":{"type":"integer","readOnly":true},"to_process_files_sum":{"type":"integer","readOnly":true},"processed_files_sum":{"type":"integer","readOnly":true},"finalized_files_sum":{"type":"integer","readOnly":true},"bandwidth_avg":{"type":"integer","readOnly":true},"bandwidth_count":{"type":"integer","readOnly":true},"tasks_count":{"type":"integer","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"task_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/task_facet_bucket"}}}},"task_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"type":"integer"}}},{"$ref":"#/components/schemas/task_facet"}]}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}}}},"paths":{"/statistics/task_by_storage":{"get":{"summary":"Get statistics about tasks executions, grouped by source and destination","operationId":"statistics_task_by_storage","description":"**API Key Scope**: statistics / task_by_storage","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/task_by_storage"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"}]}}}}
```

## Get statistics about tasks executions, grouped by metadata

> \*\*API Key Scope\*\*: statistics / task\_by\_metadata

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_by_metadata":{"description":"Statistics for tasks grouped by metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/by_task_metadata_facet"}}}}},"schemas":{"by_task_metadata_facet":{"allOf":[{"$ref":"#/components/schemas/task_facet"},{"type":"object","properties":{"meta_key_s":{"$ref":"#/components/schemas/task_facet_metadata_key_buckets"}}}]},"task_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"type":"object","properties":{"to_process_size_sum":{"type":"integer","readOnly":true},"processed_size_sum":{"type":"integer","readOnly":true},"to_process_files_sum":{"type":"integer","readOnly":true},"processed_files_sum":{"type":"integer","readOnly":true},"finalized_files_sum":{"type":"integer","readOnly":true},"bandwidth_avg":{"type":"integer","readOnly":true},"bandwidth_count":{"type":"integer","readOnly":true},"tasks_count":{"type":"integer","readOnly":true}}}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"task_facet_metadata_key_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/task_facet_metadata_key_bucket"}}}},"task_facet_metadata_key_bucket":{"allOf":[{"$ref":"#/components/schemas/task_facet_metadata_bucket"},{"type":"object","properties":{"meta_value_t":{"$ref":"#/components/schemas/task_facet_metadata_value_buckets"}}}]},"task_facet_metadata_bucket":{"allOf":[{"type":"object","properties":{"val":{"type":"string"}}},{"$ref":"#/components/schemas/task_facet"}]},"task_facet_metadata_value_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/task_facet_metadata_bucket"}}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"task_facet_sort":{"name":"sort","in":"query","description":"Sort results of facet on task","schema":{"type":"string","default":"count","enum":["count","tasks_count","to_process_size_sum","processed_size_sum","to_process_files_sum","processed_files_sum","finalized_files_sum","bandwidth_avg","bandwidth_count"]}},"file_facet_limit":{"name":"limit","in":"query","description":"Limit results of facet","schema":{"type":"integer","default":10}}}},"paths":{"/statistics/task_by_metadata":{"get":{"summary":"Get statistics about tasks executions, grouped by metadata","operationId":"statistics_task_by_metadata","description":"**API Key Scope**: statistics / task_by_metadata","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/task_by_metadata"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"},{"$ref":"#/components/parameters/task_facet_sort"},{"$ref":"#/components/parameters/file_facet_limit"}]}}}}
```

## Get statistics about storages, grouped by types

> \*\*API Key Scope\*\*: statistics / storages

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"storage":{"description":"Statistics for storage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/storage_facet"}}}}},"schemas":{"storage_facet":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"$ref":"#/components/schemas/storage_by_type_facets"}]},"default_facet":{"type":"object","properties":{"count":{"type":"integer","readOnly":true}}},"storage_by_type_facets":{"type":"object","properties":{"container":{"$ref":"#/components/schemas/default_facet"},"nas_share":{"$ref":"#/components/schemas/storage_nas_share_facets"},"cloud_bucket":{"$ref":"#/components/schemas/storage_cloud_bucket_facets"},"tape":{"$ref":"#/components/schemas/storage_tape_facets"},"pool":{"$ref":"#/components/schemas/storage_pool_facets"}}},"storage_nas_share_facets":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"$ref":"#/components/schemas/storage_nas_share_by_type_facets"}]},"storage_nas_share_by_type_facets":{"type":"object","properties":{"nas_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"},"pool_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"}}},"by_type_facet_buckets":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/by_type_facet_bucket"}}}},"by_type_facet_bucket":{"allOf":[{"type":"object","properties":{"val":{"type":"integer"}}},{"$ref":"#/components/schemas/default_facet"}]},"storage_cloud_bucket_facets":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"$ref":"#/components/schemas/storage_cloud_bucket_by_type_facets"}]},"storage_cloud_bucket_by_type_facets":{"type":"object","properties":{"cloud_connector_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"},"pool_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"}}},"storage_tape_facets":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"$ref":"#/components/schemas/storage_tape_by_type_facets"}]},"storage_tape_by_type_facets":{"type":"object","properties":{"tape_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"},"tape_library_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"},"pool_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"}}},"storage_pool_facets":{"allOf":[{"$ref":"#/components/schemas/default_facet"},{"$ref":"#/components/schemas/storage_pool_by_type_facets"}]},"storage_pool_by_type_facets":{"type":"object","properties":{"pool_type_i":{"$ref":"#/components/schemas/by_type_facet_buckets"},"pool_content_i":{"$ref":"#/components/schemas/by_type_facet_buckets"}}}},"parameters":{"solr_query":{"name":"q","in":"query","description":"Solr query","schema":{"type":"string"}},"solr_filter_query":{"name":"fq","in":"query","description":"Solr filter query\n\nMultiple query can be separated by `|`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}}}},"paths":{"/statistics/storage":{"get":{"summary":"Get statistics about storages, grouped by types","operationId":"statistics_storage","description":"**API Key Scope**: statistics / storages","tags":["statistics"],"responses":{"200":{"$ref":"#/components/responses/storage"}},"parameters":[{"$ref":"#/components/parameters/solr_query"},{"$ref":"#/components/parameters/solr_filter_query"}]}}}}
```


# Reference Files

## Return list of reference files

> \*\*API Key Scope\*\*: reference\_files / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"reference_files_index":{"description":"List of reference file","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"./refparser.yml#/components/schemas/reference_file"}}}}}}},"paths":{"/reference_files":{"get":{"operationId":"index_reference_files","summary":"Return list of reference files","description":"**API Key Scope**: reference_files / index","tags":["reference_files"],"responses":{"200":{"$ref":"#/components/responses/reference_files_index"}}}}}}
```

## Upload a reference file to be parsed

> \*\*API Key Scope\*\*: reference\_files / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"upload":{"description":"Uploaded file","content":{"application/json":{"schema":{"$ref":"./refparser.yml#/components/schemas/reference_file"}}}}}},"paths":{"/reference_files":{"post":{"operationId":"create_reference_file","summary":"Upload a reference file to be parsed","description":"**API Key Scope**: reference_files / create","tags":["reference_files"],"responses":{"201":{"$ref":"#/components/responses/upload"}},"requestBody":{"content":{"multipart/form-data":{"schema":{"required":["xml"],"properties":{"xml":{"type":"string","description":"Reference file to upload.","format":"binary"}}}}},"required":true}}}}}
```

## Return a parsed reference file

> \*\*API Key Scope\*\*: reference\_files / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"reference_file_show":{"description":"Show an analyzed reference file","content":{"application/json":{"schema":{"$ref":"./refparser.yml#/components/schemas/analyzed_reference_file"}}}}}},"paths":{"/reference_files/{reference_file_id}":{"get":{"operationId":"show_reference_file","summary":"Return a parsed reference file","description":"**API Key Scope**: reference_files / show","tags":["reference_files"],"responses":{"200":{"$ref":"#/components/responses/reference_file_show"}}}}}}
```

## Update the list of parsed file in a reference file

> \*\*API Key Scope\*\*: reference\_files / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"reference_file_show":{"description":"Show an analyzed reference file","content":{"application/json":{"schema":{"$ref":"./refparser.yml#/components/schemas/analyzed_reference_file"}}}}},"requestBodies":{"reference_file_update_body":{"content":{"application/json":{"schema":{"$ref":"./refparser.yml#/components/schemas/reference_file_update_request"}}},"required":true}}},"paths":{"/reference_files/{reference_file_id}":{"put":{"operationId":"update_reference_file","summary":"Update the list of parsed file in a reference file","description":"**API Key Scope**: reference_files / update","tags":["reference_files"],"responses":{"200":{"$ref":"#/components/responses/reference_file_show"}},"requestBody":{"$ref":"#/components/requestBodies/reference_file_update_body"}}}}}
```

## Destroys a reference file.

> \*\*API Key Scope\*\*: reference\_files / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/reference_files/{reference_file_id}":{"delete":{"summary":"Destroys a reference file.","operationId":"destroy_reference_file","description":"**API Key Scope**: reference_files / destroy","tags":["reference_files"],"responses":{"200":{"description":"Reference file destroyed."}}}}}}
```

## Scan a parsed reference file

> \*\*API Key Scope\*\*: reference\_files / scan

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"reference_file_show":{"description":"Show an analyzed reference file","content":{"application/json":{"schema":{"$ref":"./refparser.yml#/components/schemas/analyzed_reference_file"}}}}},"requestBodies":{"reference_file_scan_body":{"content":{"application/json":{"schema":{"$ref":"./refparser.yml#/components/schemas/reference_file_scan_request"}}},"required":true}}},"paths":{"/reference_files/{reference_file_id}/scan":{"put":{"operationId":"scan_reference_file","summary":"Scan a parsed reference file","description":"**API Key Scope**: reference_files / scan","tags":["reference_files"],"responses":{"200":{"$ref":"#/components/responses/reference_file_show"}},"requestBody":{"$ref":"#/components/requestBodies/reference_file_scan_body"}}}}}
```

## Check result of task sources creation

> \*\*API Key Scope\*\*: reference\_files / create\_task\_sources

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}}},"parameters":{"job_id":{"name":"job_id","in":"query","description":"ID of active job","required":true,"schema":{"type":"string"}}}},"paths":{"/reference_files/{reference_file_id}/task_sources":{"get":{"operationId":"create_task_sources_from_reference_file_result","summary":"Check result of task sources creation","description":"**API Key Scope**: reference_files / create_task_sources","tags":["reference_files"],"responses":{"200":{"$ref":"#/components/responses/active_job_status"},"202":{"$ref":"#/components/responses/active_job_status"}},"parameters":[{"$ref":"#/components/parameters/job_id"}]}}}}
```

## Create task sources from a reference file

> \*\*API Key Scope\*\*: reference\_files / create\_task\_sources

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"active_job_status":{"description":"An active job that may be queued, working, completed or failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/active_job_status"}}}}},"schemas":{"active_job_status":{"type":"object","properties":{"job_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true,"enum":["queued","working","completed","failed"]},"progress":{"type":"integer","readOnly":true},"total":{"type":"integer","readOnly":true}}},"reference_file_task_sources":{"required":["task_id"],"type":"object","properties":{"task_id":{"type":"integer"},"container_ids":{"type":"array","items":{"type":"integer"}},"pool_id":{"type":"integer"}}}},"requestBodies":{"task_sources_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/reference_file_task_sources"}}},"required":true}}},"paths":{"/reference_files/{reference_file_id}/task_sources":{"post":{"operationId":"create_task_sources_from_reference_file","summary":"Create task sources from a reference file","description":"**API Key Scope**: reference_files / create_task_sources","tags":["reference_files"],"responses":{"202":{"$ref":"#/components/responses/active_job_status"}},"requestBody":{"$ref":"#/components/requestBodies/task_sources_body"}}}}}
```


# Metadata

## List task metadata definitions

> \*\*API Key Scope\*\*: task\_metadata\_definitions / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_metadata_definitions_index":{"description":"List of task metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadata_definition_collection"}}}}},"schemas":{"task_metadata_definition_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"task_metadata_definitions":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/task_metadata_definition"}}}},"task_metadata_definition":{"allOf":[{"$ref":"#/components/schemas/metadata_definition"},{"type":"object","properties":{"type":{"type":"string","enum":["input_text","text_area","checkbox","radio"]},"apply_active_archive":{"type":"integer"},"apply_offline_archive":{"type":"integer"},"apply_data_migration":{"type":"integer"},"apply_data_exchange":{"type":"integer"},"apply_maintenance":{"type":"integer"}}}]},"metadata_definition":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"name":{"type":"string"},"mandatory":{"type":"integer"},"type":{"type":"string","enum":["input_text","text_area","checkbox","radio","multi_text"]},"comment":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}}}},"paths":{"/task_metadata_definitions":{"get":{"summary":"List task metadata definitions","description":"**API Key Scope**: task_metadata_definitions / index","tags":["metadata"],"operationId":"index_task_metadata_definitions","responses":{"200":{"$ref":"#/components/responses/task_metadata_definitions_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"}]}}}}
```

## Displays a specific task metadata definition.

> \*\*API Key Scope\*\*: task\_metadata\_definitions / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"task_metadata_definitions_show":{"description":"A specific task metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/task_metadata_definition"}}}}},"schemas":{"task_metadata_definition":{"allOf":[{"$ref":"#/components/schemas/metadata_definition"},{"type":"object","properties":{"type":{"type":"string","enum":["input_text","text_area","checkbox","radio"]},"apply_active_archive":{"type":"integer"},"apply_offline_archive":{"type":"integer"},"apply_data_migration":{"type":"integer"},"apply_data_exchange":{"type":"integer"},"apply_maintenance":{"type":"integer"}}}]},"metadata_definition":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"name":{"type":"string"},"mandatory":{"type":"integer"},"type":{"type":"string","enum":["input_text","text_area","checkbox","radio","multi_text"]},"comment":{"type":"string"}}}}},"paths":{"/task_metadata_definitions/{metadata_definition_id}":{"get":{"summary":"Displays a specific task metadata definition.","description":"**API Key Scope**: task_metadata_definitions / show","tags":["metadata"],"operationId":"show_task_metadata_definition","responses":{"200":{"$ref":"#/components/responses/task_metadata_definitions_show"}}}}}}
```

## List file metadata definitions

> \*\*API Key Scope\*\*: file\_metadata\_definitions / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"file_metadata_definitions_index":{"description":"List of file metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/file_metadata_definition_collection"}}}}},"schemas":{"file_metadata_definition_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"file_metadata_definitions":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/file_metadata_definition"}}}},"file_metadata_definition":{"allOf":[{"$ref":"#/components/schemas/metadata_definition"}]},"metadata_definition":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"name":{"type":"string"},"mandatory":{"type":"integer"},"type":{"type":"string","enum":["input_text","text_area","checkbox","radio","multi_text"]},"comment":{"type":"string"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}}}},"paths":{"/file_metadata_definitions":{"get":{"summary":"List file metadata definitions","description":"**API Key Scope**: file_metadata_definitions / index","tags":["metadata"],"operationId":"index_file_metadata_definitions","responses":{"200":{"$ref":"#/components/responses/file_metadata_definitions_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"}]}}}}
```

## Displays a specific task metadata definition.

> \*\*API Key Scope\*\*: file\_metadata\_definitions / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"file_metadata_definitions_show":{"description":"A specific file metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/file_metadata_definition"}}}}},"schemas":{"file_metadata_definition":{"allOf":[{"$ref":"#/components/schemas/metadata_definition"}]},"metadata_definition":{"type":"object","properties":{"id":{"type":"integer","readOnly":true,"format":"int64"},"key":{"type":"string"},"name":{"type":"string"},"mandatory":{"type":"integer"},"type":{"type":"string","enum":["input_text","text_area","checkbox","radio","multi_text"]},"comment":{"type":"string"}}}}},"paths":{"/file_metadata_definitions/{metadata_definition_id}":{"get":{"summary":"Displays a specific task metadata definition.","description":"**API Key Scope**: file_metadata_definitions / show","tags":["metadata"],"operationId":"show_file_metadata_definition","responses":{"200":{"$ref":"#/components/responses/file_metadata_definitions_show"}}}}}}
```


# Email

## Return list of recipients

> \*\*API Key Scope\*\*: recipients / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"email_recipients_index":{"description":"List of recipient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_recipient_collection"}}}}},"schemas":{"email_recipient_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"recipients":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/email_recipient"}}}},"email_recipient":{"type":"object","properties":{"email_id":{"type":"string"},"activation":{"type":"integer"},"email_address":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}}}},"paths":{"/email/recipients":{"get":{"operationId":"index_recipients","summary":"Return list of recipients","description":"**API Key Scope**: recipients / index","tags":["email"],"responses":{"200":{"$ref":"#/components/responses/email_recipients_index"}}}}}}
```

## Creates a new recipient.

> \*\*API Key Scope\*\*: recipients / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"email_recipients_show":{"description":"A specific recipient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_recipient"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"email_recipient":{"type":"object","properties":{"email_id":{"type":"string"},"activation":{"type":"integer"},"email_address":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"email_recipient_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_recipient"}}},"required":true}}},"paths":{"/email/recipients":{"post":{"summary":"Creates a new recipient.","operationId":"create_recipient","description":"**API Key Scope**: recipients / create","tags":["email"],"responses":{"201":{"$ref":"#/components/responses/email_recipients_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/email_recipient_body"}}}}}
```

## Displays a specific recipient.

> \*\*API Key Scope\*\*: recipients / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"email_recipients_show":{"description":"A specific recipient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_recipient"}}}}},"schemas":{"email_recipient":{"type":"object","properties":{"email_id":{"type":"string"},"activation":{"type":"integer"},"email_address":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}}}},"paths":{"/email/recipients/{email_id}":{"get":{"summary":"Displays a specific recipient.","operationId":"show_recipient","description":"**API Key Scope**: recipients / show","tags":["email"],"responses":{"200":{"$ref":"#/components/responses/email_recipients_show"}}}}}}
```

## Updates a specific recipient with his relations.

> \*\*API Key Scope\*\*: recipients / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"email_recipients_show":{"description":"A specific recipient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_recipient"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"email_recipient":{"type":"object","properties":{"email_id":{"type":"string"},"activation":{"type":"integer"},"email_address":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"email_recipient_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_recipient"}}},"required":true}}},"paths":{"/email/recipients/{email_id}":{"put":{"summary":"Updates a specific recipient with his relations.","operationId":"update_recipient","description":"**API Key Scope**: recipients / update","tags":["email"],"responses":{"200":{"$ref":"#/components/responses/email_recipients_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/email_recipient_body"}}}}}
```

## Destroys a specific recipient.

> \*\*API Key Scope\*\*: recipients / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/email/recipients/{email_id}":{"delete":{"summary":"Destroys a specific recipient.","operationId":"destroy_recipient","description":"**API Key Scope**: recipients / destroy","tags":["email"],"responses":{"204":{"description":"Recipient destroyed."}}}}}}
```

## Return relay server infos

> \*\*API Key Scope\*\*: relay\_server / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"email_relay_server_show":{"description":"relay server infos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_relay_server"}}}}},"schemas":{"email_relay_server":{"type":"object","properties":{"server":{"type":"string"},"sender":{"type":"string"},"user":{"type":"string"},"password":{"type":"string"}}}}},"paths":{"/email/relay_server":{"get":{"operationId":"show_relay_server","summary":"Return relay server infos","description":"**API Key Scope**: relay_server / show","tags":["email"],"responses":{"200":{"$ref":"#/components/responses/email_relay_server_show"}}}}}}
```

## Updates relay server infos.

> \*\*API Key Scope\*\*: relay\_server / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"email_relay_server_show":{"description":"relay server infos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_relay_server"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"email_relay_server":{"type":"object","properties":{"server":{"type":"string"},"sender":{"type":"string"},"user":{"type":"string"},"password":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"email_relay_server_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/email_relay_server"}}},"required":true}}},"paths":{"/email/relay_server":{"put":{"summary":"Updates relay server infos.","operationId":"update_relay_server","description":"**API Key Scope**: relay_server / update","tags":["email"],"responses":{"200":{"$ref":"#/components/responses/email_relay_server_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/email_relay_server_body"}}}}}
```


# Snmp

## Return list of traps

> \*\*API Key Scope\*\*: traps / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"snmp_traps_index":{"description":"List of trap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_trap_collection"}}}}},"schemas":{"snmp_trap_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"traps":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/snmp_trap"}}}},"snmp_trap":{"type":"object","properties":{"snmp_trap_id":{"type":"string"},"activation":{"type":"integer"},"version":{"type":"string"},"manager":{"type":"string"},"community":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}}}},"paths":{"/snmp/traps":{"get":{"operationId":"index_traps","summary":"Return list of traps","description":"**API Key Scope**: traps / index","tags":["snmp"],"responses":{"200":{"$ref":"#/components/responses/snmp_traps_index"}}}}}}
```

## Creates a new trap.

> \*\*API Key Scope\*\*: traps / create

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"snmp_traps_show":{"description":"A specific trap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_trap"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"snmp_trap":{"type":"object","properties":{"snmp_trap_id":{"type":"string"},"activation":{"type":"integer"},"version":{"type":"string"},"manager":{"type":"string"},"community":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"snmp_trap_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_trap"}}},"required":true}}},"paths":{"/snmp/traps":{"post":{"summary":"Creates a new trap.","operationId":"create_trap","description":"**API Key Scope**: traps / create","tags":["snmp"],"responses":{"201":{"$ref":"#/components/responses/snmp_traps_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/snmp_trap_body"}}}}}
```

## Displays a specific trap.

> \*\*API Key Scope\*\*: traps / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"snmp_traps_show":{"description":"A specific trap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_trap"}}}}},"schemas":{"snmp_trap":{"type":"object","properties":{"snmp_trap_id":{"type":"string"},"activation":{"type":"integer"},"version":{"type":"string"},"manager":{"type":"string"},"community":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}}}},"paths":{"/snmp/traps/{snmp_trap_id}":{"get":{"summary":"Displays a specific trap.","operationId":"show_trap","description":"**API Key Scope**: traps / show","tags":["snmp"],"responses":{"200":{"$ref":"#/components/responses/snmp_traps_show"}}}}}}
```

## Updates a specific trap with his relations.

> \*\*API Key Scope\*\*: traps / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"snmp_traps_show":{"description":"A specific trap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_trap"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"snmp_trap":{"type":"object","properties":{"snmp_trap_id":{"type":"string"},"activation":{"type":"integer"},"version":{"type":"string"},"manager":{"type":"string"},"community":{"type":"string"},"severity_low":{"type":"integer"},"severity_high":{"type":"integer"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"snmp_trap_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_trap"}}},"required":true}}},"paths":{"/snmp/traps/{snmp_trap_id}":{"put":{"summary":"Updates a specific trap with his relations.","operationId":"update_trap","description":"**API Key Scope**: traps / update","tags":["snmp"],"responses":{"200":{"$ref":"#/components/responses/snmp_traps_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/snmp_trap_body"}}}}}
```

## Destroys a specific trap.

> \*\*API Key Scope\*\*: traps / destroy

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/snmp/traps/{snmp_trap_id}":{"delete":{"summary":"Destroys a specific trap.","operationId":"destroy_trap","description":"**API Key Scope**: traps / destroy","tags":["snmp"],"responses":{"204":{"description":"trap destroyed."}}}}}}
```

## Return server configuration infos

> \*\*API Key Scope\*\*: server\_configuration / show

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"snmp_server_configuration_show":{"description":"server configuration infos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_server_configuration"}}}}},"schemas":{"snmp_server_configuration":{"type":"object","properties":{"version":{"type":"string"},"community":{"type":"string"},"location":{"type":"string"},"contact":{"type":"string"}}}}},"paths":{"/snmp/server_configuration":{"get":{"operationId":"show_server_configuration","summary":"Return server configuration infos","description":"**API Key Scope**: server_configuration / show","tags":["snmp"],"responses":{"200":{"$ref":"#/components/responses/snmp_server_configuration_show"}}}}}}
```

## Updates server configuration infos.

> \*\*API Key Scope\*\*: server\_configuration / update

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"snmp_server_configuration_show":{"description":"server configuration infos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_server_configuration"}}}},"unprocessable_entity":{"description":"The received resource was not correctly formatted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error"}}}}},"schemas":{"snmp_server_configuration":{"type":"object","properties":{"version":{"type":"string"},"community":{"type":"string"},"location":{"type":"string"},"contact":{"type":"string"}}},"error":{"type":"object","properties":{"details":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/attribute_error"}},"description":"Parsable objects describing the errors. The key is the invalid attribute name."},"messages":{"type":"array","description":"English description of the errors.","items":{"type":"string"}}}},"attribute_error":{"required":["error"],"type":"object","properties":{"error":{"type":"string"}},"discriminator":{"propertyName":"error"}}},"requestBodies":{"snmp_server_configuration_body":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/snmp_server_configuration"}}},"required":true}}},"paths":{"/snmp/server_configuration":{"put":{"summary":"Updates server configuration infos.","operationId":"update_server_configuration","description":"**API Key Scope**: server_configuration / update","tags":["snmp"],"responses":{"200":{"$ref":"#/components/responses/snmp_server_configuration_show"},"422":{"$ref":"#/components/responses/unprocessable_entity"}},"requestBody":{"$ref":"#/components/requestBodies/snmp_server_configuration_body"}}}}}
```


# Logs

## List all logs

> \*\*API Key Scope\*\*: logs / index

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"responses":{"logs_index":{"description":"List of logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/log_collection"}}}}},"schemas":{"log_collection":{"type":"object","properties":{"count":{"type":"integer","readOnly":true},"logs":{"type":"array","readOnly":true,"items":{"$ref":"#/components/schemas/log"}}}},"log":{"type":"object","properties":{"date":{"type":"string"},"message":{"type":"string"},"degree":{"type":"integer"}}}},"parameters":{"limit":{"name":"limit","in":"query","description":"The number of items to display for pagination.","schema":{"type":"integer"}},"offset":{"name":"offset","in":"query","description":"The number of items to skip for pagination.","schema":{"type":"integer"}},"sort_by":{"name":"sort_by","in":"query","description":"Sort results by attribute.\n\nCan sort on multiple attributes, separated by `|`.\nOrder direction can be suffixing the attribute by either `:asc` (default) or `:desc`.","style":"pipeDelimited","schema":{"type":"array","items":{"type":"string"}}},"filter_degree":{"name":"degree","in":"query","description":"Filter on degree","schema":{"type":"string"}},"filter_date":{"name":"date","in":"query","description":"Filter on date","schema":{"type":"string"}},"filter_message":{"name":"message","in":"query","description":"Filter on message","schema":{"type":"string"}},"filter_notifications":{"name":"is_a_notification","in":"query","description":"Lets know if the request should return \nall the logs or only the notifications","schema":{"type":"string"}}}},"paths":{"/logs":{"get":{"summary":"List all logs","operationId":"index_logs","description":"**API Key Scope**: logs / index","tags":["logs"],"responses":{"200":{"$ref":"#/components/responses/logs_index"}},"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/sort_by"},{"$ref":"#/components/parameters/filter_degree"},{"$ref":"#/components/parameters/filter_date"},{"$ref":"#/components/parameters/filter_message"},{"$ref":"#/components/parameters/filter_notifications"}]}}}}
```

## Clear all notifications

> \*\*API Key Scope\*\*: logs / post

```json
{"openapi":"3.0.1","info":{"title":"Nodeum API","version":"2.1.0"},"servers":[{"url":"{url}/api/v2","variables":{"url":{"default":"http://localhost","description":"URL of server"}}}],"security":[{"BasicAuth":[]},{"BearerAuth":[]},{"JWT":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Pass the username and password of a user in the authorization header.\nThis currently gives full access."},"BearerAuth":{"type":"apiKey","description":"Create an API Key associated to user.\nAccess can be restricted with the scope.\nEach API call described below has a scoped mentionned in its description.\n\nFor example :\n\n**API Key Scope**: files / index\n\nThis means that the API key should have a scope with controller as *files*\nand the action as *index*.","name":"Authorization","in":"header"},"JWT":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"paths":{"/logs/clear_notifications":{"post":{"summary":"Clear all notifications","operationId":"clear_notifications","description":"**API Key Scope**: logs / post","tags":["logs"],"responses":{"204":{"description":"Log notifications clear"}}}}}}
```


# Configuration through RestAPI  Console

### Open the RAILS console

```bash
$ nodeumctl rails c
```

### User Configuration

#### Change the default password of admin user

```bash
> user = Api::V2::User.all.where("username = 'admin'")
 => #<ActiveRecord::Relation [#<Api::V2::User id: 1, user_id: 1032, group_id: nil, 
 is_active: 1, is_admin: true, username: "admin", email: "nodeum@localhost", 
 key_id: 0, vector: "no-cipher", created_at: "2019-12-13...
> user.update(password: 'newpassword')
 => [#<Api::V2::User email: "nodeum@localhost", id: 1, user_id: 1032, group_id: nil, 
 is_active: 1, is_admin: true, username: "admin", key_id: 0, vector: "no-cipher", 
 created_at: "2019-12-13 11:46:30.000000000 +0000", updated_at: "2023-03-23 
 15:56:21.000000000 +0000", provider: nil, uid: nil>]
```

### Storage Configuration

#### Create a new ‘Mounted File System connector’

Mandatory : name: ; type: :undefined

```bash
> nas = Api::V2::NAS.create!(
    name: "...",
    host: "...",
    # :undefined :smb_v1 :smb_v2_1 :smb_v3 :nfs_v3 :nfs_v4 :storenext_v5
    type: :undefined,
  )
```

Save&#x20;

```bash
> nas.save!
```

#### Create a new ‘Swift connector’

Mandatory : name ; provider: ":openstack\_swift”

```bash
> cloud = Api::V2::CloudConnector.create!(
    name: "...",
    url: "...",
    # :undefined :generic_s3 :amazon_aws_s3 :cloudian_hyperstore :scality_ring 
    :dell_emc_ecs :azure :google_cloud_storage :openstack_swift :wasabi 
    :quantum_activescale :datacore_swarm
    provider: :openstack_swift,
    region: "...",
    access_key: "...",
    secret_key: "...",
    options: "...",
  )
```

Save&#x20;

```bash
> cloud.save!
```


# Hybrid Storage Management

Configure and operate file, object, and tape backends from one place.

***


# File System Managment

### Protocol SMB

SMB storage protocol provides a reliable and efficient way for users to access and share files stored on a network.

Its versatility and ease of use make it an ideal solu-tion for collaborative work environments, and its advanced security features help ensure that data is accessed securely. This is a valuable feature that enhances the platform's capabilities and provides users with an efficient and secure file sharing solution.

One of the primary advantages of using SMB is its ease of use. It is supported by most operating systems and devices, including Windows, macOS, Linux. With this protocol, users can easily access files remotely from any NAS or SMB compatible device.

### Protocol NFS

NFSv3 and NFSv4 protocols allow for easy and efficient file sharing across a network. With its support for both versions, users can choose the protocol that best suits their needs, whether they require an established and reliable protocol like NFSv3 or the advanced security and performance features of NFSv4.

This provides an ideal solution for organizations that need to share files across multiple devices while maintaining security and efficiency.

## List Of NAS Storage Compatible

Nodeum Supports natively NAS Connection.

<details>

<summary>DELLEMC</summary>

Scale-out NAS Isilon

Protocol Supported : SMB/NFS

Primary Storage : yes

Secondary Storage : yes

</details>

<details>

<summary>Fast LTA</summary>

Silent Cubes - Silent Brick

Protocol Supported : SMB/NFS

Primary Storage : yes

Secondary Storage : yes

</details>

<details>

<summary>Hitachi</summary>

HNAS

Protocol Supported : SMB/NFS

Primary Storage : yes

Secondary Storage : yes

</details>

<details>

<summary>Huawei</summary>

<mark style="color:blue;">Product</mark> : OceanStor

<mark style="color:blue;">Protocol Supported :</mark> SMB/NFS

<mark style="color:blue;">Primary Storage :</mark> yes

<mark style="color:blue;">Secondary Storage :</mark> yes

</details>

<details>

<summary>HPE</summary>

<mark style="color:blue;">Product</mark> : StoreEasy

<mark style="color:blue;">Protocol Supported :</mark> SMB/NFS

<mark style="color:blue;">Primary Storage :</mark> yes

<mark style="color:blue;">Secondary Storage :</mark> yes

</details>

<details>

<summary>Linux</summary>

<mark style="color:blue;">Product</mark> : Ubuntu - RHEL - CentOS

<mark style="color:blue;">Protocol Supported :</mark> SMB/NFS

<mark style="color:blue;">Primary Storage :</mark> yes

<mark style="color:blue;">Secondary Storage :</mark> yes

</details>

<details>

<summary>NetApp</summary>

<mark style="color:blue;">Product</mark> : FAS Series 7-mode and cluster Mode

<mark style="color:blue;">Protocol Supported :</mark> SMB/NFS

<mark style="color:blue;">Primary Storage :</mark> yes

<mark style="color:blue;">Secondary Storage :</mark> yes

</details>

<details>

<summary>QNAP</summary>

<mark style="color:blue;">Product</mark> : All Series

<mark style="color:blue;">Protocol Supported :</mark> SMB/NFS

<mark style="color:blue;">Primary Storage :</mark> yes

<mark style="color:blue;">Secondary Storage :</mark> yes

</details>

<details>

<summary>Oracle</summary>

<mark style="color:blue;">Product</mark> : ZFS Storage Appliance

<mark style="color:blue;">Protocol Supported :</mark> SMB/NFS

<mark style="color:blue;">Primary Storage :</mark> yes

<mark style="color:blue;">Secondary Storage :</mark> yes

</details>

<details>

<summary>Synology</summary>

<mark style="color:blue;">Product</mark> : all series

<mark style="color:blue;">Protocol Supported :</mark> SMB/NFS

<mark style="color:blue;">Primary Storage :</mark> yes

<mark style="color:blue;">Secondary Storage :</mark> yes

</details>


# Object Storage Management

### S3

Nodeum supports the widely recognized S3 protocol format for seamless communication with object storage. It ensures a reliable and secure connection with a variety of object storage providers, whether public or private.

Nodeum boasts an impressive compatibility matrix that covers a wide range of technologies and vendors, enabling users to effortlessly integrate Nodeum into their existing storage infrastructure.

The compatibility matrix highlights the versatility of Node-um and its ability to communicate with various storage providers such as AWS S3, Microsoft Azure Blob Storage, Google Cloud Storage, and many more.

With Nodeum, users can confidently manage their data movement workflows, knowing that their storage infrastructure is fully supported.

Nodeum offers complete flexibility to customers by preventing any vendor lock-in and allowing them to schedule data movement between different cloud providers. The platform supports a wide range of cloud storage providers, including public and private clouds, and provides the ability to migrate data between them seamlessly.

With Nodeum, customers have the freedom to choose the cloud provider that best suits their needs, and can easily switch to another provider without the worry of being locked-in.

Nodeum's advanced data management features ensure that data is securely and efficiently moved between different cloud providers, without any loss or corruption.

The platform also offers data encryption capabilities, providing an extra layer of security for data in transit. Overall, Nodeum provides a highly flexible and secure solution for customers to manage their data across different cloud providers, without any restrictions or limitations.

### Swift

Nodeum supports the Swift protocol in addition to the S3 protocol. This includes a full integration with the OpenStack Swift object storage platform and the Nodeum Swift storage configuration includes the full support of Keystone versions.

This integration enables users to take advantage of the scalability and durability of Swift storage. Users can easily create and manage workflows that copy or move data to and from containers and Swift Object Storage using Nodeum's interface or API.


# Customize your S3 connection

### S3 Backend supported

#### S3FS

s3fs is a FUSE filesystem backed by Amazon S3 that allows to mount an S3 bucket as a local filesystem. It stores files natively and transparently in S3 (i.e., you can use other\
programs to access the same files).

#### Rclone

Rclone is a command line program to manage files on cloud storage. It is a feature rich alternative to cloud vendors' web storage interfaces.&#x20;

<figure><img src="https://www.nodeum.io/hs-fs/hubfs/image-png-Feb-15-2022-01-36-32-50-PM.png?width=340&#x26;name=image-png-Feb-15-2022-01-36-32-50-PM.png" alt=""><figcaption></figcaption></figure>

### **List of Options available:**

#### **S3FS**

<table><thead><tr><th width="218.33333333333331">Options</th><th width="168">Default Value</th><th>Description</th></tr></thead><tbody><tr><td><strong>connect_timeout</strong></td><td>"300" (seconds)</td><td>Time to wait for connection before giving up</td></tr><tr><td><p></p><p><strong>Default_acl</strong></p><p> </p></td><td>“private”</td><td><p>By default, it is the "private" ACL which set the default canned ACL to apply to all written s3 objects.</p><p><br>Other ACLs be set according to Amazon S3 implementation. </p><p>The following URL lists these options:<br><a href="https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl">https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl</a></p></td></tr><tr><td><strong>ecs</strong></td><td>disable</td><td>This option instructs a query to the ECS container credential metadata address instead of the instance metadata address.</td></tr><tr><td><strong>enable_content_md5</strong></td><td>disable</td><td>Allow check data integrity of uploads via the MD5 checksum. This can add CPU overhead to transfers.</td></tr><tr><td><strong>iam_role</strong></td><td>no IAM role</td><td>This option requires the IAM role name or "auto". If you specify "auto", it will automatically use the IAM role names that are set to an instance. If you specify this option without any argument, it is the same as that you have specified the "auto".</td></tr><tr><td><strong>list_object_max_keys</strong></td><td>“1000”</td><td>This specify the maximum number of keys returned by S3 list object API.</td></tr><tr><td><strong>max_stat_cache_size</strong></td><td>"100,000" entries (about 40MB))</td><td>maximum number of entries in the stat cache, and this maximum is also treated as the number of symbolic link cache.</td></tr><tr><td> <strong>multipart_size</strong></td><td>10</td><td>Part size, in MB, for each multipart request. The minimum value is 5 MB and the maximum value is 5 GB.</td></tr><tr><td><strong>multireq_max</strong></td><td>20</td><td>This is about the maximum number of parallel requests for listing objects.</td></tr><tr><td><strong>no_check_certificate</strong></td><td></td><td>The server certificate won't be checked against the available certificate authorities. This is very useful if there is self-signed certificate.</td></tr><tr><td><strong>nomultipart</strong></td><td></td><td>Disable multipart uploads</td></tr><tr><td><strong>parallel_count</strong></td><td>5</td><td>Number of parallel requests for uploading big objects. by multipart post request and sends parallel requests. It is necessary to set this value depending on a CPU and a network band.</td></tr><tr><td><strong>readwrite_timeout</strong></td><td>"120" (seconds)</td><td>Time to wait between read/write activity before giving up</td></tr><tr><td><strong>retries</strong></td><td>5</td><td>Number of times the system will do a retry when an S3 transaction failed.</td></tr><tr><td><p></p><p> <strong>singlepart_copy_limit</strong></p></td><td>512</td><td>Maximum size, in MB, of a single-part copy before trying multipart copy.</td></tr><tr><td><strong>ssl_verify_hostname</strong></td><td>2</td><td>When 0, do not verify the SSL certificate against the hostname.</td></tr><tr><td><strong>storage_class</strong></td><td>"standard"</td><td><p>This option has to be supported by the storage vendor; it allows to store the objects with specified storage class. </p><p></p><p>Possible values are standard, standard_ia, onezone_ia, reduced_redundancy and intelligent_tiering.</p></td></tr></tbody></table>

### &#x20;Encryption for S3&#x20;

Nodeum allows the usage of the 3 types of Amazon's Server-Site Encryption:

* SSE-S3
* &#x20;SSE-C
* SSE-KMS

Server-side encryption is about protecting data at rest, it encrypts only the object data, not object metadata.

#### SSE-S3 uses Amazon S3-managed encryption keys

It is a Server-side encryption that protects data at rest. The S3 storage encrypts each data with a unique key. As an added safeguard, it encrypts the key itself with a master key that it rotates regularly.

S3 server-side encryption uses one of the strongest block ciphers available to encrypt your data, 256-bit Advanced Encryption Standard (AES-256).

<figure><img src="/files/1OwDxaEpmPXBdvM4lNuW" alt=""><figcaption></figcaption></figure>

#### SSE-C uses customer-provided encryption keys

Using server-side encryption with customer-provided encryption keys (SSE-C) allows you to set your own encryption keys.&#x20;

With the encryption key you provide as part of your request, Amazon S3 manages the encryption as it writes to disks and decryption when you access your objects.

<figure><img src="/files/cL6rGuqJrjbCpSdTxyyK" alt=""><figcaption></figcaption></figure>

It is important to understand that the only thing to do is to manage the encryption keys you provide.

When a file is copied to the Cloud S3 storage, the S3 storage uses the encryption key you supply to apply AES-256 encryption to your data and removes the encryption key from memory.

When you retrieve the file, you must supply the same encryption key. The S3 storage first verifies that the encryption key you supplied matches and then decrypts the object before returning the data to you.

#### SSE-KMS uses the master key which you manage in AWS KMS

Server-side encryption is the encryption of data at its destination by the application or service that receives it.

AWS Key Management Service (AWS KMS) is a service that combines secure, universally available hardware and software to provide a key management system scaled for the cloud. It uses AWS KMS customer master keys (CMKs) to encrypt your data. AWS KMS encrypts only the object data. Object metadata is not encrypted.

<figure><img src="/files/D8HibrMj9temBPHz85xe" alt=""><figcaption></figcaption></figure>

### SSE Usage Recommendations

#### Well know situation :&#x20;

{% hint style="info" %}
You don't specify a file with a 32 char key
{% endhint %}

<mark style="color:orange;">Situation :</mark>&#x20;

The SSE required a 32 char key to be able to encrypt the contents which are sent to the bucket. Make sure that you include a 32 char key for having the feature working properly.<br>

#### **Keys rotation**

<mark style="color:orange;">Situation :</mark>&#x20;

The uploader key file can include multiple keys, be careful about the syntax and file organization :

* first line is always the main encryption / decryption key
* second lines are always the decryption keys

Example : If you want to change the key every month (for encryption), you will store the last key in the first line, and store all previous keys in the next lines ; this to keep the possibility to decrypt the files which have been stored and encrypted with this key.

Example :

> **Keys.txt**
>
> **01234567890123456789012345678911**\
> **11234567890123456789012345678911**\
> **21234567890123456789012345678911**

* *01234567890123456789012345678911* is the key used to encrypt - decrypt datas
* *11234567890123456789012345678911* is a previous key which is still required to decrypt the data
* *21234567890123456789012345678911* is a previous key which is still required to decrypt the data

#### **Bucket Encryption Configuration Changes**

Situation : You store data in a bucket from a while and after a certain time, you decide to set an encryption option.

This change only impact the new data which will be encrypted and keep all previous written files not encrypted.

#### **Encryption Visualization**

In an S3 object storage supporting SSE, we can easily see icons showing the encrypted files :

![key sse example](https://www.nodeum.io/hs-fs/hubfs/key%20sse%20example.png?width=2240\&name=key%20sse%20example.png)\
\
\
&#x20;    &#x20;


# Tape Library Management

## **Tape Library Management**

### Native connection support

Nodeum supports tape library management through three connection types:

* **SCSI over Fibre Channel**: Manages SCSI-based tape libraries over Fibre Channel.
* **SCSI over SAS**: Manages SCSI-based tape libraries over SAS.
* **ACSLS**: Manages Oracle StorageTek tape libraries through an ACSLS server.

#### **Library Management with ACSLS:**

Use ACSLS to manage supported Oracle StorageTek tape libraries through an ACSLS server.

**Supported Operations:**

Nodeum automates tape library operations, including tape mounting and unmounting during `read and write tasks`.

**Tape Drive Generations:**

The system supports LTO tape drives from LTO5 to LTO10, handling automated functions like tape and LTFS mounting/unmounting.


# Configuring Multipath Failover

This procedure is optional, but for libraries supporting Multipathing Failover feature, it is important to properly configure the libraries in NODEUM.

### Prerequisites

All components in the environment should meet the hardware vendor support standards for this feature. This includes the following:

* Fabric switches
* FC HBAs
* Tape library

OS driver levels and firmware levels of FC HBAs, and library and drives should be of supported revisions.

### lin\_tape driver

To use the lin\_tape device driver software, you need to install the driver. NODEUM has been tested with the latest available `lin_tape` driver, `3.0.72`, which can be downloaded and installed from the IBM fix\_central website.

Once you have followed the installation instruction provided by the vendor, you can verify that the driver is well installed:

```bash
$ lsmod |grep -i -E 'st|lin_tape'
lin_tape              483328  4
pfo                  1130496  1 lin_tape
st                     65536  0
```

You can see mediumx and tape drive devices:

```bash
$ lsscsi -g | grep -i -E 'medium|tape'
[11:0:0:0]   tape    IBM      ULT3580-HH5      F991  -          /dev/sg3
[11:0:0:1]   mediumx IBM      3573-TL          E.20  -          /dev/sg4
[11:0:1:0]   mediumx ADIC     Scalar i500      100A  -          /dev/sg5
[11:0:2:0]   tape    IBM      ULT3580-HH6      G9P1  -          /dev/sg6

$ cat /proc/scsi/IBMchanger
lin_tape version: 3.0.72
lin_tape major number: 237
Attached Changer Devices:
Number  model       SN                       HBA                       SCSI            FO Path
0       3573-TL     00L2U78AW009_LL0         qla2xxx                   11:0:0:1        NA
1       Scalar i500 VL001AV1506BVV00078      qla2xxx                   11:0:1:0        NA

$ cat /proc/scsi/IBMtape
lin_tape version: 3.0.72
lin_tape major number: 237
Attached Tape Devices:
Number  model       SN                       HBA                       SCSI            FO Path
0       ULT3580-HH5 90WT013124               qla2xxx                   11:0:0:0        NA
1       ULT3580-HH6 90WT054335               qla2xxx                   11:0:2:0        NA
```

### NODEUM Tape Library configuration

In following the standard Tape Library configuration, the tape library has to configured with the `lin_tape` library and drive emulation.

For doing this, you need to confirm that beside the defined tape library, the Emulation is set with the `lin_tape` emulation.

<figure><img src="/files/ZkDI1LwoqaVLQWkupr60" alt=""><figcaption></figcaption></figure>

This is the same for the Tape Drive(s):

<figure><img src="/files/i8PYGznfBVCuCYc7qoht" alt=""><figcaption></figcaption></figure>


# Tape Writing Format : LTFS

Nodeum uses the LTFS open format to write data on magnetic tapes. The LTFS format (Linear Tape File System) is a format supported by the drive and tape library manufacturers which are the founders of the LTO Ultrium consortium. This format has existed since the LTO-5 generation. It offers the unique feature to store both data and index data on tape.

A tape written with the LTFS format can be read independently of any storage system and offers a file system to access the data written on that tape. The LTFS drivers for any kind of operating system can read the index and then execute functions like copy, update or delete. It is also possible to use a graphical interface for features like a simple drag and drop.

Unlike tapes generated by backup software, LTFS tapes can be removed from the appliance, shared and stored. And, because they are stored following an open format under a common standard, other divisions, customers, partners or workgroups can easily access data without having to purchase specialized hardware or additional software.

Nodeum is listed as one of the LTFS Partners. Moreover, it is important to know that Nodeum has been certified as a LTFS certified appliance by the LTO consortium: &#x20;

{% embed url="<http://www.lto.org/technology/ltfs/ltfs-compliance-verification/>" %}

###


# Tape Compression

Due to tape compression capabilities, volume size on tape can be different to the volume size of data ingested.

After a workflow execution, you can see a difference between the volume size of what is stored on tape and the capacity processed by the workflow.&#x20;

The reason is that the Tape Drive has compression capabilities ; and this hardware compression process can be significant. The hardware compression is much faster than software compression, it is transparent to the operating system, and data is compressed “on the fly”.

Usually, the compression ratio for magnetic tape drives is maximum 2:1. In fact, the compression ratio of 2:1 may be really equal to **1.2:1** or **1.6:1.** That depends on the type of data that you are writing onto tape. If the data are already compressed or not.

To know more about the level of compression of your tapes, you can check if the tape drive compression setting is activated. You can also see the compression status of each tape, for that, you can access the Nodeum Tape reporting to see the level of compression of each media:

<figure><img src="/files/ooEFkcLZ5x1WnhnYlNDi" alt=""><figcaption></figcaption></figure>

If you want to verify if each file has been well copied to tape; we recommend to activate the Checksum Integrity verification during the workflow execution.

Nodeum supports the two main algorithms: md5-hash and xxhash-64be.

And then you have also the option to compare each checksum and then validate if all files have been well copied on the tape.


# Task Maintenance for Tapes

#### Tape Library Maintenance

Nodeum provides various tape library maintenance services, including:

* **LTFS Media Formatting**: Prepares tapes for use with the Linear Tape File System (LTFS).
* **LTFS Media Scanning**: Conducts scans to ensure tapes are properly configured for LTFS.
* **Tape Media Consistency Check**: Verifies the integrity and consistency of tape media.

<figure><img src="/files/XnH2l2T80gdj9lChkvWX" alt=""><figcaption><p>Task maintenance</p></figcaption></figure>

### Format a media in LTFS

#### Preparing Tape Media for Nodeum

To use a tape with Nodeum, format the media through the appliance using LTFS. This allows immediate use. You can format a single tape, multiple tapes, or an entire pool. In the task settings, you can choose to assign the tape to the Scratch pool after successful formatting. By default, tapes added to the library are not assigned to any pool.

{% hint style="danger" %}
Formatting a tape will delete all current content. Proceed carefully.
{% endhint %}

### Import a LTFS Tape <a href="#offlinearchiveworkflows-workflow-offlinearchivetoscandataunknownbynodeum" id="offlinearchiveworkflows-workflow-offlinearchivetoscandataunknownbynodeum"></a>

#### How to import into Nodeum a LTFS Tape ?   <a href="#offlinearchiveworkflows-workflow-offlinearchivetoscandataunknownbynodeum" id="offlinearchiveworkflows-workflow-offlinearchivetoscandataunknownbynodeum"></a>

If you have been using the LTFS protocol with your tape library and want to import your data set into Nodeum, follow these steps.

#### Procedure to Import a Tape into Your Library

1. Insert the tape into your tape library.
2. Create a maintenance task to scan the LTFS media.
3. Launch the task.

| Source | Type of action Mover |
| ------ | -------------------- |
| Tapes  | Scan an LTFS Media   |

#### Result after the task processed with success

1. Information are known by Nodeum
2. Information are display in all metrics (tape reporting, tape Overview, Catalog
3. Information on tape can be easily reloaded

**Benefits:**

* Efficiently catalog data, reducing the need for tape-to-tape migrations.
* Enhance team productivity.
* Streamline LTFS Appliance migration.
* Benefit from a transparent process with Nodeum-validated Scalar LTFS migration.
* Facilitate content exchange with customers or partners.

### Scan a LTFS Media

Automatically scan and catalog content from LTFS Tape into the Nodeum catalog. This workflow enables the re-importation of previously written tapes.

To import LTFS Tapes into Nodeum, follow these steps :

Add the LTFS TAPE 000001L6 in the tape library connected to Nodeum

<figure><img src="/files/vAuy0rC9mlpgIEeqeXsb" alt=""><figcaption></figcaption></figure>

#### Define a workflow to scan the LTFS TAPE and then execute it

* Select Scan an LTFS Media

<figure><img src="/files/XpYzgx8kGEZBydA7VXEF" alt=""><figcaption></figcaption></figure>

* Select as the source the tape need to scan "Tape “000001L6"

<figure><img src="/files/4hr5J2rkjdxwaIMMPk9B" alt=""><figcaption></figcaption></figure>

* Launch the task

<figure><img src="/files/nbcWmungNPulNHVtoktG" alt=""><figcaption></figcaption></figure>

#### Get the result after the task execution

* Data are indexed and recognized by Nodeum without reading the complete tape
* The tape have to be placed in a pool offline and can only be used in an offline archive workflow.
* Metadata are injected in the catalog&#x20;
* End user can see and retrieve easily the contents (files, images, video)&#x20;
* End user accesses contents straight away; no need to make new set of tapes

### Tape Rehydratation

When files are deleted from a tape, they are not fully erased. A rehydration task is needed for complete erasure, which enhances performance and user experience.&#x20;

Nodeum does not delete or modify files on the tapes; instead, catalog entries are removed for deletions, and new versions are written while index pointers are updated for modifications. Files remain physically intact on tapes.&#x20;

Consequently, frequent deletions or updates can imbalance the free space to consumed space ratio on these tapes.

<figure><img src="/files/y6PV3mLuObfoGMBq42jJ" alt=""><figcaption></figcaption></figure>

#### **Go in the menu Storage Services/Tape/Maintenance** <a href="#maintenancetasks-first-gotoecosystemmanagementandselect-tasks" id="maintenancetasks-first-gotoecosystemmanagementandselect-tasks"></a>

Complete the form:

1. Define the task name and comments
2. Select the Action: Rehydration
3. Choose one or several tapes
4. Schedule the Task
5. Define Other Options

#### **Task Priority Guidelines**

* The highest priority level is 10. Assign a priority of 10 for tasks deemed most critical.
* Priority levels range from 1 (lowest) to 10 (highest).
* In cases with multiple simultaneous tasks, higher priority tasks will execute first.
* Clearly specify the task's priority level when scheduling.

#### **Tape Capacity Usage**

This value is expressed as a percentage.\
The workflow activates when the tape reaches this specified reclaimable capacity.

#### **Capacity volume that need to be cleaned**

When the reclaimable capacity on the tape reaches a certain percentage, the workflow will be triggered.

{% hint style="info" %}
This two last options are very important to be set to get the space reclamation you are looking for.
{% endhint %}

### Check tape media consistency

#### LTFS Consistency Check

This feature verifies the consistency of LTFS media. A volume is deemed consistent when both partitions are complete, and the last index in the Index Partition references the last full index in the Data Partition. If inconsistencies are found, media recovery using the `ltfsck` command is recommended.


# Tape Drive Maintenance

## Maintenance Mode

When Nodeum detects an issue with a tape drive, it activates Maintenance Mode for the affected drive, ensuring continuity of tasks on other drives.

**Examples of Maintenance Mode Activation:**

* Frequent mounting errors detected in the drive.
* An unrecognized tape is loaded into the drive.

**Steps to Restore Drive Functionality:**

1. Correct the identified issue with the drive.
2. Stop and restart Nodeum services.

### Procedure to Replace a Tape Drive

When a tape drive needs replacement in the Tape Library, follow these detailed steps:

1. Navigate to the **`Tape Library Configuration Panel`**.
   1. Go to the Tape Library Configuration Panel. (Tape Library Configuration)&#x20;
   2. unselect the drive you need to replace.

2. **Stop Nodeum Services**.

<figure><img src="https://www.nodeum.io/hubfs/image-35.png" alt=""><figcaption></figcaption></figure>

3. Physically replace the tape drive in the Tape Library.
4. **Reboot the Nodeum System**.
5. Return to the **`Tape Library Configuration Panel`**.
   * Select the newly installed drive.
6. **Restart Nodeum Services**.

![](https://www.nodeum.io/hubfs/image-36.png)

### Changing Bridge Drive Allocation

**Description:**\
If the Drive Bridge encounters an error or fails, the Tape Library will also experience errors, hindering proper access by Nodeum. In such cases, you need to reallocate the drive bridge to a different drive.

**Procedure:**\
To change the Bridge Drive allocation, follow the steps below using an **Oracle SL150 Tape Library** as an example:

1. From the Drive Panel, identify which Tape Drive is the Bridge Tape Drive.
2. In the Tape Library Configuration:
   * Select **Configure Library Settings**.
   * Change the Library Bridged Drive.
3. Reboot the Nodeum system to correctly update the new SCSI address of the Tape Library.

### Tape Library & Tape Drive Firmware Upgrade

Start the upgrade of the Firmware in a Tape Library or a Tape Library need to be performed carefully.

It is also important to take into account that during this operation Nodeum cannot use the tape library or the selected tape drive.

Once the firmware upgrade is operated from the Tape Library itself, it is important to proceed with these following steps:

#### Go into the Nodeum interface and follow this procedure :

* Check in the Configuration panel of Tape Drive and save the new parameters. Visualize the Firmware Revision number.<br>

  <figure><img src="https://www.nodeum.io/hubfs/image-png-Nov-20-2020-07-28-33-29-AM.png" alt=""><figcaption></figcaption></figure>
* Restart the Nodeum server to verify the SCSI device setup.


# Container

### Overview

Each container, acting as a network folder, is assigned specific access rights for users or groups. Access control can be managed locally, through Active Directory, or via LDAP. Quota and disk allocation settings help in managing caching usage per container and overall storage capacity.

#### Disk Caching

Disk caching is employed to speed up data transactions. This flexible caching system supports various use cases and multiple disk types. Storage can be accessed using NFS/SMB or the S3 protocol, where containers function as buckets with user authentication.

#### Data Accessibility

Containers serve as storage spaces, allowing users to read, write, or modify files accessible over the network through standard transport protocols:

* **Network Shared Folder** using SMB protocol
* **NFS Target** using NFS protocol
* **Bucket** using S3 protocol

#### File Virtualization

The file virtualization layer manages files and systems across diverse storage solutions, offering an abstraction between file servers and clients. Nodeum provides a logical representation of this virtualization. Users can view, retrieve, and access files even if they reside on secondary storage.


# Cache Configuration Requirements

To successfully implement the Cache Configuration, the system must support two primary features:

1. **Data Archiving**
2. **Scan LTFS Tape**

The caching system should function as a block device accessible via the `/dev/` directory, or any supported mounted filesystem. Possible configurations include:

* Internal RAID on local disks
* Internal RAID on JBOD setups
* SCSI Attached Storage
* iSCSI Attached Storage
* Linux-based block replication (e.g., DRBD, GlusterFS)

### Cache configuration

To proceed when the cache disk is unready, initialize it by running these commands.

<figure><img src="/files/CnYMNP7LJddyrdSg5XpS" alt=""><figcaption></figcaption></figure>

To set up the CACHE Disk, follow these steps:

1. Create the CACHE Disk:

   ```bash
   /opt/nodeum/bin/core/cache_disk_format.sh /dev/sdX
   ```

{% hint style="info" %}
Replace `sdX` with the correct device identifier, likely `sdb`.
{% endhint %}

1. Select the CACHE Disk:

   ```bash
   /opt/nodeum/bin/core/cache_disk_select.sh /dev/sdX
   ```

{% hint style="info" %}
Use the same device identifier as in the previous step.
{% endhint %}

The process will then begin.

After configuration, the disk functions as a cache. You can then check its status.

<figure><img src="/files/Pi3CxVvnwS3ySECjuqRT" alt=""><figcaption></figcaption></figure>

### Extend your cache

To enhance the cache size, adjust the solution according to the server type.

{% hint style="warning" %}
**Backup Your Data:** Before extending the cache, ensure all cache data is copied to secondary storage.
{% endhint %}

#### Increasing Disk Volume Capacity

**RAID**

1. **Add New Disk(s):** Introduce new disk(s) to the existing RAID volume serving as Nodeum Cache.
2. **Wait for RAID Reconstruction:** Allow time for the RAID reconstruction to complete, which may take several days depending on the disk size.

**Virtual Machine Datastore**

1. **Shutdown the Nodeum Server:** Ensure the Nodeum server is safely shut down.
2. **Edit Server Settings:** Adjust the Nodeum server settings by selecting the appropriate disk and expanding its size.
3. **Save Configurations:** Apply and save the new configurations.

#### **Extend the volume partition** <a href="#cacheconfiguration-extendthevolumepartition" id="cacheconfiguration-extendthevolumepartition"></a>

{% hint style="warning" %}
When creating a new disk partition larger than 16TB, the `resize2fs` command (version <1.43) will fail with the error: **"resize2fs: New size too large to be expressed in 32 bits"**. To resolve this, use the latest version of Gparted, which supports the 64-bit version of this command. Below is a guide on how to use Gparted.
{% endhint %}

#### Using GParted Live ISO to Graphically Edit Disk Size

1. **Download the GParted ISO:**
   * Visit: [GParted Download Page](https://gparted.org/download.php)
2. **Create a Bootable USB:**
   * Follow the instructions on the [GParted Live CD/USB Creation Page](https://gparted.org/livecd.php).
3. **Boot from Live ISO:**
   * **For Physical Servers:** Use a CD/USB or a Remote Management Server interface to boot.
   * **For Virtual Servers:** Boot the VM using the downloaded GParted ISO.
4. **Resize Partition Graphically:**
   * After booting, you will see the GParted graphical interface.
   * **Note:** For disks larger than 16 TB, ensure a 64-bit file system. Convert using:

     ```bash
     sudo resize2fs -b /dev/sdb1
     ```
   * Select your Nodeum cache disk (typically `/dev/sdb1`).
   * Click 'Resize/Move'.
   * Drag the vertical bar to adjust partition size.
   * Click 'Resize/Move' again.
   * Apply changes.
5. **Finish Up:**
   * Reboot the server to utilize the new, larger cache size.

#### Command Line Interface Procedure

* Stopping the Nodeum services

```bash
// /usr/mtc/bin>./core_stop all
[core_stop] core_watchdog has stopped successfully (CORE_STOP/cstop_stop_watchdog)
[core_stop] Trying umount (CORE_STOP/cstop_stop_fuse).
[core_stop] Trying umount force (CORE_STOP/cstop_stop_fuse).
[core_stop] Trying umount lazy (CORE_STOP/cstop_stop_fuse).
umount: /mnt/FUSE: not mounted
[core_stop] core_fuse has stopped successfully (CORE_STOP/cstop_stop_fuse).
[core_stop] data_mining has stopped successfully (CORE_STOP/cstop_stop_data_mining)
[core_stop] core_manager has stopped successfully (CORE_STOP/cstop_stop_manager)
[core_stop] library_manager has stopped successfully (CORE_STOP/cstop_stop_library)
[core_stop] core_superv has stopped successfully (CORE_STOP/cstop_stop_superv)
```

* Identify the disk mounted at `/mnt/CACHE` to determine if it needs to be expanded.

```bash
$ /usr/mtc/bin>df -lh
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       146G   88G   52G  64% /
tmpfs           1,9G   40K  1,9G   1% /dev/shm
/dev/sda1       465M   39M  402M   9% /boot
/dev/sdb1       886G  7,4G  834G   1% /mnt/CACHE


```

* Umount the Cache disk

```bash
$ /usr/mtc/bin>umount /mnt/CACHE
$ /usr/mtc/bin>mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
```

* Check the disk

Ensure functionality works correctly; stop to address any unfixed errors before proceeding.

```bash
$ /usr/mtc/bin>e2fsck -f -y -v -C 0 /dev/sdb1
e2fsck 1.41.12 (17-May-2010)
Le bitmap de bloc du groupe 707 n'est pas initialisé
alors que le bitmap d'i-noeud est en cours d'utilisation.
Corriger ? oui
 
Le bitmap de bloc du groupe 708 n'est pas initialisé
alors que le bitmap d'i-noeud est en cours d'utilisation.
Corriger ? oui
 
Le bitmap de bloc du groupe 709 n'est pas initialisé
alors que le bitmap d'i-noeud est en cours d'utilisation.
Corriger ? oui
 
Le bitmap de bloc du groupe 710 n'est pas initialisé
alors que le bitmap d'i-noeud est en cours d'utilisation.
Corriger ? oui
 
Le bitmap de bloc du groupe 711 n'est pas initialisé
alors que le bitmap d'i-noeud est en cours d'utilisation.
Corriger ? oui
 
Passe 1 : vérification des i-noeuds, des blocs et des tailles
Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe
 
   63944 inodes used (0.11%)
      98 non-contiguous files (0.2%)
       3 non-contiguous directories (0.0%)
         nombre d'i-noeuds avec des blocs ind/dind/tind : 0/0/0
         Histogramme des profondeurs d'extents : 63863/71
 5658831 blocks used (2.40%)
       0 bad blocks
       1 large file
 
   63702 regular files
     233 directories
       0 character device files
       0 block device files
       0 fifos
       0 links
       0 symbolic links (0 fast symbolic links)
       0 sockets
```

* use parted to extend the partition size

```bash
$ /usr/mtc/bin>parted /dev/sdb
(parted) unit s
(parted) print free
Modèle: VMware Virtual disk (scsi)
Disque /dev/sdb : 2097152000s
Taille des secteurs (logiques/physiques): 512B/512B
Table de partitions : gpt
 
Numéro  Début        Fin          Taille       Système de fichiers  Nom      Fanions
        34s          2047s        2014s        Espace libre
 1      2048s        1887434751s  1887432704s  ext4                 primary
        1887434752s  2097151966s  209717215s   Espace libre
 
(parted) rm 1
(parted) mkpart primary 2048s 2097151966s
(parted) print free
Modèle: VMware Virtual disk (scsi)
Disque /dev/sdb : 2097152000s
Taille des secteurs (logiques/physiques): 512B/512B
Table de partitions : gpt
 
Numéro  Début  Fin          Taille       Système de fichiers  Nom      Fanions
        34s    2047s        2014s        Espace libre
 1      2048s  2097151966s  2097149919s  ext4                 primary
 
(parted) quit
```

* Check the disk again

```bash
$ /usr/mtc/bin>e2fsck -f -y -v -C 0 /dev/sdb1
e2fsck 1.41.12 (17-May-2010)
Passe 1 : vérification des i-noeuds, des blocs et des tailles
Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe
 
   63944 inodes used (0.11%)
      98 non-contiguous files (0.2%)
       3 non-contiguous directories (0.0%)
         nombre d'i-noeuds avec des blocs ind/dind/tind : 0/0/0
         Histogramme des profondeurs d'extents : 63863/71
 5658831 blocks used (2.40%)
       0 bad blocks
       1 large file
 
   63702 regular files
     233 directories
       0 character device files
       0 block device files
       0 fifos
       0 links
       0 symbolic links (0 fast symbolic links)
       0 sockets
--------
   63935 files
```

* Extend the disk size

```bash
$ /usr/mtc/bin>resize2fs -p /dev/sdb1
resize2fs 1.41.12 (17-May-2010)
En train de retailler le système de fichiers sur /dev/sdb1 à 262143739 (4k) blocs.
Début de la passe 1 (max = 800)
Extension de la table d'i-noeudsXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Le système de fichiers /dev/sdb1 a maintenant une taille de 262143739 blocs.
```

{% hint style="warning" %}
If the operation fails, refer to Cautions 1 above.
{% endhint %}

* Mount the disk

```bash
$ /usr/mtc/bin>mount /dev/sdb1 /mnt/CACHE/ -o user_xattr
$ /usr/mtc/bin>df -lh
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       146G   88G   52G  64% /
tmpfs           1,9G   32K  1,9G   1% /dev/shm
/dev/sda1       465M   39M  402M   9% /boot
/dev/sdb1       985G  7,4G  927G   1% /mnt/CACHE
```

* Start the Nodeum services

```bash
/usr/mtc/bin>./core_start all
[core_start] core_superv has started successfully (CORE_START/cstart_start_superv)
[core_start] library_manager has started successfully (CORE_START/cstart_start_library)
[core_start] core_manager has started successfully (CORE_START/cstart_start_manager)
[core_start] data_mining has started successfully (CORE_START/cstart_start_data_mining
[core_start] core_fuse has started successfully (CORE_START/cstart_start_fuse).
[core_start] core_watchdog has started successfully (CORE_START/cstart_start_watchdog)
```


# Authorization and Authentication

## Authorization through SMB

### Settings

> System -> User Management -> Container

Enhancing your network's SMB authorization involves adopting best practices and understanding its components to boost security and efficiency.

Privileged access to containers is controlled individually for each container. On this page, you can view the list of users and groups with access.&#x20;

<figure><img src="/files/hmDvikMID1MxP828e5JA" alt=""><figcaption><p>List Container's user</p></figcaption></figure>

Rights and privileges of data stored in the container adhere to these guidelines

* When a workflow copies data into a container, the rights and privileges of the original data are maintained.  It is essential to properly configure the container's user permissions to ensure to authorize users access.

* When end users copy files through the container using SMB protocols, the rights are determined by the access rights defined within the container and its associated permission schema.

  &#x20;

### Configure the Authentication Services

Two types of authorization and authentication are available to access Container:

1. Local users and groups
2. Active Directory

### Local users&#x20;

By default, local user and group settings are applied.&#x20;

<figure><img src="/files/uqppNU9yClsh3V0bKASC" alt=""><figcaption></figcaption></figure>

#### Create local User & Group

Click on the button '+' to **add a new user:**

<figure><img src="/files/xQu84JGFTcEbAIPlSf01" alt=""><figcaption><p>User Creation</p></figcaption></figure>

Fill out the form in the modal and click "Save."

* **User Name:** Name of the User you would like to create,
* **Password:** Password for this User,
* **Confirm Password:** Retype the password to confirm it,
* **Optional:** Select the group you want this user associated with.

<figure><img src="/files/XaNd6O9UY7kXizY07Orx" alt="" width="563"><figcaption><p>User Creation Page</p></figcaption></figure>

To create a new group, navigate to the "Group" tab

<figure><img src="/files/2KJJRMOO0A52ffJ30Xs2" alt=""><figcaption><p>Group Creation</p></figcaption></figure>

&#x20;Complete the form in the modal and save it:

* **Group Name:** Name of the Group you would like to create.
* Select the **user**(s) you want to include in this **group**.

<figure><img src="/files/yBNn6zhuja6lSfkvEshy" alt="" width="563"><figcaption><p>Group Creation Page</p></figcaption></figure>

### **Active Directory**

The configuration enables setting up an Active Directory connection. &#x20;

Validate all settings before saving them using the "Test connection" button.&#x20;

The "Save" button confirms the connection to the selected Active Directory server and integrates the Nodeum server into the Active Directory domain.

<figure><img src="/files/UArThfWCreHiNyZa5OVV" alt=""><figcaption></figcaption></figure>

## Authorization through S3

### Define the rights and privileges

Define the rights and privileges for each user to control and authorize access.  This will allow and  authorize the access of the container.

&#x20;To set this authorization:

* Navigate to the Container section and select it.
* To change user permissions, select "User" and click the "Edit" button. Set the permissions to Read/Write, Read Only, or no access

<figure><img src="/files/rnCIj7Y9QCpuvMtbJ05M" alt=""><figcaption><p>Container User Management</p></figcaption></figure>

<figure><img src="/files/UXUMPn3DsVVIAGZlUvDy" alt=""><figcaption><p>Edit Container</p></figcaption></figure>

<figure><img src="/files/PxsQJiH4Dr5Mfip1DqXs" alt=""><figcaption><p>Define the Container's Priviledges</p></figcaption></figure>

### Generate S3 policy for a local User

You can create an S3 policy to grant a local user access to an S3 bucket within a container.

To create the user, adhere to the instructions provided in the prior section. Afterward, edit the user by following these steps:

<figure><img src="/files/iNhXCqI81l05pQz4rkch" alt="" width="527"><figcaption><p>User detail</p></figcaption></figure>

Instructions:

Find the URL and credentials for the S3 object storage console in the panel.&#x20;

Copy the generated S3 policy to your clipboard

Access the Minio Console using the Root User and Root Password.&#x20;

Navigate to the Access menu, create a new policy, and paste the policy from the clipboard.

<figure><img src="/files/UX4KxGON6TWbYJQflUe5" alt="" width="563"><figcaption></figcaption></figure>

Create a user, define your own password, and attach the defined policy to this user.

<figure><img src="/files/5rmPE9guvrGSSn8hR2kj" alt="" width="563"><figcaption></figcaption></figure>

After completing the setup, you can access the container via S3 using the user credentials you created. By default, this access occurs through port 9000.<br>

## Authorization through NFS

### Ensuring UID and GID Preservation in NFS

To maintain UID and GID consistency between an NFS client and a container accessed via NFS:

1. **UID/GID Matching**: Ensure that the User ID (UID) and Group ID (GID) used in the NFS client match those in the container.
2. **ID Mapping**: Configure ID mapping on both the client and the container to handle any discrepancies. This can be done by editing the `/etc/idmapd.conf` file or using other mechanisms supported by your system.
3. **Consistent User/Group Database**: Use a unified system like LDAP to keep the user and group names synchronized across both environments.
4. **NFS Export Options**: Set the NFS server's export options to maintain UID/GID, such as options `no_root_squash` or `anonuid` and `anongid` settings, to ensure correct access permissions.

### idmap Configuration

To setup idmap on both the client and the Nodeum server.

#### &#x20;Nodeum Server

Edit the idmap.conf file

```bash
...
Domain = localdomain
...
[Mapping]
 
Nobody-User = admin
Nobody-Group = customergroup
...
```

Activate 'idmapping':

```
echo N > /sys/module/nfsd/parameters/nfs4_disable_idmapping
```

Configure the export:

<pre><code><strong>/mnt/FUSE *(rw,all_squash,anonuid=1000,anongid=2000,subtree_check,fsid=0)
</strong></code></pre>

Where uid=1000 is already existing

Where gid=2000 is a new group which has to be created

And restart the service

```
# systemctl restart nfs-idmapd.service
```

#### Client

* uid=1000 is customeruser user
* gid=2000 is customergroup group

&#x20;Edit the idmap.conf file

```bash
[General]
 
Verbosity = 0
Pipefs-Directory = /var/lib/nfs/rpc_pipefs
Domain = localdomain
 
[Mapping]
 
# Nobody-User = nobody
Nobody-User = customeruser
# Nobody-Group = nobody
Nobody-Group = customergroup
```

Activate 'idmapping':

```
echo N > /sys/module/nfsd/parameters/nfs4_disable_idmapping
```

And restart the service

```
# systemctl restart nfs-idmapd.service
```

### Posix Permission Management

#### Group rights Management

Manage properly the group rights in a folder and all members of the groups to create file in or read files.

user1:

```
[user@nodeum localrepo]$ mkdir dataset
drwxrwxr-x  2 user    user                    	4096 May 21 07:50 dataset
[user@nodeum localrepo]$ chgrp nodeum_test dataset/
[user@nodeum localrepo]$ ls -l |grep dataset
drwxrwxr-x  2 user         nodeum_test          4096 May 21 07:50 dataset
[user@nodeum localrepo]$ chmod 770 dataset/ -R
[user@nodeum localrepo]$ ls -l |grep dataset
drwxrwx---  2 user         nodeum_test          4096 May 21 07:50 dataset
[user@nodeum localrepo]$ cd dataset/
[user@nodeum dataset]$ touch afilecontent
[user@nodeum dataset]$ ls -l
total 4
-rw-rw-r-- 1 user user 0 May 21 07:51 afilecontent
[user@nodeum dataset]$ chgrp nodeum_test afilecontent
[user@nodeum dataset]$ ls -l
total 4
-rw-rw-r-- 1 user nodeum_test 0 May 21 07:51 afilecontent
```

user2:

```
[root@nodeum localrepo]$ su user2
[user2@nodeum localrepo]$ cd dataset/
[user2@nodeum dataset]$ ls -l
total 4
-rw-rw-r-- 1 user1 nodeum_test 0 May 21 07:51 afilecontent
[user2@nodeum dataset]$ cat afilecontent
```

#### Inheritance in POSIX for File Creation

Implement group inheritance in POSIX by ensuring that files created within a directory automatically inherit the directory's group membership. This streamlines permissions management and maintains consistent access control across all files

```
[root@nodeum Dataset]# mkdir abc
[root@nodeum Dataset]# chmod 2770 abc
[root@nodeum Dataset]# chown 1002:nodeum-test abc
[root@nodeum Dataset]# ll | grep abc
drwxrws--- 2 1002       nodeum-test       4096 Apr 16 11:44 abc
 
[root@nodeum Dataset]# su 1002
 
bash-4.4$ ls -lah abc
total 12K
drwxrws--- 2 1002       nodeum-test  SETGID 4.0K Apr 16 11:44 .
drwxrwxrwx 4 root       root         4.0K Apr 16 11:44 ..
 
bash-4.4$ touch abc/test
 
bash-4.4$ ls -lah abc/
total 16K
drwxrws--- 2 1002       nodeum-test  4.0K Apr 16 11:46 .
drwxrwxrwx 4 root       root         4.0K Apr 16 11:44 ..
-rw-r--r-- 1 1002       nodeum-test    0 Apr 16 11:46 test
```

### NFS4 ACL

Network File System version 4 (NFSv4) Access Control Lists (ACLs) provide a mechanism to manage permissions for files and directories.&#x20;

Mainly composed by :&#x20;

* **ACL Entries**: Consist of a type (allow or deny), a set of permissions, and a principal (user or group).
* **Permissions**: Include operations such as read, write, and execute. They can be fine-tuned to control access granularly.
* **Principal**: Specifies whom the permissions apply to, such as a specific user, group, or everyone.

#### Usage Example

To set ACLs on a file:

```
[user1@nodeum localrepo]$ nfs4_setfacl -R -a "A:fdi:1007:R" dataset
```

To check ACLs on a file:

```
[user1@nodeum localrepo]$ nfs4_getfacl dataset
# file: dataset
A::OWNER@:rwaDxtTcCy
A::GROUP@:rwaDxtcy
A::EVERYONE@:xtcy
D:fdi:OWNER@:r
A:fdi:OWNER@:tTcCy
A:fdi:1007:rtcy
A:fdi:GROUP@:tcy
A:fdi:EVERYONE@:tcy
```

#### NFS 4 ACL inheritance

How It Works?

When you set an ACL with inheritance attributes on a directory, any new file or subdirectory will automatically inherit these attributes, streamlining permissions management.

<mark style="color:purple;">Example</mark>

To apply a default ACL that inherits to both files and directories, you can use the following command:

```
[root@nodeum dataset]# mkdir dataset
[root@nodeum dataset]# ls -l
total 88
drwxr-xr-x  2 root root 4096 May 20 07:42 dataset

[root@nodeum localrepo]# nfs4_setfacl -a "A:fdi:1002:RWX" dataset/
[root@nodeum localrepo]# nfs4_getfacl dataset/
# file: dataset/
A::OWNER@:rwaDxtTcCy
A::GROUP@:rxtcy
A::EVERYONE@:rxtcy
A:fdi:OWNER@:rwaDxtTcCy
A:fdi:1002:rwaDxtcy
A:fdi:GROUP@:rxtcy
A:fdi:EVERYONE@:rxtcy

[root@nodeum localrepo]# vi dataset/file-1
[root@nodeum localrepo]# mkdir dataset/data-1
[root@nodeum localrepo]# nfs4_getfacl dataset/data-1/
# file: dataset/data-1/
A::OWNER@:rwaDxtTcCy
A::1002:rwaDxtcy
A::GROUP@:rxtcy
A::EVERYONE@:rxtcy
A:fdi:OWNER@:rwaDxtTcCy
A:fdi:1002:rwaDxtcy
A:fdi:GROUP@:rxtcy
A:fdi:EVERYONE@:rxtcy

[root@nodeum localrepo]# nfs4_getfacl dataset/file-1
# file: dataset/file-1
A::OWNER@:rwatTcCy
A::1002:rwatcy
A::GROUP@:rtcy
A::EVERYONE@:rtcy
```

&#x20;


# Access your Container

### How can “User” access Containers?

Access the containers to reach the Archived Data, a virtual file system that includes a comprehensive file and folder structure. This system utilizes an internal cache and is supplemented by secondary storage volumes.

The solution is compatible with

* Windows 7, 8, 10, 11
* MacOS
* Linux

### Windows-Based Operating System&#x20;

#### SMB

To access the Network File Explorer via the command line, enter: `\\nodeumhostname\`<br>

The hostname in this screenshot is "nodeum

<figure><img src="/files/abAuNLjluJEp4WthrLi4" alt=""><figcaption></figcaption></figure>

You will then view the available containers

In this example, "archive" is a defined container. Click the icon

<figure><img src="/files/ZYt8OabFNzlEifbY7hq7" alt=""><figcaption></figcaption></figure>

If Nodeum is configured with Active Directory, this window won't appear. However, if it's set up with a local account, use your Nodeum local username

<figure><img src="/files/mqxorK26lWuBBmsWPS39" alt=""><figcaption></figcaption></figure>

After authorization, the container's contents will appear as a normal Network Shared Folder.

<figure><img src="/files/ejTgkxBhxiB1zWPBBSLj" alt=""><figcaption></figcaption></figure>

### MacOS-Based Operating System&#x20;

#### NFS

&#x20;Navigate to the "Go" menu on your MacOS top bar and select "Connect to Server

<figure><img src="/files/3ev6EXbfkRLoQDTsA2cT" alt=""><figcaption></figcaption></figure>

To connect, enter the Nodeum hostname in the address field as `smb://nodeumhostname`, then click

<figure><img src="/files/cYz7ZEzXKsjlG5a65W1R" alt=""><figcaption></figcaption></figure>

Once your credentials are correctly configured, you can access the Network Shared Folder's contents.

<figure><img src="/files/lpLKGlwSZ44YzsFvW2Xf" alt=""><figcaption></figcaption></figure>

### Linux-Based Operating System&#x20;

#### SMB

In your Linux terminal, mount the container (named archive in the example) in using SMB protocol. Verify that you have the right package installed:

```bash
$ sudo yum install cifs-utils
$ sudo mount.cifs //nodeum.local/archive /mnt/testmnt -o user=johndoe,
pass="secret" 
```

**In this example:**

* **nodeum.local**: hostname of server
* **/archive**: Container name into Nodeum
* **/mnt/testmnt**: access point in your Linux system. In the best practice, the name "testmnt" must be chosen according to the container name.
* **-o user=johndoe,pass="secret"**: johndoe is a user who have access to the container and "secret" is the password of the user.&#x20;

Adding a Mount Point in /etc/fstab

To ensure the mount point is persistent across reboots, you can add it to the `/etc/fstab` file.

```bash
...
//nodeum.local /archive /mnt/testmnt cifs credentials=johndoe 0 0
...
```

#### &#x20;NFS

In your Linux terminal, mount the container (named archive in the example) in using NFS protocols.&#x20;

Verify that you have the right package installed:

```bash
$ sudo yum install nfs-utils nfs-utils-lib
$ sudo mount -t nfs -o vers=4 nodeum.local:/archive /mnt/testmnt
```

&#x20;Adding a Mount Point in /etc/fstab

To ensure the mount point is persistent across reboots, you can add it to the `/etc/fstab` file.

```bash
...
nodeum.local:/archive /mnt/testmnt/ nfs rw,sync,hard,intr 0 0
...
```

### &#x20;Access your container in S3

&#x20;Prior to accessing your container as a bucket, you must define a pair of access key and secret key.&#x20;

For this you need to go to Container User  Management section, then select edit the user profile to whom you want to generate the pair of keys.&#x20;

In this interface, you can see the keys with possibility to generate new ones.

Once you have your pair of keys generated, you need to remap the container authorization list with the new defined user.&#x20;

For doing this, you must click on this button:

<figure><img src="/files/bHlboKrSbIaTh1VMCjke" alt=""><figcaption></figcaption></figure>

Go through an S3-supported application and define a new S3 connection profile.&#x20;

Define a new profile with following configuration:

* &#x20;Protocol: S3 (HTTP) or S3 (HTTPS) if you have configured the SSL option in the Nodeum   configuration.
* Nickname: Your own profile definition.
* Server: Nodeum Server Name
* Port: 9000 is the default port for this service
* Access Key ID: This is the access key defined in the Nodeum Container User Management. It is typically the username.
* Secret Access Key: This is the secret key you have generated in the Nodeum Container User Management

<figure><img src="/files/OnHP9gNPtAxGmJHfMcun" alt=""><figcaption></figcaption></figure>

Once done, you can connect to this profile, and you will see the list of bucket your user can access.

<figure><img src="/files/bSsjYUGZwGosft2ly9zF" alt=""><figcaption></figcaption></figure>


# Identity Management

#### Rights and Metadata Preservation

When Nodeum performs data movement between different storage types, it preserves rights, ownership, and metadata from the source storage.

#### Authentication and Authorization

**Storage Access**

Data movements are executed with root privileges to access all storage systems comprehensively.

#### Nodeum Interface

Nodeum is accessible through several interfaces, employing various user management systems:

* Local user management
* LDAP (Lightweight Directory Access Protocol)
* Active Directory


# Alerts

Notifications can be sent via email or SNMP Trap. Both can be set up to alert users about software misusage or misconfigurations.

### Email Notification Setup

```
System -> Notifications -> Email Tab
```

Ensure all email notifications are configured promptly. Set up the **Email Recipients** section to specify different recipients. When an event occurs, an automatic email alert is dispatched to the admin, including detailed information. Additionally, configure notification services and define the severity level for email alerts.

<figure><img src="/files/Q3wInbov8GC9MCsxUjkX" alt=""><figcaption><p>System Notifications</p></figcaption></figure>

**Email Recipients**

For each user, ensure the email address is active and select the appropriate notification level. Refer to Point 3 for the definition of notification levels.

<figure><img src="/files/HlT6ORHkqBBaa2MKMwvR" alt=""><figcaption></figcaption></figure>

#### **Configuration : own ISP SMTP relay**

<table data-header-hidden><thead><tr><th width="274"></th><th></th></tr></thead><tbody><tr><td>Hostname</td><td>relay.edpnet.be</td></tr><tr><td>From Email address</td><td>any type of email address</td></tr><tr><td>User Name</td><td>empty if your SMTP server doesn’t required any authentication</td></tr><tr><td>Password</td><td>empty if your SMTP server doesn’t required any authentication</td></tr></tbody></table>

#### **Configuration : Office 365 SMTP relay**

<table data-header-hidden><thead><tr><th width="271"></th><th></th></tr></thead><tbody><tr><td>Hostname</td><td>smtp.office365.com</td></tr><tr><td>From Email address</td><td>this has to be an email address which is recognized into your Office 365 account.</td></tr><tr><td>User Name</td><td>This has to be an authorized email address from your Office 365 organization.</td></tr><tr><td><strong>Password</strong></td><td>This is the password linked to the Username specified below.</td></tr></tbody></table>

### **Configuration : Google Mail SMTP relay**

<table data-header-hidden><thead><tr><th width="252"></th><th></th></tr></thead><tbody><tr><td><strong>Hostname</strong></td><td>smtp.gmail.com:587</td></tr><tr><td><strong>From Email address</strong></td><td>this has to be an email address which is recognized into your Google Mail account.</td></tr><tr><td><strong>User Name</strong></td><td>This has to be an authorized email address in your Google Mail organization.</td></tr><tr><td><strong>Password</strong></td><td>For passwords, it is required to create an App password in Google portal. This will allows to by pass the 2FA mechanism.</td></tr></tbody></table>

**Email Recipients**

The Simple Network Management Protocol (SNMP) is a protocol that allows network administrators to manage and diagnose network and hardware issues remotely. Nodeum enables sending SNMP traps to collectors. Trap Destination List is the section where you define the trap configuration.

### **SNMP server configuration**

```
System -> Notifications -> SNMP 
```

<figure><img src="/files/P4GUCvMDkAIucJ79WPtv" alt=""><figcaption><p>SNMP</p></figcaption></figure>

To configure the host SNMP settings, the following parameters are necessary:

<table data-header-hidden><thead><tr><th width="192"></th><th></th></tr></thead><tbody><tr><td><strong>Version</strong></td><td>SNMP version you want to configure.</td></tr><tr><td><strong>Community</strong></td><td>The community string you want to use; by default public should be used.</td></tr><tr><td><strong>System Location</strong></td><td>not mandatory but can be useful to define the solution location.</td></tr><tr><td><strong>System Contact</strong></td><td>not mandatory but can be useful to define the solution point of contact.</td></tr></tbody></table>

**SNMP Trap Destination Management**

Add or remove SNMP trap destinations, configure thresholds, and set alarms for SNMP traps. Normally, these traps are sent to a Network Management System or Infrastructure Monitoring System. Complete the following information:

<table data-header-hidden><thead><tr><th width="254"></th><th></th></tr></thead><tbody><tr><td>Destination address</td><td>Hostname or IP address of the server where the trap has to be sent.</td></tr><tr><td>Community</td><td>The community string which is configured in your trap handler software.</td></tr><tr><td>Version</td><td>SNMP version which is supported by your trap handler software.</td></tr><tr><td>Notification level</td><td>Define the level of severity that will trigger the SNMP trap messages. (see point 3)</td></tr></tbody></table>

**Definitions for Severity Levels**

<table data-header-hidden><thead><tr><th width="85.33333333333331"></th><th width="165"></th><th></th></tr></thead><tbody><tr><td>0</td><td>Message</td><td><p><strong>Action Notification: Level 0 Activation Required</strong></p><p>To receive notifications regarding task completion, please activate Level 0.</p></td></tr><tr><td>1</td><td>Information</td><td><strong>Severity Level: Informational</strong><br>This message serves as an informational notice, indicating that no error has occurred. No response is necessary. It may signal ongoing operations or the successful completion of a task.</td></tr><tr><td>2</td><td>Warning</td><td>This message indicates a potential error where the software defaults to supplanted input due to missing data. The operation's outcome is assumed to align with the user's intent.</td></tr><tr><td>3</td><td>Error</td><td><p><strong>Error Detection and Recovery Notice</strong></p><p>An error has been detected. While automatic recovery procedures were likely applied, and processing continued, a default input may have been substituted. Consequently, the operation's results might be invalid. The function may only be partially complete; for instance, while some items in a list may be processed correctly, others might fail.</p></td></tr><tr><td>4</td><td>Severe</td><td><p><strong>Error Handling Notification</strong></p><p><strong>Issue:</strong> A critical error occurred that cannot be automatically resolved. Default settings cannot be applied.</p><p><strong>Implications:</strong></p><ul><li>If the error is in the source data, the affected input record is skipped.</li><li>If the error occurs during program execution, it leads to an abnormal termination of the program (Severity Level 4).</li></ul><p><strong>Outcome:</strong> The operation results are invalid.</p></td></tr><tr><td>5</td><td>Abnormal End of Program or Function</td><td>The operation concluded, either due to invalid data handling issues or a user termination.</td></tr><tr><td>6</td><td>Abnormal End of Task</td><td>The task was either not initiated or did not complete successfully. Potential issues include a routing step failing to start or ending unexpectedly, a job-level function not being executed as required, or the overall job being terminated.</td></tr><tr><td>7</td><td>System Status</td><td>This type of urgent message is sent exclusively to the system operator, providing either a status update or a warning concerning a device, subsystem, or the entire system.</td></tr><tr><td>8</td><td>Device Integrity</td><td>A message of this severity is sent solely to the system operator. It indicates a device malfunction or that a device is no longer operational. You might restore system operation yourself, or you may need the help of a service representative.</td></tr><tr><td>9</td><td>System Alert</td><td>A message of this severity is issued only to the system operator. It warns of a condition that, although not severe enough to stop the system now, could become more severe unless preventive measures are taken.</td></tr><tr><td>10</td><td>System Integrity</td><td><p></p><p>A severe message is issued solely to the system operator. It details a condition that makes a subsystem or the entire system non-functional.</p></td></tr></tbody></table>


# Log Management

#### Event Log Management

All systems and tasks are logged into a central management service. This service collects these logs and displays them in the Event Log Management section. The log information is available in real-time, with an option to access historical data for log searches.

### Event Log

#### Trace Collector Overview

The Trace Collector is an asynchronous system designed to assist the advanced support team in diagnosing technical issues. It gathers, compresses, and archives debug files, making them available for download once they are ready.

<table><thead><tr><th width="275">File</th><th>Description</th></tr></thead><tbody><tr><td>All</td><td>This gather all below informations</td></tr><tr><td>Data Mining</td><td>Statistics about product usage.</td></tr><tr><td>File System Virtualization</td><td>This is about the container usage feature.</td></tr><tr><td>Library Manager</td><td>This is about the Tape Library and Tape Drive Management.</td></tr><tr><td>Manager</td><td>This is about the the Workflow Manager and help to solve issue which happened during tasks executions.</td></tr><tr><td>Watchdog</td><td>This is about the watchdog and how services are monitored</td></tr><tr><td>System</td><td>Anything about the system itself.</td></tr><tr><td>Interface</td><td>Anything about the Console</td></tr></tbody></table>

To activate tracing and provide the required information, [enable the debug trace](/data-archiving/console/system-settings/general-configuration#module).

<figure><img src="/files/dnzXPN55xOzwpizLLcQ0" alt=""><figcaption><p>Event Logs</p></figcaption></figure>


# Compatibility Guide

Supported OS, server sizing, disk layout, and validated storage compatibility (NAS, object, and tape) for Nodeum deployments.

### Software requirement

**Supported Operating Systems**: List all operating systems the software supports.

**Minimal ISO Image**: Ensure a minimal ISO image is available.

<table><thead><tr><th width="216"></th><th width="243.33333333333331">Operating System</th><th>Version</th><th>Architecture</th></tr></thead><tbody><tr><td>Linux</td><td>RHEL </td><td>8 - 9</td><td>x86-64</td></tr><tr><td></td><td>Rocky </td><td>8 - 9</td><td>x86-64</td></tr><tr><td></td><td>Almalinux </td><td>8 - 9</td><td>x86-64</td></tr><tr><td></td><td>Ubuntu</td><td>22.04 LTS</td><td>x86-64</td></tr><tr><td></td><td>Ubuntu</td><td>24.04 LTS</td><td>x86-64</td></tr></tbody></table>

### Server Specification

The software can be installed on both physical and virtual servers.

{% hint style="danger" %}
To configure a Tape Library, Nodeum must be installed on a physical server. Tape Libraries are not supported on Virtual Machines.
{% endhint %}

For optimal performance, we suggest these specifications:

<table><thead><tr><th width="166"></th><th width="189">Up to 10 Million Files</th><th width="204">Up to 100 Million Files</th><th>Up to 1 Billion Files</th></tr></thead><tbody><tr><td><strong>Memory</strong></td><td>32 GB</td><td>128GB</td><td>Upon Request</td></tr><tr><td><strong>Processors</strong></td><td>6</td><td>2 x 12</td><td>Upon Request</td></tr><tr><td><strong>System Disk</strong></td><td>110 GB</td><td>900 GB</td><td>Upon Request</td></tr></tbody></table>

{% hint style="info" %}
For configuration and setup details, contact our support team. They will assist in validating the architecture sizing.
{% endhint %}

#### Disk Partitioning Guidelines

For optimal performance, the following disk and volume partitioning specifications are recommended:

* `/opt/`: Minimum size of 100GB (size may vary based on the number of executed tasks and number of files processed by each task)
* `/home/`: Minimum size of 10GB
* `/var/`: Minimum size of 100GB (size may vary based on the number of managed and indexed contents)
* `/tmp/`: Minimum size of 10GB

{% hint style="info" %}
Minimal ISO image is required.
{% endhint %}

### NAS Storage&#x20;

Nodeum supports the following network protocols :

* **NFS**: Versions v3, v4, v4.1, v4.2
* **SMB**: Versions v1, v2.1, v3.0

### Object Storage&#x20;

Nodeum supports interaction with object storage using S3 or Swift protocols.&#x20;

The software ensures compatibility and connectivity with numerous object storage providers.

#### Provider supported

We have validated and certified the compatibility of our product with various object storage providers. The compatibility matrix below outlines the different technologies and vendors that Nodeum supports:

<details>

<summary><strong>Amazon</strong></summary>

<mark style="color:blue;">Product :</mark> AWS S3 Storage

<mark style="color:blue;">Type :</mark> Public

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Amazon AWS S3 Storage

</details>

<details>

<summary><strong>CEPH</strong></summary>

<mark style="color:blue;">Product :</mark>

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Generic S3

</details>

<details>

<summary><strong>Cloudian</strong></summary>

<mark style="color:blue;">Product :</mark> HyperStore

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Cloudian HyperStore

</details>

<details>

<summary><strong>Datacore</strong></summary>

<mark style="color:blue;">Product :</mark> DataCore Swarm

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> DataCore Swarm

</details>

<details>

<summary><strong>DellEMC ECS</strong></summary>

<mark style="color:blue;">Product :</mark> ECS

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> DellEMC ECS

</details>

<details>

<summary><strong>FileBase</strong></summary>

<mark style="color:blue;">Product :</mark>

<mark style="color:blue;">Type :</mark> Public

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Generic S3

</details>

<details>

<summary><strong>Google</strong></summary>

<mark style="color:blue;">Product :</mark> Google Cloud Storage

<mark style="color:blue;">Type :</mark> Public

<mark style="color:blue;">Protocol :</mark> Google Storage

<mark style="color:blue;">Nodeum Connector :</mark> Google Cloud Storage

</details>

<details>

<summary><strong>Huawei</strong></summary>

<mark style="color:blue;">Product :</mark> **OceanStore**

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Generic S3

</details>

<details>

<summary><strong>IBM</strong></summary>

<mark style="color:blue;">Product :</mark> IBM Cloud Object Storage (COS)

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Generic S3

</details>

<details>

<summary><strong>MinIO</strong></summary>

<mark style="color:blue;">Product :</mark>

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Generic S3

</details>

<details>

<summary><strong>Microsoft</strong></summary>

<mark style="color:blue;">Product :</mark> Azure Blob

<mark style="color:blue;">Type :</mark> Public

<mark style="color:blue;">Protocol :</mark> Blob

<mark style="color:blue;">Nodeum Connector :</mark> Microsoft Azure Blob Storage

</details>

<details>

<summary><strong>NetApp</strong></summary>

<mark style="color:blue;">Product :</mark> StorageGRID

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Generic S3

</details>

<details>

<summary><strong>OpenStack SwIFT (°)</strong></summary>

<mark style="color:blue;">Product :</mark> non-Keystone - Keystone v2.0 - Keystone v3.0

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> Swift

<mark style="color:blue;">Nodeum Connector :</mark> Openstack Swift

</details>

<details>

<summary><strong>Quantum</strong></summary>

<mark style="color:blue;">Product :</mark> Activescale - ActiveScale Cold Storage

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Quantum ActiveScale

</details>

<details>

<summary><strong>Scality</strong></summary>

<mark style="color:blue;">Product :</mark> Scality Ring

<mark style="color:blue;">Type :</mark> On-Premise

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Scality Ring

</details>

<details>

<summary><strong>Wasabi Hot Cloud Storage</strong></summary>

<mark style="color:blue;">Product :</mark>

<mark style="color:blue;">Type :</mark> Public

<mark style="color:blue;">Protocol :</mark> S3

<mark style="color:blue;">Nodeum Connector :</mark> Wasabi Hot Cloud Storage

</details>

### Tape Library&#x20;

Natively, Nodeum supports and manages tape library as secondary storage.\
It uses the LTFS open format specifications (2.4.0) to write data on magnetic tapes.

Barcode Tape management capabilities are supported for Fiber Channel - SAS Tape Library

Nodeum seamlessly integrates with a variety of Tape Libraries and Tape Drives.&#x20;

It automates tape library management through SCSI over Fiber Channel or an ACSLS server.&#x20;

For tape drive connectivity, it supports both Fiber Channel and SAS. The default tape format is LTO, starting from LTO5.

<details>

<summary><strong>DELL/EMC PowerVault</strong></summary>

<mark style="color:blue;">Product :</mark> Tape Library TL2000 - TL4000 -  ML6000&#x20;

<mark style="color:blue;">Protocol :</mark> Fiber Channel

</details>

<details>

<summary><strong>HPE StoreEver</strong></summary>

<mark style="color:blue;">Product :</mark>  Tape Library ESL G3 - T950 - MSL6480 - MSL2024/4048 -&#x20;

<mark style="color:blue;">Protocol :</mark> Fiber Channel

</details>

<details>

<summary><strong>IBM TS Series</strong></summary>

<mark style="color:blue;">Product :</mark> TS Series

<mark style="color:blue;">Protocol :</mark> Fiber Channel

</details>

<details>

<summary><strong>Quantum Scalar</strong></summary>

<mark style="color:blue;">Product :</mark> Scalar i3 - Scalar i6 - Scalar i500 - Scalar i6000

<mark style="color:blue;">Protocol :</mark> Fiber Channel

</details>

<details>

<summary><strong>Oracle / StorageTek</strong></summary>

<mark style="color:blue;">Product :</mark>  Modular Tape Library : SL150 - SL3000 - SL4000 - SL8500&#x20;

<mark style="color:blue;">Protocol :</mark> Fiber Channel / ACSLS

</details>

<details>

<summary><strong>Overland</strong></summary>

<mark style="color:blue;">Product :</mark>  Neo Series

<mark style="color:blue;">Protocol :</mark> Fiber Channel&#x20;

</details>

<details>

<summary><strong>Spectra Logic</strong></summary>

<mark style="color:blue;">Product :</mark> T950

<mark style="color:blue;">Protocol :</mark> Fiber Channel

</details>

#### LTO Ultrium Drive Series

* LTO-10 Ultrium Drive
* LTO-9 Ultrium Drive
* LTO-8 Ultrium Drive
* LTO-7 Ultrium Drive
* LTO-6 Ultrium Drive
* LTO-5 Ultrium Drive

### Client OS&#x20;

The file system used an internal cache system and is extended with secondary storage volumes.

<table><thead><tr><th width="151">Client Operating system</th><th>Version</th><th>Access Container</th><th>Access Console</th></tr></thead><tbody><tr><td>Windows</td><td>Windows 10 - 11<br>Windows Server 2008, 2012, 2016</td><td>SMB / NFS</td><td>HTTP/HTTPS</td></tr><tr><td>MacOS</td><td>MacOS </td><td>SMB / NFS</td><td>HTTP/HTTPS</td></tr><tr><td>Linux</td><td>Ubuntu<br>Debian<br>Fedora<br>CentOS<br>RHEL</td><td>SMB / NFS</td><td>HTTP/HTTPS</td></tr></tbody></table>

### Client Application&#x20;

| Client Application  | OS                  | Protocol        |
| ------------------- | ------------------- | --------------- |
| Cyberduck           | Windows/MacOS       | S3 (HTTP/HTTPS) |
| CloudBerry Explorer | Windows/MacOS       | S3 (HTTP/HTTPS) |
| MinIO Client        | Windows/MacOS/Linux | S3 (HTTP/HTTPS) |
| rclone              | Windows/MacOS/Linux | S3 (HTTP/HTTPS) |


# Product Specifications

UTF-8 support and filename restrictions, plus key platform limits for tasks, containers, and NAS/S3/tape backends.

### Character Set Support

#### UTF-8 Encoding Overview

UTF-8 encodes all character data, providing consistent representation across various storage systems. Defined by RFC 3629, UTF-8 is a variable-length encoding capable of representing all 1,112,064 valid Unicode code points using one to four 8-bit bytes.

* **ASCII Range (U+0000 to U+007F):** Encoded using a single byte, maintaining binary compatibility with ASCII.
* **Higher Ranges:** Encoded using two to four bytes, optimized to minimize size and maximize compatibility for frequently used characters.

This strategy ensures comprehensive Unicode support, efficient storage, and reliable interoperability with modern file systems and network protocols.

#### UTF-8 Restrictions

Avoid using certain UTF-8 characters in file or folder names:

* `/` and `|` are reserved by the filesystem and shell.
* `%` and `:` should not be the sole characters in a name.

When a file or folder is encoded with a non-UTF-8 character set, it will automatically be re-encoded using the format `%MNGA182` followed by the **hexadecimal representation** of the original name. This process maintains compatibility and helps track files with unsupported or legacy encodings.

These limits apply to tasks, naming, containers, and supported backends. Some values reflect underlying OS or protocol constraints.

### Limitations

These limits apply to tasks, naming, containers, and supported backends. Some values reflect underlying OS or protocol constraints.

#### Tasks Limitations

| Tasks                    | Value                      |
| ------------------------ | -------------------------- |
| Maximum number of tasks  | 18,446,744,073,709,551,615 |
| Maximum task name length | 255 characters             |

| Files And Directories                   | Value                      | Notes                                                     |
| --------------------------------------- | -------------------------- | --------------------------------------------------------- |
| Maximum number of files and directories | 18,446,744,073,709,551,615 | Includes active, archived, exchange, and deleted entries. |

| Names and paths                | Value          | Notes                                                                                                       |
| ------------------------------ | -------------- | ----------------------------------------------------------------------------------------------------------- |
| Maximum filename length        | 255 characters | If a non-UTF-8 character is detected, the name is re-encoded. This reduces the effective max length.        |
| Maximum path + filename length | 4096 bytes     | Matches OS `PATH_MAX`. Unicode can use multiple bytes. Practical limit is also capped at 21,845 characters. |

For files or folders with non-UTF-8 characters, Nodeum re-encodes them as: `%MNGA182` followed by the hexadecimal representation of the original name.

#### Metadata Limitations

| Metadata fields           | Value          |
| ------------------------- | -------------- |
| Metadata name length      | 256 characters |
| Metadata value length     | 256 characters |
| Custom field name length  | 256 characters |
| Custom field value length | 256 characters |

#### Reserved Extended Attribute Metadata

The following attribute names are reserved by Nodeum for extended metadata:

* `user.mtcsize`
* `user.mtcid`
* `user.mtcincache`
* `user.mtclastgetdate`
* `user.mtclastupdate`

| Container                    | Value                                                         | Notes                                                    |
| ---------------------------- | ------------------------------------------------------------- | -------------------------------------------------------- |
| Maximum number of containers | 100                                                           |                                                          |
| Container name length        | 4–25 characters                                               |                                                          |
| First character              | Must be lower case                                            | Required if the container must be accessible through S3. |
| Unsupported patterns         | `_`, trailing `-`, `;;`, `--`, IP address (e.g. `10.10.10.2`) |                                                          |

#### File System Commands

This system supports all standard file operations such as `mkdir`, `rmdir`, `ls`, and `cd`, but it does not support symbolic links.

#### Storage Limitations

| Nas Storage          | Value          |
| -------------------- | -------------- |
| Hostname length      | 55 characters  |
| Target name length   | 255 characters |
| Mount options length | 255 characters |
| Username length      | 255 characters |
| Password length      | 255 characters |

| S3 - Object Storage                         | Value                                 |
| ------------------------------------------- | ------------------------------------- |
| Cloud connector name length                 | 25 characters                         |
| Bucket name length                          | 64 characters                         |
| Location/region length                      | 15 characters                         |
| Buckets                                     | No limit                              |
| Objects per bucket                          | No limit                              |
| Multipart uploads returned per list request | 1,000                                 |
| Objects returned per list request           | 1,000                                 |
| Parts per upload                            | 10,000                                |
| Parts returned per list parts request       | 1,000                                 |
| Max object size                             | 5 TB                                  |
| Max object size per PUT operation           | 5 TB                                  |
| Min object size                             | 0 B                                   |
| Part size                                   | 5 MB to 5 GB (last part: 0 B to 5 GB) |

| Tape Library                     | Value          |
| -------------------------------- | -------------- |
| Tape library name length         | 250 characters |
| Tape pool name length            | 255 characters |
| Barcode length                   | 8 characters   |
| Maximum number of tape libraries | 16             |
| Maximum number of drives         | 256            |
| Maximum number of tapes          | 15,000         |


# System Reliability

***

### Summary

This section groups the runbooks used to keep Nodeum available. It focuses on backups and controlled failover procedures.

### Next steps

1. Set up and validate your backup plan in [Backup & Restore](/data-archiving/system-reliability/backup-and-restore).
2. Review and rehearse single-site recovery in [Failover Procedure - One Site](/data-archiving/system-reliability/failover-procedure-one-site).
3. If you run HA, confirm the cutover steps in [Failover - Active/Passive](/data-archiving/system-reliability/failover-active-passive).


# Backup & Restore

### Backup - automated Execution

A backup captures the key data of the configured solution. If the system fails, you can use the backup to restore it to its previous state.

#### Components

* **Databases**: SQL and NoSQL data, including the file catalog, metadata, and task execution history.
* **S3 and Swift API keys**: Authentication credentials for S3 and Swift storage providers.
* **Task execution log reports**: Processing history for each file in each task.

<figure><img src="/files/ZzUZtLcRvkYpaPixeDOG" alt=""><figcaption></figcaption></figure>

#### How to Schedule a Backup

1. Open the **Settings** menu.
2. Navigate to the **Backup** section.
3. Click on the **+** button.
4. Then complete & save the form, here is an example:

<figure><img src="/files/AVYqnt1Fud2xcqmT8Ml1" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/JPBfSb43Y2lZjLaaqXS4" alt=""><figcaption></figcaption></figure>

There are two different types of backup available :

<table><thead><tr><th width="202">Type</th><th>Definition</th></tr></thead><tbody><tr><td>Full Backup</td><td>Backup everything every time</td></tr><tr><td>Incremental Backup</td><td>Backup only the difference since the last backup</td></tr></tbody></table>

{% hint style="danger" %}
Conduct a full backup weekly, while performing incremental backups at other times.
{% endhint %}

Different scheduling options are available :

<table><thead><tr><th width="174.33333333333331">Option</th><th width="273">Definition</th><th>Comments</th></tr></thead><tbody><tr><td>Timezone</td><td>The schedule can be defined based on a different timezone</td><td>Defined by default, it will be current system timezone</td></tr><tr><td>Recurrence</td><td>Once</td><td>Defined by default , there is no recurrence selected</td></tr><tr><td></td><td>Every</td><td>Minute - Day - Month - Year</td></tr><tr><td></td><td>Expands</td><td>Expand the scope of the recurrence</td></tr><tr><td></td><td>Count Option</td><td>Number of backup</td></tr></tbody></table>

{% hint style="info" %}
If your server fails, reinstall the Nodeum software and restore your backup to resume data management activities.
{% endhint %}

### Backup - Manual Execution

#### How to execute a backup manually?

To initiate a manual backup or restore, execute the following shell script command:

`/opt/nodeum/tools/backup_restore.sh`

```bash
nodeum#/usr/mtc/bin/backup_restore.sh param1 param2
```

**Parameter 1**: `f` for full backup or `i` for incremental backup.\
**Parameter 2**: The path where the backup will be saved or where a restore operation will occur.

If an incremental backup is requested without an existing full backup, a full backup will be performed instead. Each incremental backup adds to the existing full backup, ensuring the backup remains restorable.

Example:

```bash
$ nohup /opt/nodeum/tools/backup_restore.sh full_backup /root/nodeum_bck_2302 &
```

The `nohup` command and the `&` operator can be used to run a backup script as a background process. The output of the executed command is saved in the file `nohup.out`.

{% hint style="info" %}
The full backup overwrites the previous full backup, while the incremental backup adds only new or changed data to the folder.
{% endhint %}

#### Components Software

The Backup includes all of these components :

<table><thead><tr><th width="251">Components</th><th>Description</th><th data-hidden></th></tr></thead><tbody><tr><td>All databases</td><td>This includes SQL and NoSQL information: file catalog, metadata, task execution history.</td><td></td></tr><tr><td>S3 - Swift API Keys</td><td>Authentication Key Credentials of S3 and Swift storage provider.</td><td></td></tr><tr><td>Data enrichment API Keys</td><td>Authentication Key Credentials of Machine Learning provider.</td><td></td></tr><tr><td>Tasks execution log reports</td><td>History of each files processed per task.</td><td></td></tr><tr><td>Licence Key</td><td>Nodeum Encrypted License Key</td><td></td></tr></tbody></table>

### Restore

#### How to execute a restore manually ?

To restore a backup, execute the following command line.

```bash
$ /opt/nodeum/tools /backup_restore.sh param1 param2
```

<mark style="color:green;">param1</mark> : r for restore

<mark style="color:green;">param2</mark> : source path where the backup is located

Example:

```bash
$ nohup /opt/nodeum/tools/backup_restore.sh restore /root/nodeum_bck_2302 &
```

The "nohup" command and "&" symbol allow running a backup script in the background. The output of the executed command is saved in a file named "nohup.out".

#### Important Note

**Temporary Folder Usage**: By default, the script utilizes a temporary folder located at `/tmp/bckp/` on the main file system for storing backups before they are moved to their final destination. You can specify a different folder as the third argument to customize this location.

Example: In this scenario, the backup will be stored in the `/nas/backupnodeum/` directory, and the system will use `/tmp/` as a temporary cache.

```bash
/bin/bash ./backup_restore.sh full_backup /mnt/MOUNT_POINTS/nas/backupnodeum
```

#### Backup Configuration

In this example, the backup will be stored in the directory `/nas/backupnodeum/`. The system will use `/mnt/CACHE/tempbck` as a temporary cache during the backup process.

```bash
/bin/bash ./backup_restore.sh full_backup /mnt/MOUNT_POINTS/nas/
backupnodeum /mnt/CACHE/tempbck
```

**Troubleshooting Backup Process Not Starting**

If your backup process does not start and the console shows a message indicating that a `backup_restore.sh` script is already running, follow these steps:

1. **Check for Running Processes:**
   * Use the command `ps -aef` to determine if another process is currently executing.
2. **Check for Lock File:**
   * It is possible that a lock file named `nodeum_bkp_lock` exists, stored in the `/tmp` directory, even if the temporary folder location has been modified.

Verify these two aspects to resolve the issue.


# Failover Procedure - One Site

### Consideration&#x20;

1. Nodeum has been erased or alterated
2. Configuration in Nodeum has been erased or alterated
3. Caching Disk is not impacted.

### Prerequesites

**Step 1 :**&#x20;

Activate the backup feature, then the backup is done in a regular basis (defined during the backup configuration).  Be careful to export this backup.&#x20;

**Step 2 :**&#x20;

Move the generated backup to external devices.&#x20;

### In case of failure

**Step 1** : Reinstall Nodeum from scratch in using the last Ansible packages&#x20;

**Step 2** : Copy the generated [backup](/data-archiving/system-reliability/backup-and-restore#backup) into a folder in Nodeum server.&#x20;

**Step 3** : Restore the backup in using the appropriated procedure.&#x20;

**Step 4** : The server is now back online.


# Failover - Active/Passive

### Introduction

Manage a product configured in an active/passive cluster mode.

### Objective

This procedure pertains to implementing Nodeum in an active-passive configuration.

### Architecture

<figure><img src="/files/P1ImSymW5RR9mglLrfxf" alt=""><figcaption></figcaption></figure>

### Implementation Overview

The failover mechanism is established via an Ansible package during the initial Nodeum deployment. The Ansible inventory defines the cluster members and associated services. Once deployed, the system provides these key services:

* **Service Redundancy**: Ensures Nodeum and its components are redundant.
* **Cache Disk Redundancy**: Guarantees redundancy for the cache disk.
* **Single Namespace IP Address**: Provides a unified access point.

In the event of a node failure, the system automatically redirects access through the second node, ensuring continuous availability.

## Ansible Inventory Overview

Below is a definition detailing how services are deployed across two servers.

20-main

```bash
[mongodb]
srv01
srv02

[web]
srv01
srv02

[core]
srv01
srv02

[scheduler]
srv01
srv02

[refparser]
srv01
srv02

[mount_point_scanning]
srv01
srv02
```

11-mariadb-cluster

```bash
[mariadb]
; When updating from a single node to a cluster, only the node that
;   previously hold the data should be set to `true`
srv01  galera_master=true
srv02

```

31-catalog-indexer

```bash
[zookeeper_nodes]
srv01
srv02

[solr]
srv01
srv02

[solr:vars]

; Product of these two variables should be lower or equal to number of hosts

; Number of shards to split the collection into.
; Default: 3
; solr_shards=3
; Number of copies of each document in the collection.
; Default: 1
; solr_replication_factor=1

[catalog_indexer]
srv01
srv02

```

31-catalog-indexer

```bash
[gluster_cache]
srv01  gluster_cache_device=/dev/sdb  gluster_logical_size=100%FREE
srv02  gluster_cache_device=/dev/sdb  gluster_logical_size=100%FREE

[gluster_cache:vars]
; Arbiter count
; gluster_arbiters=

; Disperse count
; gluster_disperses=

; Redundancy count
; gluster_redundancies=

; Replica count
; gluster_replicas=

; Stripe count
; gluster_stripes=

```

#### Resiliency Level, Cluster, and Failover

#### &#x20;**Definitions**

**Cluster**: A service running in cluster mode operates simultaneously on both nodes without interruption.

**Failover**: This mode automatically restarts services and shifts the virtual IP to the passive server when needed, ensuring continuity.

Below is a list of services and their corresponding resiliency levels:

<table><thead><tr><th width="287">Nodeum Services</th><th>Resiliency Level</th></tr></thead><tbody><tr><td>Notification Manager</td><td>Failover</td></tr><tr><td>Core Manager</td><td>Failover</td></tr><tr><td>Tape Library Manager</td><td>Failover</td></tr><tr><td>Data Mining</td><td>Failover</td></tr><tr><td>File System Virtualization</td><td>Failover</td></tr><tr><td>Watchdog</td><td>Failover</td></tr><tr><td>Ref. File Parsing</td><td>Failover</td></tr><tr><td>Scheduler</td><td>Failover</td></tr><tr><td>File Listing Processing</td><td>Failover</td></tr><tr><td>Indexation Engine</td><td>Failover</td></tr></tbody></table>

<table><thead><tr><th width="288">System Services</th><th>RESILIENCY LEVEL</th></tr></thead><tbody><tr><td>CACHE Disk</td><td>Cluster</td></tr><tr><td>Solr</td><td>Cluster</td></tr><tr><td>NGINX</td><td>Cluster</td></tr><tr><td>MariaDB</td><td>Cluster</td></tr><tr><td>MongoDB</td><td>Cluster</td></tr><tr><td>SMB</td><td>Cluster</td></tr><tr><td>NFS</td><td>Cluster</td></tr><tr><td>MinIO</td><td>Not yet available</td></tr></tbody></table>

### &#x20;System troubleshooting

#### &#x20;Service Status Monitoring

You can monitor the status of each service by accessing the web interface of each node. The active server must have all Nodeum services running, while the passive server should have the "Core Manager," "Scheduler," "File Listing Processing," and "Indexation Engine" services stopped.

| Server “Active”                                                                     | Server “Passive”                                                                    |
| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| <img src="/files/ZgX6YsIRVuoo0aFGyaqN" alt="" data-size="original">                 | <img src="/files/hjCjf3njdt5m1RFfH6We" alt="" data-size="original">                 |
| ![](file:///C:/Users/JESSIC~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png) | ![](file:///C:/Users/JESSIC~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg) |

| Server “Active”                                                     | Server “Passive”                                                    |
| ------------------------------------------------------------------- | ------------------------------------------------------------------- |
| <img src="/files/hM9i6tZU7doJfuyY1niI" alt="" data-size="original"> | <img src="/files/rb9OCC6vgXjhK7BYRmPx" alt="" data-size="original"> |

#### Cluster Node Maintenance Guide

To perform maintenance on a cluster node while ensuring continuous service, follow these steps:

1. **Objective**: Stop each server one at a time, making sure at least one server remains active at all times.
2. **Options for Shutdown**:
   * **Via Nodeum Console**: Access the Nodeum Console for the server you wish to shut down and initiate the shutdown process.
   * **Via SSH**: Connect to the server using SSH and execute the shutdown command.

By adhering to this process, you can maintain the cluster effectively without service interruption.

To verify which node is active, check which one has the clustered IP assigned. Use the command `ip address show` to display the IP addresses on the network interfaces. The active server will have both its main IP address and the clustered IP address.

In this example:

* The network interface device name on both servers is `ens160`.
* The IP address of the cluster is `10.3.1.111`.
* The IP address of `nodcluster01` is `10.3.1.101`.
* The IP address of `nodcluster02` is `10.3.1.102`.

```bash
$ ip address show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group 
default qlen 1000
    link/ether 00:50:56:be:f4:1d brd ff:ff:ff:ff:ff:ff
    inet 10.3.1.154/24 brd 10.3.1.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::8216:6cb0:f936:9863/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
```

```bash
$ ip address show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group 
default qlen 1000
    link/ether 00:50:56:be:cc:d4 brd ff:ff:ff:ff:ff:ff
    inet 10.3.1.155/24 brd 10.3.1.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 10.3.1.153/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::641e:f11a:fe5d:e531/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
```

### Situation 1: Unexpected Stop of Active Node

#### List of Cases:

* Power outage
* Virtual server downtime
* Operating system failure

**What’s happened:**

\-        Nodeum switch the second (passive) node automatically

\-        Services are restarted on the second for the failover service.

**Note:** In this scenario, the passive node remains unaware of the cluster's state transfer. This situation arises when the cluster is presumed to be split, with the node in a smaller subset, often due to temporary network issues causing nodes to momentarily lose connection. The node uses this precaution to prevent data inconsistencies.

**Result:**&#x20;

I can't get into the Nodeum Console, it gives me a “internal 500 error”.&#x20;

**Determine the root cause**:&#x20;

Check the Status of MariaDB with this command: `‘systemctl status mariadb’`. The status may display the following error message 'WSREP has not yet prepared node for application use'.

**Resolution:**&#x20;

This temporary state which can be detected by checking wsrep\_ready value. The node allows SHOW and SET command during this period.

```bash
$ mysql -u root -padmin
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_ready';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_ready   | OFF   |
+---------------+-------+
```

In the Server that have the Issue:

```bash
$ mysql -u root -padmin
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 48

Server version: 10.4.18-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SET GLOBAL wsrep_provider_options='pc.bootstrap=true';
```

#### Situation 2: Two nodes stopped Restart two nodes which fall down in the same time

&#x20;**List of cases:**

\-        Power outage on both node

\-        (Virtual) Servers down

\-        Virtual Cluster down

\-        Loss of Operating System

**What’s happened:**

\-        All servers are down and must be restarted when systems are back online

\-        Once servers are restarted, they need to elect the master one to handle the DB Cluster service.

Note : If you shut down all nodes at the same time, then you have effectively terminated the cluster. Of course, the cluster's data still exists, but the running cluster no longer exists.

**Result :**&#x20;

MariaDB does not start correctly.

**Resolution :**&#x20;

Once you restart the servers, you'll need to bootstrap the cluster again. If the cluster is not bootstrapped and MariaDB on the first node is just started normally, then the node will try to connect to at least one of the nodes listed in the wsrep\_cluster\_address option.

If no nodes are currently running, then this will fail. Bootstrapping the first node solves this problem. In some cases, Galera will refuse to bootstrap a node if it detects that it might not be the most advanced node in the cluster. Galera makes this determination if the node was not the last one in the cluster to be shut down or if the node crashed. In those cases, manual intervention is needed.

If you experience this issue the recovery\_galera command solves it

```bash
$ /usr/bin/galera_recovery
```

If we cannot recover with the recovery\_galera command it means that we will have to do it manually, for which on the server we will edit the file `/var/lib/mysql/grastate.dat` and change the value of `safe_to_bootstrap: 0` to `safe_to_bootstrap: 1` on the server that we believe has the most up-to-date data from the databases.

```bash
$ vi /var/lib/mysql/grastate.dat
```

Then on the same server we execute the following command:

```bash
$ galera_new_cluster 
```

And on the other server we start MariaDB normally

```bash
$ systemctl restart mariadb 
```

With this, our MariaDB cluster should be normalized.

#### Situation 3: Lost of network connectivity on node 1

**List of cases:**

\-        Network Equipments are down

\-        Network Cable(s) connected to the server are faulty

\-        Network interface of the server is faulty

**What’s happened:**

\-        The server is unreachable from a network point of view; then the failover service of the cluster will detect that the server is not reachable anymore from the network.

\-        The result is that the system will failover to the second server and reassign the clustered ip to the second server.

#### Situation 4: Unexpected disconnection of the cache storage

**List of cases:**

\-        Network have been disconnected – flapped

\-        Network Cable(s) connected to the server are faulty

\-        Internal disk that serves as cache has been disconnected

**What’s happened:**

\-        The server is unreachable from a network point of view; the internal volume serving the cache is not available.

\-        The result is that the system that the Container contents cannot operate properly.

\-        Task(s) can display some file with the status as ‘NO FILE’.

&#x20;**Result :**&#x20;

Service ‘nodeum\_file\_system\_virt’ does not start correctly.

**Resolution :**

On both servers, execute these actions:

Node 1: unmount the volume manually and remount it

```bash
$ umount /srv/gluster/nodeum_cache_brick
$ mount -a

```

Node 2: Unmount the volume manually and remount it

```bash
$ umount /srv/gluster/nodeum_cache_brick
$ mount -a

```

Afterwards, you can restart the GlusterFS daemon and the Nodeum File System virtualization service.

Node 1:

```bash
$ systemctl restart glusterd
$ systemctl restart nodeum_file_system_virt
```

Node 2:

```bash
$ systemctl restart glusterd 
$ systemctl restart nodeum_file_system_virt
```

At this stage, on both servers, you will be able to display the volume behind each of these volumes:

```bash
$ ls /srv/gluster/nodeum_cache_brick
$ ls /mnt/CACHE
$ ls /mnt/FUSE
```

If tasks reported file with ‘NO FILE’ status, then you have to restart the task and the problems should be resolved, meaning that all files have to be processed.

It is also important to use these commands to verify the good state of the Gluster File System

On both servers, we need to have the same results for these following commands:

```bash
$ gluster volume status nodeum_cache_brick clients
Client connections for volume nodeum_cache_brick
----------------------------------------------
Brick : 10.x.x.1:/srv/gluster/nodeum_cache_brick
Clients connected : 2
Hostname                                BytesRead    BytesWritten       OpVersion
--------                                ---------    ------------       ---------
10.x.x.1:49108       	               38043530114   230085103629        70200
10.x.x.2:49144          	         37815908       179832112        70200
----------------------------------------------
----------------------------------------------
```

```bash
$ gluster volume status nodeum_cache_brick
Status of volume: nodeum_cache_brick
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 10.x.x.1:/srv/gluster/nodeum_cache	
_brick                                      49152     0          Y       110881
Brick 10.x.x.2:/srv/gluster/nodeum_cache
_brick                                      N/A       N/A        Y       16258

Task Status of Volume nodeum_cache_brick
------------------------------------------------------------------------------
There are no active volume tasks
```

```bash
$ gluster volume status nodeum_cache_brick clients
Client connections for volume nodeum_cache_brick
----------------------------------------------
Brick : 10.x.x.1:/srv/gluster/nodeum_cache_brick
Clients connected : 1
Hostname                        BytesRead    BytesWritten       OpVersion
--------                        ---------    ------------       ---------
10.x.x.1:49108                  38319242436  231731737617           70200
----------------------------------------------
Brick : 10.x.x.2:/srv/gluster/nodeum_cache_brick
Clients connected : 1
Hostname                        BytesRead    BytesWritten       OpVersion
--------                        ---------    ------------       ---------
10.x.x.2:49147                  372933965      2066922877           70200
----------------------------------------------
```

```bash
$ gluster peer status
Number of Peers: 1

Hostname: 10.x.x.2
Uuid: a3b18da3-5a42-4399-9480-105f1f7032fb
State: Peer in Cluster (Connected)
```

```bash
$ gluster peer status
Number of Peers: 1

Hostname: 10.x.x.1
Uuid: a3b18da3-5a42-4399-9480-105f1f7032fb
State: Peer in Cluster (Connected)
```

### Point of attention

Make sure that the “/” directory has enough space.

```bash
$ df -h
Filesystem                                  Size  Used Avail Use% Mounted on
devtmpfs                                     16G     0   16G   0% /dev
tmpfs                                        16G  576K   16G   1% /dev/shm
tmpfs                                        16G  1.6G   15G  11% /run
tmpfs                                        16G     0   16G   0% 
/dev/mapper/centos_nodeu-root               788G   29G  719G   4% /
/dev/sdb1                                   8.2T  7.5T  254G  97% /mnt/CACHE
/dev/sda1                                  1014M  275M  740M  28% /boot
tmpfs                                       3.2G     0  3.2G   0% 
tmpfs                                       3.2G     0  3.2G   0% /run/user/0
core_fuse                                   102T  8.0T   94T   8% /mnt/FUSE
```

### Backup Feature - Manual Execution

{% hint style="warning" %} <mark style="color:red;">This procedure needs to be applied on each node of the cluster</mark>
{% endhint %}

#### How to execute a backup manually?

There is a command line that must be executed for starting a manual backup or restore.

The shell script is "`/opt/nodeum/tools/backup_restore.sh"`

```bash
$ /usr/mtc/bin/backup_restore.sh param1 param2
```

&#x20;The first parameter: f / full backup or i / incremental backup.

The second parameter: it is the target path where the backup will be saved or where the backup is located for a restore

&#x20;If the command line is configured to do an incremental, and there is no full already done, it will perform a full backup.

&#x20;The incremental option will always increment an existing full backup. This means that the incremental backup is restorable.

&#x20;Examples:

```bash
$ nohup /opt/nodeum/tools/backup_restore.sh full_backup /root/nodeum_bck_2302 &
```

"nohup" and "&" allow to run the backup script in daemon, there is a file named "nohup.out" ; this file contains the result of the executed command.

### How to execute a restore manually?

&#x20;There is a command line that must be executed for restoring a backup.

```bash
$ /opt/nodeum/tools /backup_restore.sh param1 param2
```

param1 : r for restore

param2 : source path where the backup is located

&#x20;Example :

```bash
$ nohup /opt/nodeum/tools/backup_restore.sh restore /root/nodeum_bck_2302 &
```

"nohup" and "&" allow to run the backup script in daemon, there is a file named "nohup.out"; this file contains the result of the executed command.

#### Point of Attention

&#x20;By default, when script is running, it uses a temporary folder : `/tmp/bckp/` in the main file system ; this temporary folder is used to store the backup before moved to the final location. The temporary folder can be changed in specifying another folder in the 3rd argument.

**Default temp folder :**

In this example, the backup will be stored in the folder …`/nas/backupnodeum/` and the backup system will use as implicit temporary cache which `/tmp/`

```bash
/bin/bash ./backup_restore.sh full_backup /mnt/MOUNT_POINTS/nas/backupnodeum
```

**Another temp folder**

In this example, the backup will be stored in the folder …`/nas/backupnodeum/` and the backup system will use as temporary cache, the directory `/mnt/CACHE/tempbck`

```bash
/bin/bash ./backup_restore.sh full_backup /mnt/MOUNT_POINTS/nas/backupnodeum /mnt/
CACHE/tempbck
```

#### Point of Attention

&#x20;If the backup do not run and the console mentioned that there is already another backup\_restore.sh script running, there are two things to review :

* Used a "ps -aef" command to verify if there is another process already running
* It is possible that a lock file (nodeum\_bkp\_lock) is stored, this lock file is stored into the /tmp folder ; and this even if the temporary folder location has been changed.


# Architecture

***

### Fully Scalable & Resilience


# Install & Deploy

Deployment options for Nodeum, including Ansible playbooks, Docker Compose, and Slurm integration.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-type="users" data-multiple></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td></td><td>Ansible Based Installation</td><td></td><td></td><td><a href="/pages/FPZIQ2Woi6IFUDEClO6q">/pages/FPZIQ2Woi6IFUDEClO6q</a></td></tr><tr><td></td><td>Docker Based Deployement</td><td></td><td></td><td><a href="/pages/j6DaXbHP5pjfBNh7Um31">/pages/j6DaXbHP5pjfBNh7Um31</a></td></tr><tr><td></td><td>Slurm Integration</td><td></td><td></td><td><a href="/pages/0aBGj2ZGotTlvfVYh6kh">/pages/0aBGj2ZGotTlvfVYh6kh</a></td></tr></tbody></table>


# Ansible based Installation

## Prerequisites

Nodeum is compatible with the RHEL, Rocky, and AlmaLinux families. Please refer to the software requirements for further details.

**Installing Nodeum Software**

Nodeum can be installed on either a physical server or a virtual machine. To learn more about hardware requirements, please refer to the official documentation. The installation process utilizes an Ansible Playbook or a Docker Image for setup.

Before starting the installation, verify that your system's configuration is fully completed.

To deploy the Nodeum Package, follow these instructions (ensure you have an internet connection):

1. Install wget:

   ```bash
   yum install wget
   ```
2. Download the Nodeum package:

   ```bash
   wget get.nodeum.io/public/nodeum-v2-x-y-zzz.tar.gz
   ```
3. Extract the package:

   ```bash
   tar -xvzf /root/nodeum-v2-x-y-zzz.tar.gz
   ```
4. Navigate to the extracted folder:

   ```bash
   cd v2-x-y
   ```

The inventory location is defined in `ansible.cfg`. It must be stored in a specific folder and be available for each installation. To do this, move the folder into the standard inventory location:

1. Create the Nodeum directory:

   ```bash
   mkdir ~/nodeum
   ```
2. Move the inventory:

   ```bash
   mv ./inventory ~/nodeum/inventory
   ```

#### Password Configuration

Passwords are crucial for internal database usage. It's essential to define them initially, as changes after the first installation should be avoided. Configure passwords in the following file:

`~/nodeum/inventory/group_vars/all/passwords-v1.yml`

For production systems, file encryption is highly recommended. Learn more by exploring the "Customize Your Installation" guide.

### Installation Guide

1. **Install EPEL Release:**

   ```
   $ yum install epel-release
   ```
2. **Install sshpass:**

   ```
   $ yum install sshpass
   ```

   *Note: This command is essential for installations on multiple nodes and for adding each host's fingerprint to the `known_hosts` file. You can do this by executing `ssh` commands on each node.*
3. **Verify Installation:**

   Execute the `check_install` playbook:

   ```
   $ ansible-playbook check_install.yml
   ```
4. **Run Installation:**

   If you are not using an encrypted password file, execute:

   ```
   $ ansible-playbook install.yml
   ```

{% hint style="info" %}
If Ansible requests a reboot, restart the server. Once it has restarted, execute the command again.
{% endhint %}

5. **Verification:**

After completing the playbook installation, verify that it finishes successfully and produces the expected output.

<figure><img src="/files/590IhL8a0348BLyOGCn1" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
Be aware that no results have failed.
{% endhint %}

**Accessing the Console**

To access the Console, open your browser and enter the URL: `http://your-nodeum-ip-address/` or use the DNS name associated with it.

If you cannot access the Console on the default HTTP port, it could be due to your local firewall settings. Ensure that your firewall is configured to permit HTTP/HTTPS traffic to the server.

#### Running Ansible Playbook with Encrypted Passwords

If you have an encrypted password file, execute the Ansible playbook using:

* Prompt for vault password:

  ```bash
  ansible-playbook --ask-vault-password install.yml
  ```
* Use a vault password file:

  ```bash
  ansible-playbook --vault-password-file=password_file install.yml
  ```

Even if the user is in the `sudoers` file, Ansible might still ask for a sudo password. Use the `-kK` options to prompt for both SSH and sudo passwords:

```bash
ansible-playbook install.yml -kK
```

#### Post-Ansible Verification

After completing the deployment, verify that all defined storage configurations are present in the data mover service. To do this, review the file located at `/etc/nodeum/mover.toml`.

#### Step 1: Verify Plugin Status

Ensure that the Object Storage plugin `s3.so` is correctly defined and enabled.

```yaml
/etc/nodeum/mover.toml
--

...

[[plugins]]
  path = "s3.so"

...
```

* [ ] plugin swift.so is well defined

```
/etc/nodeum/mover.toml
--

...

[[plugins]]
  path = "swift.so"

...
```

### Verify Configuration

#### For Mounted File system Storage

<pre><code><strong>/etc/nodeum/mover.toml
</strong><strong>--
</strong>...  
[[storages.options]]
  # Applying additional options to connect to POSIX file system
  type = "nas-share"
  parent_name = "data1"
  [storages.options.handler]
    # will always be considered mounted in this directory, no mounting will be 
    attempted
    always_mounted = true
    path = "/mnt/data1"
...
</code></pre>

#### For OpenStack Swift Storage

```yaml
/etc/nodeum/mover.toml
--
...
[[storages.options]]
  # Applying additional options to connect to OpenStack swift as IDP
  parent_name = "swift_connector"
  [storages.options.handler]
    region_name = "my-region"
    auth_url = "https://my-swift-storage-url/"
    identity_provider = "your provider"
    auth_protocol = "openid"
...
```

#### Configuration Change

To update your configuration, modify the `/etc/nodeum/mover.toml` file. Ensure you apply changes to all nodes if multiple nodes are running the mover service.

{% hint style="warning" %}
Please ensure <mark style="color:red;">**to save**</mark> the file and restart the mover service.
{% endhint %}

```bash
$ sudo systemctl restart nodeum_mover.target
```

{% hint style="info" %}
**Caution:** Manual changes will be overwritten if you relaunch Ansible without updating the `group_vars/all/options.yml` Ansible Inventory file. Always backport your manual changes to avoid losing them.
{% endhint %}

#### Customize Your Installation

You can define and automate various options during deployment. Visit the Customize Your Installation page for more information.


# Customize your Installation

### Pre-Deployment Configuration

Before launching the playbook, configure your deployment settings by following these steps:

1. **Cluster Architecture Configuration:**
   * Refer to the architecture guide to set up the following sections.
2. **Hosts File Configuration:**
   * Location: `~/nodeum/inventory/`
3. **Services Configuration:**
   * Options file: `~/nodeum/group_vars/all/options.yml`
4. **Password Configuration:**
   * Passwords file: `~/nodeum/group_vars/all/passwords-v1.yml`

#### Configuration of Hosts Files

Refer to the architecture guide for detailed information. Different file templates are available for deploying services across various nodes:

* **00-server-local**: For standalone installation.
* **00-server-ssh**: For multi-node environments.
* **10-mariadb-standalone**: Deploys MariaDB service in standalone mode.
* **11-mariadb-cluster**: Deploys MariaDB service in cluster mode.
* **20-web-standalone**: Deploys standalone web services.
* **21-web-haproxy**: Deploys a cluster of web services with HAProxy.
* **30-redis-standalone**: Deploys standalone Redis.
* **31-redis-sentinel**: Deploys Redis with Sentinel in cluster mode.
* **40-main**: Defines the remaining service deployment strategy across all nodes.
* **50-monitoring**: Defines the deployment of monitoring services.

#### Services Configuration:&#x20;

#### Service Mapping

To configure the network interface mapping in the `group_vars/all/options.yml`, follow the example below. It sets the default interface as `em0` and assigns a specific service, `rails`, to interface `em1`.

```yaml
default_interface: em0
service_interface_mapping:
  rails: em1
```

```yaml
# If there is no default network interface defined or you want to override it
# Default value is the interface with the default route.
iface_name: em0
rails_iface_name: em1
```

#### Web Server Name

To customize the web server name, you can specify a preferred name instead of using the default 'nodename'.

```yaml
###! The hostname on which the web server will answers.
# web_server_name: "{{ ansible_nodename }}"
```

#### Configure OpenID

```yaml
### Custom JWT authentication
###! Define a JWT that will be accepted in API calls
###! Reference: https://github.com/jwt/ruby-jwt
# web_custom_jwt:
#   secret: ""
#   options:
#     # jwks: {}
#     # jwks_uri: ""
#     # x5c: {}
#     # algorithm: ""
#     # algorithms: []
#
#     # verify_aud: false
#     # aud: ""
#     # verify_iss: false
#     # iss: ""
#     # verify_jti: false
#     # verify_sub: false
#     # sub: ""
#     # verify_required_claims: false
#     # required_claims: []
#
#     # verify_expiration: false
#     # verify_iat: false
#     # verify_not_before: false
#     # leeway: 0
#     # exp_leeway: 0
#     # nbf_leeway: 0
###! When receiving a JWT, will initially check if the user
###! exists in our database. The value on the right will be
###! read in the JWT, and check against the value on the left
###! in our database
#   user_check_mapping:
#     email: email
###! Same as `user_check_mapping`, but used when
###! creating the new user
#   user_attr_mapping:
#     username: name

###! Advanced configuration for `user_check_mapping` and `user_check_mapping`.
###! Value will be interpreted in a ruby proc.
###! Parameter `jwt` contains the decoded token.
# web_custom_jwt_user_check_mapping_proc:
#   # username: jwt['email'].split('@').first
# web_custom_jwt_user_attr_mapping_proc:
#   # is_admin: jwt['privileges'] == 'admin'
```

#### Listening Ports Configuration

By default, the services Front, Scheduler, Monitoring, Dispatcher, Mover, and Finalizer use random listening ports, as specified in the architecture guide. However, you can configure specific ports for each service.

To set specific listening ports, edit the file `group_vars/all/options.yml`. Within each service's definition, provide the desired port number. This allows you to control the listening ports instead of relying on the default random assignment.

Example for the front service which has the port 8093 defined.

```yaml
### Front

###! Additional environment variable to be passed to front
###! Format is the same as `EnvironmentFile` of `systemd.exec`
# front_additional_env: ""

###! Listening port for front must static, can't be dynamic.
# front_server_bind: '{{ iface_details.address }}'
# front_server_port: '8093'
```

### Define the # of parallel movement for the mover

The information is specified in the `group_vars/all/options.yml` file under the mover section. You can configure the number of mover processes on the server (default is 1) and the maximum number of parallel mover executions. This can be either a formula based on the number of processors or a specified value.

```yaml
---
# mover_workers: 1

…

###! Maximum number of operation running in parallel in the mover service
###! By default, base on number of CPU
# mover_parallel: "{{ (10 * ansible_processor_count) | int }}"
…
```

### Configuring Finalizer Parallelism

The number of parallel movements for the finalizer can be defined in the `group_vars/all/options.yml` file under the finalizer section.&#x20;

By default, one finalizer process is deployed on the server, but this can be adjusted. You can either use a formula based on the number of processors or specify an exact number for the maximum parallel finalizer executions. For more details, refer to the architecture guide.

```yaml
---
# finalizer _workers: 1

…

###! Maximum number of operation running in parallel in the mover service
###! By default, base on number of CPU
# finalizer_parallel: "{{ (10 * ansible_processor_count) | int }}"
…
```

### Activate LDAP plugin

This section explains how to set up the LDAP plugin to retrieve a user's UID and GID using a JWT token.

```yaml
dispatcher_plugins:
  - path: ./ldap-user-mapper
    args:
      - --primary-pools=data1_pool,data2_pool
      - --ldap-lookups=./ldap-mapping.yml
    env:
      LDAP_URL: ldap://myldapserver.mydomain.local:389/
      LDAP_BIND_DN: cn=datamover,ou=storages,ou=site,dc=mydomain,dc=local
      LDAP_BIND_PASSWD: '{{ ldap_bind_passwd }}'
```

{% hint style="warning" %}
The list of primary pools are the storage locations where the plugin will be applied.
{% endhint %}

### Activate S3 and SWIFT plugins

To enable Object Storage plugins, navigate to `group_vars/all/options.yml` in the Mover configuration section.

```yaml
---
###! Install the plugin for accessing S3 storage, with backend `s3-native`.
###! Access data directly without mounting the storage, unlike `s3fs` and `rclone`.
mover_plugin_s3_enabled: true

###! Install the plugin for accessing Openstack Swift storages
mover_plugin_swift_enabled: true
```

### Activate Mounted File System Storage connections

To configure the Mounted File System Storage, navigate to `group_vars/all/options.yml`, under the Mover section. Ensure the following options are configured:

* **type**: The type of storage.
* **parent\_name**: The logical name of the storage to be recognized during task movement.
* **always\_mounted**: Specifies if the storage is mounted outside the data mover.

```yaml
mover_storages_options:
  - type: nas-share
    parent_name: <name of your posix storage>
    options:
      always_mounted: true
      path: /mnt/storageposix    # this is the path where posix storage is mounted
```

### Activate Object Storage using OpenID authentication

To configure the object storage, edit the `group_vars/all/options.yml` file in the "Mover" section. Ensure the following options are set:

* **region\_name**: Set to your default region.
* **Auth\_url**: Provide the Keystone URL.
* **Identity\_provider**: Specify your identity provider.
* **Auth\_protocol**: Use "openid".

```yaml
mover_storages_options:
  - parent_name: object_pool
    options:
      region_name: <your region>
      auth_url: https://<your keystone url>
      identity_provider: <your identity provider>
      auth_protocol: openid
```

### Configure Prometheus

In `group_vars/all/options.yml`, you can configure Prometheus and Node Exporter. Various options are available to fine-tune your Node Exporter and Prometheus deployment, including interface binding and port mapping. Additionally, settings like the `prometheus_scrap_interval` can be customized.

```yaml
### Prometheus

node_exporter_bind: '{{ iface_details.address }}'
node_exporter_port: '9100'

prometheus_bind: '{{ iface_details.address }}'
prometheus_port: '9090'

# prometheus_extra_targets: {}

prometheus_scrape_interval: 1m
# prometheus_scrape_timeout: 10s
# prometheus_evaluation_interval: 1m 
```

### Configure Fluentd Loki exporter

To configure Nodeum Logs export to Grafana Loki, modify the `group_vars/all/options.yml` file with the Fluentd Loki exporter settings.

```yaml
### Loki

fluentd_loki_host: "http://localhost:3100"
```

Input:

* `localhost`: This is the server name for your Grafana Loki setup.
* `3100`: This is the port number where the Grafana Loki server is listening.

## Password Encryption with Ansible Vault

Ansible Vault allows you to encrypt password files securely. Explore these features to ensure your passwords are protected:

### Encryption Options

**Prompted Password Encryption**: Securely encrypt files by entering the password when prompted during encryption.

### Ansible Vault Commands

**Encrypt a File**:

```bash
ansible-vault encrypt ~/nodeum/inventory/group_vars/all/passwords-v1.yml
```

**Edit an Encrypted File**:

```bash
ansible-vault edit ~/nodeum/inventory/group_vars/all/passwords-v1.yml
```

**Change the Vault Password**:

```bash
ansible-vault rekey ~/nodeum/inventory/group_vars/all/passwords-v1.yml
```

### Ansible Vault Operations

**Encrypt a Password File**:

```bash
ansible-vault encrypt --vault-id=password_file ~/nodeum/inventory/group_vars/all/passwords-v1.yml
```

**Edit an Encrypted File**:

```bash
ansible-vault edit --vault-id=password_file ~/nodeum/inventory/group_vars/all/passwords-v1.yml
```

**Change the Vault Password**:

```bash
ansible-vault rekey --vault-id=old_password_file --new-vault-id=new_password_file ~/nodeum/inventory/group_vars/all/passwords-v1.yml
```

Utilize these commands to ensure the security and confidentiality of your sensitive information with Ansible Vault.


# Docker Based Deployment

To deploy the Nodeum as Docker Container, follow these instructions :&#x20;

#### Download the images

<pre class="language-bash"><code class="lang-bash"><strong>$ yum install wget
</strong><strong>$ wget get.nodeum.io/public/nodeum-docker-compose-v2-x-y-zzz.tar.gz 
</strong><strong>$ tar -xvzf /root/nodeum-docker-compose-v2-x-y-zzz.tar.gz
</strong><strong>$ cd v2-x-y
</strong></code></pre>

#### Load Docker Images

```
$ docker load -i data-management.tgz
$ docker load -i web.tgz
$ docker load -i fluentd.tgz
```

#### Start with Docker Compose

```
$ docker compose up --detach
```

### If there is no internet access

If the server doesn't have internet access, some images must be pulled and loaded manually.

#### Retrieve the related images on a system which has internet access:

<pre class="language-bash"><code class="lang-bash">$ docker image pull mariadb:10.6
$ docker image pull mongo:4.4
<strong>$ docker image pull redis:6.2.6
</strong>$ docker image pull quay.io/coreos/etcd:v3.5.8
$ docker image save mariadb:10.6 mongo:4.4 redis:6.2.6 quay.io/coreos/etcd:v3.5.8 | 
gzip > services.tgz
</code></pre>

On the host where you want to deploy Nodeum:

```
$ docker load -i services.tgz
```


# Console

Nodeum provides a user-friendly graphical console and gives different monitoring options (email, SNMP, etc.) on storage activities, system activities and much more.

A rich graphical user interface that provides similar functionality to the nd command line tool with additional features.

The Console is available to handling administration tasks like Workflow Definition, Storages configuration, Reporting and Log Monitoring, or any overall system Configuration. This interface is embedded as part of the Nodeum Services.

### Compatibility guidelines

Web Based Interface designed in HTML5, Nodeum provides the best of its capabilities in using Chrome or Firefox as browser.

### Role-Based Access Control (RBAC)

Two different user profiles are available to use, manage and administrate Nodeum throughout the Console.

<table><thead><tr><th></th><th width="127">Catalog</th><th width="215">Workflow Management</th><th>Trend Analytic</th></tr></thead><tbody><tr><td>Standard End-User</td><td>yes</td><td>no</td><td>no</td></tr><tr><td>Administrator User</td><td>yes</td><td>yes</td><td>yes</td></tr></tbody></table>

###


# Login

### How to access to the Console?

You can browse the Console Administration with your favorite browser through this URL: `http://<your server address>`.

By default an administrator profile is defined with the following credential:

`` Default Login : `admin` ``

`` Default Password : `password` ``

{% hint style="danger" %}
**Recommendation**: Update the admin password in the settings immediately.
{% endhint %}

<figure><img src="/files/eaJZzt4zeUsL8iDWK4ME" alt=""><figcaption></figcaption></figure>

## How to change the admin password?

To change the default Admin password, navigate to the `System` page, select `User Management`, then go to `Web`, and set a new password.

<figure><img src="/files/nAUOJVkcOjD6KNsbTJbU" alt=""><figcaption></figcaption></figure>

## User roles

Two roles are available: `admin` and `user`.

* `admin` manages the software, storage, and services.
* `user` can create movement tasks.


# Profile and Bar Menu

<figure><img src="/files/fpALjRqWb8fJGokA1931" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/dWCrZgQeCeJ34pmQdTsh" alt=""><figcaption></figcaption></figure>


# Data Mover Management

The centralized dashboard enables users to monitor task progress with real-time updates on data status. Users can define unlimited tasks simultaneously to move, archive, and protect data across various storage tiers. Task management features provide control and visibility

Each workflow has its own settings:

* [ ] <mark style="color:green;">Actions</mark>
* [ ] <mark style="color:green;">Source</mark>
* [ ] <mark style="color:green;">Destination</mark>
* [ ] <mark style="color:green;">Granular File Selection</mark>
* [ ] <mark style="color:green;">Scheduler</mark>
* [ ] <mark style="color:green;">Filter</mark>&#x20;
* [ ] <mark style="color:green;">Advanced Setting : Priority, Metadata Management, …</mark>

### Task Monitoring

To aid in monitoring task execution, the Console offers a comprehensive monitoring feature. This feature provides a global overview of all task activities.

Three different sections are available :&#x20;

#### Upcoming task

This section shows the task(s) scheduled.  For each task, you can see detailed information including the date - time when the task will be executed.&#x20;

It is possible to skip an execution in clicking in the right cross icon.

If a task hasn't been executed properly, then you will an information saying that "task execution missed for one or multiple occurence".

<figure><img src="/files/h6TaTWFA9P3WVfczj0uM" alt=""><figcaption></figcaption></figure>

#### Running task

This section provides the list of the task(s) which are currently running. &#x20;

For each of these tasks, you can

1. See the detail and the status.
2. Pause the task execution.
3. Resume a paused task .
4. Stop the task execution

#### History

In this section you can find all the tasks that have been completed.

<figure><img src="/files/K5K2PNJIYSz1zyjol0p5" alt=""><figcaption><p>List of tasks history</p></figcaption></figure>

## Task Report&#x20;

For each task running or finished, you can open to see the global view about the task.

To see the full informations click on the arrow beside the task:

<figure><img src="/files/ecFkdKPgXQcFY56zFlYh" alt=""><figcaption><p>List of Nodeum's tasks</p></figcaption></figure>

And have a look on the task information:

<figure><img src="/files/HfnSbNyXrNcyvdtKols3" alt=""><figcaption><p>Screenshot about a task execution</p></figcaption></figure>

Definitions of task informations :&#x20;

| Informations    | Definition                                                                                                                                     |                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Timing          | <ol><li>Task starts the x date and at x hours</li><li>Elapsed time for the task</li><li>Estimated remaining time to process the task</li></ol> |                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Type            | <ol><li>Data Migration</li></ol>                                                                                                               | <p>Move or Copy to a destination:</p><p></p><p><img src="https://mt-c-storage.atlassian.net/wiki/download/attachments/1007681564/image2018-3-19_10-51-57.png?version=1&#x26;modificationDate=1547218571533&#x26;cacheVersion=1&#x26;api=v2" alt=""> Nas</p><p><img src="https://mt-c-storage.atlassian.net/wiki/download/attachments/1007681564/image2018-3-19_10-51-17.png?version=1&#x26;modificationDate=1547218571188&#x26;cacheVersion=1&#x26;api=v2" alt=""> Tape</p> |
| Processed size  | size of data processed                                                                                                                         |                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Processed items | Number of items of data processed                                                                                                              | To see the good process click on the tab processed items\*                                                                                                                                                                                                                                                                                                                                                                                                                  |
| Logs            | Details of task's log                                                                                                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |

{% hint style="success" %}
Each task report  contains all files processed during the task, a downloaded copy can be exported.
{% endhint %}

### Task Log

Below is a table listing messages found in the logs, mostly arranged in the


# Policy-Based Task orchestration

**Data Movement Management**

The system manages and coordinates data movement tasks based on predetermined policies or rules. It facilitates handling numerous tasks, covering not only execution but also monitoring and reporting.

**Types of Workflows**

The Workflow Manager enables the creation of various data movement tasks:

* **Copy**
* **Move**

**Policies Available**

* **Data Migration**

Each task involves defining both the source storage, along with its dataset, and the destination storage.

### Execution Modes

It is possible to define multiple tasks, they are executed in parallel mode in a multi-threaded system.

Each task will execute the movement of a list of files (1 or n) and segment the processing into 3 main parts:

* Preparation phase
* Execution phase
* Finalization phase

For each task execution process, specific jobs are created. The default segmentation is defined to optimize the data processing (example of a default setting: create a job of 1 GB or 100 files maximum).

Each job will be sent into a different queue system. A dispatching engine will coordinate the processing of each job in regard to the defined priority.

Then, different workers are created to do the copy of files and to do the reporting to Finalization process about the status of the copy.

&#x20;The workflow manager can execute these 3 phases in two main different modes:

* sequential processing
* parallel processing

The Data Mover always takes into account the remaining space of the destination storage. This means that if the available capacity is insufficient to store the file being copied, the operation will either result in an error message such as "stopped by system" (in the case of NAS and file systems), or it will request a new tape (for tape storage). In any case, files are never split across multiple media.

### Task Action

Each running task can be paused or stopped. If a task is paused, it can always be restarted. Pressing the stop button will stop the task. Once the stop button has been pressed, it may take a few seconds or minutes before the task is stopped. This is because the task always finishes the current job under processing.

### Extended Data Set Selector

An unlimited data set selector brings granularity to the data you have to select. Movement can be executed between any type of storage from storage where hot data are stored to cold storage.

### Path Management

For any type of data movement, the Workflow Manager always maintains the original path where the contents were originally stored.

Business applications are configured to access the same folders, even if data have been moved. It is why it is very important that when data are retrieved, they are recopied into their original folder.

Meanwhile, Nodeum offers different options to change this behavior and provides solutions to relocate the contents into another folder structure.

### Result of Task execution&#x20;

Each task finishes with a status, each task status determines the result of the processing that has been executed. This following [table](broken://pages/DR8u4bfKcmJPfJGybryO) describes each type of status.




---

[Next Page](/llms-full.txt/1)

