Only this pageAll pages
Powered by GitBook
1 of 90

T4O-6.2

About Trilio for OpenStack

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Getting Started

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Upgrading to T4O-6.x from older supported versions

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Advanced Configuration

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

User Guide

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Admin Guide

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Troubleshooting

Loading...

Loading...

Loading...

API GUIDE

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Welcome to Trilio for OpenStack

Trilio Data, Inc. is the leader in providing backup and recovery solutions for cloud-native applications. Established in 2013, its flagship products, Trilio for OpenStack(T4O) and Trilio for Kubernetes(T4K) are used by a wide number of large corporations around the world.

T4O, by Trilio Data, is a native OpenStack service-based solution that provides policy-based comprehensive backup and recovery for OpenStack workloads. It captures point-in-time workloads (Application, OS, Compute, Network, Configurations, Data, and Metadata of an environment) as full or incremental snapshots. These snapshots can be held in a variety of storage environments including NFS, AWS S3, and other S3-compatible storages. With Trilio and its one-click recovery, organizations can improve Recovery Time Objectives (RTO) and Recovery Point Objectives (RPO). With Trilio, IT departments are enabled to fully deploy OpenStack solutions and provide business assurance through enhanced data retention, protection, and integrity.

With the use of Trilio’s VAST (Virtual Snapshot Technology), Enterprise IT and Cloud Service Providers can now deploy backup and disaster recovery as a service to prevent data loss or data corruption through point-in-time snapshots and seamless one-click recovery. Trilio takes point-in-time backup of the entire workload consisting of compute resources, network configurations, and storage data as one unit. It also takes incremental backups that capture only the changes that were made since the last backup. Incremental snapshots save a considerable amount of storage space as the backup only includes changes since the last backup. The benefits of using VAST for backup and restore could be summarized below:

This documentation serves as the end-user technical resource to accompany Trilio for OpenStack. You will learn about the architecture, installation, and vast number of operations of this product. The intended audience is anyone who wants to understand the value, operations, and nuances of protecting their cloud-native applications with Trilio for OpenStack.

Trilio Data, Inc

About Trilio for OpenStack

Efficient Capture and Storage of Snapshots

Since our full backups only include data that is committed to storage volume and the incremental backups only include changed blocks of data since the last backup, our backup processes are efficient and store backup images efficiently on the backup media.

Faster and Reliable Recovery

When your applications become complex that snap multiple VMs and storage volumes, our efficient recovery process will bring your application from zero to operational with just a click of a button

Easy Migration of Workloads between Clouds

Trilio captures all the details of your application and hence our migration includes your entire application stack without leaving anything for guesswork.

Low Total Cost of Ownership

Our tenant-driven backup policy and automation eliminate the need for dedicated backup administrators, thereby improving your total cost of ownership.

About this Documentation

T4O Architecture

A quick overview on the Architecture of T4O

Backup-as-a-Service

Trilio is like a Data Protection project providing Backup-as-a-Service

Trilio is an add-on service to OpenStack cloud infrastructure and provides backup and disaster recovery solutions for tenant workloads. Trilio is very similar to other OpenStack services including Nova, Cinder, Glance, etc., and adheres to all tenets of OpenStack. It is a stateless service that scales with your cloud.

Main Components

T4O 6.2 Architecture — a single Dynamic Mount Service runs on the controller and on every compute node, replacing the per-backup-target object-store containers.

Trilio has four main software components which are again segregated into multiple services.

WorkloadManager

This component is registered as a keystone service of type workloads which manages all the workloads being created for utilizing the snapshot and restore functionalities. It has 4 services responsible for managing these workloads, their snapshots, and restores.

  1. workloadmgr-api

  2. workloadmgr-scheduler

  3. workloadmgr-workloads

  4. workloadmgr-cron

Similar to WorkloadManager, this component registers a keystone service of the type datamover which manages the transfer of extensive data to/from the backup targets. It has 2 services that are responsible for taking care of the data transfer and communication with WorkloadManager

  1. datamover-api

  2. datamover

For ease of access and better user experience, T4O provides an integrated UI with the OpenStack dashboard service Horizon,

  1. Trilio API is a Python module that is installed on all OpenStack controller nodes where the nova-api service is running.

  2. Trilio Datamover is a Python module that is installed on every OpenStack compute nodes

  3. Trilio Horizon plugin is installed as an add-on to Horizon servers. This module is installed on every server that runs Horizon service.

Introduced in 6.2, DMS is the component responsible for mounting and unmounting backup targets on the nodes that need them. It runs as a single container per host on the controller and on every compute node, and replaces the per-backup-target object-store containers that Trilio used in earlier releases.

  1. trilio-dms-server: receives mount/unmount requests over RabbitMQ, fetches S3 credentials from Barbican using the requesting job's Keystone token, and performs the actual NFS mount or spawns an s3vaultfuse process for S3 targets. One server runs per host.

  2. trilio-dms-client: invoked in-process by workloadmgr (controller-side) and dmapi (compute-side) to send mount/unmount requests, and maintains the per-job mount ledger in the database so concurrent jobs can share a mount and the last release triggers the actual umount.

Mounts are performed on demand, scoped to a backup job, and reference-counted; targets are unmounted automatically when the last job releases them. Stale mounts (dead FUSE processes, broken NFS sessions) are detected before every mount and recovered automatically.

Trilio is both a provider and consumer in the OpenStack ecosystem. It uses other OpenStack services such as Nova, Cinder, Glance, Neutron, and Keystone and provides its own services to OpenStack tenants. To accommodate all possible OpenStack deployments, Trilio can be configured to use either public or internal URLs of services. Likewise, Trilio provides its own public, internal, and admin URLs for two of its services WorkloadManager API and Datamover API.

Unlike the previous versions of Trilio for OpenStack, now it utilizes the existing network of the OpenStack deployed environment. The networks for the Trilio services can be configured as per the user's desire in the same way the user configures any other OpenStack service. Additionally, a dedicated network can be provided to Trilio services on both control and compute planes for storing and retrieving backup data from the backup target store.

Getting started with Trilio on Red-Hat OpenStack Platform

Trilio Installation on RHOSPTrilio Installation on RHOSO

DataMover

Horizon Dashboard Plugin

Dynamic Mount Service (DMS)

Service Endpoints

Network Topology

Installation Strategy and Preparation

Before embarking on the installation process for Trilio in your OpenStack environment, it is highly advisable to carefully consider several key elements. These considerations will not only streamline the installation procedure but also ensure the optimal setup and functionality of Trilio's solutions within your OpenStack infrastructure.

Tenant Quotas

Trilio leverages Cinder snapshots to facilitate the computation of both full and incremental backups.

When executing full backups, Trilio orchestrates the generation of Cinder snapshots for all volumes included in the backup job. These Cinder snapshots remain intact for subsequent incremental backup image calculations.

During incremental backup operations, Trilio generates fresh Cinder snapshots and computes the altered blocks between these new snapshots and the earlier retained snapshots from full or previous backups. The old snapshots are subsequently deleted, while the newly generated snapshots are preserved.

Consequently, it becomes imperative for each tenant benefiting from Trilio's backup functionality to possess adequate Cinder snapshot quotas capable of accommodating these supplementary snapshots. As a guiding principle, it is recommended to append 2 snapshots for each volume incorporated into the backup quotas for the respective tenant. Additionally, a commensurate increase in volume quotas for the tenant is advisable, as Trilio briefly materializes a volume from the snapshot to access data for backup purposes.

During the restoration process, Trilio generates supplementary instances and Cinder volumes. To facilitate seamless restore operations, tenants should maintain adequate quota levels for Nova instances and Cinder volumes. Failure to meet these quota requirements may lead to disruptions in restoration procedures.

The AWS S3 object consistency model includes:

  1. Read-after-write

  2. Read-after-update

  3. Read-after-delete

Each of these models explains how an object becomes consistent after being created, updated, or deleted. None of these methods ensures strong consistency, leading to a delay before an object becomes fully consistent.

Although Trilio has introduced measures to address AWS S3's eventual consistency limitations, the exact time an object achieves consistency cannot be predicted through deterministic means.

There is no official statement from AWS on how long it takes for an object to reach a consistent state. However, read-after-write has a shorter time to reach consistency compared to other IO patterns. Therefore, our solution is designed to maximize the read-after-write IO pattern.

The time in which an object reaches eventual consistency also depends on the AWS region.

For instance, the AWS-standard region doesn't offer the same level of strong consistency as regions like us-east or us-west. Opting for these regions when setting up S3 buckets for Trilio is advisable. While fully avoiding the read-after-update IO pattern is complex, we've introduced significant access delays for objects to achieve consistency over longer periods. On rare occasions when this does happen, it will cause a backup failure and require a retry.

Trilio can be deployed as a single node or a three-node cluster. It is highly recommended that Trilio is deployed as a three-node cluster for fault tolerance and load balancing. Starting with the 3.0 release, Trilio requires additional IP or FQDN for the cluster and is required for both single-node and three-node deployments. Cluster IP a.k.a virtual IP is used for managing clusters and is used to register the Trilio service endpoint in the keystone service catalog.

Resources

Each T4O release includes a set of artifacts such as version-tagged containers, package repositories, and distribution packages.

To help users quickly identify the resources associated with each release, we have added dedicated sub-pages corresponding to a specific release version.

Getting started with Trilio on Canonical OpenStack

Uninstall Trilio

The high-level process is the same for all Distributions.

  1. Uninstall the Horizon Plugin or the Trilio Horizon container

  2. Uninstall the datamover-api container

  3. Uninstall the datamover container

Uninstall the workloadmgr container

AWS S3 Eventual Consistency

AWS Region Considerations

Trilio Cluster

6.2.1
6.2.0
Trilio Installation on Canonical (via Juju Charms)
Trilio Installation on Canonical OpenStack (Sunbeam)

Advanced Ceph configurations

Ceph is the most common OpenSource solution to provide block storage through OpenStack Cinder.

Ceph is a very flexible solution. The possibilities of Ceph require additional steps to the Trilio solution.

Upgrade Trilio

Upgrading on RHOSPUpgrading on RHOSOUpgrading on OpenStack-Helm/MOSKUpgrading on Kolla-Ansible

Grafana Monitoring

Overview

It provides the procedure for installing and configuring Grafana to enable monitoring and visualization of metrics in the OpenStack environment.

It covers the integration of Grafana with the required data sources (such as Prometheus) and explains how to configure dashboards for effective monitoring of infrastructure and services.

Uninstalling from OpenStack Helm/MOSK

1] Uninstall trilio-openstack helm chart

Run following commands to uninstall trilio services from MOSK cloud.

2] Uninstall Dynamic Backup Targets (Optional)

If you have installed multiple backup targets other than the default one, you can uninstall them using:

3] Verify uninstallation

Verify if the trilio-openstack chart and other components got uninstalled. No objects should be listed in following command output:

4] Clean TrilioVault’s OpenStack resources

5] Unmount the targets from All Worker and Master Nodes

To unmount the backup target mount points from each node, run:

Repeat this on each worker and master node where the target was mounted.

git clone -b <branch> https://github.com/trilioData/triliovault-cfg-scripts.git
cd triliovault-cfg-scripts/
cd openstack-helm/trilio-openstack/utils
./uninstall.sh
helm uninstall <dynamic-backup-target-name> -n trilio-openstack
kubectl get pods -n trilio-openstack
kubectl get jobs -n trilio-openstack
kubectl get pv -n trilio-openstack | grep nfs (Only if backup target was NFS)
kubectl get pvc -n trilio-openstack | grep nfs (Only if backup target was NFS)
openstack service list | grep -E 'TrilioVaultWLM|dmapi'
openstack endpoint list | grep -E 'TrilioVaultWLM|dmapi'
# Delete TrilioVault services from keystone catalog
openstack service delete TrilioVaultWLM
openstack service delete dmapi
# Verify TrilioVault services and endpoints got cleaned. Following command output should be empty.
openstack service list | grep -E 'TrilioVaultWLM|dmapi'
openstack endpoint list | grep -E 'TrilioVaultWLM|dmapi'
# Login to database and clean TrilioVault's databases and db users.
MYSQL_DBADMIN_PASSWORD=`kubectl -n openstack get secrets/mariadb-dbadmin-password --template={{.data.MYSQL_DBADMIN_PASSWORD}} | base64 -d`
kubectl -n openstack exec -it mariadb-server-0 -- bash
mysql -u root -p${MYSQL_DBADMIN_PASSWORD} -e "REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'dmapi'@'%%';"
mysql -u root -p${MYSQL_DBADMIN_PASSWORD} -e "DROP USER 'dmapi'@'%%';"
mysql -u root -p${MYSQL_DBADMIN_PASSWORD} -e "DROP DATABASE dmapi;"
mysql -u root -p${MYSQL_DBADMIN_PASSWORD} -e "REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'workloadmgr'@'%%';"
mysql -u root -p${MYSQL_DBADMIN_PASSWORD} -e "DROP USER 'workloadmgr'@'%%';"
mysql -u root -p${MYSQL_DBADMIN_PASSWORD} -e "DROP DATABASE workloadmgr;"
umount /var/lib/trilio/triliovault-mounts/<base64>

Requirements

Cloud-Native and Containerized

T4O represents a comprehensively containerized deployment model, eliminating the necessity for any KVM-based appliances for service deployment. This marks a departure from earlier T4O releases, where such appliances were required.

Summary of Requirements

Trilio requires its containers to be deployed on the same plane as OpenStack, utilizing existing cluster resources.

As described in the architecture overview, Trilio requires sufficient cluster resources to deploy its components on both the Controller Plane and Compute Planes.

  1. Valid Trilio License & Acceptance of the EULA

  2. When deploying the Control Plane to OpenShift, ensure sufficient resources are available on Worker Nodes.

  3. Sufficient storage capacity and connectivity on Cinder for snapshotting operations

  4. Sufficient network capabilities for efficient data transfer of workloads

  5. User and Role permissions for access to required cluster objects

  6. Optional features may have specific requirements such as encryption, file search, snapshot mount, FRM instance, etc

  7. Set hw_qemu_guest_agent=True property on the image and install qemu-guest-agent on the VM, in order to avoid any file system inconsistencies post restore.

  8. For the VMware to OpenStack migration feature, please refer to the and pages.

Network Considerations

Trilio seamlessly integrates with OpenStack, functioning exclusively through APIs utilizing the OpenStack Endpoints. Furthermore, Trilio establishes its own set of OpenStack endpoints. Additionally, both the Trilio appliance and compute nodes interact with the backup target, impacting the network strategy for a Trilio installation.

Existing endpoints in OpenStack

OpenStack comprises three endpoint groupings:

  • Public Endpoints

Public endpoints are meant to be used by the OpenStack end-users to work with OpenStack.

  • Internal Endpoints

Internal endpoints are intended to be used by the OpenStack services to communicate with each

  • Admin Endpoints

Admin endpoints are meant to be used by OpenStack administrators.

Among these three endpoint categories, it's important to note that the admin endpoint occasionally hosts APIs not accessible through any other type of endpoint.

To learn more about OpenStack endpoints please visit the official OpenStack documentation.

Trilio communicates with all OpenStack services through a designated endpoint type, determined and configured during the deployment of Trilio's services.

The following network requirements can be identified this way:

  • Trilio services need access to the Keystone admin endpoint on the admin endpoint network if it is available.

  • Trilio services need access to all endpoints of the set endpoint type during deployment.

Trilio recommends granting comprehensive access to all OpenStack endpoints for all Trilio services, aligning with OpenStack's established standards and best practices.

Additionally, Trilio generates its own endpoints, which are integrated within the same network as other OpenStack API services.

To adhere to OpenStack's prescribed standards and best practices, it's advisable that Trilio containers operate on the same network as other OpenStack containers.

  • The public endpoint to be used by OpenStack users when using Trilio CLI or API

  • The internal endpoint to communicate with the OpenStack services

  • The admin endpoint to use the required admin-only APIs of Keystone

The Trilio solution uses backup target storage to place the backup data securely. Trilio divides its backup data into two parts:

  1. Metadata

  2. Volume Disk Data

The first type of data is generated by the Trilio Workloadmgr services through communication with the OpenStack Endpoints. All metadata that is stored together with a backup is written by the Trilio Workloadmgr services to the backup target in the JSON format.

The second type of data is generated by the Trilio Datamover service running on the compute nodes. The Datamover service reads the Volume Data from the Cinder or Nova storage and transfers this data as a qcow2 image to the backup target. Each Datamover service is hereby responsible for the VMs running on its compute node.

The network requirements are therefor:

  • Every Trilio Workloadmgr service containers need access to the backup target

  • Every Trilio Datamover service containers need access to the backup target

Supported Trilio Upgrade Path

The following versions can be upgraded to each other:

From
To

4.1 GA (4.1.94) or 4.1.HFx

5.x.x

4.2 GA (4.2.64) or 4.2.HFx or 4.2.x

5.x.x

Trilio for OpenStack 6.2 introduces the , which changes how backup targets are mounted on controller and compute nodes. Upgrading from 6.1.x to 6.2.x therefore has a one-time migration beyond the usual package upgrade:

  1. The trilio-dms service is deployed alongside the existing Trilio services on every controller and compute node that needs backup-target access. Deployment scripts in triliovault-cfg-scripts (branch 6.2.x) handle this automatically.

  2. The /etc/triliovault-dms/ configuration tree — server.conf, client.conf, rootwrap.conf

Detailed platform-specific steps are in the platform upgrade guides.

Platform availability at 6.2.0 GA: the upgrade path from 6.1.x to 6.2.x is supported on RHOSO 18.0 at GA. Support for other platforms will land in subsequent 6.2.x releases.

Licensing

After all Trilio components are installed, the license can be applied.

The license can be applied either through the Admin tab in Horizon or the CLI

Apply license through Horizon

To apply for the license through Horizon follow these steps:

  1. Login to Horizon using admin user.

  2. Click on the Admin Tab.

  3. Navigate to Backups-Admin

  4. Navigate to Trilio

  5. Navigate to License

  6. Click "Update License"

  7. Read the license agreement

  8. Click on "I accept the terms in the License Agreement"

  9. Click on "Next"

  10. Click "Choose File"

  11. Choose license file on the client system

  12. Click "Apply"

  • <license_file> ➡️ path to the license file

Read and accept the End User License Agreement to complete the license application.

Users can preview the latest EULA at our main site:

Switching NFS Backing file

Trilio employs a base64 hash to establish the mount point for NFS Backup targets, ensuring compatibility across multiple NFS Shares within a single Trilio installation. This hash is an integral component of Trilio's incremental backups, functioning as an absolute path for backing files.

Consequently, during a disaster recovery or rapid migration situation, the utilization of a mount bind becomes necessary.

In scenarios that allow for a comprehensive migration period, an alternative approach comes into play. This involves modifying the backing file, thereby enabling the accessibility of Trilio backups from a different NFS Share. The backing file is updated to correspond with the mount point of the new NFS Share.

Backing file change script

Trilio provides a shell script for the purpose of changing the backing file. This script is used after the Trilio appliance has been reconfigured to use the new NFS share.

Downloading the shell script

Please request the shell script from your Trilio Customer Success Manager or Customer Success Engineer by opening a case from our Customer Portal. It is not publically available for download at this time.

Prerequisites

The following requirements need to be met before the change of the backing file can be attempted.

  • The Trilio Appliance has been reconfigured with the new NFS Share

  • The OpenStack environment has been reconfigured with the new NFS Share

    • Please check for Red Hat OpenStack Platform

  • The workloads are available on the new NFS Share

  • The workloads are owned by nova:nova user

The shell script is changing one workload at a time.

Run the following command:

with

  • /var/trilio/triliovault-mounts/<base64>/ being the new NFS mount path

  • workload_<workload_id> being the workload to rebase

The shell script is generating the following log file at the following location:

The log file will not get overwritten when the script is run multiple times. Each run of the script will append the available log file.

E-Mail Notifications

Definition

Trilio can notify users via E-Mail upon the completion of backup and restore jobs.

The E-Mail will be sent to the owner of the Workload.

Requirements to activate E-Mail Notifications

To use the E-mail notifications, two requirements need to be met.

Both requirements need to be set or configured by the OpenStack Administrator. Please contact your OpenStack Administrator to verify the requirements.

User E-Mail assigned

As the E-Mail will be sent to the owner of the Workload does the OpenStack User, who created the workload, require to have an E-Mail address associated.

Trilio E-Mail Server configured

Trilio needs to know which E-Mail server to use, to send the E-mail notifications. Backup Administrators can do this in the "Backup Admin" area.

Activate/Deactivate the E-Mail Notifications

E-Mail notifications are activated tenant wide. To activate the E-Mail notification feature for a tenant follow these steps:

  1. Login to Horizon

  2. Navigate to the Backups

  3. Navigate to Settings

  4. Check/Uncheck the box for "Enable Email Alerts"

The following screenshots show example E-mails send by Trilio.

Rebasing existing workloads

The Trilio solution is using the qcow2 backing file to provide full synthetic backups.

Especially when the NFS backup target is used, there are scenarios at which this backing file needs to be updated to a new mount path.

To make this process easier and streamlined Trilio is providing the following rebase tool.

Serial Upload per Instance during Snapshot

The following steps depict configuring the Trilio for OpenStack to override the default snapshot upload functionality.

By default, during a snapshot, Trilio will consider all the instances that are members of a workload and starts uploading the resources of each instance simulateously. In some cases, it may be required that the snapshots must be done in serial per VM such that backup of all the disks of one VM/instance must be finished before taking backup of the other VMs that are part of that workload.

Trilio has a provision to update the default behaviour of considering all the instances of a workload during backup process, by introducing a configrable parameter in the on of its services.

Follow the below mentioned steps to set the serial upload as the default behavior.

Finding the required configuration file

As per the OpenStack distribution, look for the configuration file of workloadmgr-api(wlm-api) and workloadmgr-workloads(wlm-workloads) services or containers on the controller plane.

The default location of this configration file in the container or VM where it is running is /etc/triliovault/triliovault-wlm.conf

Once the file is located, take a backup of the file in-case of future reference.

Once the files are located, add the below mentioned parameter with its value to the [DEFAULT] section of the configuration file. serial_vm_backup=true

After successfully updating the file, restart the services or containers and these steps need to be followed on all the controller plane.

Additions for multiple CEPH configurations

It is possible to configure Cinder and Ceph to use different Ceph users for different Ceph pools and Cinder volume types. Or to have the nova boot volumes and cinder block volumes controlled by different users.

If multiple Ceph storages are configured/integrated with the OpenStack, please ensure that respective conf and keyring files are present in /etc/ceph directory.

In the case of multiple Ceph users, it is required to delete the keyring extension from the triliovault-datamover.conf inside the Ceph block by following below mentioned steps:

  1. Deploy Trilio as per the documented steps.

  2. Post successful deployment, please modify the triliovault-datamover.conf file present at following locations on all compute nodes.

    For RHOSP : /var/lib/config-data/puppet-generated/triliovaultdm/etc/triliovault-datamover/

    For Kolla : /etc/kolla/triliovault-datamover/

  3. Modify keyring_ext value with valid keyring extension (eg. .keyring). This extension is expected to be same for all the keyring files. It will be present under [ceph] block in triliovault-datamover.conf file.

Sample conf entry below. This will try all files with the extension keyring that are located inside /etc/ceph to access the Ceph cluster for a Trilio related task.

  1. Restart triliovault_datamover container on all compute nodes.

Migrating encrypted Workloads

Migration within the same cloud to a different owner Cloud A — Domain A — Project A — User A => Cloud A — Domain A — Project A — User B Cloud A — Domain A — Project A — User A => Cloud A — Domain A — Project B — User B Cloud A — Domain A — Project A — User A =>Cloud A — Domain B — Project B — User B

Steps used:

  1. Create a secret for Project A in Domain A via User A.

  2. Create encrypted workload in Project A in Domain A via User A. Take snapshot.

Managing Trusts

Trilio is using the which enables the Trilio service user to act in the name of another OpenStack user.

This system is used during all backup and restore features.

Trusts can only be worked with via CLI

  • <trust_id> ➡️ ID of the trust to show

  • <role_name> ➡️Name of the role that trust is created for

OpenStack endpoints required by Trilio

It is recommended to configure connectivity through the admin endpoints if available.

Recommendation: Provide access to all OpenStack Endpoint types

Backup target access required by Trilio

Updating the configuration file

prerequisite
limitations
Network Considerations
Installation Strategy and Preparation
,
rootwrap.d/dms.filters
— is laid down on each node.
  • A database schema migration adds the backup_target_mount_ledger table used by DMS. This is applied by workloadmgr-manage db sync and the equivalent dmapi migration step, both of which are run automatically by the upgrade playbooks.

  • 5.0 GA or 5.x.x

    6.x.x

    6.1.x

    6.2.x

    Notes for upgrades to 6.2.x

    Dynamic Mount Service (DMS)

    Example E-Mails

    Screenshot of a notification E-mail for a successful Snapshot
    Screenshot of a notification E-Mail for a failed Snapshot
    Screenshot of a notification E-Mail for a successful Restore
    Screenshot of a notification E-Mail for a failed Restore

    Apply license through CLI

    https://trilio.io/eula/

    Usage

    The shell script has to run as nova user, otherwise the owner will get changed and the backup can not be used by Trilio.

    Logging of the procedure

    here
    
    ...
    
    [ceph]
    keyring_ext = .keyring
    
    ...
    
    Reassign workload to new owner
  • Load rc file of User A & provide read only rights through acl to the new owner

    openstack acl user add --user <userB_id> <secret_href> --insecure

  • Migration between clouds Cloud A — Domain A — Project A — User A => Cloud B — Domain B — Project B — User B

    Steps used:

    1. Create a secret for Project A in Domain A via User A.

    2. Create an encrypted workload in Project A in Domain A via User A. Trigger snapshot.

    3. Reassign workload to Cloud B - Domain B — Project B — User B

    4. Load RC file of User B.

    5. Create a secret for Project B in Domain B via User B with the same payload used in Cloud A.

    6. Create token via “openstack token issue --insecure”

    7. Add migrated workload's metadata to the new secret (provide issued token to Auth-Token & workload id to matadata as below)

    Same cloud - different owner

    Different cloud

    --is_cloud_trust {True,False} ➡️ Set to true if creating cloud admin trust. While creating cloud trust use same user and tenant which used to configure Trilio and keep the role admin.

    • <trust_id> ➡️ ID of the trust to be deleted

    OpenStack Administrators should never have the need to directly work with the trusts created.

    The cloud-trust is created during the Trilio configuration and further trusts are created as necessary upon creating or modifying a workload.

    List all trusts

    Show a trust

    Create a trust

    OpenStack Keystone Trust system

    Delete a trust

    workloadmgr license-create <license_file>
    ./backing_file_update.sh /var/trilio/triliovault-mounts/<base64>/workload_<workload_id>
    /tmp/backing_file_update.log
    curl -i -X PUT \
       -H "X-Auth-Token:gAAAAABh0ttjiKRPpVNPBjRjZywzsgVton2HbMHUFrbTXDhVL1w2zCHF61erouo4ZUjGyHVoIQMG-NyGLdR7nexmgOmG7ed66LJ3IMVul1LC6CPzqmIaEIM48H0kc-BGvhV0pvX8VMZiozgFdiFnqYHPDvnLRdh7cK6_X5dw4FHx_XPmkhx7PsQ" \
       -H "Content-Type:application/json" \
       -d \
    '{
      "metadata": {
          "workload_id": "c13243a3-74c8-4f23-b3ac-771460d76130",
          "workload_name": "workload-c13243a3-74c8-4f23-b3ac-771460d76130"
        }
    }' \
     'https://kolla-victoria-ubuntu20-1.triliodata.demo:9311/v1/secrets/f3b2fce0-3c7b-4728-b178-7eb8b8ebc966/metadata'
     
     
    curl -i -X GET \
       -H "X-Auth-Token:gAAAAABh0ttjiKRPpVNPBjRjZywzsgVton2HbMHUFrbTXDhVL1w2zCHF61erouo4ZUjGyHVoIQMG-NyGLdR7nexmgOmG7ed66LJ3IMVul1LC6CPzqmIaEIM48H0kc-BGvhV0pvX8VMZiozgFdiFnqYHPDvnLRdh7cK6_X5dw4FHx_XPmkhx7PsQ" \
     'https://kolla-victoria-ubuntu20-1.triliodata.demo:9311/v1/secrets/f3b2fce0-3c7b-4728-b178-7eb8b8ebc966/metadata'
    workloadmgr trust-list
    workloadmgr trust-show <trust_id>
    workloadmgr trust-create [--is_cloud_trust {True,False}] <role_name>
    workloadmgr trust-delete <trust_id>

    Compatibility Matrix

    Trilio for OpenStack Compatibility Matrix

    Trilio Release
    RHOSP version
    Linux Distribution
    Supported ?

    6.2.1

    RHOSO18 <= FR6(18.0.21)

    RHEL-9

    Trilio Release
    OpenStack version
    Linux Distribution
    Supported ?
    Trilio Release
    OpenStack version
    Supported ?
    Trilio Release
    Canonical OpenStack version
    Linux Distribution
    Supported ?

    All versions of T4O-6.x releases support NFSv3, NFSv4 and S3 as backup targets on all the compatible distributions.

    All versions of T4O-6.x releases support encryption using Barbican service on all the compatible distributions.

    Installing the QEMU guest agent is an optional but recommended service to run inside the VM to ensure backup data consistency with Trilio. QEMU Guest Agent is the standard OpenSource QEMU/KVM hypervisor agent that runs inside a virtual machine (VM) and communicates with the host system (the hypervisor) to provide enhanced management and control of the VM. It is an essential component of any hypervisor platform that OpenStack can use to provide enhanced functionality when required.

    To enable this feature, you must set hw_qemu_guest_agent=yes as a metadata parameter on the image you wish to use to create the guest-agent-capable instances from. Reference: https://docs.openstack.org/nova/pike/admin/configuration/hypervisor-kvm.html

    If the Virtual Machine is already created from the glance image which doesn't have the hw_qemu_guest_agent=yes property set, guest agent can be enabled using following process:

    The process is stopping the VM, manually adding the lines below to the virsh definition using "virsh edit ", and starting it again:

    The VM the needs to be running the qemu-guest agent software:

    Ubuntu/Debian: sudo apt install -y qemu-guest-agent && sudo systemctl enable qemu-guest-agent && sudo systemctl restart qemu-guest-agent && sudo systemctl status qemu-guest-agent --no-pager

    RHEL/CentOS VMs: sudo yum install -y qemu-guest-agent && sudo systemctl enable qemu-guest-agent && sudo systemctl restart qemu-guest-agent && sudo systemctl status qemu-guest-agent --no-pager

    Windows VMs: Inside the guest OS, install the guest agent tools from: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win-guest-tools.exe. Finally, make sure the service is running and set to start on boot automatically, in PowerShell, as Administrator: Set-Service QEMU-GA -StartupType Automatic; Restart-Service QEMU-GA; Get-Service QEMU-GA

    You can confirm the qemu-guest-agent is running properly after installed, from the compute host, like this:

    virsh qemu-agent-command $INSTANCE '{"execute":"guest-ping"}'

    The output must be: {"return":{}}

    Software Driven Migration is supported in T4O 5.X release. Please refer

    Upgrading on RHOSP

    1] Prerequisites

    Please ensure the following requirements are met before starting the upgrade process:

    • No Snapshot or Restore is running

    • Global job scheduler is disabled

    • Disable the wlm services on all controller nodes

    sudo systemctl stop tripleo_triliovault_wlm_api.service
    sudo systemctl disable tripleo_triliovault_wlm_api.service
    sudo systemctl stop tripleo_triliovault_wlm_scheduler.service
    sudo systemctl disable tripleo_triliovault_wlm_scheduler.service
    sudo systemctl stop tripleo_triliovault_wlm_workloads.service
    sudo systemctl disable tripleo_triliovault_wlm_workloads.service
    • Disable the datamover service on all compute nodes

    Take a backup of existing triliovault-cfg-scripts directory

    Clone triliovault-cfg-scripts github repository of latest release.

    Copy the passwords and triliovault wlm ids files from old cfg-scripts directory.

    Please follow from section 1.4 to section 10. Please note that sections 5 and 6 needs to be skipped during this process.

    While providing the backup target details in section 4.1, please ensure to provide the existing backup target (of 5.x release) as default.

    From any one of the controller nodes, run the below command.

    From any one of the controller nodes, login to wlm api container and run the below commands to fetch the backup target details.

    This command will return the backup_target_id and backup_target_type_id.

    To import workloads after upgrade, run the following command from any controller node by logging into the WLM API container:

    Above --inplace-upgrade will update all the workload and policy records in database as per the current release version.

    The above command gives you the list of all the workloads that can be imported from the specified backup target.

    The above command imports all workloads from the specified backup target in the current cloud.

    Please follow to update the backing file path of existing snapshots.

    Post Installation Health-Check

    After the installation and configuration of Trilio for OpenStack did succeed the following steps can be done to verify that the Trilio installation is healthy.

    On the Controller node

    Make sure below containers are in a running state, triliovault-wlm-cron would be running on only one of the controllers in case of multi-controller setup.

    • triliovault_datamover_api

    • triliovault_wlm_api

    • triliovault_wlm_scheduler

    • triliovault_wlm_workloads

    • triliovault-wlm-cron

    If the containers are in a restarting state or not listed by the following command then your deployment is not done correctly. Please recheck if you followed the complete documentation.

    After successful deployment, triliovault-wlm-cron service would get added in pcs cluster as a cluster resource, you can verify through pcs status command

    Verify the HAproxy configuration under:

    Make sure the Trilio Datamover container is in running state and no other Trilio container is deployed on compute nodes.

    Check if provided backup target is mounted well on Compute host.

    Make sure the horizon container is in a running state. Please note that the Horizon container is replaced with Trilio's Horizon container. This container will have the latest OpenStack horizon + Trilio horizon plugin.

    Disaster Recovery

    Trilio Workloads are designed to allow a Disaster Recovery without the need to backup the Trilio database.

    As long as the Trilio Workloads are existing on the Backup Target Storage and a Trilio installation has access to them, it is possible to restore the Workloads.

    Disaster Recovery Process

    1. Install and Configure Trilio for the target cloud

    2. Verify required mount-paths and create if necessary

    3. Reassign Workloads

    4. Notify users to of Workloads being available

    Trilio incremental Snapshots involve a backing file to the prior backup taken, which makes every Trilio incremental backup a synthetic full backup.

    Trilio is using qcow2 backing files for this feature:

    As can be seen in the example is the backing file an absolute path, which makes it necessary, that this path exists so the backing files can be accessed.

    Trilio is using the base64 hashing algorithm for the NFS mount-paths, to allow the configuration of multiple NFS Volumes at the same time. The hash value is calculated using the provided NFS path.

    When the path of the backing file is not available on the Trilio appliance and Compute nodes, will the restores of incremental backups fail.

    The tested and recommended method to make the backing files available is creating the required directory path and using mount --bind to make the path available for the backups.

    Running the mount --bind command will make the necessary path available until the next reboot. If it is required to have access to the path beyond a reboot is it necessary to edit the fstab.

    Important log files

    Trilio services logs on RHOSP

    On the Controller Node

    Below Trilio containers gets deployed on the Contoller node.

    • triliovault_datamover_api

    • triliovault_wlm_api

    • triliovault_wlm_scheduler

    • triliovault_wlm_workloads

    • triliovault-wlm-cron

    The log files for above Trilio services can be found here:

    /var/log/containers/triliovault-datamover-api/triliovault-datamover-api.log

    /var/log/containers/triliovault-wlm-api/triliovault-wlm-api.log

    /var/log/containers/triliovault-wlm-cron/triliovault-wlm-cron.log

    /var/log/containers/triliovault-wlm-scheduler/triliovault-wlm-scheduler.log

    /var/log/containers/triliovault-wlm-workloads/triliovault-wlm-workloads.log

    In the case of using S3 as a backup target is there also a log file that keeps track of the S3-Fuse plugin used to connect with the S3 storage.

    For Trilio for OpenStack 6.2 and later, the s3vaultfuse processes are spawned and managed by the Dynamic Mount Service. Per-target log paths are emitted by the trilio-dms-server container; see .

    For 6.1 and earlier, a single per-node S3-Fuse plugin log is written at:

    /var/log/containers/triliovault-wlm-workloads/triliovault-object-store.log

    For file serach operation, logs can be found on Controller node at below location:

    /var/log/containers/triliovault-wlm-workloads/workloadmgr-filesearch.log

    Trilio Datamover container gets deployed on the Compute node.

    The log file for the Trilio Datamover service can be found at:

    /var/log/containers/triliovault-datamover/triliovault-datamover.log

    Frequently Asked Questions

    Frequently Asked Questions about Trilio for OpenStack

    1. Can Trilio for OpenStack restore instance UUIDs?

    Answer: NO

    Trilio for OpenStack does not restore Instance UUIDs (also known as Instance IDs). The only scenario where we do not modify the Instance UUID is during an Inplace Restore, where we only recover the data without creating new instances.

    When Trilio for OpenStack restores virtual machines (VMs), it effectively creates new instances. This means that new Virtual Machine Instance UUIDs are generated for the restored VMs. We achieve this by orchestrating a call to Nova, which creates new VMs with new UUIDs.

    By following this approach, we maintain the principles of OpenStack and auditing. We do not update or modify existing database entries when objects are deleted and subsequently recovered. Instead, all deletions are marked as such, and new instances, including the recovered ones, are created as new objects in the Nova tables. This ensures compliance and preserves the integrity of the OpenStack environment.

    2. Can Trilio for OpenStack restore MAC addresses?

    Answer: YES

    Trilio can restore the VMs MAC address, however, there is a caveat when restoring a virtual machine (VM) to a different IP address: a new MAC address will be assigned to the VM.

    In the case of a One-Click Restore, the original MAC addresses and IP addresses will be recovered, but the VM will be created with a new UUID, as mentioned in question #1.

    When performing a Selective Restore, you have the option to recover the original MAC address. To do so, you need to select the original IP address from the available dropdown menu during the recovery process.

    By choosing the original IP address, Trilio for OpenStack will ensure that the VM is restored with its original MAC address, providing more flexibility and customization in the restoration process.

    Example of Selective Restore with original MAC (and IP address):

    1. In this example, we have taken a Trilio backup of a VM called prod-1.

    1. The VM is deleted and we perform a Selective Restore of a VM called prod-1, selecting the IP address it was originally assigned from the drop-down menu:

    1. Trilio then restores the VM with the original MAC address:

    1. If you left the option as "Choose next available IP address", it will assign a new MAC to the VM instead as Neutron maps all MAC addresses to IP addresses on the Subnet - so logically a new IP will result in a new MAC address.

    Release Notes

    1. New Qualifcation

      • Qualification support for RHOSO18.0-FR6 (18.0.21).

      • Qualification support for Canonical Jammy.

    Multi-IP NFS Backup target mapping file configuration

    Filename and location:

    This file exclusively comes into play when users aim to configure Trilio with a NFS backup target that employs multiple network endpoints. For all other scenarios, such as single IP NFS or S3, this file remains inactive, and in such instances, please consult the standard installation documentation.

    When using an NFS backup target with multiple network endpoints, T4O will mount a single IP/endpoint on a designated compute node for a specific NFS share. This approach enables users to distribute NFS share IPs/endpoints across various compute nodes.

    The 'triliovault_nfs_map_input.yml' file allows users to distribute/load balance NFS share endpoints across compute nodes in a given cloud.

    Here, the User has ‘one’ NFS share exposed with three IP addresses. 192.168.1.34, 192.168.1.35, 192.168.1.33 Share directory path is: /var/share1

    So, this NFS share supports the following full paths that clients can mount:

    There are 32 compute nodes in the OpenStack cloud. 30 node hostnames have the following naming pattern

    File Search

    The file search functionality allows the user to search for files and folders located on a chosen VM in a workload in one or more Backups.

    The file search tab is part of every workload overview. To reach it follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    Installing WorkloadManager CLI client

    The workloadmgr CLI client is provided as rpm and deb packages.

    The following operating systems have been verified with the installation:

    • Rocky9, RHEL9

    • CentOS8

    • Ubuntu 18.04, Ubuntu 20.04

    Installing the workloadmgr client will automatically install all required OpenStack clients as well.

    Schedulers

    Every Workload has its own schedule. Those schedules can be activated, deactivated and modified.

    A schedule is defined by:

    • Status (Enabled/Disabled)

    • Start Day/Time

    • End Day

    Configuring Slack Webhook and Alert Notifications

    Before creating a Slack Webhook URL, ensure the following requirements are met:

    • A Slack workspace where you have admin privileges.

    • Basic understanding of enterprise messaging platforms.

    • Access to the Slack API portal.

    Trilio Snapshot and Backup exporter Metric Information


    Metric
    Description

    Uninstalling from RHOSO

    Delete tvocontrolplane resource

    Use the following command

    List openshift trilio control plane nodes

    SSH Login to all these nodes and unmount the backup targets used by Trilio control plane services

    Delete dataplane trilio resources from openshift

    Trilio registers services and users in Keystone. Those need to be unregistered and deleted.

    Trilio creates databases for dmapi and workloadmgr services. These databases need to be cleaned.

    Login into the database cluster

    Run the following SQL statements to clean the database.

    General Troubleshooting Tips

    Troubleshooting inside a complex environment like OpenStack can be very time-consuming.

    The following tips will help to speed up the troubleshooting process to identify root causes.

    OpenStack and Trilio are divided into multiple services. Each service has a very specific purpose that is called during a backup or recovery procedure. Knowing which service is doing what helps to understand where the error is happening, allowing more focused troubleshooting.

    The Trilio Workloadmgr is the Controller of Trilio. It receives all Workload related requests from the users.

    Every task of a backup or restore process is triggered and managed from here. This includes the creation of the directory structure and initial metadata files on the Backup Target.

    During a backup process is the Trilio Workloadmgr also responsible for gathering the metadata about the backed-up VMs and networks from the OpenStack environment. It sends API calls to the OpenStack endpoints on the configured endpoint type to fetch this information. Once the metadata has been received, the Trilio Workloadmgr writes it as JSON files on the Backup Target.

    The Trilio Workloadmgr is also sending the Cinder Snapshot command.

    During the restore process, the Trilio Workloadmgr reads the VM metadata from its Database and uses the metadata to create the Shell for the restore. It sends API calls to the OpenStack environment to create the necessary resources.

    On the Compute Node

    Dynamic Mount Service
    Qualification support for Sunbeam Canonical 2024.1 (Caracal) on Noble.
  • Qualification support for MOSK & OS Helm.

  • New Features

    • Unified import and reassign operator.

    • Tenant chargeback csv download.

    • Upgrade from 5.x to 6.2.1 on Kolla-Ansible.

  • Enhancements

    • Nova Server Group Preservation — the Nova server group each protected instance belongs to is now captured with every Snapshot and reapplied when the instance is restored, preserving affinity / anti-affinity placement across restore, migration and disaster recovery. Selective Restore lets you choose the target server group per instance; One Click Restore reuses the captured group automatically. See Features for details.

  • Bug Fixes

    • VM restored via selective restore after deletion of original VM automatically becomes the member of the workload.

    • Selective restore fails with error : you cannot attach a port multiple times.

    • Pre-created port IP not attached to the VM from selective restore attempted from API.

    • Misleading error message in selective restore Failed restoring snapshot: Timeout waiting for the instance to boot from volume even after waiting for 4 minutes.

    • Selective restore fails with error that port is still in use.

    • NFS mount hangs on 6.2 release.

    • Unauthorized Backup Operations Are Not Properly Rejected.

    • Snapshot-create API blocks wlm-api worker for full snapshot duration → scheduled backups fail with "Proxy Error" under load.

    • Unexpected Workload VM Membership Loss.

    • API for usage report.

    • s3fuse segment cache unbounded in aggregate → repeated OOM kills of s3vaultfuse → mount outages fail snapshots.

    • Preserve Nova Server Group Metadata During RHOSP16.2 to RHOSO18 VM Migration/Restore

    1. Snapshot mount fails on Kolla Ubuntu Flamingo.

    2. Horizon: snapshot/restore cancel buttons broken; snapshot row click hangs on Loading. This issue is intermittent.

      • Workaround:

        • Refresh the page and try cancel operation again.

    3. 504 gateway timeout error in bulk deletion of error state snapshot from UI.

      • Workaround:

        • Delete multiple snapshots (in loop) from CLI using a script which will delete 1 snapshot at a time.

    4. Retention failing intermittently with NFS V4.

    1. Support for Kolla Epoxy (2025.1) & Kolla Flamingo (2025.2) [For Rocky 9 & Ubuntu 24.04].

    2. Dynamic Mount Service (DMS) — backup targets are now mounted per-job and reference-counted across controller and compute nodes, replacing the previous per-backup-target container model. See T4O Architecture for an overview.

    3. S3 backup-target credentials are now retrieved from OpenStack Barbican at mount time through the new secret_ref field on the backup target, instead of being supplied in configuration.

    1. Snapshot mount fails on Kolla Ubuntu Flamingo.

    2. Incremental backups fail after upgrading to T4O-6.2.0 when using immutable Ceph S3 backup target (mainly for image booted instances).

      • Workaround:

        • Initiate a Full snapshot.

    3. Workload Reset operation fails to cleanup the volume snapshots.

    4. Workload Import getting stuck.

    5. Horizon: snapshot/restore cancel buttons broken; snapshot row click hangs on Loading. This issue is intermittent.

      • Workaround:

        • Refresh the page and try cancel operation again.

    6. 504 gateway timeout error in bulk deletion of error state snapshot from UI.

      • Workaround:

        • Delete multiple snapshots (in loop) from CLI using a script which will delete 1 snapshot at a time.

    7. Retention failing intermittently with NFS V4.

    6.2.1

    Release Date : 21st Aug'2026

    What's New?

    Known Issues

    6.2.0

    Release Date : 30th April'2026

    What's New?

    Known Issues

    The dmapi service is the connector between the Trilio cluster and the Datamover running on the compute nodes.

    The purpose of the dmapi service is to identify which compute node is responsible for the current backup or restore task. To do so, the dmapi service connects to the nova API requesting the compute hose of a provided VM.

    Once the compute host has been identified, the dmapi forwards the command from the Trilio Workloadmgr to the datamover running on the identified compute host.

    The datamover is the Trilio service running on the compute nodes.

    Each datamover is responsible for the VMs running on top of its compute node. A datamover can not work with VMs running on a different compute node.

    The datamover controls the freeze and thaw of VMs as well as the actual movement of the data.

    Trilio is reading and writing on the Backup Target as nova:nova.

    The POSIX user-id and group-id of nova:nova need to be aligned between the Trilio Cluster and all compute nodes. Otherwise, backup or restores may fail with permission or file not found issues.

    Alternativ ways to achieve the goal are possible, as long as all required nodes can fully write and read as nova:nova on the Backup Target.

    It is recommended to verify the required permissions on the Backup Target in case of any errors during the data transfer phase or in case of any file permission errors.

    On Cohesity NFS if an Input/Output error is observed, then increase the timeo and retrans parameter values in your NFS options.

    Logging inside all datamover containers and add uxsock_timeout with value as 60000 which is equal to 60 sec inside /etc/multipath.conf.Restart datamover container

    Trilio is using RBAC to allow the usage of Trilio features to users.

    This trustee role is absolutely required and can not be overwritten using the admin role.

    It is recommended to verify the assignment of the Trilio Trustee Role in case of any permission errors from Trilio during the creation of Workloads, backups, or restores.

    Trilio is creating Cinder Snapshots and temporary Cinder Volumes. The OpenStack Quotas need to allow that.

    Every disk that is getting backed up requires one temporary Cinder Volumes.

    Every Cinder Volume that is getting backup requires two Cinder Snapshots. The second Cinder Snapshot is temporary to calculate the incremental.

    What is happening where

    Trilio Workloadmgr

    During a backup process

    During a restore process

    Datamover API

    Datamover

    Everything on the Backup Target is happening as user nova

    Input/Output Error with Cohesity NFS

    Timeout receiving packet error in multipath ISCSi environment

    Trilio Trustee Role

    OpenStack Quotas

    Kolla Epoxy (2025.1)

    Ubuntu 24.04 Rocky 9

    ✔️ ✔️

    ✔️

    6.2.0

    RHOSO18 <= FR5(18.0.17)

    RHEL-9

    ✔️

    6.2.X

    Kolla Flamingo (2025.2)

    Ubuntu 24.04 Rocky 10

    ✔️ ✔️

    6.2.X

    Bobcat (2023.2) Epoxy (2025.1) Caracal (MOSK25.1) Epoxy (MOSK25.2)

    ✔️ ✔️ ✔️ ✔️

    6.2.1

    Sunbeam 2024.1 (Caracal) 2024.1 (Caracal) 2023.2 (Bobcat)

    Noble Jammy Jammy

    ✔️ ✔️ ✔️

    NFS & S3 Support:

    Encryption Support:

    QEMU Guest Agent

    Enabling QEMU Guest Agent

    Software Driven Migration: VMware to OpenStack

    VM-Migration-T4O-5.X

    6.2.X

    2] Install latest Trilio release

    3] Restart wlm-cron resource

    4] Fetch backup target details

    5] Import workloads

    DEPRECATED: workloadmgr workload-importworkloads --inplace-upgrade is deprecated. It remains supported, but please use the newly added workload-inplace-db-upgrade command instead:

    workloadmgr workload-inplace-db-upgrade

    6] Update backing file path

    This step would be needed only when your old backup target is S3.

    this documentation
    this documentation

    On Compute node

    On the node with Horizon service

    This procedure is designed to be applicable to all OpenStack installations using Trilio. It is to be used as a starting point to develop the exact Desaster Recovery process of a specific environment.

    In case that instead of noticing the users, the workloads shall be restored is it necessary to have an User in each Project, that has the necessary privileges to restore.

    Mount-paths

    1] Uninstall TVO Control Plane Services

    1.1] Uninstall operator - tvo-operator

    1.2] Delete old trilio-galera cluster pvcs and pv

    1.3] Unmount the backup targets

    2] Uninstall TVO Data Plane Services

    2.1] Log into each compute node, then stop and disable all Trilio services using the approach outlined below.

    2.2] Clean Trilio Keystone resources

    2.3] Clean Trilio database resources

    Identify the workload a file search shall be done in

  • Click the workload name to enter the Workload overview

  • Click File Search to enter the file search tab

  • A file search runs against a single virtual machine for a chosen subset of backups using a provided search string.

    To run a file search the following elements need to be decided and configured

    Under VM Name/ID choose the VM that the search is done upon. The drop down menu provides a list of all VMs that are part of any Snapshot in the Workload.

    The File Path defines the search string that is run against the chosen VM and Snapshots. This search string does support basic RegEx.

    Example File Path for all files inside /etc : /etc/*

    "Filter Snapshots by" is the third and last component that needs to be set. This defines which Snapshots are going to be searched.

    There are 3 possibilities for a pre-filtering:

    1. All Snapshots - Lists all Snapshots that contain the chosen VM from all available Snapshots

    2. Last Snapshots - Choose between the last 10, 25, 50, or custom Snapshots and click Apply to get the list of the available Snapshots for the chosen VM that match the criteria.

    3. Date Range - Set a start and end date and click apply to get the list of all available Snapshots for the chosen VM within the set dates.

    After the pre-filtering is done all matching Snapshots are automatic prechosen. Uncheck any Snapshot that shall not be searched.

    To start a File Search the following elements need to be set:

    • A VM to search in has to be chosen

    • A valid File Path provided

    • At least one Snapshot to search in selected

    Once those have been set click "Search" to start the file search.

    After a short time the results will be presented. The results are presented in a tabular format grouped by Snapshots and Volumes inside the Snapshot.

    For each found file or folder the following information are provided:

    • POSIX permissions

    • Amount of links pointing to the file or folder

    • User ID who owns the file or folder

    • Group ID assigned to the file or folder

    • Actual size in Bytes of the file or folder

    • Time of creation

    • Time of last modification

    • Time of last access

    • Full path to the found file or folder

    Once the Snapshot of interest has been identified it is possible to go directly to the Snapshot using the "View Snapshot" option at the top of the table. It is also possible to directly mount the Snapshot using the "Mound Snapshot" Button at the end of the table.

    • <vm_id> ➡️ ID of the VM to be searched

    • <file_path> ➡️ Path of the file to search for

    • --snapshotids <snapshotid> ➡️ Search only in specified snapshot ids snapshot-id: include the instance with this UUID

    • --end_filter <end_filter> ➡️Displays last snapshots, example , last 10 snapshots, default 0 means displays all snapshots

    • --start_filter <start_filter> ➡️Displays snapshots starting from , example , snapshot starting from 5, default 0 means starts from first snapshot

    • --date_from <date_from> ➡️ From date in format 'YYYY-MM-DDTHH:MM:SS' eg 2016-10-10T00:00:00, If time isn't specified then it takes 00:00 by default

    • --date_to <date_to> ➡️ To date in format 'YYYY-MM-DDTHH:MM:SS'(defult is current day),Specify HH:MM:SS to get snapshots within same day inclusive/exclusive results for date_from and date_to

    Definition

    Navigating to the file search tab in Horizon

    Configuring and starting a file search Horizon

    Choose the VM the file search shall run against

    VMs that are no longer activly protected by the Workload but are still part of an existing Snapshot are listed in red.

    Set the File Path

    The File Path has to start with a '/'

    Windows partitions are fully supported. Each partition is its own Volume with its own root. Use '/Windows' instead of 'C:\Windows'

    The file search does not go into deeper directories and always searches on the directory provided in the File Path

    Define the Snapshots to search in

    When no Snapshot is chosen the file search will not start.

    Start the File Search and retrieve the results in Horizon

    Do not navigate to any other Horizon tab or website after starting the File Search. Results are lost and the search has to be repeated to regain them.

    Doing a CLI File Search

    Further, the installation of the workloadmgr client will integrate the client into the global OpenStack Python client, if available.

    The Trilio workload manager CLI client has several requirements that need to be met before the client can be installed without dependency issues.

    The following steps need to be done to prepare the installation of the workloadmgr client:

    1. Add required repositories

      1. epel-release yum -y install epel-release

      2. centos-release-openstack-train yum -y install centos-release-openstack-train

    To install the latest available workloadmgr package for a Trilio release from the Trilio repository the following steps need to be done:

    Create the Trilio yum repository file /etc/yum.repos.d/trilio.repo Enter the following details into the repository file:

    Install the workloadmgr client issuing the following command:

    yum install python-3-workloadmgrclient-el8

    The Trilio workload manager CLI client has several requirements that need to be met before the client can be installed without dependency issues.

    The following steps need to be done to prepare the installation of the workloadmgr client:

    1. Add required repositories

      1. epel-release yum -y install epel-release

    To install the latest available workloadmgr package for a Trilio release from the Trilio repository the following steps need to be done:

    Create the Trilio yum repository file /etc/yum.repos.d/trilio.repo Enter the following details into the repository file:

    Install the workloadmgr client issuing the following command:

    yum install python-3-workloadmgrclient-el9

    The Trilio workloadmgr client packages for Ubuntu are only available from the online repository.

    There is no preparation required. All dependencies are automatically resolved by the standard repositories provided by Ubuntu.

    To install the latest available workloadmgr package for a Trilio release from the Trilio repository the following steps need to be done:

    Create the Trilio yum repository file /etc/apt/sources.list.d/fury.list Enter the following details into the repository file:

    run apt update to make the new repository available.

    The apt package manager is used to install the workloadmgr client package:

    apt-get install python3-workloadmgrclient

    About the workloadmgr CLI client

    Install workloadmgr client rpm package on CentOS8

    Preparing the workloadmgr client installation

    These repositories are required to fulfill the following dependencies:

    python3-pbr,python3-prettytable,python3-requests,python3-simplejson,python3-six,python3-pyyaml,python3-pytz,python3-openstackclient

    Installing the workloadmgr client

    Installing from the Trilio online repository

    Install workloadmgr client rpm package on Rocky9 and RHEL9

    Preparing the workloadmgr client installation

    Installing the workloadmgr client

    Installing from the Trilio online repository

    Install workloadmgr client deb packages on Ubuntu

    Preparing the workloadmgr client installation

    Installing the Workloadmgr client

    Installing from the Trilio online repository

    openstack_protected_vm

    Number of protected VMs per project

    mysql_trilio_backup_size_info

    Snapshot storage usage in GB

    mysql_trilio_snapshots_status

    Snapshot-level status information

    trilio_allowed_quota_value

    Allowed quota limits

    trilio_quota_high_watermark

    Highest observed quota usage

    trilio_workload_info

    Workload metadata

    trilio_workload_vm_info

    VM metadata for workloads


    Provides per-project snapshot counts grouped by snapshot state (successful, failed, running).

    Example


    Provides information about restore operations.

    Example


    Shows the number of unique protected VMs per project.

    Example


    Provides aggregated snapshot storage metrics per project, normalized to GB.

    Example


    Provides snapshot-level granularity, exposing individual snapshot identity and status.

    Example


    Exposes allowed quota limits per project and quota type.

    Example


    Reports the highest observed quota usage for each quota type per project.

    Example


    Exports metadata for all workloads, including lifecycle and configuration details.

    Example


    Exports VM-level metadata associated with Trilio workloads.

    Example

    Note: The above are just a few examples for better understanding. Any other suitable examples may be used as required.

    mysql_trilio_snapshots_info

    Snapshot counts grouped by state

    mysql_trilio_restore_info

    Restore metrics

    Metrics Overview

    Metrics Details

    mysql_trilio_snapshots_info

    mysql_trilio_restore_info

    openstack_protected_vm

    mysql_trilio_backup_size_info

    mysql_trilio_snapshots_status

    trilio_allowed_quota_value

    trilio_quota_high_watermark

    trilio_workload_info

    trilio_workload_vm_info

    <channel type='unix'>
    <target type='virtio' name='org.qemu.guest_agent.0'/>
    <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    sudo systemctl stop tripleo_triliovault_datamover.service
    sudo systemctl disable tripleo_triliovault_datamover.service
    sudo umount /var/lib/nova/triliovault-mounts
    cd /home/stack
    mv triliovault-cfg-scripts/ triliovault-cfg-scripts-5.x
    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cp /home/stack/triliovault-cfg-scripts-5.x/redhat-director-scripts/rhosp17/environments/passwords.yaml /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/environments/trilio_passwords.yaml
    cp /home/stack/triliovault-cfg-scripts-5.x/redhat-director-scripts/rhosp17/puppet/trilio/files/triliovault_wlm_ids.conf /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/puppet/trilio/files/
    sudo pcs resource restart triliovault-wlm-cron-podman-0
    sudo podman exec -it triliovault_wlm_api bash
    source /etc/triliovault-wlm/cloud_admin_rc
    workloadmgr backup-target-type-list
    sudo podman exec -it triliovault_wlm_api bash
    source /etc/triliovault-wlm/cloud_admin_rc
    workloadmgr workload-importworkloads --inplace-upgrade
    workloadmgr workload-get-importworkloads-list --source-bt {{ backup_target_id }}
    workloadmgr workload-importworkloads --source-btt {{ backup_target_type_id }}
    [root@overcloudtrain5-controller-0 /]# podman ps  | grep trilio-
    76511a257278  undercloudqa.ctlplane.trilio.local:8787/trilio/trilio-horizon-plugin:<CONTAINER-TAG-VERSION>-rhosp17.1          kolla_start           12 days ago   Up 12 days ago           horizon
    5c5acec33392  cluster.common.tag/trilio-wlm:pcmklatest                                                          /bin/bash /usr/lo...  7 days ago    Up 7 days ago            triliovault-wlm-cron-podman-0
    8dc61a674a7f  undercloudqa.ctlplane.trilio.local:8787/trilio/trilio-datamover-api:<CONTAINER-TAG-VERSION>-rhosp17.1           kolla_start           7 days ago    Up 7 days ago            triliovault_datamover_api
    a945fbf80554  undercloudqa.ctlplane.trilio.local:8787/trilio/trilio-wlm:<CONTAINER-TAG-VERSION>-rhosp17.1                     kolla_start           7 days ago    Up 7 days ago            triliovault_wlm_scheduler
    402c9fdb3647  undercloudqa.ctlplane.trilio.local:8787/trilio/trilio-wlm:<CONTAINER-TAG-VERSION>-rhosp17.1                     kolla_start           7 days ago    Up 6 days ago            triliovault_wlm_workloads
    f9452e4b3d14  undercloudqa.ctlplane.trilio.local:8787/trilio/trilio-wlm:<CONTAINER-TAG-VERSION>-rhosp17.1                     kolla_start           7 days ago    Up 6 days ago            triliovault_wlm_api
    [root@overcloudtrain5-controller-0 /]# pcs status
    Cluster name: tripleo_cluster
    Cluster Summary:
      * Stack: corosync
      * Current DC: overcloudtrain5-controller-0 (version 2.0.5-9.el8_4.3-ba59be7122) - partition with quorum
      * Last updated: Mon Jul 24 11:19:05 2023
      * Last change:  Mon Jul 17 10:38:45 2023 by root via cibadmin on overcloudtrain5-controller-0
      * 4 nodes configured
      * 14 resource instances configured
    
    Node List:
      * Online: [ overcloudtrain5-controller-0 ]
      * GuestOnline: [ galera-bundle-0@overcloudtrain5-controller-0 rabbitmq-bundle-0@overcloudtrain5-controller-0 redis-bundle-0@overcloudtrain5-controller-0 ]
    
    Full List of Resources:
      * ip-172.30.6.27      (ocf::heartbeat:IPaddr2):        Started overcloudtrain5-controller-0
      * ip-172.30.6.16      (ocf::heartbeat:IPaddr2):        Started overcloudtrain5-controller-0
      * Container bundle: haproxy-bundle [cluster.common.tag/openstack-haproxy:pcmklatest]:
        * haproxy-bundle-podman-0   (ocf::heartbeat:podman):         Started overcloudtrain5-controller-0
      * Container bundle: galera-bundle [cluster.common.tag/openstack-mariadb:pcmklatest]:
        * galera-bundle-0   (ocf::heartbeat:galera):         Master overcloudtrain5-controller-0
      * Container bundle: rabbitmq-bundle [cluster.common.tag/openstack-rabbitmq:pcmklatest]:
        * rabbitmq-bundle-0 (ocf::heartbeat:rabbitmq-cluster):       Started overcloudtrain5-controller-0
      * Container bundle: redis-bundle [cluster.common.tag/openstack-redis:pcmklatest]:
        * redis-bundle-0    (ocf::heartbeat:redis):  Master overcloudtrain5-controller-0
      * Container bundle: openstack-cinder-volume [cluster.common.tag/openstack-cinder-volume:pcmklatest]:
        * openstack-cinder-volume-podman-0  (ocf::heartbeat:podman):         Started overcloudtrain5-controller-0
      * Container bundle: triliovault-wlm-cron [cluster.common.tag/trilio-wlm:pcmklatest]:
        * triliovault-wlm-cron-podman-0     (ocf::heartbeat:podman):         Started overcloudtrain5-controller-0
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg
    [root@overcloudtrain5-novacompute-0 heat-admin]# podman  ps | grep -i datamover
    c750a8d0471f  undercloudqa.ctlplane.trilio.local:8787/trilio/trilio-datamover:<CONTAINER-TAG-VERSION>-rhosp17.1              kolla_start  7 days ago   Up 7 days ago           triliovault_datamover
    [root@overcloudtrain5-novacompute-0 heat-admin]# df -h  | grep triliovault-mounts
    172.30.1.9:/mnt/rhosptargetnfs  7.0T  5.1T  2.0T  72% /var/lib/nova/triliovault-mounts/L21udC9yaG9zcHRhcmdldG5mcw==
    [root@overcloudtrain5-controller-0 heat-admin]# podman ps  | grep horizon
    76511a257278  undercloudqa.ctlplane.trilio.local:8787/trilio/trilio-horizon-plugin:<CONTAINER-TAG-VERSION>-rhosp17.1          kolla_start           12 days ago   Up 12 days ago           horizon
    qemu-img info 85b645c5-c1ea-4628-b5d8-1faea0e9d549
    image: 85b645c5-c1ea-4628-b5d8-1faea0e9d549
    file format: qcow2
    virtual size: 1.0G (1073741824 bytes)
    disk size: 21M
    cluster_size: 65536
    backing file: /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW0=/workload_3c2fbee5-ad90-4448-b009-5047bcffc2ea/snapshot_f4874ed7-fe85-4d7d-b22b-082a2e068010/vm_id_9894f013-77dd-4514-8e65-818f4ae91d1f/vm_res_id_9ae3a6e7-dffe-4424-badc-bc4de1a18b40_vda/a6289269-3e72-4085-adca-e228ba656984
    Format specific information:
        compat: 1.1
        lazy refcounts: false
        refcount bits: 16
        corrupt: false
    # echo -n 10.10.2.20:/upstream | base64
    MTAuMTAuMi4yMDovdXBzdHJlYW0=
    #mount --bind <mount-path1> <mount-path2>
    #vi /etc/fstab
    <mount-path1> <mount-path2>	none bind	0 0
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    ./uninstall_tvo_control_plane.sh
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    ./uninstall_operator.sh <TVO_OPERATOR_CONTAINER_IMAGE_URL>
    oc -n trilio-openstack get pvc
    oc -n trilio-openstack delete pvc <pvc0> <pvc1> <pvc2>
    oc get nodes -l trilio-control-plane=enabled
    Example:- 
    [openstackdev@localhost dataplane-scripts]$ oc get nodes -l trilio-control-plane=enabled
    NAME      STATUS   ROLES                         AGE   VERSION
    master1   Ready    control-plane,master,worker   90d   v1.31.6
    master2   Ready    control-plane,master,worker   90d   v1.31.6
    master3   Ready    control-plane,master,worker   90d   v1.31.6
    
    oc debug node/master1
    chroot /host
     
     ## List NFS backup target mounts
     mount | grep nfs
     
     ## Unmount all shares listed in above command output
     umount -l <NFS_Share>
     
     ## Verify that trilio nfs backup target is listed in command output
     mount  | grep nfs
     
     ## Unmount S3 backup target mounts
     ls -ll /var/lib/trilio/triliovault-mounts/
     
     ## If there is any S3 backup target mounted inside above director, abobve command will 
     ## fail and will provide mount point information.
     ## You need to copy those mount points and do unmount
     umount /var/lib/trilio/triliovault-mounts/<mount_point>
     
     ## After unmounting all backup targets, you will be able to run following command successfully
     ls -ll /var/lib/trilio/triliovault-mounts/
     
     ## Remove triliovault-mounts directory
     rm -rf /var/lib/trilio/triliovault-mounts/
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts
    ./uninstall.sh
    ssh root@<compute_ip>
    
    Example:-
    systemctl list-units | grep trilio
      edpm_triliovault-datamover.service                                                                                                   loaded active running   triliovault-datamover container
      edpm_triliovault-object-store-BT1_S3.service                                                                                         loaded active running   triliovault-object-store-BT1_S3 container
    
    systemctl stop edpm_triliovault-datamover.service
    systemctl disable edpm_triliovault-datamover.service
    Removed "/etc/systemd/system/multi-user.target.wants/edpm_triliovault-datamover.service".
    
    openstack service delete dmapi
    openstack user delete dmapi
    openstack service delete TrilioVaultWLM
    openstack user delete triliovault
    oc exec -it openstack-galera-0 -n openstack bash
    mysql -u root -p<password>
    ## Clean database
    DROP DATABASE dmapi;
    
    ## Clean dmapi user
    => List 'dmapi' user accounts
    MariaDB [(none)]> select user, host from mysql.user where user='dmapi';
    +-------+------+
    | User  | Host |
    +-------+------+
    | dmapi | %    |
    +-------+------+
    1 row in set (0.001 sec)
    
    => Delete those user accounts
    MariaDB [(none)]> DROP USER dmapi@'%';
    Query OK, 0 rows affected (0.011 sec)
    
    => Verify that dmapi user got cleaned
    MariaDB [(none)]> select user, host from mysql.user where user='dmapi';
    Empty set (0.001 sec)
    
    ## Clean database
    DROP DATABASE workloadmgr;
    
    ## Clean workloadmgr user
    => List 'workloadmgr' user accounts
    MariaDB [(none)]> select user, host from mysql.user where user='workloadmgr';
    +-------------+------+
    | User        | Host |
    +-------------+------+
    | workloadmgr | %    |
    +-------------+------+
    1 row in set (0.001 sec)
    
    => Delete those user accounts
    MariaDB [(none)]> DROP USER workloadmgr@'%';
    Query OK, 0 rows affected (0.008 sec)
    
    => Verify that workloadmgr user got cleaned
    MariaDB [(none)]> select user, host from mysql.user where user='workloadmgr';
    Empty set (0.001 sec)
    
    workloadmgr filepath-search [--snapshotids <snapshotid>]
                                [--end_filter <end_filter>]
                                [--start_filter <start_filter>]
                                [--date_from <date_from>]
                                [--date_to <date_to>]
                                <vm_id> <file_path>
    [trilio]
    name=Trilio Repository
    baseurl=https://yum.fury.io/trilio-6-0/
    enabled=1
    gpgcheck=0
    [trilio]
    name=Trilio Repository
    baseurl=https://yum.fury.io/trilio-6-0/
    enabled=1
    gpgcheck=0
    deb [trusted=yes] https://apt.fury.io/trilio-6-0/ /
    mysql_trilio_snapshots_info{status="error"} 3
    count(mysql_trilio_restore_info{status="error"})
    openstack_protected_vm{ProjectID="proj1"} 25
    mysql_trilio_backup_size_info{ProjectID="proj1"} 450.75
    mysql_trilio_snapshots_status{ProjectID="p1",WorkloadID="w1",SnapshotID="123",SnapshotName="daily-backup",status="successful"} 1
    trilio_allowed_quota_value{ProjectID="p1",QuotaName="Snapshots"} 100
    trilio_quota_high_watermark{ProjectID="p1",QuotaName="Snapshots"} 80
    trilio_workload_info{ID="123",ProjectID="p1",DisplayName="TestWorkload",Status="available"} 1
    trilio_workload_vm_info{VMID="vm-123",WorkloadID="456",Status="protected"} 1

    The remaining 2 node hostnames do not follow any format/pattern.

    Now the mapping file will look like this

    Compute node IP range used here: 172.30.3.11-40 and 172.30.4.40, 172.30.4.50 Total of 32 compute nodes

    Use the following command to get compute hostnames. Check the ‘Name' column. Use these exact hostnames in 'triliovault_nfs_map_input.yml' file.

    In the following command output, ‘overcloudtrain1-novacompute-0' and ‘overcloudtrain1-novacompute-1' are correct hostnames.

    triliovault-cfg-scripts/common/triliovault_nfs_map_input.yml
    192.168.1.33:/var/share1 
    192.168.1.34:/var/share1 
    192.168.1.35:/var/share1

    Introduction

    Note: Two IPs/endpoints of the same NFS share on a single compute node is an invalid scenario and not required because in the backend it stores data at the same place.

    Examples

    Using hostnames

    prod-compute-1.trilio.demo 
    prod-compute-2.trilio.demo 
    prod-compute-3.trilio.demo 
    . 
    . 
    . 
    prod-compute-30.trilio.demo
    compute_bare.trilio.demo 
    compute_virtual
    multi_ip_nfs_shares: 
     - "192.168.1.34:/var/share1": ['prod-compute-[1:10].trilio.demo', 'compute_bare.trilio.demo'] 
       "192.168.1.35:/var/share1": ['prod-compute-[11:20].trilio.demo', 'compute_virtual'] 
       "192.168.1.33:/var/share1": ['prod-compute-[21:30].trilio.demo'] 
    
    single_ip_nfs_shares: []
    multi_ip_nfs_shares: 
     - "192.168.1.34:/var/share1": ['172.30.3.[11:20]', '172.30.4.40'] 
       "192.168.1.35:/var/share1": ['172.30.3.[21:30]', '172.30.4.50'] 
       "192.168.1.33:/var/share1": ['172.30.3.[31:40]'] 
    
    single_ip_nfs_shares: []
    (undercloud) [stack@ucqa161 ~]$ openstack server list
    +--------------------------------------+-------------------------------+--------+----------------------+----------------+---------+
    | ID                                   | Name                          | Status | Networks             | Image          | Flavor  |
    +--------------------------------------+-------------------------------+--------+----------------------+----------------+---------+
    | 8c3d04ae-fcdd-431c-afa6-9a50f3cb2c0d | overcloudtrain1-controller-2  | ACTIVE | ctlplane=172.30.5.18 | overcloud-full | control |
    | 103dfd3e-d073-4123-9223-b8cf8c7398fe | overcloudtrain1-controller-0  | ACTIVE | ctlplane=172.30.5.11 | overcloud-full | control |
    | a3541849-2e9b-4aa0-9fa9-91e7d24f0149 | overcloudtrain1-controller-1  | ACTIVE | ctlplane=172.30.5.25 | overcloud-full | control |
    | 74a9f530-0c7b-49c4-9a1f-87e7eeda91c0 | overcloudtrain1-novacompute-0 | ACTIVE | ctlplane=172.30.5.30 | overcloud-full | compute |
    | c1664ac3-7d9c-4a36-b375-0e4ee19e93e4 | overcloudtrain1-novacompute-1 | ACTIVE | ctlplane=172.30.5.15 | overcloud-full | compute |
    +--------------------------------------+-------------------------------+--------+----------------------+----------------+---------+

    Using IPs

    Other complex examples are available on github at

    Getting the correct compute hostnames/IPs

    RHOSP

    Run this command on undercloud by sourcing 'stackrc'.

    Hrs between 2 snapshots

    To disable the scheduler of a single Workload in Horizon do the following steps:

    1. Login to the Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload to be modified

    5. Click the small arrow next to "Create Snapshot" to open the sub-menu

    6. Click "Edit Workload"

    7. Navigate to the tab "Schedule"

    8. Uncheck "Enabled"

    9. Click "Update"

    • --workloadid <workloadid> ➡️ Requires at least one workloadid, Specify an ID of the workload whose scheduler disables. Specify option multiple times to include multiple workloads. --workloadids <workloadid> --workloadids <workloadid>

    To disable the scheduler of a single Workload in Horizon do the following steps:

    1. Login to the Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload to be modified

    5. Click the small arrow next to "Create Snapshot" to open the sub-menu

    6. Click "Edit Workload"

    7. Navigate to the tab "Schedule"

    8. check "Enabled"

    9. Click "Update"

    • --workloadid <workloadid> ➡️ Requires at least one workloadid, Specify an ID of the workload whose scheduler disables. Specify option multiple times to include multiple workloads. --workloadids <workloadid> --workloadids <workloadid>

    To modify a schedule the workload itself needs to be modified.

    Please follow this procedure to modify the workload.

    Trilio is using the OpenStack Keystone Trust system which enables the Trilio service user to act in the name of another OpenStack user.

    This system is used during all backup and restore features.

    As a trust is bound to a specific user for each Workload does the Trilio Horizon plugin show the status of the Scheduler on the Workload list page.

    Screenshot of an Workload with established scheduler trust
    • <workload_id> ➡️ ID of the workload to validate

    Definition

    workloadmgr disable-scheduler --workloadids <workloadid>
    workloadmgr enable-scheduler --workloadids <workloadid>
    workloadmgr scheduler-trust-validate <workload_id>

    Disable a schedule

    Using Horizon

    Using CLI

    Enable a schedule

    Using Horizon

    Using CLI

    Modify a schedule

    Verify the scheduler trust is working

    Using Horizon

    Using CLI

    Create a new private channel to recieve slack webhook notifications


    Incoming Webhooks in Slack allow third-party applications to send messages directly to a Slack channel when specific events occur. Slack provides a simple interface to configure Webhooks for integrations and alert notifications.

    Follow the steps below to generate a Slack Webhook URL.


    Go to the Slack API portal:

    Log in and click Create an App.


    Select From Scratch and give the application a name.


    Choose the Slack Workspace that should be connected to the application.

    ---

    On the application configuration page, locate and select Incoming Webhooks.


    Enable the Activate Incoming Webhooks toggle and Click Add New Webhook to Workspace to create a webhook configuration.

    Scroll to the bottom of the page.


    Select the Slack channel where messages should be posted.


    After authorization, you will be redirected to the webhook configuration page where the Webhook URL will be displayed.


    Copy the above Webhook URL and use it in your alerting or notification configuration.

    To test the webhook, you can send a request using curl:

    If configured correctly, the message will appear in the selected Slack channel.


    The Slack Webhook setup is now complete.


    Alerts can also be integrated with Slack.

    Please refer to https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-slack/

    Alerts for Trilio metrics can be configured in below way:

    Grafana also allows creating alerts directly from dashboards.

    Query:

    Condition:

    • Trigger alert if value > 0

    • Evaluation interval: 5 minutes

    Alert Message:


    Query:

    Condition:

    • Trigger alert if value > 0

    • Evaluation interval: 5 minutes

    Alert Message:


    Query:

    Condition:

    • Trigger alert if value > 5000

    • Evaluation interval: 15 minutes

    Alert Message:


    Note: The above are just a few examples for better understanding. Any other suitable examples may be used as required.

    Prerequisites

    https://api.slack.com/apps
    curl -X POST -H 'Content-type: application/json' \
    --data '{"text":"Hello, World!"}' \
    <YOUR_WEBHOOK_URL>
    mysql_trilio_snapshots_info{status="failed"} > 0
    Trilio Snapshot Failure Detected
    One or more snapshot operations have failed.
    mysql_trilio_restore_info{status="failed"} > 0
    Trilio Restore Failure Detected
    One or more restore operations have failed.
    sum(mysql_trilio_backup_size_info)
    Trilio Backup Size High
    Total backup storage usage exceeded 5TB threshold.

    Steps to Set Up Slack Webhook URL

    Step 1

    Step 2

    Step 3

    Step 4

    Step 5

    Step 6

    Step 7

    Step 8

    Slack Alerting

    Alert Rule Examples

    Using Grafana Alerting

    Example Alert Rules

    Snapshot Failure Alert

    Restore Failure Alert

    Backup Size Alert

    Procedure to Import a Grafana Dashboard

    1] Procedure to Access the Grafana Dashboard for Trilio

    The following command provides the URL for the Grafana dashboard:

    oc -n openshift-user-workload-monitoring get routes -n openshift-user-workload-monitoring

    The above command shows the Grafana URL. Log in to Grafana using this URL.

    Use the credentials mentioned in the grafana-secret-creds.yaml file to log in to the Grafana UI.

    Alternatively, you can fetch the credentials using the following commands:

    kubectl get secret -n openshift-user-workload-monitoring credentials -o "jsonpath={.data.GF_SECURITY_ADMIN_USER}" | base64 --decode
    
    kubectl get secret -n openshift-user-workload-monitoring credentials -o "jsonpath={.data.GF_SECURITY_ADMIN_PASSWORD}" | base64 --decode

    1.1] Import Grafana Dashboard File

    Download or navigate to the Grafana dashboard JSON file using the following location:

    cd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/grafana/

    Grafana dashboard JSON file:

    vi TrilioGrafanaDashboard.json

    2] Steps to Import a Grafana Dashboard

    After successful login to Grafana, follow these steps.

    2.1] Go to Dashboards

    a) On the left sidebar, click the Dashboards icon (four-square icon).

    b) Click New → Import.

    (In some Grafana versions, you may see an Import option directly in the Dashboards section.)


    You will see the following options:

    • Import dashboard from file or import via dashboard JSON model

    • Upload or paste JSON file

    Perform one of the following actions:

    • Click Upload JSON file, then select your dashboard JSON file (for example, TrilioGrafanaDashboard.json)

    OR

    • Paste the JSON content directly into the text box


    • Grafana will create the dashboard from the JSON file

    • You will be redirected to the dashboard view


    Select the Prometheus datasource when prompted.


    The dashboard import is now complete.



    The Grafana dashboard has two levels:

    1. Project level

    2. Cloud level


    This panel shows the successful, failed, and running backups.

    • Green indicates successful backups

    • Red indicates failed backups

    • Yellow indicates running backups

    The panel also shows the percentage ratio of each status.


    This panel shows the successful, failed, and running restore operations.

    • Green indicates successful restores

    • Red indicates failed restores

    • Yellow indicates running restores

    The panel also shows the percentage ratio of each status.


    This panel shows the number of protected and unprotected instances.


    This panel shows the quota usage details for:

    • Backups

    • Virtual machines

    • Snapshots

    • Workloads


    This panel shows the number of workloads available in the selected project.


    This panel shows the same details as the project level panels, but it displays the information for the entire cloud instead of a specific project.


    Workload Quotas

    Trilio enables OpenStack administrators to set Project Quotas against the usage of Trilio.

    The following Quotas can be set:

    • Number of Workloads a Project is allowed to have

    • Number of Snapshots a Project is allowed to have

    • Number of VMs a Project is allowed to protect

    triliovault-cfg-scripts/common/examples-multi-ip-nfs-map at master · trilioData/triliovault-cfg-scripts

    2.2] Choose JSON File

    2.3] Click Import

    2.4] Select Prometheus Datasource

    2.5] Example

    3] Overview of Default Panels

    3.1] Project Level Panel Details

    3.1.1] Snapshot Panel

    3.1.2] Restore Panel

    3.1.3] Protected Instance Info Panel

    3.1.4] Quota Usage Panel

    3.1.5] Workload Panel

    3.2] Cloud Level Panel Details

    Snapshot Panel
    Restore Panel
    Restore Panel

    Amount of Storage a Project is allowed to use on the Backup Target

    Workload Quotas are managed like any other Project Quotas.

    1. Login into Horizon as user with admin role

    2. Navigate to Identity

    3. Navigate to Projects

    4. Identify the Project to modify or show the quotas on

    5. Use the small arrow next to "Manage Members" to open the submenu

    6. Choose "Modify Quotas"

    7. Navigate to "Workload Manager"

    8. Edit Quotas as desired

    9. Click "Save"

    Screenshot of Horizon integration for Workload Manager Quotas

    Trilio is providing several different Quotas. The following command allows listing those.

    The following command will show the details of a provided Quota Type.

    • <quota_type_id> ➡️ID of the Quota Type to show

    The following command will create a Quota for a given project and set the provided value.

    • <quota_type_id> ➡️ID of the Quota Type to be created

    • <allowed_value>➡️ Value to set for this Quota Type

    • <high_watermark>➡️ Value to set for High Watermark warnings

    • <project_id>➡️ Project to assign the quota to

    The following command lists all Trilio Quotas set for a given project.

    • <project_id>➡️ Project to list the Quotas from

    The following command shows the details about a provided allowed Quota.

    • <allowed_quota_id> ➡️ID of the allowed Quota to show.

    The following command shows how to update the value of an already existing allowed Quota.

    • <allowed_value>➡️ Value to set for this Quota Type

    • <high_watermark>➡️ Value to set for High Watermark warnings

    • <project_id>➡️ Project to assign the quota to

    • <allowed_quota_id> ➡️ID of the allowed Quota to update

    The following command will delete an allowed Quota and sets the value of the connected Quota Type back to unlimited for the affected project.

    • <allowed_quota_id> ➡️ID of the allowed Quota to delete

    workloadmgr project-quota-type-list
    workloadmgr project-quota-type-show <quota_type_id>
    workloadmgr project-allowed-quota-create --quota-type-id quota_type_id
                                             --allowed-value allowed_value 
                                             --high-watermark high_watermark 
                                             --project-id project_id
    workloadmgr project-allowed-quota-list <project_id>
    workloadmgr project-allowed-quota-show <allowed_quota_id>
    workloadmgr project-allowed-quota-update [--allowed-value <allowed_value>]
                                             [--high-watermark <high_watermark>]
                                             [--project-id <project_id>]
                                             <allowed_quota_id>
    workloadmgr project-allowed-quota-delete <allowed_quota_id>

    Work with Workload Quotas via Horizon

    The Trilio Quota feature is available for all supported OpenStack versions and distributions, but only Train and higher releases include the Horizon integration of the Quota feature.

    Work with Workload Quotas via CLI

    List available Quota Types

    Trilio 4.1 do not yet have the Quota Type Volume integrated. Using this will not generate any Quotas a Tenant has to apply to.

    Show Quota Type Details

    Create a Quota

    The high watermark is automatically set to 80% of the allowed value when set via Horizon.

    A created Quota will generate an allowed_quota_object with its own ID. This is ID is needed when continuing to work with the created Quota.

    List allowed Quotas

    Show allowed Quota

    Update allowed Quota

    Delete allowed Quota

    6.2.0

    Learn about artifacts related to Trilio for OpenStack 6.2.0

    Trilio Branch

    Branch of the repository to be used for DevOps scripts.

    trilio_branch : 6.2.0

    Trilio Branch for Grafana setup

    Branch of the repository to enable grafana monitoring on RHOSO18.0.

    trilio_grafana_branch : 6.2.0

    Deployment Scripts

    git clone -b 6.2.0 https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/
    git clone -b 6.2.0 https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/kolla-ansible/ansible

    Container/Revision Information

    RHOSP Version

    CONTAINER-TAG-VERSION

    RHOSP Version
    Container URLs
    Kolla Version
    triliovault_tag
    triliovault_dms_tag
    kolla_base_distro

    All packages are Python 3 (py3.6 - py3.10) compatible only.

    Repo URL:

    Name
    Version

    Configuring Grafana Webhook and Alert Notifications


    1. Open Grafana Dashboard

    • Log in to Grafana.

    • Navigate to Alerting → Contact Points.


    2. Create a Webhook Contact Point

    • Click New Contact Point.

    • Enter a name (e.g., custom-webhook-alert).

    • Select Webhook as the integration type.

    • URL → This is the endpoint where Grafana will send alerts. You must provide a reachable API URL (for example, your backend service or webhook receiver).

    Example:

    • HTTP Method → POST (default).

    • Authentication → Configure if your API requires authentication.

    • Custom Headers → Add headers if required by your API.

    Example header:


    Grafana allows you to customize the JSON payload sent to your webhook.


    • Click Save Contact Point.

    • Your webhook notification channel is now ready to use.


    • Go to Alerting → Alert Rules.

    • Click New Alert Rule.

    • Select a data source (e.g., Prometheus).

    • Write a query for the metric you want to monitor.

    Example:


    Example condition:

    This means the alert will trigger if the condition remains true for 5 minutes.


    • Under Configure Notifications, select the contact point you created (custom-webhook-alert).

    • Save the alert rule.


    • Go to Contact Points.

    • Select your webhook.

    • Click Test.

    Grafana will send a sample JSON payload to your configured endpoint URL.



    • Python must be installed on the system.

    • The pip package manager must be available.

    • Install the Flask Python module using the following command: pip3 install flask.

    • All commands must be executed on the system where the webhook server will run.


    1. Save the above Python code in a file (e.g., server1.py).

    2. Test the webhook:


    • A file named test.json will be created.

    • It will contain the received webhook payload.


    1. Run the following command on your host machine:

    1. Once the server starts, it will be available at:

    Use this URL in Grafana as your webhook endpoint.


    This confirms that Grafana successfully sent an alert to your webhook.

    Note: Similarly, if you follow the above steps and create a Grafana alert rule (for example, using the MySQL snapshot query), the webhook will receive the actual alert payload. The details will be stored in test.json, confirming that Grafana successfully sent the alert to your webhook.


    Delete a backup target

    Follow the steps below to remove a backup target.

    6.2 simplifies the delete flow. Trilio for OpenStack 6.2 deploys a single server per host instead of one triliovault-object-store-<bt-name> pod per backup target. As a result, deleting a backup target in 6.2 no longer requires deleting per-BT control-plane CRs (tvobackuptarget) or running per-BT data-plane teardown deployments. The procedure below covers the 6.2 flow; the legacy 6.1 steps are preserved at the bottom for reference.


    1. Clean Workloads and Backups (Optional)

    • All data related to workloads and the cloud resides on the backup target. The administrator can clean this data from the backup target before deletion, but this step is optional and should not prevent the user from deleting the backup target.

    • Before cleaning up workloads or snapshots, log in to the correct OpenStack project, as each backup target and its workloads belong to that specific project. Select the right project you need before proceeding.

    • Delete all backups stored on the required dynamically added S3 backup target using the UI (Horizon) or Trilio CLI.

    Refer to for detailed steps.

    Refer to for detailed steps.

    Note: Repeat this procedure for each backup and workload that needs to be deleted from the S3 backup target created earlier.


    Deleting a backup target removes it from the TrilioVault database. Make sure you do not need this backup target anymore before you delete it.

    • Log in to the OpenStack Horizon Dashboard as an Admin user.

    • Navigate to Admin → Backups-Admin → Backup Targets.

    • Click the button next to the target, and confirm the deletion when prompted.

    • Multiple targets can be deleted by selecting their checkboxes and clicking the

    1. Identify the WLM API pod in the trilio-openstack namespace:

    2. Exec into the pod and source the admin RC file:

    1. Exec into the wlm-api container and source the admin RC file:

    1. List the backup targets to find the ID of the one you want to delete:

      Note the Backup Target ID and the Secret Ref URL (for S3 targets) — you will need the secret ref to clean up the Barbican secret in step 3.

    2. Delete the backup target:

    3. Verify deletion:


    In 6.2, the S3 access/secret keys for each backup target are stored in an OpenStack Barbican secret. Once the backup target record is gone, the corresponding Barbican secret is no longer referenced and can be removed.

    From inside the WLM API pod/container:

    Or use the Secret Ref URL captured from workloadmgr backup-target-list in section 2 directly:


    DMS unmounts the backup target automatically when the last in-flight job releases it; no manual unmount is required. You can confirm that:

    • The deleted backup target no longer appears in workloadmgr backup-target-list.

    • The DMS server pods on the controller and compute nodes are still Running:

    • No per-BT triliovault-object-store-<bt-name>-* pods remain in the trilio-openstack namespace (in 6.2 they should never be present):

    • The DMS server containers on the controller and compute nodes are still Running:


    Workload Encryption with Barbican

    Learn about encrypting Trilio workloads with Barbican

    Introduction

    Integrating Trilio for OpenStack with Barbican facilitates encryption support for the qcow2-data segment of Trilio backups. However, the JSON files housing the backed-up OpenStack metadata remain unencrypted.

    This capability necessitates the presence of the OpenStack Barbican service. Absence of the Barbican service will result in the omission of encryption options for Workloads within the Horizon interface.

    Trilio for OpenStack (T4O) exclusively retrieves secrets from Barbican, without generating, modifying, or deleting any secrets within the Barbican platform.

    Barbican secrets are indispensable for executing backups or restorations in encryption-enabled Workloads. The onus lies on the OpenStack project user to supply these secrets and guarantee their accurate availability.

    In order to employ encrypted Workloads, the Trilio trustee role must be capable of interacting with the Barbican service to access and retrieve secrets from Barbican. By default, only the 'admin' and 'creator' roles are endowed with these permissions.

    Encryption availability for a Workload is confined to the Workload creation stage. Post-creation, the encryption status of a Workload is irreversible; it cannot be altered or toggled.

    Note : When leveraging OpenStack Barbican for protecting encrypted volumes and offering encrypted backups, it's essential that the Trustee Role is assigned as 'Creator' or a role that possesses equivalent permissions to the Creator role.

    This is crucial because only the Creator role has the authority to create, read, and delete secrets within Barbican. The generation of encryption-enabled workloads would be unsuccessful if the Trustee Role does not possess the permissions associated with the 'Creator' role.

    The following secret configurations are supported for AES-256

    Mode(s)
    Content Types
    Payload Content Encoding
    Secret Type
    Payload/Secret File
    • Alghorithm: AES-256 (All supported types utilize this algorithm)

    • Mode: cbc

    • content type: application/octet-stream

    • payload-content-encoding: base64

    For encrypted workload Barbican should enabled on Openstack, then while configuring T4O, trustee role should be kept as creator .

    Additionally every user who’ll be interacting with TrilioVault for any operator, should also have creator role assigned.

    Secret can be created via OpenStack cli with following the below steps

    1. Source the rc file of the user who is going to create the encrypted workload.

    2. Create any supported type of secret and fetch the secret UUID using OpenStack secret cli.

      1. Refer to this guide for more information about

      2. Below is the example of symmetric secret type creation & fetch the secret UUID.

    b. View the details of the order to identify the location of the generated key, shown here as the Secret href value:

    c. Fetch the secret UUID via below command (use Secret href)

    Note down the last value from Secret href URL which is UUID (8-4-4-4-12 format).

    For example secret UUID for the Secret href URL http://172.30.0.75:9311/v1/secrets/b14bc1ae-9251-4dd5-9fd4-18ef50bbb664 will be b14bc1ae-9251-4dd5-9fd4-18ef50bbb664

    This UUID will be used further for creating the encrypted workload.

    1. Login to openstack horizon dashboard with user who has created the secret & go to Project->Backup->workloads

    2. click on create workload.

    3. select the checkbox for Enable Encryption

    4. Provide the UUID noted in above steps in Secret UUID text box

    1. Follow the usual procedure for further tabs (Workload member, Schedule, policy & Option) & click on create.

    2. Workload will be created and value for Encryption field will be True.

    For migration of encrypted workload please follow:

    Trilio Installation on Canonical (via Juju Charms)

    Trilio and Canonical have started a partnership to ensure a native deployment of Trilio using JuJu Charms.

    Those JuJu Charms are publicly available as Open Source Charms.

    • A Canonical (Charmed) OpenStack base setup deployed for a required release, with all units in active/idle state. Refer to the .

    • Juju controller connected to the OpenStack model. Verify with juju status.

    Uninstalling from RHOSP

    The following steps need to be run on all nodes, which have the Trilio Datamover API & Workloadmanager services running. Those nodes can be identified by checking the roles_data.yaml for the role that contains the below entries

    Once the role that runs the Trilio Datamover API & Workloadmanager services has been identified will the following commands clean the nodes from the service.

    Remove triliovault_datamover_api container.

    Clean Trilio Datamover API service conf directory.

    Clean Trilio Datamover API service log directory.

    Remove triliovault_wlm_api container.

    Clean Trilio Workloadmanager API service conf directory.

    Multi-Region Deployments

    This document discusses OpenStack multi-region deployments and how Trilio (or T4O, which stands for Trilio For OpenStack) can be deployed in multi-region OpenStack clouds.

    OpenStack is designed to be scalable. To manage scale, OpenStack supports various resource segregation constructs: Regions, cells, and availability zones to manage OpenStack resources. Resource segregation is essential to define fault domains and localize network traffic.

    From an end user's perspective, OpenStack regions are equivalent to regions in Amazon Web Services. Regions live in separate data centers, often named after their location. If your organization has a data center in Chicago and one in Boston, you'll have at least a CHG and a BOS region. Users who want to disperse their workloads geographically will place some in CHG and some in BOS. Regions have separate API endpoints for all services except for Keystone. Users, Tenants, and Domains are shaped across regions through a single Keystone deployment.

    Availability Zones are an end-user visible logical abstraction for partitioning a cloud without knowing the physical infrastructure. Availability zones can partition a cloud on arbitrary factors, such as location (country, data center, rack), network layout, and power source. Because of the flexibility, the names and purposes of availability zones can vary massively between clouds.

    In addition, other services, such as the and the , also provide an availability zone feature. However, the implementation of these features differs vastly between these different services. Please look at the documentation for these other services for more information on their implementation of this feature.

    Cells

    File Search

    POST https://$(tvm_address):8780/v1/$(tenant_id)/search

    Starts a File Search with the given parameters

    Name
    Type
    Description

    Webhook Configuration

    Optional Fields

    3. Configure Custom Payload (Optional)

    Example Payload

    4. Save the Contact Point

    5. Create an Alert Rule

    6. Define Alert Conditions

    7. Attach the Webhook Contact Point

    8. Test the Webhook

    Example Webhook Payload Sent by Grafana (Simplified)

    Example Python Webhook Receiver (Flask)

    Prerequisites for Example Webhook Server

    How to Run and test the Webhook Server quickly

    Expected Result

    Example Server Output

    application/octet-stream

    base64

    symmetric keys

    encoded with base64

    cbc, ctr, xts

    text/plain

    None

    opaque

    plaintext

    secret type: opaque

  • payload: plaintext

  • Generate a new 256-bit key using order create

  • cbc, xts

    text/plain

    None

    passphrase

    plaintext

    By default Barbican will generate secrets of the following type:

    Prerequisite

    1. Secret creation

    It is strongly advised against creating a secret with an expiration date. In case the secret expires, Trilio will be unable to perform any restores for the corresponding encrypted workload, rendering the backups ineffective.

    2. Workload creation

    Encrypted workload migration

    managing Barbican secrets
    Migrating Encrypted Workloads
    Create Workload
    Workloads

    ctr, cbc, xts

    Clean Trilio Workloadmanager API service log directory.

    Remove triliovault_wlm_workloads container.

    Clean Trilio Workloadmanager Workloads service conf directory.

    Clean Trilio Workloadmanager Workloads service log directory.

    Remove triliovault_wlm_scheduler container.

    Clean Trilio Workloadmanager Scheduler service conf directory.

    Clean Trilio Workloadmanager Scheduler service log directory.

    Remove triliovault-wlm-cron-podman-0 container from controller.

    Clean Trilio Workloadmanager Cron service conf directory.

    Clean Trilio Workloadmanager Cron service log directory.

    The following steps need to be run on all nodes, which have the Trilio Datamover service running. Those nodes can be identified by checking the roles_data.yaml for the role that contains the entry OS::TripleO::Services::TrilioDatamover.

    Once the role that runs the Trilio Datamover service has been identified will the following commands clean the nodes from the service.

    Remove triliovault_datamover container.

    Unmount the Trilio Backup Target on the compute host.

    Clean Trilio Datamover service conf directory.

    Clean log directory of Trilio Datamover service.

    Remove wlm cron resource from pcs cluster on the controller node.

    The following steps need to be run on all nodes, which have the HAproxy service running. Those nodes can be identified by checking the roles_data.yaml for the role that contains the entry OS::TripleO::Services::HAproxy.

    Once the role that runs the HAproxy service has been identified will the following commands clean the nodes from all the Trilio resources.

    Edit the following file inside the HAproxy container and remove all Trilio entries.

    /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg

    An example of these entries is given below.

    Restart the HAproxy container once all edits have been done.

    Trilio registers services and users in Keystone. Those need to be unregistered and deleted.

    Trilio creates databases for dmapi and workloadmgr services. These databases need to be cleaned.

    Login into the database cluster

    Run the following SQL statements to clean the database.

    Remove the following entries from roles_data.yaml used in the overcloud deploy command.

    • OS::TripleO::Services::TrilioDatamoverApi

    • OS::TripleO::Services::TrilioWlmApi

    • OS::TripleO::Services::TrilioWlmWorkloads

    • OS::TripleO::Services::TrilioWlmScheduler

    • OS::TripleO::Services::TrilioWlmCron

    • OS::TripleO::Services::TrilioDatamover

    Follow these steps to clean the overcloud deploy command from all Trilio entries.

    1. Remove trilio_env.yaml entry

    2. Remove trilio endpoint map file Replace with original map file if existing

    Run the cleaned overcloud deploy command.

    Clean Trilio Datamover API and Workloadmanager services

    Run all commands as root or user with sudo permissions.

    Clean Trilio Datamover Service

    Run all commands as root or user with sudo permissions.

    Clean wlm-cron resource from pcs cluster

    Clean Trilio HAproxy resources

    Run all commands as root or user with sudo permissions.

    Clean Trilio Keystone resources

    Clean Trilio database resources

    Revert overcloud deploy command

    In the case that the overcloud deploy command used prior to the deployment of Trilio is still available, it can directly be used.

    Revert back to the original RHOSP Horizon container

    http://your-server:50100/webhook
    Content-Type: application/json
    {
      "alert": "{{ .Title }}",
      "status": "{{ .Status }}",
      "message": "{{ .Message }}",
      "labels": "{{ .Labels }}"
    }
    (
      count by (SnapshotID, WorkloadID, SnapshotName, status) (
        mysql_trilio_snapshots_status{status="successful"}
      )
    )
    unless
    (
      count by (SnapshotID, WorkloadID, SnapshotName, status) (
        mysql_trilio_snapshots_status{status="successful"} offset 5m
      )
    )
    WHEN query(A) > 0
    FOR 5m
    {
      "status": "resolved",
      "alert": "test-snapshot-status",
      "snapshot_id": "ffe2ff4b-5122-42be-8e25-b61a0a6699c1",
      "snapshot_name": "snapshot",
      "workload_id": "7166933a-bb0b-4988-9188-e73e5a1cebb5",
      "result": "successful",
      "message": "Snapshot completed successfully"
    }
    from flask import Flask, request
    import json
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return 'Hello, World!'
    
    @app.route('/webhook', methods=["POST"])
    def webhook():
        alertData = request.json
    
        # Save alert data to a file (for debugging/logging)
        with open("test.json", "w") as out_file:
            json.dump(alertData, out_file, indent=4)
    
        return 'ok'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=50100, debug=True)
    curl -X POST http://localhost:50100/webhook \
    -H "Content-Type: application/json" \
    -d '{"status":"test","message":"hello webhook"}'
    python3 server1.py
    http://localhost:50100/webhook
     * Running on http://127.0.0.1:50100
     * Running on http://<your-ip>:50100
    172.22.0.2 - - [17/Mar/2026 07:34:28] "POST /webhook HTTP/1.1" 200 -
    openstack secret order create --name secret2 --algorithm aes --mode ctr --bit-length 256 --payload-content-type=application/octet-stream key
    +----------------+------------------------------------------------------------------------+
    | Field          | Value                                                                  |
    +----------------+------------------------------------------------------------------------+
    | Order href     | http://172.30.0.75:9311/v1/orders/8b442c6e-73e0-40ed-9946-b986c8cc7e12 |
    | Type           | Key                                                                    |
    | Container href | N/A                                                                    |
    | Secret href    | None                                                                   |
    | Created        | None                                                                   |
    | Status         | None                                                                   |
    | Error code     | None                                                                   |
    | Error message  | None                                                                   |
    +----------------+------------------------------------------------------------------------+
    openstack secret order get http://172.30.0.75:9311/v1/orders/8b442c6e-73e0-40ed-9946-b986c8cc7e12
    +----------------+-------------------------------------------------------------------------+
    | Field          | Value                                                                   |
    +----------------+-------------------------------------------------------------------------+
    | Order href     | http://172.30.0.75:9311/v1/orders/8b442c6e-73e0-40ed-9946-b986c8cc7e12  |
    | Type           | Key                                                                     |
    | Container href | N/A                                                                     |
    | Secret href    | http://172.30.0.75:9311/v1/secrets/b2d8a100-9ef9-4460-beff-bc5592f83746 |
    | Created        | 2025-09-18T03:28:30+00:00                                               |
    | Status         | ACTIVE                                                                  |
    | Error code     | None                                                                    |
    | Error message  | None                                                                    |
    +----------------+-------------------------------------------------------------------------+
    openstack secret get http://172.30.0.75:9311/v1/secrets/b14bc1ae-9251-4dd5-9fd4-18ef50bbb664
    +---------------+-------------------------------------------------------------------------+
    | Field         | Value                                                                   |
    +---------------+-------------------------------------------------------------------------+
    | Secret href   | http://172.30.0.75:9311/v1/secrets/b14bc1ae-9251-4dd5-9fd4-18ef50bbb664 |
    | Name          | None                                                                    |
    | Created       | 2025-09-17T10:46:16+00:00                                               |
    | Status        | ACTIVE                                                                  |
    | Content types | None                                                                    |
    | Algorithm     | aes                                                                     |
    | Bit length    | 256                                                                     |
    | Secret type   | opaque                                                                  |
    | Mode          | cbc                                                                     |
    | Expiration    | None                                                                    |
    +---------------+-------------------------------------------------------------------------+
    OS::TripleO::Services::TrilioDatamoverApi
    OS::TripleO::Services::TrilioWlmApi
    OS::TripleO::Services::TrilioWlmWorkloads
    OS::TripleO::Services::TrilioWlmScheduler
    OS::TripleO::Services::TrilioWlmCron
    podman rm -f triliovault_datamover_api
    podman rm -f triliovault_datamover_api_db_sync
    podman rm -f triliovault_datamover_api_init_log
    rm -rf /var/lib/config-data/puppet-generated/triliovaultdmapi
    rm /var/lib/config-data/puppet-generated/triliovaultdmapi.md5sum
    rm -rf /var/lib/config-data/triliovaultdmapi*
    rm -f /var/lib/config-data/triliovault_datamover_api*
    rm -rf /var/log/containers/triliovault-datamover-api/
    podman rm -f triliovault_wlm_api
    podman rm -f triliovault_wlm_api_cloud_trust_init
    podman rm -f triliovault_wlm_api_db_sync
    podman rm -f triliovault_wlm_api_config_dynamic
    podman rm -f triliovault_wlm_api_init_log
    rm -rf /var/lib/config-data/puppet-generated/triliovaultwlmapi
    rm /var/lib/config-data/puppet-generated/triliovaultwlmapi.md5sum
    rm -rf /var/lib/config-data/triliovaultwlmapi*
    rm -f /var/lib/config-data/triliovault_wlm_api*
    rm -rf /var/log/containers/triliovault-wlm-api/
    podman rm -f triliovault_wlm_workloads
    podman rm -f triliovault_wlm_workloads_config_dynamic
    podman rm -f triliovault_wlm_workloads_init_log
    rm -rf /var/lib/config-data/puppet-generated/triliovaultwlmworkloads
    rm /var/lib/config-data/puppet-generated/triliovaultwlmworkloads.md5sum
    rm -rf /var/lib/config-data/triliovaultwlmworkloads*
    rm -rf /var/log/containers/triliovault-wlm-api/
    podman rm -f triliovault_wlm_scheduler
    podman rm -f triliovault_wlm_scheduler_config_dynamic
    podman rm -f triliovault_wlm_scheduler_init_log
    rm -rf /var/lib/config-data/puppet-generated/triliovaultwlmscheduler
    rm /var/lib/config-data/puppet-generated/triliovaultwlmscheduler.md5sum
    rm -rf /var/lib/config-data/triliovaultwlmscheduler*
    rm -rf /var/log/containers/triliovault-wlm-scheduler/
    podman rm -f triliovault-wlm-cron-podman-0
    podman rm -f triliovault_wlm_cron_config_dynamic
    podman rm -f triliovault_wlm_cron_init_log
    rm -rf /var/lib/config-data/puppet-generated/triliovaultwlmcron
    rm /var/lib/config-data/puppet-generated/triliovaultwlmcron.md5sum
    rm -rf /var/lib/config-data//triliovaultwlmcron*
    rm -rf /var/log/containers/triliovault-wlm-cron/
    podman rm -f triliovault_datamover
    ## Following steps are applicable for all supported RHOSP releases.
    
    # Check triliovault backup target mount point
    mount | grep trilio
    
    # Unmount it
    -- If it's NFS	(COPY UUID_DIR from your compute host using above command)
    umount /var/lib/nova/triliovault-mounts/<UUID_DIR>
    
    -- If it's S3
    umount /var/lib/nova/triliovault-mounts
    
    # Verify that it's unmounted		
    mount | grep trilio
    	
    df -h  | grep trilio
    
    # Remove mount point directory after verifying that backup target unmounted successfully.
    # Otherwise actual data from backup target may get cleaned.	
    
    rm -rf /var/lib/nova/triliovault-mounts
    rm -rf /var/lib/config-data/puppet-generated/triliovaultdm/
    rm /var/lib/config-data/puppet-generated/triliovaultdm.md5sum
    rm -rf /var/lib/config-data/triliovaultdm*
    rm -rf /var/log/containers/triliovault-datamover/
    pcs resource delete triliovault-wlm-cron
    listen triliovault_datamover_api
      bind 172.30.5.23:13784 transparent ssl crt /etc/pki/tls/private/overcloud_endpoint.pem
      bind 172.30.5.23:8784 transparent ssl crt /etc/pki/tls/certs/haproxy/overcloud-haproxy-internal_api.pem
      balance roundrobin
      http-request set-header X-Forwarded-Proto https if { ssl_fc }
      http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
      http-request set-header X-Forwarded-Port %[dst_port]
      maxconn 50000
      option httpchk
      option httplog
      retries 5
      timeout check 10m
      timeout client 10m
      timeout connect 10m
      timeout http-request 10m
      timeout queue 10m
      timeout server 10m
      server overcloudtrain1-controller-0.internalapi.trilio.local 172.30.5.28:8784 check fall 5 inter 2000 rise 2 verifyhost overcloudtrain1-controller-0.internalapi.trilio.local
    
    listen triliovault_wlm_api
      bind 172.30.5.23:13781 transparent ssl crt /etc/pki/tls/private/overcloud_endpoint.pem
      bind 172.30.5.23:8781 transparent ssl crt /etc/pki/tls/certs/haproxy/overcloud-haproxy-internal_api.pem
      balance roundrobin
      http-request set-header X-Forwarded-Proto https if { ssl_fc }
      http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
      http-request set-header X-Forwarded-Port %[dst_port]
      maxconn 50000
      option httpchk
      option httplog
      retries 5
      timeout check 10m
      timeout client 10m
      timeout connect 10m
      timeout http-request 10m
      timeout queue 10m
      timeout server 10m
      server overcloudtrain1-controller-0.internalapi.trilio.local 172.30.5.28:8780 check fall 5 inter 2000 rise 2 verifyhost overcloudtrain1-controller-0.internalapi.trilio.local
    podman restart haproxy-bundle-podman-0
    openstack service delete dmapi
    openstack user delete dmapi
    openstack service delete TrilioVaultWLM
    openstack user delete triliovault
    podman exec -it galera-bundle-podman-0 mysql -u root
    ## Clean database
    DROP DATABASE dmapi;
    
    ## Clean dmapi user
    => List 'dmapi' user accounts
    MariaDB [mysql]> select user, host from mysql.user where user='dmapi';
    +-------+-----------------------------------------+
    | user  | host                                    |
    +-------+-----------------------------------------+
    | dmapi | %                                       |
    | dmapi | 172.30.5.28                             |
    | dmapi | overcloudtrain1internalapi.trilio.local |
    +-------+-----------------------------------------+
    3 rows in set (0.000 sec)
    
    => Delete those user accounts
    MariaDB [(none)]> DROP USER dmapi@'%';
    Query OK, 0 rows affected (0.005 sec)
    
    MariaDB [(none)]> DROP USER dmapi@172.30.5.28;
    Query OK, 0 rows affected (0.006 sec)
    
    MariaDB [(none)]> DROP USER dmapi@overcloudtrain1internalapi.trilio.local;
    Query OK, 0 rows affected (0.005 sec)
    
    => Verify that dmapi user got cleaned
    MariaDB [mysql]> select user, host from mysql.user where user='dmapi';
    Empty set (0.00 sec)
    
    ## Clean database
    DROP DATABASE workloadmgr;
    
    ## Clean workloadmgr user
    => List 'workloadmgr' user accounts
    MariaDB [(none)]> select user, host from mysql.user where user='workloadmgr';
    +-------------+-----------------------------------------+
    | user        | host                                    |
    +-------------+-----------------------------------------+
    | workloadmgr | %                                       |
    | workloadmgr | 172.30.5.28                             |
    | workloadmgr | overcloudtrain1internalapi.trilio.local |
    +-------------+-----------------------------------------+
    3 rows in set (0.000 sec)
    
    => Delete those user accounts
    MariaDB [(none)]> DROP USER workloadmgr@'%';
    Query OK, 0 rows affected (0.012 sec)
    
    MariaDB [(none)]> DROP USER workloadmgr@172.30.5.28;
    Query OK, 0 rows affected (0.006 sec)
    
    MariaDB [(none)]> DROP USER workloadmgr@overcloudtrain1internalapi.trilio.local;
    Query OK, 0 rows affected (0.005 sec)
    
    => Verify that workloadmgr user got cleaned
    MariaDB [(none)]> select user, host from mysql.user where user='workloadmgr';
    Empty set (0.000 sec)

    6.2.0-2025.2

    6.2.0-2025.2

    ubuntu rocky

    Kolla Version
    Container URLs

    Kolla Rocky Flamingo (2025.2)

    Kolla Ubuntu Flamingo (2025.2)

    Kolla Rocky Epoxy (2025.1)

    6.2.0.3

    workloadmgrclient

    6.2.0.3

    Repo URL:

    deb [trusted=yes] https://apt.fury.io/trilio-6-2/ /
    Name
    Version

    python3-contegoclient

    6.2.0.3

    python3-dmapi

    6.2.0.3

    Repo URL:

    https://yum.fury.io/trilio-6-2/

    To enable, add the following file /etc/yum.repos.d/fury.repo:

    [trilio-fury]
    name=Trilio Gemfury Private Repo
    baseurl=https://yum.fury.io/trilio-6-2/
    enabled=1
    gpgcheck=0
    Name
    Linux Distribution
    Version

    python3-contegoclient-el9

    RHEL9

    6.2.0.3-6.2

    Channel Operator Hub

    tvo-operator Version Operator Hub

    RHOSO 18.0

    6.2.0-rhoso18.0

    6.2.x

    6.2.0

    RHOSO 18.0

    registry.connect.redhat.com/trilio/trilio-datamover-rhoso:6.2.0-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-datamover-api-rhoso:6.2.0-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-horizon-plugin-rhoso:6.2.0-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-wlm:6.2.0-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-dms-rhoso:6.2.0-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-openstack-operator-rhoso:6.2.0-rhoso18.0
    
    registry.connect.redhat.com/trilio/trilio-ansible-runner-rhoso:6.2.0-1-rhoso18.0

    Kolla Epoxy (2025.1)

    6.2.0-2025.1

    6.2.0-2025.1

    ubuntu rocky

    https://pypi.fury.io/trilio-6-2/

    contegoclient

    6.2.0.3

    tvault-horizon-plugin

    6.2.0.3

    Package Repositories & Versions

    Kolla Flamingo (2025.2)

    workloadmgr

    button at the top right.
    oc get pods -n trilio-openstack | grep wlm-api
    oc exec -n trilio-openstack -it <trilio-wlm-api-pod-name> bash
    source <admin-rc-file>
    docker exec -it triliovault_wlm_api bash
    source <admin-rc-file>
    workloadmgr backup-target-list -c ID -c "Backend Endpoint" -c "Secret Ref"
    workloadmgr backup-target-delete <backup_target_id>
    workloadmgr backup-target-list -c ID -c "Backend Endpoint"
    openstack secret list --name secret-key-<btt-name>
    openstack secret delete <Secret href from previous list>
    openstack secret delete <secret_ref>
    oc -n trilio-openstack get pods | grep trilio-dms-server
    oc -n openstack get pods | grep trilio-dms-server
    oc -n trilio-openstack get pods | grep object-store
    docker ps | grep triliovault_dms

    Delete Snapshots

    Delete a Workload

    2. Remove the Backup Target Record

    Using Horizon Dashboard

    Using CLI

    RHOSO18

    Kolla

    Common Steps

    3. Delete the Barbican Secret (S3 only)

    4. Verify

    RHOSO18

    Kolla

    Deprecated (6.1) — per-BT data-plane teardown and tvobackuptarget CR delete

    In Trilio for OpenStack 6.1 and earlier, deleting a backup target also required tearing down a per-BT object-store container on every node. This procedure is preserved for reference; do not run any of these steps on 6.2 or later — there are no per-BT containers or CRs to remove.

    3.1] Unmount Backup Target from Data Plane

    Delete the per-BT data-plane deployment

    • List OpenStackDataPlaneDeployment resources matching the backup target name:

      oc -n openstack get osdpd | grep trilio
    • Delete the deployment:

    • List the per-BT OpenStackDataPlaneService:

    • Delete it:

    • Generate the cleanup YAMLs:

    • Edit trilio-delete-backup-target-service.yaml and set openStackAnsibleEERunnerImage:. Apply:

    • Edit trilio-delete-backup-target-deployment.yaml and add the compute nodeSets where this BT was added. Apply:

    • List the tvobackuptarget CRs added dynamically:

    • Delete the selected one:

    • Verify the deletion and confirm that the per-BT object-store pods have been cleaned:


    In 6.2, none of the resources referenced above (OpenStackDataPlaneDeployment/OpenStackDataPlaneService per BT, create-templates-delete-backup-target.sh, tvobackuptarget CR, per-BT object-store pods) exist — DMS handles unmount on demand and the only steps required are sections 1–3 of this page.

    this documentation
    this documentation
    Dynamic Mount Service

    The following OpenStack services must already be deployed:

    • MySQL InnoDB Cluster — for WLM and DMAPI databases

    • RabbitMQ Server — for AMQP messaging (WLM, DMAPI, DataMover, DMS)

    • Keystone — for identity service (WLM, DMAPI, and Data-Mover via the identity-service relation)

    • Nova-Compute — DataMover is a subordinate of nova-compute

    • OpenStack Dashboard (Horizon) — for the Horizon Plugin subordinate

    • Vault (recommended) — for TLS certificate management

    • Ceph Mon — if Ceph is the OpenStack storage backend

    • OpenStack Barbican — required by the Dynamic Mount Service (DMS) to retrieve S3 credentials at mount time

    Sample Trilio overlay bundles (T4O release wise) are available in the triliovault-cfg-scripts repository at path: juju-charms/sample_overlay_bundles

    Copy the sample bundle and customise it for your environment:

    Unlike an upgrade, a fresh install does need machine placements set in the overlay bundle — juju deploy uses them to place the WLM and DMAPI LXD containers.

    The sample bundle already includes the 6.2.1 relation changes:

    • trilio-data-mover:identity-service → keystone:identity-service (replaces the older keystone-auth-url config option)

    • Charm channel set to 6.2/stable, with per-charm revision variables at the top of the file

    Following table provides the details of the values to be updated in the overlay bundle.

    Parameters

    Summary

    triliovault-pkg-source

    Trilio debian package repo url; Refer release specific page

    machines

    List of Machines available on canonical openstack setup

    channel

    3.1] Do a dry run to check if the Trilio bundle is working

    3.2] Trigger deployment

    3.3] Wait until all the Trilio units are deployed successfully. Check the status via juju status command.

    Expected output — all units should show:

    4.1] Once the deployment is complete, perform the below operations:

    a. Create cloud admin trust & add licence

    juju run --wait=300s trilio-wlm/leader create-cloud-admin-trust password=<openstack admin password>
    juju attach-resource trilio-wlm license=<Path to trilio license file>
    juju run --wait=300s trilio-wlm/leader create-license
    juju run-action --wait=300s trilio-wlm/leader create-cloud-admin-trust password=<openstack admin password>
    juju attach-resource trilio-wlm license=<Path to trilio license file>
    juju run-action --wait=300s trilio-wlm/leader create-license

    Note: Reach out to the Trilio support team for the license file.

    5.1] After T4O deployment steps are over, it can take some time for all units to get deployed successfully. Deployment is considered successful when all the units show Unit is ready in the message column.

    To verify the same, the following command can be used to fetch the Trilio units/applications:

    All Trilio units should show status active with message Unit is ready.

    5.2] For a deeper check, verify services and rendered DMS configs on each node type.

    On a compute node (DataMover):

    On the WLM node:

    On the DMAPI node:

    The output must be OK: DMS client authenticated as workloadmgr.

    Important: In T4O 6.2.1, backup targets are NOT configured at deploy time. The DMS service dynamically mounts/unmounts targets as needed.

    To add a backup target, follow the "Canonical" steps in the admin guide: Add a new Backup Target.

    7.1] To debug any specific unit: juju debug-log --include <UNIT_NAME_IN_ERROR>

    Eg. If trilio-wlm/6 unit is in 'error' state, its logs can be fetched using the following command. Substitute the correct unit number from your deployment using the juju status command.

    juju debug-log --include trilio-wlm/6

    For multipath enabled environments, perform the following actions

    1. log into each nova compute node

    2. add uxsock_timeout with value as 60000 (i.e. 60 sec) in /etc/multipath.conf

    3. restart tvault-contego service

    Please refer to the Resources section for required Charm details.

    This page covers a fresh install of T4O 6.2.1 onto a Canonical (Charmed) OpenStack cloud that has no prior Trilio deployment. If you are upgrading an existing Trilio deployment, see Upgrading on Canonical instead.

    This page covers the classic MAAS + machine-charm Canonical OpenStack deployment. If your cloud is Canonical OpenStack Sunbeam (Kubernetes-based control plane), see Trilio Installation on Canonical OpenStack (Sunbeam) instead — it uses different charms (trilio-wlm-k8s, trilio-dm-api-k8s, trilio-data-mover-sunbeam) and a different deployment model.

    Prerequisites

    Compatibility Matrix
    juju export-bundle --filename openstack_base_file.yaml
    git clone https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts
    git checkout {{ trilio_branch }}
    cd juju-charms/sample_overlay_bundles
    cp tvo-overlay-bundle.yaml tvo-overlay-bundle-6.2.yaml
    # Edit tvo-overlay-bundle-6.2.yaml:
    #   - triliovault-pkg-source and revision numbers (from the 6.2.1 build report)
    #   - machine placements (`to:` blocks) to match your environment
    juju deploy --dry-run ./openstack_base_file.yaml --overlay tvo-overlay-bundle-6.2.yaml
    juju deploy ./openstack_base_file.yaml --overlay tvo-overlay-bundle-6.2.yaml
    watch -n 5 juju status trilio-wlm trilio-data-mover trilio-dm-api trilio-horizon-plugin
    Agent    Status   Message
    idle     active   Unit is ready
    juju status | grep -i trilio
    juju ssh nova-compute/0
    sudo systemctl status tvault-contego trilio-dms-server
    
    # Verify the DMS server config was rendered:
    cat /etc/triliovault-dms/server.conf
    juju ssh trilio-wlm/leader
    sudo systemctl status wlm-api wlm-workloads wlm-cron wlm-scheduler trilio-dms-server
    
    # Verify DMS configs:
    ls /etc/triliovault-dms/
    cat /etc/triliovault-dms/server.conf
    cat /etc/triliovault-dms/client.conf
    juju ssh trilio-dm-api/leader
    sudo systemctl status tvault-datamover-api
    
    # Verify the DMS client config. A populated db_url only proves the config
    # rendered -- it does NOT prove the credential works. Authenticate with it:
    cat /etc/triliovault-dms/client.conf
    sudo python3 - <<'EOF'
    import configparser, pymysql, urllib.parse as up
    c = configparser.ConfigParser(); c.read("/etc/triliovault-dms/client.conf")
    u = up.urlparse(c["client"]["db_url"])
    if not u.hostname:
        raise SystemExit("FAILED: db_url is empty in client.conf")
    pymysql.connect(host=u.hostname, port=u.port or 3306, user=u.username,
                    password=up.unquote(u.password), database=u.path.lstrip("/"))
    print("OK: DMS client authenticated as", u.username)
    EOF

    Backup targets are NOT configured at deploy time in T4O 6.2.1. Add them after deployment via the T4O CLI or the Horizon UI — see Step 6, "Add Backup Targets Post-Deployment," below.

    Steps to install the Trilio charms

    1. Export the OpenStack base bundle

    2. Create a Trilio overlay bundle as per the OpenStack setup release using the charms given above.

    Trilio File Search functionality requires that the Trilio Workload manager (trilio-wlm) be deployed as a virtual machine. File Search will not function if the Trilio Workload manager (trilio-wlm) is running as a lxd container(s).

    If trilio-wlm service is assigned to any nova-compute node then wlm mysql router service fails to start. Hence, please ensure to assign trilio-wlm service to some other node.

    Value of trilio_branch can be taken from release specific

    The trilio-backup-targets and backup-target-type charm config options used in releases prior to 6.2 are removed from the 6.2 charms — the sample bundle no longer sets them. Backup targets are configured after deployment instead; see Step 6, "Add Backup Targets Post-Deployment," below.

    3. T4O Deployment

    4. Post Deployment Steps

    --wait requires a duration unit (300s, not 300) — juju run/juju run-action otherwise default to --wait=0s, which queues the action asynchronously and returns immediately without its result.

    5. Verify the T4O Deployment

    6. Add Backup Targets Post-Deployment

    7. Troubleshooting T4O Deployment

    functionality enables OpenStack to scale the compute in a more distributed fashion without using complicated technologies like database and message queue clustering. It supports vast deployments.

    Cloud architects can partition OpenStack Compute Cloud into groups called cells. Cells are configured as a tree. The top-level cell should have a host that runs a nova-api service but no nova-compute services. Each child cell should run all the typical nova-* services in a regular Compute cloud except for nova-api. You can think of cells as a regular Compute deployment in that each cell has its database server and message queue broker.

    This document discusses OpenStack multi-region deployments and how Trilio can be deployed in multi-region OpenStack clouds.

    OpenStack offers lots of flexibility with multi-region deployments, and each organization architects the OpenStack that meets their business needs. OpenStack only suggests that the Keystone service is shared between regions, and the rest of the service endpoints differ for different regions. RabbitMQ and MySQL databases can be shared or deployed independently.

    Multi-Region OpenStack Deployment

    The following code section is a snippet of OpenStack services endpoints in two regions.

    Trilio backup and recovery service is architecturally similar to OpenStack services. It has an API endpoint, a scheduler service, and workload services. Cloud architects must deploy Trilio similarly to Nova or Cinder service with an instance of Trilio in each region, as shown below. Trilio deployment must support any OpenStack multi-region deployments compatible with OpenInfra recommendations.

    Multi-Region OpenStack with Trilio Services

    Trilio services endpoints in a multi-region OpenStack deployment are shown below.

    Reference Document: OpenStack Docs: Multiple Regions Deployment with Kolla

    Deployment of Trilio on the Kolla multi-region cloud is straightforward. We need to deploy Trilio in every region of the Kolla OpenStack cloud using the Kolla-ansible deploy command.

    Please take a look at the Trilio install document for Kolla.

    Getting started with Trilio on Kolla-Ansible OpenStack

    For example, the Kolla OpenStack cloud has three regions.

    1. RegionOne

    2. RegionTwo

    3. RegionThree

    To deploy Multi-Region Trilio on this cloud, we need to install Trilio in each region.

    Please follow the below steps:

    1. Identify the kolla ansible inventory file for each region.

    2. Identify the kolla-ansible deploy command that was used for OpenStack deployment for each region(Most probably, this is the same for all regions)

    3. The customer might have used a separate “/etc/kolla/globals.yml“ file for each region deployment. Please check those details.

    4. Deploy Trilio for the first region ( In our example, ‘RegionOne' ). Use it’s globals.yml. Follow the Trilio install guide for Kolla-ansible. No other configuration changes are needed for this deployment.

    5. Now, for the following region deployment (RegionTwo), you can identify an ansible inventory file and the '/etc/kolla/globals.yml' file for that region. Also, could you identify the kolla-ansible deploy command used for that region?

    6. Append the appropriate Trilio globals yml file to the/etc/kolla/globals.yml file; refer to section 3.1 from the Trilio install .

    7. Populate all Trilio config parameters in the ‘/etc/kolla/globals.yml’ file of RegionTwo. Or you can copy them from RegionOne’s '/etc/kolla/globals.yml' file.

    8. Append Trilio inventory to the RegionTwo inventory file. Please take a look at section 3.4 of the Trilio install document.

    9. Repeat (Pull Trilio container images) from the Trilio install document for RegionTwo.

    10. If you use separate Kolla Ansible servers for each region, you must perform all the steps mentioned in the Trilio install document for Kolla again for RegionTwo. Using the same Kolla Ansible server for all region deployments, you can skip this for RegionTwo and all subsequent regions.

    11. Review the Trilio install document, and if any other standard config file(like /etc/kolla/passwords.yml) is defined separately for each region, we need to check that Trilio uses that config file and perform any related steps from the Trilio install document.

    12. Run the Kolla-ansible deploy command, which will deploy Trilio on RegionTwo.

    1. OpenStack Docs: Multiple Regions Deployment with Kolla

    2. Evaluation of OpenStack Multi-Region Keystone Deployments

    Regions

    Availability Zones

    Cells

    networking service
    block storage service
    region=RegionOne
    Network Subnet: 172.21.6/23
    
    | neutron     | network      | RegionOne                                                                |
    |             |              |   public: https://172.21.6.20:9696                                       |
    |             |              | RegionOne                                                                |
    |             |              |   internal: https://172.21.6.20:9696                                     |
    |             |              | RegionOne                                                                |
    |             |              |   admin: https://172.21.6.20:9696                                        |
    |             |              |                                                                          |                                    |
    |             |              |                                                                          |
    | nova        | compute      | RegionOne                                                                |
    |             |              |   public: https://172.21.6.21:8774/v2.1                                  |
    |             |              | RegionOne                                                                |
    |             |              |   admin: https://172.21.6.21:8774/v2.1                                   |
    |             |              | RegionOne                                                                |
    |             |              |   internal: https://172.21.6.21:8774/v2.1                                |
    |             |              |                                                                          |
    +-------------+--------------+--------------------------------------------------------------------------+
    
    region=RegionTwo
    Network Subnet: 172.21.31/23
    
    | neutron     | network      | RegionTwo                                                                |
    |             |              |   public: https://172.31.6.20:9696                                       |
    |             |              | RegionTwo                                                                |
    |             |              |   internal: https://172.31.6.20:9696                                     |
    |             |              | RegionTwo                                                                |
    |             |              |   admin: https://172.31.6.20:9696                                        |
    |             |              |                                                                          |                                   |
    |             |              |                                                                          |
    | nova        | compute      | RegionTwo                                                                |
    |             |              |   public: https://172.31.6.21:8774/v2.1                                  |
    |             |              | RegionTwo                                                                |
    |             |              |   admin: https://172.31.6.21:8774/v2.1                                   |
    |             |              | RegionTwo                                                                |
    |             |              |   internal: https://172.31.6.21:8774/v2.1                                |
    |             |              |                                                                          |
    +-------------+--------------+--------------------------------------------------------------------------+
    region=RegionOne
    Network Subnet: 172.21.6/23
    
    | neutron     | network      | RegionOne                                                                |
    |             |              |   public: https://172.21.6.20:9696                                       |
    |             |              | RegionOne                                                                |
    |             |              |   internal: https://172.21.6.20:9696                                     |
    |             |              | RegionOne                                                                |
    |             |              |   admin: https://172.21.6.20:9696                                        |
    |             |              |                                                                          |
    | workloadmgr | workloads    | RegionOne                                                                |
    |             |              |   internal: https://172.21.6.23:8780/v1/38bd7aa9b55944ebb3578c251a1b785b |
    |             |              | RegionOne                                                                |
    |             |              |   public: https://172.21.6.23:8780/v1/38bd7aa9b55944ebb3578c251a1b785b   |
    |             |              | RegionOne                                                                |
    |             |              |   admin: https://172.21.6.23:8780/v1/38bd7aa9b55944ebb3578c251a1b785b    |
    |             |              |                                                                          |
    | dmapi       | datamover    | RegionOne                                                                |
    |             |              |   internal: https://172.21.6.22:8784/v2                                  |
    |             |              | RegionOne                                                                |
    |             |              |   public: https://172.21.6.22:8784/v2                                    |
    |             |              | RegionOne                                                                |
    |             |              |   admin: https://172.21.6.22:8784/v2                                     |
    |             |              |                                                                          |
    | nova        | compute      | RegionOne                                                                |
    |             |              |   public: https://172.21.6.21:8774/v2.1                                  |
    |             |              | RegionOne                                                                |
    |             |              |   admin: https://172.21.6.21:8774/v2.1                                   |
    |             |              | RegionOne                                                                |
    |             |              |   internal: https://172.21.6.21:8774/v2.1                                |
    |             |              |                                                                          |
    +-------------+--------------+--------------------------------------------------------------------------+
    
    region=RegionTwo
    Network Subnet: 172.21.31/23
    
    | neutron     | network      | RegionTwo                                                                |
    |             |              |   public: https://172.31.6.20:9696                                       |
    |             |              | RegionTwo                                                                |
    |             |              |   internal: https://172.31.6.20:9696                                     |
    |             |              | RegionTwo                                                                |
    |             |              |   admin: https://172.31.6.20:9696                                        |
    |             |              |                                                                          |
    | workloadmgr | workloads    | RegionTwo                                                                |
    |             |              |   internal: https://172.31.6.23:8780/v1/38bd7aa9b55944ebb3578c251a1b785b |
    |             |              | RegionTwo                                                                |
    |             |              |   public: https://172.31.6.23:8780/v1/38bd7aa9b55944ebb3578c251a1b785b   |
    |             |              | RegionTwo                                                               |
    |             |              |   admin: https://172.31.6.23:8780/v1/38bd7aa9b55944ebb3578c251a1b785b    |
    |             |              |                                                                          |
    | dmapi       | datamover    | RegionTwo                                                                |
    |             |              |   internal: https://172.31.6.22:8784/v2                                  |
    |             |              | RegionTwo                                                                |
    |             |              |   public: https://172.31.6.22:8784/v2                                    |
    |             |              | RegionTwo                                                                |
    |             |              |   admin: https://172.31.6.22:8784/v2                                     |
    |             |              |                                                                          |
    | nova        | compute      | RegionTwo                                                                |
    |             |              |   public: https://172.31.6.21:8774/v2.1                                  |
    |             |              | RegionTwo                                                                |
    |             |              |   admin: https://172.31.6.21:8774/v2.1                                   |
    |             |              | RegionTwo                                                                |
    |             |              |   internal: https://172.31.6.21:8774/v2.1                                |
    |             |              |                                                                          |
    +-------------+--------------+--------------------------------------------------------------------------+

    Multi-Region OpenStack Deployments

    Trilio in a Multi-Region OpenStack

    A Reference Deployment on Kolla-Ansible OpenStack

    References

    IP or FQDN of Trilio service

    tenant_id

    string

    ID of the Tenant/Project to run the search in

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Mon, 09 Nov 2020 13:23:25 GMT
    Content-Type: application/json
    Content-Length: 244
    Connection: keep-alive
    X-Compute-Request-Id: req-bdfd3fb8-5cbf-4108-885f-63160426b2fa
    
    {
       "file_search":{
          "created_at":"2020-11-09T13:23:25.698534",
    

    POST https://$(tvm_address):8780/v1/$(tenant_id)/search/<search_id>

    Starts a filesearch with the given parameters

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Mon, 09 Nov 2020 13:24:28 GMT
    Content-Type: application/json
    Content-Length: 819
    Connection: keep-alive
    X-Compute-Request-Id: req-d57bea9a-9968-4357-8743-e0b906466063
    
    {
       "file_search":{
          "created_at":"2020-11-09T13:23:25.000000",
          "updated_at":"2020-11-09T13:23:48.000000",
          "id":14,
          "deleted_at":null,
          "status":"completed",
          "error_msg":null,
          "filepath":"/etc/h*",
          "json_resp":"[
                          {
                             "ed4f29e8-7544-4e1c-af8a-a76031211926":[
                                {
                                   "/dev/vda1":[
                                      "/etc/hostname",
                                      "/etc/hosts"
                                   ],
                                   "/etc/hostname":{
                                      "dev":"2049",
                                      "ino":"32",
                                      "mode":"33204",
                                      "nlink":"1",
                                      "uid":"0",
                                      "gid":"0",
                                      "rdev":"0",
                                      "size":"1",
                                      "blksize":"1024",
                                      "blocks":"2",
                                      "atime":"1603455255",
                                      "mtime":"1603455255",
                                      "ctime":"1603455255"
                                   },
                                   "/etc/hosts":{
                                      "dev":"2049",
                                      "ino":"127",
                                      "mode":"33204",
                                      "nlink":"1",
                                      "uid":"0",
                                      "gid":"0",
                                      "rdev":"0",
                                      "size":"37",
                                      "blksize":"1024",
                                      "blocks":"2",
                                      "atime":"1603455257",
                                      "mtime":"1431011050",
                                      "ctime":"1431017172"
                                   }
                                }
                             ]
                          }
                      ]",
          "vm_id":"08dab61c-6efd-44d3-a9ed-8e789d338c1b"
       }
    }

    tvm_address

    Start File Search

    Path Parameters

    string

    {
       "file_search":{
          "start":<Integer>,
          "end":<Integer>,
          "filepath":"<Reg-Ex String>",
          "date_from":<Date Format: YYYY-MM-DDTHH:MM:SS>,
          "date_to":<Date Format: YYYY-MM-DDTHH:MM:SS>,
          "snapshot_ids":[
             "<Snapshot-ID>"
          ],
          "vm_id":"<VM-ID>"
       }
    }

    Headers

    Body format

    Get File Search Results

    Path Parameters

    Headers

    Getting started with Trilio on Kolla-Ansible OpenStack

    1] Plan for Deployment

    Refer to the link Resources to get release specific values of the placeholders, triliovault_tag, triliovault_dms_tag, trilio_branch and kolla_base_distro in this document as per the Openstack environment:

    Trilio requires OpenStack CLI to be installed and available for use on the Kolla Ansible Control node.

    2] Prepare Trilio deployment scripts

    Starting with T4O 6.2.1, Kolla-Ansible deployments on Epoxy (2025.1) and Flamingo (2025.2) use a single automation script, prepare_install_upgrade.py, to hook Trilio into Kolla-ansible. This replaces the previous manual steps of appending globals.yml, passwords.yml, site.yml, and the inventory file by hand.

    2.1] Activate virtual environment

    Export and activate the kolla virtual environment. The venv path depends on the base distro of your Kolla deployment:

    export venv_path="/opt/kolla-venv"
    source $venv_path/bin/activate

    2.2] Clone Trilio Deployment Scripts

    Clone triliovault-cfg-scripts GitHub repository on Kolla ansible server at '/root' or any other directory of your preference.

    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/kolla-ansible/ansible

    3] Prepare Trilio deployment for your OpenStack release

    Run prepare_install_upgrade.py to append the Trilio global variables, passwords, site.yml content, and inventory entries for your OpenStack release into the corresponding Kolla-ansible files.

    • --os-release➡️ Use 2025.1 for Epoxy or 2025.2 for Flamingo.

    • --mode➡️ Use install for a fresh Trilio installation.

    Edit /etc/kolla/globals.yml file to fill Trilio build details. You will find the Trilio related parameters at the end of globals.yml file. Details like Trilio version, cloud admin details, etc need to be filled out.

    Following is the list of parameters that the usr needs to edit.

    Parameter
    Defaults/choices
    comments

    Activate the login into dockerhub for Trilio tagged containers on the control node(s), then pull the Trilio container images based on the existing inventory file.

    Please get the Dockerhub login credentials from Trilio Sales/Support team

    Run the deploy command using the existing inventory file.

    Verify on the nodes that are supposed to run the Trilio containers, that those are available and healthy.

    The example is shown for 6.2.0 release from Kolla Rocky Epoxy setup.

    Replace the inventory file path and run the below command to create cloud admin trust.

    Login to any controller node and check the logs of wlm_cloud_trust container. This should show the cloud admin trust created.

    To add a new backup target, refer to the .

    To see all TriloVault containers running on a specific node use the docker ps command.

    To check the startup logs use the docker logs <container name> command.

    Verify that the Trilio Appliance is configured. The Horizon tabs are only shown, when a configured Trilio appliance is available.

    Verify that the Trilio horizon container is installed and in a running state.

    • Trilio workloadmgr api service logs on workloadmgr api node

    • Trilio workloadmgr cron service logs on workloadmgr cron node

    • Trilio workloadmgr scheduler service logs on workloadmgr scheduler node

    • Trilio workloadmgr workloads service logs on workloadmgr workloads node

    • Trilio datamover api service logs on datamover api node

    • Trilio datamover service logs on datamover node

    We are using cinder's ceph user for interacting with Ceph cinder storage. This user name is defined using parameter - 'ceph_cinder_user' in the file '/etc/kolla/globals.yaml'.

    Snapshot Mount

    Definition

    Trilio allows you to view or download a file from the snapshot. Any changes to the files or directories when snapshot is mounted are temporary and are discarded when the snapshot is unmounted. Mounting is a faster way to restore a single or multiple files. To mount a snapshot follow these steps.

    Supported File Recovery Manager Image

    Cloud Image Name

    Version

    Supported

    Ubuntu

    Bionic(18.04)

    • Create an OpenStack image using a Linux based cloud-image like Ubuntu, CentOS or RHEL with the following metadata parameters.

    • Spin up an instance from that image It is recommended to have at least 8GB RAM for the mount operation. Bigger Snapshots can require more RAM.

    ⚠️ Note: After creating the FRM instance, it must be tagged with tvault_recovery_manager. This tag is required for Horizon to identify the FRM using the Nova API.

    Use the following command to add the tag:

    • install and activate qemu-guest-agent

    • Edit /etc/sysconfig/qemu-ga and remove the following from BLACKLIST_RPC section

    • Disable SELINUX in /etc/sysconfig/selinux

    • Install python3 and lvm2

    • Reboot the Instance

    • install and activate qemu-guest-agent

    • Verify the loaded path of qemu-guest-agent

    Follow this path when systemctl returns the following loaded path

    Edit /etc/init.d/qemu-guest-agent and add Freeze-Hook file path in daemon args

    Follow this path when systemctl returns the following loaded path

    Edit qemu-guest-agent systemd file

    Add the following lines

    • Restart qemu-guest-agent service

    • Install Python3

    • Reboot the VM

    Mounting a Snapshot to a File Recovery Manager provides read access to all data that is located on the in the mounted Snapshot.

    There are 2 possibilities to mount a Snapshot in Horizon.

    To mount a Snapshot through the Snapshot list follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to mount

    To mount a Snapshot through the File Search results follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to mount

    • <snapshot_id> ➡️ ID of the Snapshot to be mounted

    • <mount_vm_id> ➡️ ID of the File Recovery Manager instance to mount the Snapshot to.

    The File Recovery Manager is a normal Linux based OpenStack instance.

    It can be accessed via SSH or SSH based tools like FileZila or WinSCP.

    The mounted Snapshot can be found at the following path:

    /mnt/tvault-mounts/mounts/

    Each VM in the Snapshot has its own directory using the VM_ID as the identifier.

    Sometimes a Snapshot is mounted for a longer time and it needs to be identified, which Snapshots are mounted.

    There are 2 possibilities to identify mounted Snapshots inside Horizon.

    1. Login to Horizon

    2. Navigate to Compute

    3. Navigate to Instances

    4. Identify the File Recovery Manager Instance

    The mounted_snapshot_url contains the Snapshot ID of the Snapshot that has been mounted last.

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to mount

    • --workloadid <workloadid> ➡️ Restrict the list to snapshots in the provided workload

    Once a mounted Snapshot is no longer needed it is possible and recommended to unmount the snapshot.

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to mount

    • <snapshot_id> ➡️ ID of the snapshot to unmount.

    Snapshots

    Definition

    A Snapshot is a single Trilio backup of a workload including all data and metadata. It contains the information of all VM's that are protected by the workload.

    List of Snapshots

    Using Horizon

    1. Login to Horizon

    2. Navigate to the Backups

    3. Navigate to Workloads

    4. Identify the workload to show the details on

    5. Click the workload name to enter the Workload overview

    6. Navigate to the Snapshots tab

    The List of Snapshots for the chosen Workload contains the following additional information:

    • Creation Time

    • Name of the Snapshot

    • Description of the Snapshot

    • Total amount of Restores from this Snapshot

    • --workload_id <workload_id> ➡️ Filter results by workload_id

    • --tvault_node <host> ➡️ List all the snapshot operations scheduled on a tvault node(Default=None)

    • --date_from <date_from>➡️ From date in format 'YYYY-MM-DDTHH:MM:SS' eg 2016-10-10T00:00:00, If don't specify time then it takes 00:00 by default

    Snapshots are automatically created by the Trilio scheduler. If necessary or in case of deactivated scheduler is it possible to create a Snapshot on demand.

    There are 2 possibilities to create a snapshot on demand.

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that shall create a Snapshot

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that shall create a Snapshot

    • <workload_id>➡️ID of the workload to snapshot.

    • --full➡️ Specify if a full snapshot is required.

    • --display-name <display-name>➡️Optional snapshot name. (Default=None)

    Each Snapshot contains a lot of information about the backup. These information can be seen in the Snapshot overview.

    To reach the Snapshot Overview follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to show

    The Snapshot Details Tab shows the most important information about the Snapshot.

    • Snapshot Name / Description

    • Snapshot Type

    • Time Taken

    • Size

    The Snapshot Restores Tab shows the list of Restores that have been started from the chosen Snapshot. It is possible to start Restores from here.

    The Snapshot Miscellaneous Tab provides the remaining metadata information about the Snapshot.

    • Creation Time

    • Last Update time

    • Snapshot ID

    • Workload ID of the Workload containing the Snapshot

    • <snapshot_id>➡️ID of the snapshot to be shown

    • --output <output>➡️Option to get additional snapshot details, Specify --output metadata for snapshot metadata, Specify --output networks for snapshot vms networks, Specify --output disks for snapshot vms disks

    Once a Snapshot is no longer needed, it can be safely deleted from a Workload.

    There are 2 possibilities to delete a Snapshot.

    To delete a single Snapshot through the submenu follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to delete

    To delete one or more Snapshots through the Snapshot overview do the following:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to show

    • <snapshot_id>➡️ID of the snapshot to be deleted

    Ongoing Snapshots can be canceled.

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to cancel

    • <snapshot_id>➡️ID of the snapshot to be canceled

    Workload Policies

    Trilio’s tenant driven backup service gives tenants control over backup policies. However, sometimes it may be too much control to tenants and the cloud admins may want to limit what policies are allowed by tenants. For example, a tenant may become overzealous and only uses full backups every 1 hr interval. If every tenant were to pursue this backup policy, it puts a severe strain on cloud infrastructure. Instead, if cloud admin can define predefined backup policies and each tenant is only limited to those policies then cloud administrators can exert better control over backup service.

    Workload policy is similar to nova flavor where a tenant cannot create arbitrary instances. Instead, each tenant is only allowed to use the nova flavors published by the admin.

    List and showing available Workload policies

    Using Horizon

    To see all available Workload policies in Horizon follow these steps:

    1. Login to Horizon using admin user.

    2. Click on Admin Tab.

    3. Navigate to Backups-Admin

    4. Navigate to Trilio

    5. Navigate to Policy

    The following information are shown in the policy tab for each available policy:

    • Creation time

    • Projects assigned

    • Name

    • Scheduling & Retention policy

    • <policy_id>➡️ Id of the policy to show

    To create a policy in Horizon follow these steps:

    1. Login to Horizon using admin user.

    2. Click on Admin Tab.

    3. Navigate to Backups-Admin

    4. Navigate to Trilio

    • --policy-fields <key=key-name> ➡️ Specify following key value pairs for policy fields. 'start_time' : '10:30 PM' --policy-fields start_time='10:30 PM'

    • --hourly ➡️ Specify following key value pairs for hourly jobschedule interval= where n is no of hours within list (1,2,3,4,6,8,12,24),retention=,snapshot_type=<full|incremental> For example --hourly interval='4',retention='1',snapshot_type='incremental' If you don't specify this option, following default value 'interval' : '1' 'retention' : '30' 'snapshot_type' : 'incremental'

    • --daily

    To edit a policy in Horizon follow these steps:

    1. Login to Horizon using admin user.

    2. Click on Admin Tab.

    3. Navigate to Backups-Admin

    4. Navigate to Trilio

    • --display-name <display-name>➡️Name of the policy

    • --display-description <display_description> ➡️ Optional policy description. (Default=No description)

    • --email <email> ➡️ Optional email address to associate with the policy. Snapshot and restore notification emails for workloads assigned to this policy are also sent to this address, if E-Mail notifications are enabled. If this option is omitted, the existing email address of the policy is kept unchanged.

    Note:- Updating a policy with partial data is not supported. Ensure that all fields from the existing policy are included in the update request to avoid overwriting or losing data.

    To assign or remove a policy in Horizon follow these steps:

    1. Login to Horizon using admin user.

    2. Click on Admin Tab.

    3. Navigate to Backups-Admin

    4. Navigate to Trilio

    • --add_project <project_id> ➡️ ID of the project to assign policy to. Use multiple times to assign multiple projects.

    • --remove_project <project_id> ➡️ ID of the project to remove policy from. Use multiple times to remove multiple projects.

    • <policy_id>➡️policy to be assigned or removed

    To delete a policy in Horizon follow these steps:

    1. Login to Horizon using admin user.

    2. Click on Admin Tab.

    3. Navigate to Backups-Admin

    4. Navigate to Trilio

    • <policy_id> ➡️ID of the policy to be deleted

    Add a backup target

    Follow the steps below to add a new backup target.

    6.2 changes the dynamic backup-target flow. Trilio for OpenStack 6.2 deploys a single server per host (one on the controller, one on each compute node) and removes the per-backup-target triliovault-object-store-<bt-name> pods used in 6.1. As a result, adding a new backup target in 6.2 no longer requires a per-BT control-plane CR or a per-BT data-plane container deployment — only the Trilio DB record needs to be created (with a Barbican secret_ref for S3 targets), and DMS handles mount/unmount on demand.

    1] Create the Trilio DB record for the new backup target

    Identify the Trilio WLM API container or unit and connect to it. All commands below run in that shell.

    RHOSO18

    oc get pods -n trilio-openstack | grep wlm-api
    oc exec -n trilio-openstack -it <trilio-wlm-api-pod-name> bash
    source <admin rc file>

    Kolla

    docker exec -it triliovault_wlm_api bash
    source <admin rc file>

    Canonical

    juju ssh trilio-wlm/leader
    source <openrc file>

    NFS options : nolock,soft,timeo=600,intr,lookupcache=none,nfsvers=3,retrans=10

    Helm and MOSK

    # Get the name of the WLM API Pod
    WLM_POD=$(kubectl get pods -n trilio-openstack -l component=wlm-api -o jsonpath="{.items[0].metadata.name}")
    # Execute into the pod
    kubectl exec -it -n trilio-openstack $WLM_POD -- bash
    source <admin rc file>

    1.1] NFS backup target

    For NFS, no Barbican secret is required. Create the backup target record directly:

    workloadmgr backup-target-create --type nfs --filesystem-export <filesystem_export> --nfs-mount-opts <nfs_mount_opts> --btt-name <btt-name>

    Sample command:

    workloadmgr backup-target-create --type nfs --filesystem-export 192.168.0.53:/home/rhosp2 --nfs-mount-opts nolock,soft,timeo=600,intr,lookupcache=none,nfsvers=3,retrans=10 --btt-name bt3-nfs

    1.2] S3 backup target

    In 6.2, S3 credentials are stored in an OpenStack Barbican secret and the backup target record holds a secret_ref URL pointing at that secret. Both trilio-dms-cli and the openstack CLI are available inside the WLM API pod, so all of the following commands run there.

    Step 1.2.1 — Build the secret payload using trilio-dms-cli secret-payload create.

    The exact flags depend on the S3 endpoint. Two key rules apply across all examples below:

    • --endpoint-url is optional for AWS S3 (leave it unset to use the default AWS endpoint) and required for any non-AWS S3-compatible endpoint (Ceph RGW, MinIO, Wasabi, etc.).

    • --filesystem-export takes a different form per target type:

      • AWS S3 — <bucket_name>

    The five common S3 cases:

    Validate the payload before storing it in Barbican:

    Step 1.2.2 — Store the payload in Barbican.

    Capture the value of Secret href from the output — that URL is the secret_ref you pass to workloadmgr in the next step.

    Step 1.2.3 — Create the backup target record.

    For a non-object-locked S3 backup target:

    For an object-lock-enabled S3 backup target:

    Sample (object-locked):

    The backup target should now appear in the output of the following command:

    No additional control-plane or data-plane deployment is required. The DMS server pods deployed during the initial 6.2 install (one triliovault-dms-* on each controller and one triliovault-dms on each compute node) handle the new target automatically. You can spot-check that they are running:

    The first time a snapshot or restore runs against the new backup target, DMS will mount it on the relevant node on demand and unmount it when the last job finishes.


    Upgrading on Kolla-Ansible

    Before upgrading, ensure the following:

    • No Snapshot or Restore is running

    • The global job scheduler is disabled

    Rename your existing triliovault-cfg-scripts directory to keep it available for reference/rollback, then clone the 6.2.1 release into a new directory:

    The venv path depends on the base distro of your Kolla deployment:

    Run prepare_install_upgrade.py

    Snapshot Mount

    POST https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>/mount

    Mounts a Snapshot to the provided File Recovery Manager

    Name
    Type
    Description

    Grafana Monitoring Installation and Configuration on RHOSO18

    The following steps must be performed on the bastion node of an already installed RHOSO environment.

    Run the following command to clone the triliovault-cfg-scripts GitHub repository:


    • Check if the following ConfigMap exists:

    • If it exists, check whether the enableUserWorkload: true parameter is present with its value set to

    "updated_at":null,
    "id":14,
    "deleted_at":null,
    "status":"executing",
    "error_msg":null,
    "filepath":"/etc/h*",
    "json_resp":null,
    "vm_id":"08dab61c-6efd-44d3-a9ed-8e789d338c1b"
    }
    }

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to run the search in

    search_id

    string

    ID of the File Search to get

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Channel name as provided in release specific Resources page

    revision

    Latest values as provided by Trilio. Refer release specific Resources page

    Resources
    Resources
    document
    step 7

    Tail the runner pod logs:

    Delete the per-BT data-plane service

    Run the cleanup playbook

    3.2] Unmount Backup Target from Control Plane

    --venv-path➡️ The kolla virtual environment path exported in the previous step.
  • --inventory-file➡️ Path to your cloud’s kolla-ansible inventory file.

  • --globals-file➡️ Path to your cloud’s globals.yml file.

  • Use the password of cloud admin user

    cloud_admin_projectname

    <cloud_admin_projectname >

    Use the project name of cloud admin user

    cloud_admin_projectid

    <cloud_admin_projectid >

    Use the project ID of cloud admin user

    cloud_admin_domainname

    <cloud_admin_domainname >

    Use the domain name of cloud admin user

    cloud_admin_domainid

    <cloud_admin_domainid >

    Use the domain ID of cloud admin user

    trustee_role

    <trustee_role >

    Comma separated list of trustee roles required.

    For Zed, trustee_role should be creator.

    For Antelope, trustee_role should be creator,member

    os_endpoint_type

    <internal/public >

    Choose required endpoint type which Trilio APIs will use for communication

    triliovault_tag

    <triliovault_tag >

    Use the triliovault tag as per your Kolla openstack version. Exact tag is mentioned in the 1st step

    triliovault_dms_tag

    <triliovault_dms_tag >

    Use the triliovault dms tag as per your Kolla openstack version. Exact tag is mentioned in the 1st step

    horizon_image_full

    Uncomment

    By default, Trilio Horizon container would not get deployed.

    Uncomment this parameter to deploy Trilio Horizon container instead of OpenStack Horizon container.

    triliovault_docker_username

    <dockerhub-login-username>

    Default docker user of Trilio (read permission only). Get the Dockerhub login credentials from Trilio Sales/Support team

    triliovault_docker_password

    <dockerhub-login-password>

    Password for default docker user of Trilio Get the Dockerhub login credentials from Trilio Sales/Support team

    triliovault_docker_registry

    Default value: docker.io

    Edit this value if a different container registry for Trilio containers is to be used. Containers need to be pulled from docker.io and pushed to chosen registry first.

    In the case of a different registry than docker hub, Trilio containers need to be pulled from docker.io and pushed to preferred registries.

    cloud_admin_username

    <cloud_admin_username >

    Use the username of cloud admin user. The user must to have assigned a 'creator' role

    cloud_admin_password

    4] Edit globals.yml to set Trilio parameters

    5] Pull container images

    6] Deploy Trilio

    Post deployment for multipath enabled environment, log into respective datamover container and add uxsock_timeout with value as 60000 (i.e. 60 sec) in /etc/multipath.conf. Restart datamover container

    7] Verify Trilio deployment

    8] Create cloud admin trust

    8.1] Verify cloud admin trust created

    9] Install a new Backup Target

    10] Troubleshooting Tips

    10.1] Check Trilio containers and their startup logs

    10.2] Trilio Horizon tabs are not visible in OpenStack

    10.3] Trilio Service logs

    11] Advanced configurations - [Optional]

    Details about multiple ceph configuration can be found here.

    Add backup target

    <cloud_admin_password >

    Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshot in the Snapshot list

  • Click the small arrow in the line of the Snapshot next to "One Click Restore" to open the submenu

  • Click "Mount Snapshot"

  • Choose the File Recovery Manager instance to mount to

  • Confirm by clicking "Mount"

  • Click the workload name to enter the Workload overview
  • Navigate to the File Search tab

  • Do a File Search

  • Identify the Snapshot to be mounted

  • Click "Mount Snapshot" for the chosen Snapshot

  • Choose the File Recovery Manager instance to mount to

  • Confirm by clicking "Mount"

  • Click on the Name of the File Recovery Manager Instance to bring up its details
  • On the Overview tab look for Metadata

  • Identify the value for mounted_snapshot_url

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Search for the Snapshot that has the option "Unmount Snapshot"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Search for the Snapshot that has the option "Unmount Snapshot"

  • Click "Unmount Snapshot"

  • ✔️

    Ubuntu

    Focal(20.04)

    ✔️

    Centos

    Centos8

    ✔️

    Centos

    Centos8 stream

    ✔️

    RHEL

    RHEL7

    ✔️

    RHEL

    RHEL8

    ✔️

    RHEL

    RHEL9

    ✔️

    Create a File Recovery Manager Instance

    It is recommended to do these steps once to the chosen cloud-Image and then upload the modified cloud image to Glance.

    Steps to apply on CentOS and RHEL cloud-images

    Steps to apply on Ubuntu cloud-images

    Loaded path init.d (Ubuntu 18.04)

    Loaded path systemd (Ubuntu 20.04)

    Finalize the FRM on Ubuntu

    Mounting a Snapshot

    It is possible to run the mounting process against any OpenStack instance. During this process will the instance be rebooted.

    Always mount Snapshots to File Recovery Manager instances only.

    To be able to successfully mount Windows (NTFS) Snapshots the ntfs filesystem support is required on the File Recovery Manager instance.

    Unmount any mounted Snapshot once there is no further need to keep it mounted. Mounted Snapshots will not be purged by the Retention policy.

    Using Horizon

    Through the Snapshot list

    Should all instances of the project be listed and there is a File Recovery Manager instance existing verify together with the administrator that the File Recovery Manager image has the following property set:

    tvault_recovery_manager=yes

    Through the File Search results

    Should all instances of the project be listed and there is a File Recovery Manager instance existing verify together with the administrator that the File Recovery Manager image has the following property set:

    tvault_recovery_manager=yes

    Using CLI

    Accessing the File Recovery Manager

    SSH login is often disabled by default in cloud-images. Enable SSH login if necessary.

    Identifying mounted Snapshots

    Using Horizon

    From the File Recovery Manager instance Metadata

    This value only gets updated, when a new Snapshot is mounted.

    From the Snapshot list

    Using CLI

    Unmounting a Snapshot

    Unmounting a Snapshot frees the File Recovery Manager instance to mount the next Snapshot and allows Trilio retention policy to purge the former mounted Snapshot.

    Deleting the File Recovery Manager instance will not update the Trilio appliance. The Snapshot will be considered mounted until an unmount command has been received.

    Using Horizon

    Using the CLI

    Total amount of succeeded Restores

  • Total amount of failed Restores

  • Snapshot Type

  • Snapshot Size

  • Snapshot Status

  • --date_to <date_to>➡️To date in format 'YYYY-MM-DDTHH:MM:SS'(defult is current day), Specify HH:MM:SS to get snapshots within same day inclusive/exclusive results for date_from and date_to

  • --all {True,False} ➡️ List all snapshots of all the projects(valid for admin user only)

  • Click "Create Snapshot"
  • Provide a name and description for the Snapshot

  • Decide between Full and Incremental Snapshot

  • Click "Create"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Click "Create Snapshot"

  • Provide a name and description for the Snapshot

  • Decide between Full and Incremental Snapshot

  • Click "Create"

  • --display-description <display-description>➡️Optional snapshot description. (Default=None)

    Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshot in the Snapshot list

  • Click the Snapshot Name

  • Which VMs are part of the Snapshot
  • for each VM in the Snapshot

    • Instance Info - Name & Status

    • Security Group(s) - Name & Type

    • Flavor - vCPUs, Disk & RAM

    • Server Group - Name & Policies (shown only for VMs that were a member of a Nova server group)

    • Networks - IP, Networkname & Mac Address

    • Attached Volumes - Name, Type, size (GB), Mount Point & Restore Size

    • Misc - Original ID of the VM

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshot in the Snapshot list

  • Click the small arrow in the line of the Snapshot next to "One Click Restore" to open the submenu

  • Click "Delete Snapshot"

  • Confirm by clicking "Delete"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshots in the Snapshot list

  • Check the checkbox for each Snapshot that shall be deleted

  • Click "Delete Snapshots"

  • Confirm by clicking "Delete"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshot in the Snapshot list

  • Click "Cancel" on the same line as the identified Snapshot

  • Confirm by clicking "Cancel"

  • Using CLI

    Creating a Snapshot

    Using Horizon

    Possibility 1: From the Workloads overview

    Possibility 2: From the Workload Snapshot list

    Using CLI

    Snapshot overview

    Using Horizon

    Details Tab

    Restores Tab

    Please refer to the Restores User Guide to learn more about Restores.

    Misc. Tab

    Using CLI

    Delete Snapshots

    The retention policy will automatically delete the oldest Snapshots according to the configure policy.

    You have to delete all Snapshots to be able to delete a Workload.

    Deleting a Trilio Snapshot will not delete any OpenStack Cinder Snapshots. Those need to be deleted separately if desired.

    Using Horizon

    Possibility 1: Single Snapshot deletion through the submenu

    Possibility 2: Multiple Snapshot deletion through checkbox in Snapshot overview

    Using CLI

    Snapshot Cancel

    Canceled Snapshots will be treated like errored Snapshots

    Using Horizon

    Using CLI

    Description
  • Email

  • Navigate to Policy
  • Click new policy

  • Provide a policy name on the Details tab

  • Provide a description on the Details tab

  • Provide an email address on the Details tab (optional)

  • Provide the retention and scheduler details in the Policy tab

  • Click create

  • ➡️
    Specify following key value pairs for daily jobschedule backup_time='1:30 12:30 00:30',retention=,snapshot_type=<full|incremental> For example --daily backup_time='01:00 02:00 11:00',retention='1',snapshot_type='incremental'
  • --weekly ➡️ Specify following key value pairs for weekly jobschedule backup_day=[mon,tue,wed,thu,fri,sat,sun],retention=,snapshot_type= For example --weekly backup_day='sun mon tue',retention='1',snapshot_type='full'

  • --monthly ➡️ Specify following key value pairs for monthly jobschedule month_backup_day=<1-31|last>, 'last': last day of the month,retention=,snapshot_type= For example --monthly month_backup_day='1 2 3',retention=1,snapshot_type='full'

  • --yearly ➡️ Specify following key value pairs for yearly jobschedule backup_month=[jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec],retention=,snapshot_type= For example --yearly backup_month='jan feb',retention='1',snapshot_type='full'

  • --manual ➡️ Specify following key value pairs for manual jobschedule retention=,retention_days_to_keep= For example --manual retention=30,retention_days_to_keep=30

  • --display-description <display_description> ➡️ Optional policy description. (Default=No description)

  • --email <email> ➡️ Optional email address to associate with the policy. Snapshot and restore notification emails for workloads assigned to this policy are also sent to this address, if E-Mail notifications are enabled. (Default=None)

  • --metadata <key=keyname> ➡️ Specify a key value pairs to include in the workload_type metadata Specify option multiple times to include multiple keys. key=value

  • <display_name> ➡️ the name the policy will get

  • Navigate to Policy
  • identify the policy to edit

  • click on "Edit policy" at the end of the line of the chosen policy

  • edit the policy as desired - all values can be changed

  • Click "Update"

  • --policy-fields <key=key-name> ➡️ Specify following key value pairs for policy fields 'start_time' : '10:30 PM' --policy-fields start_time='10:30 PM'

  • --hourly ➡️ Specify following key value pairs for hourly jobschedule interval= where n is no of hours within list (1,2,3,4,6,8,12,24),retention=,snapshot_type=<full|incremental> For example --hourly interval='4',retention='1',snapshot_type='incremental' If you don't specify this option, following default value 'interval' : '1' 'retention' : '30' 'snapshot_type' : 'incremental'

  • --daily ➡️ Specify following key value pairs for daily jobschedule backup_time='1:30 12:30 00:30',retention=,snapshot_type=<full|incremental> For example --daily backup_time='01:00 02:00 11:00',retention='1',snapshot_type='incremental'

  • --weekly ➡️ Specify following key value pairs for weekly jobschedule backup_day=[mon,tue,wed,thu,fri,sat,sun],retention=,snapshot_type= For example --weekly backup_day='sun mon tue',retention='1',snapshot_type='full'

  • --monthly ➡️ Specify following key value pairs for monthly jobschedule month_backup_day=<1-31|last>, 'last': last day of the month,retention=,snapshot_type= For example --monthly month_backup_day='1 2 3',retention=1,snapshot_type='full'

  • --yearly ➡️ Specify following key value pairs for yearly jobschedule backup_month=[jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec],retention=,snapshot_type= For example --yearly backup_month='jan feb',retention='1',snapshot_type='full'

  • --manual ➡️ Specify following key value pairs for manual jobschedule retention=,retention_days_to_keep= For example --manual retention=30,retention_days_to_keep=30

  • --metadata <key=keyname> ➡️ Specify a key value pairs to include in the workload_type metadata Specify option multiple times to include multiple keys. key=value

  • <policy_id> ➡️ ID of the policy

  • Navigate to Policy
  • identify the policy to assign/remove

  • click on the small arrow at the end of the line of the chosen policy to open the submenu

  • click "Add/Remove Projects"

  • Choose projects to add or remove by using the plus/minus buttons

  • Click "Apply"

  • Navigate to Policy
  • identify the policy to assign/remove

  • click on the small arrow at the end of the line of the chosen policy to open the submenu

  • click "Delete Policy"

  • Confirm by clicking "Delete"

  • Using CLI

    Create a policy

    Using Horizon

    The Email field is optional. When set, snapshot and restore notification emails for workloads assigned to this policy are also sent to this address. This requires E-Mail notifications to be enabled in the Backups-Admin settings.

    Using CLI

    Edit a policy

    Using Horizon

    Using CLI

    Assign/Remove a policy

    Using Horizon

    Using CLI

    Delete a policy

    Using Horizon

    Using CLI

    Kolla Ubuntu Epoxy (2025.1)

    python3-tvault-contego

    6.2.0.3

    python3-tvault-horizon-plugin

    6.2.0.3

    python3-workloadmgrclient

    6.2.0.3

    workloadmgr

    6.2.0.3

    python3-dmapi-el9

    RHEL9

    6.2.0.3-6.2

    python3-s3fuse-plugin-el9

    RHEL9

    6.2.0.3-6.2

    python3-trilio-dms-el9

    RHEL9

    6.2.0.3-6.2

    python3-trilio-fusepy-el9

    RHEL9

    3.0.1-1

    python3-tvault-contego-el9

    RHEL9

    6.2.0.3-6.2

    python3-tvault-horizon-plugin-el9

    RHEL9

    6.2.0.3-6.2

    python3-workloadmgrclient-el9

    RHEL9

    6.2.0.3-6.2

    python3-workloadmgr-el9

    RHEL9

    6.2.0.3-6.2

    oc -n openstack get pods | grep trilio-delete-backup-target
    oc logs -f <ANSIBLE_RUNNER_POD_NAME> -n openstack
    oc -n openstack delete osdpd <DEPLOYMENT_NAME>
    oc -n openstack get osdps | grep trilio
    oc -n openstack delete osdps <OpenStackDataPlaneService_NAME>
    cd dataplane-scripts/
    chmod +x create-templates-delete-backup-target.sh
    ./create-templates-delete-backup-target.sh <BACKUP_TARGET_NAME> <BACKUP_TARGET_TYPE>
    cd <BACKUP_TARGET_NAME>/
    oc -n openstack apply -f trilio-delete-backup-target-service.yaml
    oc -n openstack apply -f trilio-delete-backup-target-deployment.yaml
    oc -n trilio-openstack get tvobackuptarget
    oc delete tvobackuptarget <TVO_BACKUP_TARGET_NAME>
    oc -n trilio-openstack get tvobackuptarget | grep <TVO_BACKUP_TARGET_NAME>
    oc -n trilio-openstack get pods | grep object-store
    python3 scripts/prepare_install_upgrade.py \
      --os-release <2025.1 or 2025.2> \
      --mode install \
      --venv-path $venv_path \
      --inventory-file <kolla inventory file, e.g. /root/multinode> \
      --globals-file /etc/kolla/globals.yml
    ansible -i <kolla inventory file> control -m shell -a "docker login -u <docker-login-username> -p <docker-login-password> docker.io" --become
    
    kolla-ansible pull -i <kolla inventory file> --tags triliovault
    kolla-ansible deploy -i <kolla inventory file> --tags triliovault
    [root@controller0 ~]# docker ps | grep datamover-api
    00f3020fceda   trilio/kolla-rocky-trilio-datamover-api:6.2.0-2025.1       "dumb-init --single-…"   52 minutes ago   Up 52 minutes                       triliovault_datamover_api
    
    [root@controller0 ~]# docker ps -a | grep wlm
    dbd99e869b83   trilio/kolla-rocky-trilio-wlm:6.2.0-2025.1                 "dumb-init --single-…"   52 minutes ago   Up 52 minutes                       triliovault_wlm_cron
    e93d538aa647   trilio/kolla-rocky-trilio-wlm:6.2.0-2025.1                 "dumb-init --single-…"   52 minutes ago   Up 52 minutes                       triliovault_wlm_scheduler
    9b5771d1d588   trilio/kolla-rocky-trilio-wlm:6.2.0-2025.1                 "dumb-init --single-…"   52 minutes ago   Up 52 minutes                       triliovault_wlm_workloads
    c3f3d6d3e0d8   trilio/kolla-rocky-trilio-wlm:6.2.0-2025.1                 "dumb-init --single-…"   52 minutes ago   Up 52 minutes                       triliovault_wlm_api
    7ada694768b6   trilio/kolla-rocky-trilio-wlm:6.2.0-2025.1                 "dumb-init --single-…"   2 hours ago      Exited (0) 2 hours ago              wlm_cloud_trust
    
    [root@controller0 ~]# docker ps | grep dms
    68c1c7d40389   trilio/kolla-rocky-trilio-dms:6.2.0                        "dumb-init --single-…"   54 minutes ago   Up 54 minutes                       triliovault_dms
    
    [root@controller0 ~]# ssh compute0 "docker ps | grep datamover"
    d18ed6f3a796   trilio/kolla-rocky-trilio-datamover:6.2.0-2025.1          "dumb-init --single-…"   54 minutes ago   Up 54 minutes                   triliovault_datamover
    
    [root@controller0 ~]# ssh compute0 "docker ps | grep dms"
    cdb5dc0e1950   trilio/kolla-rocky-trilio-dms:6.2.0                       "dumb-init --single-…"   54 minutes ago   Up 54 minutes                   triliovault_dms
    
    [root@controller0 ~]# docker ps | grep horizon
    6edf2374a4c7   trilio/kolla-rocky-trilio-horizon-plugin:6.2.0-2025.1      "dumb-init --single-…"   56 minutes ago   Up 56 minutes (healthy)             horizon
    
    # For Epoxy and Flamingo
    ansible-playbook -i {{ kolla inventory file }} $venv_path/share/kolla-ansible/ansible/roles/triliovault/tasks/wlm_cloud_trust.yml -e "@/etc/kolla/globals.yml"
    ssh controller
    docker logs wlm_cloud_trust
    docker ps -a | grep trilio
    docker logs triliovault_datamover_api
    docker logs triliovault_datamover
    docker logs triliovault_wlm_api
    docker logs triliovault_wlm_scheduler
    docker logs triliovault_wlm_cron
    docker logs triliovault_wlm_workloads
    docker logs triliovault_dms
    docker logs wlm_cloud_trust
    docker ps | grep horizon
    /var/log/kolla/triliovault-wlm-api/triliovault-wlm-api.log
    /var/log/kolla/triliovault-wlm-cron/triliovault-wlm-cron.log
    /var/log/kolla/triliovault-wlm-scheduler/triliovault-wlm-scheduler.log
    /var/log/kolla/triliovault-wlm-workloads/triliovault-wlm-workloads.log
    /var/log/kolla/triliovault-datamover-api/triliovault-datamover-api.log
    /var/log/kolla/triliovault-datamover/triliovault-datamover.log
    openstack image create \
    --file <File Manager Image Path> \
    --container-format bare \
    --disk-format qcow2 \
    --public \
    --property hw_qemu_guest_agent=yes \
    --property tvault_recovery_manager=yes \
    --property hw_disk_bus=virtio \
    tvault-file-manager
    openstack server set --os-compute-api-version 2.26 --tag "tvault_recovery_manager" <FRM_UUID>
    guest-file-read
    guest-file-write
    guest-file-open
    guest-file-close
    SELINUX=disabled
    yum install python3 lvm2
    apt-get update
    apt-get install qemu-guest-agent
    systemctl enable qemu-guest-agent
    Loaded: loaded (/etc/init.d/qemu-guest-agent; generated)
    DAEMON_ARGS="-F/etc/qemu/fsfreeze-hook"
    Loaded: loaded (/usr/lib/systemd/system/qemu-guest-agent.service; disabled; vendor preset: enabled)
    systemctl edit qemu-guest-agent
    [Service]
    ExecStart=
    ExecStart=/usr/sbin/qemu-ga -F/etc/qemu/fsfreeze-hook
    systemctl restart qemu-guest-agent
    apt-get install python3
    workloadmgr snapshot-mount <snapshot_id> <mount_vm_id>
    workloadmgr snapshot-mounted-list [--workloadid <workloadid>]
    workloadmgr snapshot-dismount <snapshot_id>
     workloadmgr snapshot-list [--workload_id <workload_id>]
                               [--tvault_node <host>]
                               [--date_from <date_from>]
                               [--date_to <date_to>]
                               [--all {True,False}]
    workloadmgr workload-snapshot [--full] [--display-name <display-name>]
                                  [--display-description <display-description>]
                                  <workload_id>
    workloadmgr snapshot-show [--output <output>] <snapshot_id>
    workloadmgr snapshot-delete <snapshot_id>
    workloadmgr snapshot-cancel <snapshot_id>
    workloadmgr policy-list
    workloadmgr policy-show <policy_id>
    workloadmgr policy-create --policy-fields <key=key-name>
                            [--hourly interval=<n>,retention=<count>,snapshot_type=<incremental|full>]
                            [--daily backup_time=<time>,retention=<count>,snapshot_type=<incremental|full>]
                            [--weekly backup_day=<days>,retention=<count>,snapshot_type=<full>]
                            [--monthly month_backup_day=<date>,retention=<count>,snapshot_type=<full>]
                            [--yearly backup_month=<month>,retention=<count>,snapshot_type=<full>]
                            [--manual retention=<snapshots count>,retention_days_to_keep=<num of days>]
                            [--display-description <display_description>]
                            [--email <email>]
                            [--metadata <key=key-name>]
                            <display_name>
    workloadmgr policy-update [--display-name <display-name>]
                              [--display-description <display-description>]
                              [--email <email>]
                              [--policy-fields <key=key-name>]
                              [--hourly interval=<n>,retention=<count>,snapshot_type=<incremental|full>]
                              [--daily backup_time=<time>,retention=<count>,snapshot_type=<incremental|full>]
                              [--weekly backup_day=<days>,retention=<count>,snapshot_type=<full>]
                              [--monthly month_backup_day=<days>,retention=<count>,snapshot_type=<full>]
                              [--yearly backup_month=<months>,retention=<count>,snapshot_type=<full>]
                              [--manual retention=<snapshots count>,retention_days_to_keep=<num of days>] 
                              [--metadata <key=key-name>]
                              <policy_id>
    workloadmgr policy-assign [--add_project <project_id>]
                              [--remove_project <project_id>]
                              <policy_id>
    workloadmgr policy-delete <policy_id>
    docker.io/trilio/kolla-rocky-trilio-datamover:6.2.0-2025.1
    docker.io/trilio/kolla-rocky-trilio-datamover-api:6.2.0-2025.1
    docker.io/trilio/kolla-rocky-trilio-horizon-plugin:6.2.0-2025.1
    docker.io/trilio/kolla-rocky-trilio-wlm:6.2.0-2025.1
    docker.io/trilio/kolla-rocky-trilio-dms:6.2.0-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-datamover:6.2.0-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-datamover-api:6.2.0-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-horizon-plugin:6.2.0-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-wlm:6.2.0-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-dms:6.2.0-2025.1
    docker.io/trilio/kolla-rocky-trilio-datamover:6.2.0-2025.2
    docker.io/trilio/kolla-rocky-trilio-datamover-api:6.2.0-2025.2
    docker.io/trilio/kolla-rocky-trilio-horizon-plugin:6.2.0-2025.2
    docker.io/trilio/kolla-rocky-trilio-wlm:6.2.0-2025.2
    docker.io/trilio/kolla-rocky-trilio-dms:6.2.0-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-datamover:6.2.0-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-datamover-api:6.2.0-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-horizon-plugin:6.2.0-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-wlm:6.2.0-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-dms:6.2.0-2025.2
    only (e.g.
    my-bucket
    ).
  • Other S3 — <s3_domain_name>/<bucket_name> (e.g. s3.example.com/my-bucket).

  • NFS — <nfs_server_ip>:<export_path> (e.g. 192.168.0.53:/home/rhosp2).

  • # AWS S3 (no --endpoint-url; --filesystem-export is the bucket name only)
    trilio-dms-cli secret-payload create \
        --access-key <access_key> \
        --secret-key <secret_key> \
        --bucket <bucket> \
        --ssl --ssl-verify \
        --filesystem-export <bucket> \
        -o /tmp/secret-<btt-name>.json
    
    # S3-compatible endpoint with publicly-trusted CA
    trilio-dms-cli secret-payload create \
        --access-key <access_key> \
        --secret-key <secret_key> \
        --bucket <bucket> \
        --endpoint-url https://s3.example.com \
        --ssl --ssl-verify \
        --filesystem-export s3.example.com/<bucket> \
        -o /tmp/secret-<btt-name>.json
    
    # S3 with self-signed CA cert
    trilio-dms-cli secret-payload create \
        --access-key <access_key> \
        --secret-key <secret_key> \
        --bucket <bucket> \
        --endpoint-url https://s3.internal.example.com \
        --ssl --ssl-verify --ssl-cert /path/to/ca-cert.pem \
        --filesystem-export s3.internal.example.com/<bucket> \
        -o /tmp/secret-<btt-name>.json
    
    # S3 with SSL verification disabled
    trilio-dms-cli secret-payload create \
        --access-key <access_key> \
        --secret-key <secret_key> \
        --bucket <bucket> \
        --endpoint-url https://s3.internal.example.com \
        --ssl \
        --filesystem-export s3.internal.example.com/<bucket> \
        -o /tmp/secret-<btt-name>.json
    
    # S3 with SSL verification disabled and object lock enabled bucket
    trilio-dms-cli secret-payload create \
        --access-key <access_key> \
        --secret-key <secret_key> \
        --bucket <bucket> \
        --endpoint-url https://s3.internal.example.com \
        --ssl \
        --filesystem-export s3.internal.example.com/<bucket> \
        --object-lock --manifest-suffix \
        -o /tmp/secret-<btt-name>.json
    
    trilio-dms-cli secret-payload validate /tmp/secret-<btt-name>.json
    openstack secret store \
        --name secret-key-<btt-name> \
        --payload "$(cat /tmp/secret-<btt-name>.json)" \
        -f json
    workloadmgr backup-target-create \
        --type s3 \
        --secret-ref <Secret href from Barbican> \
        --s3-bucket <bucket>
        --btt-name <btt-name>
    workloadmgr backup-target-create \
        --type s3 \
        --secret-ref <Secret href from Barbican> \
        --btt-name <btt-name> \
        --s3-bucket <bucket>
        --immutable --metadata object_lock=1
    workloadmgr backup-target-create \
        --type s3 \
        --secret-ref https://barbican.example.com/v1/secrets/abcd1234-... \
        --btt-name s3-bt8 \
        --s3-bucket s3-object-lock
        --immutable --metadata object_lock=1
    workloadmgr backup-target-list
    oc -n trilio-openstack get pods | grep triliovault-dms
    docker ps | grep triliovault_dms
    juju ssh trilio-wlm/leader "systemctl is-active trilio-dms-server"
    juju ssh nova-compute/0 "systemctl is-active trilio-dms-server"
    kubectl get pods -n trilio-openstack | grep triliovault-dms

    Cloud admin must have read access to the secret payload. The DMS server fetches the secret at mount time using the requesting job's Keystone token. The cloud admin user (or whichever role is configured to run backup jobs) must have secret:get permission on the Barbican secret you just stored.

    2] Verify

    RHOSO18

    Kolla

    Canonical

    Helm and MOSK

    Deprecated (6.1) — adding a backup target with per-BT secret + per-BT object-store containers

    In Trilio for OpenStack 6.1 and earlier, adding a dynamic backup target required deploying a per-BT object-store container on the control plane and on every compute node. The flow below is preserved for reference; do not use it on 6.2 or later.

    1] Mount Backup target on Trilio Control Plane

    Navigate to the trilio ctlplane-scripts directory:

    cd /PATH/TO/triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts

    T4O 6.1 supported two types of backup targets — nfs and s3.

    For NFS:

    vi tvo-backup-target-cr-nfs.yaml
    oc -n trilio-openstack apply -f tvo-backup-target-cr-nfs.yaml

    For S3, copy the secret template and base64-encode the access/secret keys:

    cd /PATH/TO/triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts
    cp trilio-s3-backup-target-secret.yaml trilio-s3-backup-target-secret-<BACKUP_TARGET_NAME>.yaml
    
    echo -n "s3_key_string" | base64

    Edit the copied file:

    Set:

    Apply:

    Apply the appropriate tvo-backup-target-cr-*.yaml for AWS S3 or other S3:

    A per-BT pod named triliovault-object-store-<bt-name>-* would then appear in the trilio-openstack namespace.

    This produced a per-BT edpm_triliovault-object-store-<BT_NAME>.service on every compute node.

    In 6.1 the WLM record was created with inline S3 endpoint + bucket (no secret_ref):


    In 6.2 the per-BT secret YAML, the tvo-backup-target-cr-*.yaml CRs, the create-templates.sh step, and the trilio-add-backup-target-{service,deployment}.yaml data-plane resources are all replaced by the Barbican secret_ref flow documented above.

    Dynamic Mount Service
    in
    upgrade
    mode to update the Trilio global variables, passwords, site.yml content, and inventory entries for your OpenStack release in the corresponding Kolla-ansible files.
    • --os-release➡️ Use 2025.1 for Epoxy or 2025.2 for Flamingo.

    • --mode➡️ Use upgrade when upgrading an existing Trilio installation.

    • --venv-path➡️ The kolla virtual environment path exported in the previous step.

    • --inventory-file➡️ Path to your cloud’s kolla-ansible inventory file.

    • --globals-file➡️ Path to your cloud’s globals.yml file.

    In upgrade mode the script:

    • globals.yml — replaces the Trilio block; previously set credentials are preserved automatically, and the Trilio version tags are bumped to the target release

    • passwords.yml — skipped if all 5 Trilio password keys are already present (passwords are never regenerated)

    • site.yml — replaces the Trilio plays block with fresh content for the release

    • inventory — fully replaces the Trilio inventory block

    • nova-cell volumes — no-op if already patched

    • Horizon settings — no-op if the file already exists

    Open /etc/kolla/globals.yml and confirm triliovault_tag and triliovault_dms_tag are set to the values for 6.2.1, listed on the Resources page:

    Cloud admin details and passwords populated during the original installation do not need to change.

    Before upgrading, ensure the following:

    • No Snapshot or Restore is running

    • The global job scheduler is disabled

    Rename your existing triliovault-cfg-scripts directory to keep it available for reference/rollback, then clone the target release into a new directory:

    Example, upgrading from 5.2.7 to 6.2.1:

    Run this before making any further changes. Older releases don't expose workloadmgr backup-target-list, so this script reads the backup target configuration directly out of globals.yml and saves it for use when recreating the backup target in step 10.

    The venv path depends on the base distro of your Kolla deployment. For example:

    Run prepare_install_upgrade.py in upgrade mode to update the Trilio global variables, passwords, site.yml content, and inventory entries for your OpenStack release in the corresponding Kolla-ansible files.

    • --os-release➡️ Use 2025.1 for Epoxy or 2025.2 for Flamingo.

    • --mode➡️ Use upgrade when upgrading an existing Trilio installation.

    • --venv-path➡️ The kolla virtual environment path exported in the previous step.

    • --inventory-file➡️ Path to your cloud’s kolla-ansible inventory file.

    • --globals-file➡️ Path to your cloud’s globals.yml file.

    In upgrade mode the script:

    • globals.yml — replaces the Trilio block; previously set credentials are preserved automatically, and the Trilio version tags are bumped to the target release

    • passwords.yml — skipped if all 5 Trilio password keys are already present (passwords are never regenerated)

    • site.yml — replaces the Trilio plays block with fresh content for the release

    • inventory — fully replaces the Trilio inventory block

    • nova-cell volumes — no-op if already patched

    • Horizon settings — no-op if the file already exists

    Open /etc/kolla/globals.yml and set triliovault_tag and triliovault_dms_tag to the values for your target release, listed on the Resources page:

    Cloud admin details and passwords populated during the original installation do not need to change.

    Once the 6.2.1 DMS-based containers are deployed, remove the old per-backup-target object-store containers and mounts left over from the pre-DMS release:

    This playbook:

    • Stops and removes all triliovault_object_store* Docker containers on WLM and datamover nodes

    • Lazy-unmounts S3/FUSE and NFS mounts under /var/trilio/triliovault-mounts

    • Removes the /etc/kolla/triliovault-object-store config directory and any empty mount-point subdirectories

    • Removes the old backup target variables (triliovault_backup_target, triliovault_nfs_*, triliovault_s3_*, multi_ip_nfs_enabled, triliovault_copy_ceph_s3_ssl_cert) from /etc/kolla/globals.yml on the ansible control node

    Verify cleanup:

    Using the configuration collected in step 3, recreate the backup target against the new DMS-based schema. The playbook runs on a single controller node and executes workloadmgr inside the triliovault_wlm_api container. The backup target name is auto-generated from its type: nfs-backup-target-1 or s3-backup-target-1.

    NFS backup target:

    S3 backup target — the secret key is read automatically from existing_backup_targets.yaml (collected in step 3); no export or extra-var needed:

    Workloads created under the pre-DMS release need to be re-registered in the database and have their backing files rebased onto the new DMS-mounted backup target.

    This command updates all workload and policy records in the database to match the current release version.

    Still inside the triliovault_wlm_api container:

    Copy the script into the triliovault_wlm_api container:

    Then, back inside the container, run it once per workload against its mount path:

    Example:

    If the cloud admin trust needs to be re-established after the upgrade, run:

    mv triliovault-cfg-scripts triliovault-cfg-scripts-6.2.0
    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git triliovault-cfg-scripts-6.2.1
    cd triliovault-cfg-scripts-6.2.1/kolla-ansible/ansible/
    # Kolla Rocky (Epoxy and Flamingo)
    export venv_path="/opt/kolla-venv"
    
    # Kolla Ubuntu (Epoxy and Flamingo)
    export venv_path="/root/kolla-venv"
    
    source $venv_path/bin/activate

    This page covers two upgrade paths on Kolla-Ansible. Pick the one that matches your source release:

    • Upgrading from T4O 6.2.0 to 6.2.1 — both releases use the Dynamic Mount Service (DMS), so this is a straightforward script-driven upgrade with no backup target migration required.

    • Upgrading from an older, pre-DMS release (T4O 5.x or early 6.x) — T4O 6.2 replaced the per-backup-target object-store containers with DMS, so this path also migrates existing backup targets and workloads in addition to the usual image/config update.

    Upgrading from T4O 6.2.0 to 6.2.1 (Epoxy and Flamingo)

    1] Prerequisites

    2] Back up scripts and clone the target release

    3] Activate the kolla virtual environment

    4] Run the upgrade preparation script

    # Epoxy
    python3 scripts/prepare_install_upgrade.py --os-release 2025.1 --mode upgrade --venv-path $venv_path --inventory-file <kolla inventory file, e.g. /root/multinode> --globals-file /etc/kolla/globals.yml
    
    # Flamingo
    python3 scripts/prepare_install_upgrade.py --os-release 2025.2 --mode upgrade --venv-path $venv_path --inventory-file <kolla inventory file, e.g. /etc/kolla/multinode> --globals-file /etc/kolla/globals.yml
    vi /etc/kolla/globals.yml
    ansible -i <kolla inventory file> control -m shell -a "docker login -u <docker-login-username> -p <docker-login-password> docker.io" --become
    
    kolla-ansible pull -i <kolla inventory file> --tags triliovault
    kolla-ansible deploy -i <kolla inventory file> --tags triliovault
    docker ps | grep trilio
    docker inspect triliovault_wlm_api | grep -i image
    workloadmgr backup-target-list
    mv triliovault-cfg-scripts triliovault-cfg-scripts-{{ current_version }}
    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git triliovault-cfg-scripts-{{ target_version }}
    cd triliovault-cfg-scripts-{{ target_version }}/kolla-ansible/ansible/
    mv triliovault-cfg-scripts triliovault-cfg-scripts-5.2.7
    git clone -b 6.2.1 https://github.com/trilioData/triliovault-cfg-scripts.git triliovault-cfg-scripts-6.2.1
    cd triliovault-cfg-scripts-6.2.1/kolla-ansible/ansible/
    bash scripts/collect_backup_targets.sh -g /etc/kolla/globals.yml -o existing_backup_targets.yaml
    export venv_path="/opt/kolla-venv"
    source $venv_path/bin/activate
    python3 scripts/prepare_install_upgrade.py \
      --os-release <2025.1 or 2025.2> \
      --mode upgrade \
      --venv-path $venv_path \
      --inventory-file <kolla inventory file, e.g. /root/multinode> \
      --globals-file /etc/kolla/globals.yml
    vi /etc/kolla/globals.yml
    ansible -i <kolla inventory file> control -m shell -a "docker login -u <docker-login-username> -p <docker-login-password> docker.io" --become
    
    kolla-ansible pull -i <kolla inventory file> --tags triliovault
    kolla-ansible deploy -i <kolla inventory file> --tags triliovault
    ansible-playbook -i <kolla inventory file> cleanup_backup_targets.yml --tags upgrade-and-clean-backup-target-mounts
    # No old object-store containers (expected: no output)
    docker ps -a | grep triliovault_object_store
    
    # No hung mounts — run on each compute and control node (expected: no output)
    findmnt -r | grep triliovault-mounts
    
    # No stale empty directories (expected: empty)
    ls /var/trilio/triliovault-mounts/
    ansible-playbook -i <kolla inventory file> create_backup_target_62.yml
    ansible-playbook -i <kolla inventory file> create_backup_target_62.yml
    docker cp /etc/kolla/triliovault-cloudrc triliovault_wlm_api:/opt/
    docker exec -it triliovault_wlm_api bash
    source /opt/triliovault-cloudrc
    
    workloadmgr workload-inplace-db-upgrade
    target_id=`workloadmgr backup-target-list -f yaml | grep ID | awk '{ print $2 }'`
    token=`openstack token issue -f yaml | grep ^id | awk '{ print $2 }'`
    mountpath=`workloadmgr backup-target-list -f yaml | awk -F': ' '/Backend Mountpath/{print $2}'`
    secret_ref=`workloadmgr backup-target-list -f yaml | awk -F': ' '/Secret Ref/{print $2}'`
    
    workloadmgr dms-mount --job-id 10001 --target-id $target_id --target-type s3 --token $token --mount-path $mountpath --secret-ref $secret_ref
    docker cp backing_file_update.sh triliovault_wlm_api:/tmp/
    cd /tmp
    ./backing_file_update.sh /var/trilio/triliovault-mounts/<base64-mount-path>/workload_<workload-id>
    ./backing_file_update.sh /var/trilio/triliovault-mounts/Y2VwaHF1aW5jeS50cmlsaW9kYXRhLmRlbW8vdHJpbGlvLWF1dG9tYXRpb24=/workload_6edc1e04-2c3e-459a-9daf-829debc1c228
    docker ps | grep trilio
    docker inspect triliovault_wlm_api | grep -i image
    workloadmgr backup-target-list
    ansible-playbook -i {{ kolla inventory file }} $venv_path/share/kolla-ansible/ansible/roles/triliovault/tasks/wlm_cloud_trust.yml -e "@/etc/kolla/globals.yml"

    Before modifying any file, the script creates a timestamped backup directory in the current working directory (./backup/YYYYMMDD_HHMMSS/) and copies /etc/kolla/globals.yml, /etc/kolla/passwords.yml, site.yml, and the inventory file into it before making changes. The exact backup path is printed in the script header — copy a file back from there if you need to restore it.

    5] Update Trilio version tags in globals.yml

    6] Pull updated container images

    7] Deploy the upgrade

    Post deployment for multipath enabled environment, log into respective datamover container and add uxsock_timeout with value as 60000 (i.e. 60 sec) in /etc/multipath.conf. Restart datamover container

    8] Verify the upgrade

    Upgrading from an older, pre-DMS release to T4O 6.2.1

    Use this path when upgrading from an older, pre-DMS Trilio release (T4O 5.x or early 6.x) directly to T4O 6.2.1 on Kolla-Ansible (Epoxy/Flamingo). T4O 6.2 replaced the per-backup-target object-store containers with the Dynamic Mount Service (DMS), so upgrading from an older release requires migrating existing backup targets and workloads in addition to the usual image/config update.

    1] Prerequisites

    2] Back up scripts and clone the target release

    3] Collect the existing backup target configuration

    existing_backup_targets.yaml contains the S3 secret key in plain text. Treat it as sensitive, and delete it once step 10 completes successfully.

    4] Activate the kolla virtual environment

    5] Run the upgrade preparation script

    Before modifying any file, the script creates a timestamped backup directory in the current working directory (./backup/YYYYMMDD_HHMMSS/) and copies /etc/kolla/globals.yml, /etc/kolla/passwords.yml, site.yml, and the inventory file into it before making changes. The exact backup path is printed in the script header — copy a file back from there if you need to restore it.

    6] Set Trilio version tags in globals.yml

    7] Pull updated container images

    8] Deploy the upgrade

    Post deployment for multipath enabled environment, log into respective datamover container and add uxsock_timeout with value as 60000 (i.e. 60 sec) in /etc/multipath.conf. Restart datamover container

    9] Clean up legacy object-store containers and mounts

    10] Recreate the backup target in T4O 6.2.1

    11] Import existing workloads and update backing files

    11.1] Update existing workload and policy data

    11.2] Mount the backup target (S3 backup target only)

    This step is required only when the backup target is S3. Skip it for NFS backup targets.

    11.3] Update the backing file for each workload (S3 backup target only)

    This step is required only when the backup target is S3. Skip it for NFS backup targets.

    backing_file_update.sh is not publicly available — request it from your Trilio Customer Success Manager/Engineer via the Customer Portal. See for full script details and logging.

    12] Verify the upgrade

    13] Recreate cloud admin trust (if required)

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    ID of the Tenant/Project the Snapshot is located in

    snapshot_id

    string

    ID of the Snapshot to mount

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 11 Nov 2020 15:29:03 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-9d779802-9c65-463a-973c-39cdffcba82e

    GET https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/mounted/list

    Provides the list of all Snapshots mounted in a Tenant

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 11 Nov 2020 15:44:42 GMT
    Content-Type: application/json
    Content-Length: 228
    Connection: keep-alive
    X-Compute-Request-Id: req-04c6ef90-125c-4a36-9603-af1af001006a
    
    {
       "mounted_snapshots":[
          {
             "snapshot_id":"ed4f29e8-7544-4e1c-af8a-a76031211926",
             "snapshot_name":"snapshot",
             "workload_id":"4bafaa03-f69a-45d5-a6fc-ae0119c77974",
             "mounturl":"[\"http://192.168.100.87\"]",
             "status":"mounted"
          }
       ]
    }

    GET https://$(tvm_address):8780/v1/$(tenant_id)/workloads/<workload_id>/snapshots/mounted/list

    Provides the list of all Snapshots mounted in a specified Workload

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 11 Nov 2020 15:44:42 GMT
    Content-Type: application/json
    Content-Length: 228
    Connection: keep-alive
    X-Compute-Request-Id: req-04c6ef90-125c-4a36-9603-af1af001006a
    
    {
       "mounted_snapshots":[
          {
             "snapshot_id":"ed4f29e8-7544-4e1c-af8a-a76031211926",
             "snapshot_name":"snapshot",
             "workload_id":"4bafaa03-f69a-45d5-a6fc-ae0119c77974",
             "mounturl":"[\"http://192.168.100.87\"]",
             "status":"mounted"
          }
       ]
    }

    POST https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>/dismount

    Unmounts a Snapshot of the provided File Recovery Manager

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 11 Nov 2020 16:03:49 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-abf69be3-474d-4cf3-ab41-caa56bb611e4

    Mount Snapshot

    Path Parameters

    tvm_address

    {
       "mount":{
          "mount_vm_id":"15185195-cd8d-4f6f-95ca-25983a34ed92",
          "options":{
             
          }
       }
    }
    {
       "mount": 
          {
              "options": null
          }
    }

    Headers

    Body Format

    List of mounted Snapshots in Tenant

    Path Parameters

    Headers

    List of mounted Snapshots in Workload

    Path Parameters

    Headers

    Dismount Snapshot

    Path Parameters

    Headers

    Body Format

    true
    under
    config.yaml
    , as shown below. If it is present, user workload monitoring is enabled. If it is not present or is set to
    false
    , you must enable it using the next steps. Otherwise, skip the steps to enable user workload monitoring.

    • Check whether the following ConfigMap already exists. If it does not exist, create it using the following YAML file. No changes are required in the YAML file.

    • If the ConfigMap cluster-monitoring-config already exists, add the following parameter to it:

    • Edit the ConfigMap using:


    • First, you need to create a ConfigMap that holds the SQL Exporter's configuration. This includes the database connection string.

    • Edit sql-exporter-config.yaml. Before applying, locate the data_source_name field and update it with the correct MySQL username, password, and hostname for your database.

    • Important: Do not change the database name or the overall format of the data_source_name string. Only update credentials and hostname.

    • Create the Secret.

    Before applying the deployment, create the secret containing the DSN string:

    Replace <username>, <password>, and <hostname> with the actual values.

    • Apply the ConfigMap:


    • Deploy the SQL Exporter application using its Deployment manifest:

    • Verify pod status after deployment:

    You should see a pod with the status Running.


    • Create a Kubernetes Service to expose the SQL Exporter within the cluster so that other services (such as Prometheus) can discover and scrape its metrics:

    • Verify Service Status: Confirm that the Service has been created.


    Finally, create a ServiceMonitor resource. This tells Prometheus (if configured to discover ServiceMonitors in this namespace) to automatically scrape metrics from your SQL Exporter Service.


    Follow below steps to deploy the OpenStack Exporter:

    First, create a ConfigMap containing your OpenStack cloud credentials. This ConfigMap will be mounted into the exporter pod.

    Replace all placeholder variables (such as auth URL, username, password, etc.) with actual values from your OpenStack cloud in the following config file.


    Before deploying the OpenStack Exporter, create the required secret containing the Keystone CA certificate.


    Next, deploy the OpenStack Exporter application using its Deployment manifest.


    After deployment, verify that the exporter pod is running correctly.

    You should see a pod with a status of Running.


    To ensure the exporter is starting and connecting to OpenStack successfully, check its logs. Replace <openstack-exporter-pod-name> with the actual name of your exporter pod obtained from the previous step.

    Look for messages indicating a successful connection to OpenStack and that it is listening for metrics requests (for example, on port 9180).


    Create a Kubernetes Service to expose the OpenStack Exporter within the cluster, allowing other services (like Prometheus) to discover and scrape its metrics.


    Finally, create a ServiceMonitor resource. This tells Prometheus (if configured to discover ServiceMonitors in this namespace) to automatically scrape metrics from your OpenStack Exporter Service.


    1. Go to Administrator View → Operators → OperatorHub.

    2. Search for Grafana Operator and select it.

    3. Click Install to open the operator installation page.

    4. In the installation configuration:

      • Choose the appropriate Update Channel.

      • Select the latest available operator version.

      • Under Installation Mode, select:

        • A specific namespace on the cluster

      • Select Installed Namespace to:

      • Keep Update Approval as Automatic (recommended).

    5. Click Install to confirm the installation.

    Note: It is recommended to install the Grafana Operator in the openshift-user-workload-monitoring namespace, as this namespace is used for user workload monitoring in RHOSO.



    Edit the following secret file and set fresh username and password values.

    Token must be fetched using the following command:

    After running the above command, the token is copied into the Grafana secret YAML file.


    For a fresh deployment, create a Grafana instance:

    In case of a token update on an existing Grafana instance, this is not required if you are installing Grafana for the first time:



    If the above command to get the Grafana route returns a NotFound error, you need to expose the Grafana service manually to create the route:


    Create Grafana datasource to fetch metrics from the cluster monitoring namespace

    Verify


    git clone -b 6.1.7-1 https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/
    oc get cm -n openshift-monitoring | grep cluster-monitoring-config

    1] Clone triliovault-cfg-scripts Repository

    2] Enable User Workload Monitoring in OpenShift

    2.1] Check if user workload monitoring is already enabled on OpenShift

    oc get -n openshift-monitoring cm cluster-monitoring-config -o yaml
    apiVersion: v1
    data:
      config.yaml: |
        enableUserWorkload: true
    kind: ConfigMap
    metadata:
      name: cluster-monitoring-config
      namespace: openshift-monitoring
    cd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/
    oc apply -f cm-cluster-monitoring-config.yaml -n openshift-monitoring
    config.yaml: |
      enableUserWorkload: true
    oc edit cm cluster-monitoring-config -n openshift-monitoring
    cd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/sql_exporters/
    vi sql-exporter-config.yaml
    oc -n openshift-user-workload-monitoring create secret generic sql-exporter-secret --from-literal=dsn="mysql://<username>:<password>@<hostname>:3306/workloadmgr"
    oc -n openshift-user-workload-monitoring apply -f sql-exporter-config.yaml
    oc -n openshift-user-workload-monitoring apply -f sql-exporter-deployment.yaml
    oc -n openshift-user-workload-monitoring get pods | grep sql
    oc -n openshift-user-workload-monitoring apply -f sql-exporter-service.yaml
    oc get svc -n openshift-user-workload-monitoring | grep sql
    oc -n openshift-user-workload-monitoring apply -f sql-exporter-servicemonitor.yaml
    cd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/openstack_exporter/
    # Fill in OpenStack cloud admin user credentials in the following YAML file
    vi openstack-exporter-clouds-cm.yaml
    
    # Save changes
    # Apply the changes
    oc -n openshift-user-workload-monitoring apply -f openstack-exporter-clouds-cm.yaml
    cd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/openstack_exporter/
    ./create_keystone_cacert_secret.sh
    oc -n openshift-user-workload-monitoring apply -f openstack-exporter-deployment.yaml
    oc -n openshift-user-workload-monitoring get pods | grep openstack-exporter
    oc -n openshift-user-workload-monitoring logs <openstack-exporter-pod-name>
    oc -n openshift-user-workload-monitoring apply -f openstack-exporter-service.yaml
    oc -n openshift-user-workload-monitoring apply -f openstack-exporter-servicemonitor.yaml
    oc -n openshift-user-workload-monitoring create sa grafana-sa
    oc -n openshift-user-workload-monitoring  adm policy add-cluster-role-to-user cluster-monitoring-view -z grafana-sa
    BEARER_TOKEN=$(oc create token grafana-sa --duration=87600h -n openshift-user-workload-monitoring | base64 -w0)
    
    cp grafana-secret-creds_original.yaml grafana-secret-creds.yaml
    
    sed -i "s/\$BASE64_ENCODED_GRAFANA_SERVICE_ACCOUNT_BEARER_TOKEN/${BEARER_TOKEN}/g" grafana-secret-creds.yaml
    
    # Using above sed command, token got copied to grafan secret yaml file
    # Set username and password and save changes
    vi grafana-secret-creds.yaml
    
    # Apply the secret
    oc -n openshift-user-workload-monitoring apply -f grafana-secret-creds.yaml
    oc -n openshift-user-workload-monitoring apply -f grafana-instance.yaml
    oc rollout restart deployment grafana-deployment -n openshift-user-workload-monitoring
    $ oc -n openshift-user-workload-monitoring get GRAFANA 
    NAME      VERSION   STAGE      STAGE STATUS   AGE
    grafana   11.3.0    complete   success        49s
    
    
    $ oc -n openshift-user-workload-monitoring get pods -l app=grafana
    NAME                                  READY   STATUS    RESTARTS   AGE
    grafana-deployment-645b4bbb56-5pj6x   1/1     Running   0          4m43s
    
    $ oc -n openshift-user-workload-monitoring get route grafana -o jsonpath='{.spec.host}'
    grafana-openshift-user-workload-monitoring.apps.roso18qa.prod.engineering.trilio.io
    oc -n openshift-user-workload-monitoring expose svc/grafana-service --name=grafana --port=grafana
    
    
    oc -n openshift-user-workload-monitoring get route grafana -o jsonpath='{.spec.host}'
    oc -n openshift-user-workload-monitoring apply -f grafana-datasource.yaml
    oc -n openshift-user-workload-monitoring get GRAFANADATASOURCE

    2.2] If user workload monitoring is not enabled, enable it

    3] Steps to Install Prometheus SQL Exporter

    3.1] Create SQL Exporter ConfigMap

    3.2] Apply SQL Exporter Deployment

    3.3] Apply SQL Exporter Service

    3.4] Apply SQL Exporter ServiceMonitor

    4] Steps to Install Prometheus OpenStack Exporter

    4.1] Create ConfigMap with OpenStack Cloud Credentials

    4.2] Create Keystone CA Certificate Secret

    4.3] Deploy OpenStack Exporter

    4.4] Verify OpenStack Exporter Pod Status

    4.5] Check OpenStack Exporter Pod Logs

    4.6] Create Service for OpenStack Exporter

    4.7] Create ServiceMonitor for Prometheus Integration

    5] Install and Configure Grafana

    5.1] Install Grafana Operator

    5.2] Create Grafana service account

    5.3] Create credential secret for Grafana

    5.4] Create Grafana instance

    5.5] Verify Grafana installation

    5.6] Expose Grafana service if route not found

    5.7] Create Grafana datasource

    Features

    A list of impactful features in Trilio for OpenStack.

    Immutable Backups

    Release version: 6.0

    Trilio offers the capability to create immutable T4O backups/snapshots, ensuring they cannot be deleted until the specified retention period has ended. It leverages the target's locking and versioning features to achieve this immutability.


    Purpose

    In recent years, the Trilio S3 Fuse plugin introduced the ability to support backup immutability through the S3 object lock mechanism. This feature ensures that backups remain secure even if the OpenStack platform is compromised, acting as a crucial safeguard against cyber attacks. While traditional backup solutions prevent direct exposure of backup media to the platform, Trilio's scale-out architecture necessitates direct attachment of the


    Key Highlights

    • Pre-requisites:

      • Create a new S3 bucket to enable the object-locking feature, as it cannot be enabled on existing buckets.

      • Configure Object Locking in Compliance mode with a retention period of at least one day for enhanced protection.

      • Disable object lifecycle policies to prevent automated deletions.

      • Perform manual deletion of objects only after the retention period has expired.

    • Retention

      With the introduction of the immutable backups feature, Trilio’s retention policy has been changed. It's important to note that Trilio can no longer support incremental/full synthetic backups forever, as this functionality requires modifying the backup images. Instead, the following retention policy is now in place:

      • If the user wants to retain n number of backups, then the user needs to take full backups every n backups.

      • To keep at least n


    Follow the steps mentioned to know how to use this feature in the product.


    To enable this feature, you need to adjust certain configuration settings in the product. Refer to the deployment guides of the desired distribution for detailed instructions.


    • The feature may not work as expected if the object lifecycle policy is set for a backup target.

    • The same backup target cannot be used for DR or migration purposes, additional steps will be required to perform it.


    Release version: 6.0

    The Advanced Scheduler is a newly introduced feature in Trilio that provides enhanced flexibility and granularity in scheduling and retaining snapshots. With this feature, users can now schedule both full and incremental snapshots across various intervals—hourly, daily, weekly, monthly, and yearly. Each scheduling type offers customizable retention policies, allowing users to manage snapshots as per their specific requirements effectively.


    Purpose

    The purpose of the Advanced Scheduler is to empower users with more control over their snapshot management. By addressing limitations in the previous scheduler, this feature ensures improved efficiency, optimized resource usage, and greater alignment with organizational backup policies. This feature is especially beneficial for organizations with diverse workloads that demand varying backup frequencies and retention policies.


    Key Highlights

    • Flexible Scheduling Intervals: Users can now schedule snapshots across the following intervals:

      • Hourly: For tasks requiring frequent backups.

      • Daily: Ideal for daily operations requiring end-of-day snapshots.

      • Weekly


    Follow the steps mentioned to know how to use this feature in the product.


    Limitations

    While the Advanced Scheduler introduces significant improvements, it has certain limitations:

    1. Immutable Backups:

      • In case the user chooses the immutable backup storage, the scheduling policy will get limited options. The user can have only hourly scheduling and retention types and hourly will have only 24hrs interval option.

    2. Resource Utilization:


    Release version: 6.0

    Previously, Trilio allowed a single backup target per cloud, either NFS or S3, for all backups. Now, Trilio supports multiple backup targets, enabling both NFS and S3 types to coexist as backup options. Admin users can configure multiple backup targets and define their accessibility for tenant users. Additionally, admin users have the ability to restrict backup targets to specific projects for enhanced control.


    Purpose

    The feature aims to enhance the flexibility, scalability, and manageability of backup configurations in Trilio. By supporting multiple backup targets:

    • Organizations can align their backup strategies with diverse operational requirements.

    • Admin users can provide tenant users with more options for workload backups.

    • Access control over backup targets is improved, allowing organizations to secure sensitive data.


    Key Highlights

    • Support for Multiple Backup Targets: Trilio now supports both NFS and S3 simultaneously for backup storage.

    • Admin Configuration: Admin users can configure multiple backup targets during deployment.

    • Tenant User Flexibility: Tenant users can choose from available backup targets when creating workloads.

    • Enhanced Access Control:


    How To Use It

    Follow the steps mentioned to know how to use this feature in the product.


    Configuration

    To take advantage of this feature, you need to adjust certain configuration settings in the product. Refer to the deployment guides of the desired distribution for detailed instructions.


    Limitations

    • Backup Targets are configured during deployment. Modifying them may require redeploying Trilio.

    • While this feature is highly expandable, it currently limits the isolation of the backup targets to the projects only.

    Release version: 6.2

    The Dynamic Mount Service (DMS) centralizes the mounting and unmounting of backup targets across every node that needs access to them — both controller and compute nodes. Instead of keeping a target mounted for the lifetime of the service, DMS mounts a target when a backup job needs it and unmounts it when the last job releases it.

    The 6.2 deployment runs a single DMS server container per host (one on the controller, one on each compute node) and replaces the per-backup-target container model used in earlier releases — there is no longer a separate triliovault-object-store-<bt-name> pod per S3 backup target.


    In earlier releases, backup targets were mounted statically on every Trilio node at service startup, with a dedicated container per S3 backup target on each node. That model created a wide surface area for stale or broken mounts — a single misbehaving target could impact node stability even when no jobs were active against it — and the per-BT container count grew linearly with the number of S3 backup targets. DMS replaces that model with a single per-host server that performs per-job, reference-counted mounts, so mount state closely tracks actual usage and failures stay isolated to the job that triggered them.


    • Single DMS server container per host replaces the per-BT object-store container model. One trilio-dms-server runs on the controller and one on each compute node, regardless of how many backup targets are configured.

    • Per-job, reference-counted mounts. A target is mounted on demand and stays mounted only for as long as at least one active job requires it.

    • Works for both NFS and S3 backup targets. S3 targets are served by s3vaultfuse, which DMS spawns and manages as a child process.


    DMS is transparent to end users. Administrators continue to configure backup targets and backup target types in the usual way; DMS handles the mount lifecycle behind the scenes.


    See for the architectural overview, and the for the S3 Barbican secret payload requirements that DMS expects.

    Release version: 6.2.1

    Trilio captures the Nova server group each protected instance belongs to as part of every Snapshot, and restores that membership when the instance is brought back — preserving the affinity / anti-affinity placement policy of clustered applications across restore, migration and disaster recovery.


    Nova server groups enforce where instances are placed relative to one another through the affinity, anti-affinity, soft-affinity and soft-anti-affinity policies. Clustered applications depend on those guarantees — database replicas kept on separate hypervisors by an anti-affinity group, for example.

    Before this release, server group membership was not part of the backup, so restored and migrated instances silently lost their placement policy and had to be manually re-grouped afterwards. Because Nova only allows an instance to join a server group at boot time, re-grouping after a restore is not possible without recreating the instance - which makes capturing the membership at backup time and applying it at boot the only way to preserve it.


    • Captured on every Snapshot. Full and incremental Snapshots record the server group's ID, name and policy for each member instance, alongside the existing flavor and security group metadata. Instances that are not group members are unaffected.

    • Restore behavior suited to each restore type. Selective Restore lets the user pick the target server group per instance; One Click Restore reuses the captured group automatically; Inplace Restore is unaffected, since it does not boot new instances.

    • A missing group never fails a One Click Restore. If the captured group no longer exists on the target, the restore completes with the instance unassigned and records the reason under Warning Message, rather than failing a DR restore.


    The capture side is automatic - no action is required to start recording server group membership.

    • Horizon: the Snapshot detail view shows a Server Group tab per instance, and the Selective Restore wizard adds a Server Group dropdown per instance, pre-selected to the captured group when it still exists on the target.

    • CLI: workloadmgr snapshot-show <snapshot_id> reports a Server Group entry per instance; the Selective Restore restore.json accepts an optional server_group key per instance.

    See the user guide for the restore workflows and the for the request format.


    None. The feature is active out of the box for all backup target types and requires no configuration option or deployment change.


    • Server groups are not created on the target. Trilio restores membership of an existing group; it does not recreate the group definition. For migration and disaster recovery, create the server group in the target project first.

    • The group must exist in the project the restore runs in. A group belonging to another project is treated as non-existent.

    • Membership is applied at boot only. This is a Nova constraint. Inplace Restore cannot change server group membership, and already-running instances are never added to or removed from groups.

    Uninstalling from Canonical OpenStack Sunbeam

    This page covers removing T4O 6.2.1 from a Canonical OpenStack Sunbeam cloud (trilio-wlm-k8s, trilio-dm-api-k8s, trilio-data-mover-sunbeam) — see for the matching install procedure.

    Remove components in the order given below, verifying each step before continuing to the next.

    Backup data already written to your NFS or S3 backup target is never affected by any step in this procedure — T4O does not delete backup-target content when its charms are removed. The workload and backup-target metadata held in T4O's own databases is a separate matter, addressed in the optional below.

    Do not use --force on any removal. A forced removal skips the charms' own teardown hooks. On the control plane it can leave the trilio-wlm-k8s StatefulSet behind, which blocks a later reinstall until it is deleted by hand, and it can leave unrelated Sunbeam applications in an error state on their own relation-departed hooks. Let each removal complete on its own before starting the next.

    A unit stuck in an error state blocks removal. Juju will not retire an application while one of its units has a failed hook. Clear it with juju resolved --no-retry <unit> before retrying the removal. The --no-retry flag matters: plain juju resolved re-runs the failed hook, and if that hook fails again the removal stays blocked indefinitely.

    juju remove-application always prompts for confirmation before doing anything. When running it over SSH or from a script — anywhere without an interactive terminal to answer that prompt — include --no-prompt, or the command aborts immediately with ERROR application removal: aborted and nothing is removed. Every command below already includes it.

    Prerequisites

    • Juju CLI access to the Sunbeam controller, with both the openstack (Kubernetes) and machine models reachable. Confirm the machine model's exact name with juju models before starting — some Sunbeam environments require the owner-qualified form (e.g. admin/openstack-machines) rather than a bare openstack-machines.

    • kubectl access to the openstack namespace (on Canonical Kubernetes, this is typically sudo k8s kubectl, not a bare kubectl).

    • For only: MySQL root credentials (via the mysql charm's get-password action), RabbitMQ access via rabbitmqctl inside the rabbitmq unit, and OpenStack admin credentials (via the keystone charm's get-admin-account action).

    Removes trilio-wlm-k8s and trilio-dm-api-k8s from the openstack model.

    If you intend to redeploy later and keep existing backups usable, back up the workloadmgr database first (Step 6 shows how to reach it) — it is left untouched by this step regardless.

    Verify:

    Removes trilio-data-mover (the subordinate DataMover/DMS application) from the machine model.

    Verify:

    Required on every compute node. Removing trilio-data-mover leaves its systemd services and apt packages installed and running; once the relation is torn down, their RabbitMQ/Keystone credentials are deleted, so both services enter a continuous failure loop until stopped. Run the following via Juju for every openstack-hypervisor/<N> unit (check juju status openstack-hypervisor for the full list):

    apt-get purge does not remove the log directory these services wrote to either. Clean it up separately:

    Optional: remove the Trilio apt repository source file added during install. Confirm its exact filename first rather than assuming one:

    Verify:

    Reverts Horizon to its pre-Trilio image, removing the Trilio dashboard plugin. Two ways to determine which image to restore, in order of preference.

    Option A — Restore the saved pre-Trilio baseline (preferred, if captured)

    If horizon-baseline.yaml was captured at install time, use its saved image directly instead of a live Charmhub lookup — this guarantees an exact revert to the image Horizon had before Trilio touched it, regardless of how much time has passed or whether Canonical has since published newer horizon-k8s resource revisions on the channel.

    Option B — No saved baseline exists (fallback)

    If no baseline file was captured at install time (e.g. an install performed before this practice was adopted), fall back to Charmhub's current published default for the channel:

    For example, for horizon-k8s revision 289 on the 2024.1/stable channel, the resolved image was ghcr.io/canonical/horizon:2024.1-24.04_edge, giving:

    Verify on every unit, since each rolls over to the new image at a different time:

    If the rabbitmq or keystone-credentials offers were created specifically for T4O, and nothing else consumes them, they may be removed:

    Optional. Because --destroy-storage in Step 1 does not reach the mysql application's own storage, the WLM and DataMover-API databases, their MySQL users, associated RabbitMQ vhosts, and the Keystone service catalog entries, endpoints, and cloud-admin trust are all left behind by Steps 1–5. This step removes them. Skip it entirely if leaving these inert resources behind is acceptable.

    MySQL — leftover databases and users:

    RabbitMQ — leftover vhosts (their users are cleaned up automatically, but the vhosts themselves are not):

    Keystone — leftover service catalog entries, endpoints, and the cloud-admin trust created during install:

    Keystone — leftover identity (service) users. openstack user list on its own only shows users in the domain your current auth is scoped to (here, admin_domain, which holds only admin) — it does not list all users across all domains. Trilio's own service accounts live in a separate service_domain, so they stay invisible unless that domain is named explicitly:

    This surfaces (alongside the other OpenStack services' own accounts, svc_nova-*, svc_cinder-*, etc., which are not Trilio's and must not be touched):

    svc_trilio_dm_api_k8s and datamover have no such dependency and can be removed independently:

    Verify:

    After Steps 1–4 (the mandatory path):

    • juju status in both models shows no trilio-wlm-k8s, trilio-dm-api-k8s, or trilio-data-mover applications

    • kubectl get pods -n openstack | grep trilio returns nothing

    After Step 6 (optional, destructive):

    • no workloadmgr/dmapi databases or users remain in MySQL

    • no workloadmgr/dmapi vhosts remain in RabbitMQ

    • no dmapi

    Trilio Installation on Canonical OpenStack (Sunbeam)

    deploys OpenStack's control plane as Kubernetes charms on Canonical Kubernetes/MicroK8s, with compute nodes joined separately as machines. Trilio ships a matching set of Kubernetes charms (trilio-wlm-k8s, trilio-dm-api-k8s) for the control plane and a machine charm (trilio-data-mover-sunbeam) for the data plane.

    • Sunbeam bootstrap is complete, and the openstack and openstack-machines models are healthy — verify with juju models.

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant to search for mounted Snapshots

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgr

    ID of the Tenant to search for mounted Snapshots

    workload_id

    string

    ID of the Workload to search for mounted Snapshots

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgr

    ID of the Tenant/Project the Snapshot is located in

    snapshot_id

    string

    ID of the Snapshot to dismount

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    backups available, Trilio may retain
    2n
    backups, forming two backup chains. Once a chain is fully formed with one full backup and
    n-1
    incremental backup images, the second chain will start with a new full backup. The first chain will be removed once the second chain is fully formed with a full backup and
    n-1
    incremental backups.
    : Suitable for less critical workloads.
  • Monthly: For long-term periodic backups.

  • Yearly: Designed for archival purposes.

  • Snapshot Type Options:

    • Full Snapshots: Each scheduling type allows the user to choose the full snapshot type. But, full snapshot type is mandatory for Weekly, Monthly, and Yearly scheduling types to avoid longer backup chains which may lead to data corruption.

    • Incremental Snapshots: Hourly and Daily scheduling types provide the options from either incremental or full snapshots.

  • Advanced Retention Policies:

    • Users can define retention settings for each scheduling type.

    • Retention can be based on:

      • Number of Snapshots: Keep a specified number of snapshots for the chosen schedule.

      • Retention Duration: This is based on the scheduling type selected by the user.

  • Enhanced Management Efficiency:

    • Simplifies backup strategies by tailoring frequency, type, and retention for specific workloads.

    • Supports compliance and long-term data retention policies.

  • Frequent full snapshots (e.g., on an hourly basis) may lead to higher storage and performance overhead.
  • Complexity in Configuration:

    • Advanced options may require more planning and understanding, increasing the learning curve for new users.

  • Dependency on Storage Quotas:

    • Users must ensure sufficient storage capacity to handle the retention policies and the frequency of snapshots.

  • Manual Monitoring:

    • In cases of excessive scheduling, manual intervention might be necessary to adjust retention policies or optimize schedules.

  • Admin users can mark backup targets as private and restrict access to specific projects by creating backup target types and marking them as private.

    Automatic stale-mount detection and recovery. DMS detects dead FUSE processes and broken NFS sessions before every mount and cleans them up automatically.

  • Secure S3 credential handling. S3 credentials are stored in OpenStack Barbican and fetched at mount time using the job's Keystone token; they are never persisted in the WorkloadManager database.

  • Controller- and compute-aware routing. DMS routes mount requests to the specific node that needs the target — the controller for metadata operations, the compute node hosting an instance for data transfer.

  • Invalid input fails fast. A non-existent server group ID submitted to a Selective Restore is rejected before any data transfer begins, reporting every invalid ID in a single message.

    REST API: the Show Snapshot response includes a server_group object per instance, and the Selective Restore body accepts an optional server_group string per instance.
    Placement remains Nova's decision. If the group's policy cannot be satisfied - strict anti-affinity with too few compute hosts, for example, Nova rejects the boot and the restore fails with Nova's error, exactly as a manual boot into that group would. Note that for Selective Restore, restoring instances alongside the still-running originals doubles the group's membership, and therefore the number of hosts a strict anti-affinity policy needs.

    How To Use It

    Configuration

    Limitations

    Advanced Scheduler & Retention

    How To Use It

    Multiple Backup Targets

    Dynamic Mount Service (DMS)

    Purpose

    Key Highlights

    How To Use It

    Configuration

    Nova Server Group Preservation

    Purpose

    Key Highlights

    How To Use It

    Configuration

    Limitations

    here
    here
    here
    T4O Architecture
    Backup Targets admin guide
    Restores
    Restores API guide
    Switching NFS Backing file

    2] Mount Backup target on Trilio Data Plane

    3] Add Backup Target Records

    triliovault-datamover and triliovault-dms are inactive on every compute node
  • python3-tvault-contego, python3-trilio-dms, and python3-s3-fuse-plugin are not installed on any compute node

  • /var/log/triliovault does not exist on any compute node

  • trilio_dashboard fails to import on every Horizon unit

  • /
    TrilioVaultWLM
    services, endpoints, or admin trust remain in Keystone
  • no svc_trilio_wlm_k8s, svc_trilio_dm_api_k8s, or datamover users remain in Keystone's service_domain

  • Steps to uninstall the Trilio charms

    1. Remove the control plane

    --destroy-storage removes Juju storage volumes owned directly by these two applications. trilio-wlm-k8s and trilio-dm-api-k8s declare no storage of their own, though — they are stateless, and all workload/backup-target metadata lives in the separate mysql application's own storage. This flag therefore does not delete the WLM or DataMover-API databases; see Step 6 if you want those removed as well.

    2. Remove the data plane

    Confirming the compute-node services are actually gone requires the manual cleanup in Step 3 below — removing the Juju application does not stop or uninstall anything on the compute node's underlying OS.

    3. Clean up compute-node services and packages

    This is distinct from /var/log/juju/unit-trilio-data-mover-<N>.log, which Juju itself always preserves for a removed unit on its machine, for any application — not Trilio-specific, and not something this procedure removes.

    4. Remove the Horizon plugin

    Option B always restores whichever image is Charmhub's current default for horizon-k8s's channel at the time cleanup runs — not necessarily the exact image Horizon had before Trilio was installed, since Canonical publishes horizon-k8s resource updates on its own schedule, independent of Trilio. Prefer Option A whenever a baseline is available.

    5. Remove cross-model offers (optional)

    Leave the offers in place if you are unsure. An unused offer is harmless, but removing one that another application still consumes will break that application. Before removing anything, confirm what else is connected:

    Check the "Integration provider" section for any rabbitmq:amqp, keystone-credentials:identity-credentials, or cert-distributor:send-ca-cert relation pointing at an application other than Trilio's — these offers are frequently shared with Sunbeam's own core services (e.g. openstack-hypervisor for Nova, cinder-volume for Cinder). If any such relation exists, do not remove that offer.

    6. Remove residual database, message queue, and identity resources

    Dropping the databases below is destructive and irreversible — it permanently deletes all workload and backup-target metadata (which backups exist, their schedules, etc). It does not affect backup data on your NFS or S3 target. If you may reinstall and want existing backups to remain usable, skip the MySQL portion below (back up the workloadmgr database first if you want a safety copy).

    svc_trilio_wlm_k8s is the trustee on the cloud-admin trust created during install (trustor: admin) — confirm this by checking the trust's Trustee User ID matches this user's ID before deleting either. Delete both together, or neither; deleting the trust independently of the user (or vice versa) can leave a dangling reference:

    Verification Summary

    Step 6
    Trilio Installation on Canonical OpenStack (Sunbeam)
    Step 6
    openshift-user-workload-monitoring
    vi trilio-s3-backup-target-secret-<BACKUP_TARGET_NAME>.yaml
    <BACKUP_TARGET_NAME>_s3_access_key: <base64_encoded_access_key>
    <BACKUP_TARGET_NAME>_s3_secret_key: <base64_encoded_secret_key>
    oc -n trilio-openstack apply -f trilio-s3-backup-target-secret-<BACKUP_TARGET_NAME>.yaml
    vi tvo-backup-target-cr-amazon-s3.yaml
    oc -n trilio-openstack apply -f tvo-backup-target-cr-amazon-s3.yaml
    # or
    vi tvo-backup-target-cr-other-s3.yaml
    oc -n trilio-openstack apply -f tvo-backup-target-cr-other-s3.yaml
    cd /PATH/TO/triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
    ./create-templates.sh <BACKUP_TARGET_NAME> <BACKUP_TARGET_TYPE>
    cd <BACKUP_TARGET_NAME>/
    
    vi cm-trilio-backup-target.yaml
    oc -n openstack apply -f cm-trilio-backup-target.yaml
    
    oc -n openstack apply -f ../../ctlplane-scripts/trilio-s3-backup-target-secret-<BACKUP_TARGET_NAME>.yaml
    
    vi trilio-add-backup-target-service.yaml
    oc -n openstack apply -f trilio-add-backup-target-service.yaml
    
    oc -n openstack get OpenStackDataPlaneNodeSet
    vi trilio-add-backup-target-deployment.yaml
    oc -n openstack apply -f trilio-add-backup-target-deployment.yaml
    workloadmgr backup-target-create --type s3 --s3-endpoint-url <s3_endpoint_url> --s3-bucket <s3_bucket> --btt-name <btt-name>
    juju switch openstack
    juju remove-application trilio-wlm-k8s trilio-dm-api-k8s --destroy-storage --no-prompt
    juju status trilio-wlm-k8s trilio-dm-api-k8s
    # Both applications should report as not found. This can take a minute
    # or two to fully clear; if it still shows Scale 3/0 with units
    # "Terminating", that is normal in-progress teardown -- wait and re-check.
    
    kubectl get pods -n openstack | grep trilio
    # No output -- all pods terminated.
    juju switch openstack-machines
    juju remove-application trilio-data-mover --destroy-storage --no-prompt
    juju status trilio-data-mover
    # Application should report as not found.
    juju ssh openstack-hypervisor/<N> -- sudo systemctl stop triliovault-datamover triliovault-dms
    juju ssh openstack-hypervisor/<N> -- sudo systemctl disable triliovault-datamover triliovault-dms
    juju ssh openstack-hypervisor/<N> -- sudo apt-get purge -y python3-tvault-contego python3-trilio-dms python3-s3-fuse-plugin
    juju ssh openstack-hypervisor/<N> -- sudo systemctl daemon-reload
    juju ssh openstack-hypervisor/<N> -- sudo rm -rf /var/log/triliovault
    juju ssh openstack-hypervisor/<N> -- ls /etc/apt/sources.list.d/ | grep -i trilio
    juju ssh openstack-hypervisor/<N> -- sudo rm -f /etc/apt/sources.list.d/<confirmed-filename>
    juju ssh openstack-hypervisor/<N> -- sudo apt-get update -qq
    juju ssh openstack-hypervisor/<N> -- systemctl is-active triliovault-datamover triliovault-dms
    # Should print "inactive" for both, on every compute node.
    
    juju ssh openstack-hypervisor/<N> -- test -d /var/log/triliovault && echo "still present" || echo "removed"
    # Should print "removed", on every compute node.
    # 1. Read the saved baseline to fetch pre_trilio_image-from-baseline
    cat triliovault-cfg-scripts/sunbeam-canonical/horizon-baseline.yaml
    
    # 2. Check Horizon's currently-running image
    kubectl get pod -n openstack horizon-0 -o jsonpath='{.spec.containers[?(@.name=="horizon")].image}'
    echo
    
    # 3. Re-attach the saved pre-Trilio image
    juju attach-resource horizon horizon-image=<pre_trilio_image-from-baseline>
    # 1. Find the currently-deployed charm revision
    juju status horizon -m openstack
    # note the Rev column
    
    # 2. Look up that revision's default horizon-image resource on Charmhub
    curl -s 'https://api.charmhub.io/v2/charms/info/horizon-k8s?channel=2024.1/stable&fields=default-release.resources,default-release.revision' \
      | python3 -m json.tool
    # find the "horizon-image" resource entry's "upstream-source" field
    # (nested inside the "metadata-yaml" text, not a top-level field of the
    # resource entry itself)
    
    # 3. Re-attach that stock image
    juju attach-resource horizon horizon-image=<upstream-source-from-step-2>
    juju attach-resource horizon horizon-image=ghcr.io/canonical/horizon:2024.1-24.04_edge
    for p in horizon-0 horizon-1 horizon-2; do
      kubectl exec -n openstack $p -c horizon -- \
        python3 -c 'import trilio_dashboard; print(trilio_dashboard.__file__)'
    done
    # Each should fail with: ModuleNotFoundError: No module named 'trilio_dashboard'
    
    juju status horizon -m openstack
    # All units active/idle.
    juju switch openstack
    juju remove-offer rabbitmq:amqp
    juju remove-offer keystone-credentials:identity-credentials
    juju switch openstack
    juju run mysql/leader get-password
    
    kubectl exec -n openstack mysql-0 -c mysql -- mysql -uroot -p'<password>' -e \
      "DROP DATABASE IF EXISTS workloadmgr; DROP DATABASE IF EXISTS dmapi; \
       DROP USER IF EXISTS 'charmed_dba_workloadmgr_00'@'%'; \
       DROP USER IF EXISTS 'charmed_dba_dmapi_00'@'%';"
    kubectl exec -n openstack rabbitmq-0 -c rabbitmq -- rabbitmqctl delete_vhost workloadmgr
    kubectl exec -n openstack rabbitmq-0 -c rabbitmq -- rabbitmqctl delete_vhost dmapi
    juju run keystone/leader get-admin-account
    # use the resulting openrc / OS_* values below, with --insecure for a
    # self-signed certificate
    
    openstack --insecure trust list
    openstack --insecure trust delete <trust-id>   # confirm the ID before deleting
    
    openstack --insecure service delete dmapi
    openstack --insecure service delete TrilioVaultWLM
    # deleting a service also removes its associated endpoints
    openstack --insecure user list --domain service_domain
    svc_trilio_wlm_k8s-<suffix>       # trilio-wlm-k8s's own service account
    svc_trilio_dm_api_k8s-<suffix>    # trilio-dm-api-k8s's own service account
    datamover                         # trilio-data-mover's own service account
    openstack --insecure user delete svc_trilio_dm_api_k8s-<suffix>
    openstack --insecure user delete datamover
    kubectl exec -n openstack mysql-0 -c mysql -- mysql -uroot -p'<password>' -e "SHOW DATABASES;"
    kubectl exec -n openstack rabbitmq-0 -c rabbitmq -- rabbitmqctl list_vhosts
    openstack --insecure service list
    openstack --insecure trust list
    openstack --insecure user list --domain service_domain
    # should show only the other OpenStack services' own accounts (svc_nova-*,
    # svc_cinder-*, svc_glance-*, svc_neutron-*, svc_placement-*, horizon,
    # cinder-volume, openstack-hypervisor) -- no svc_trilio_* or datamover entries
    juju status -m openstack-machines --relations
    openstack --insecure trust show <trust-id>   # confirm Trustee User ID
    openstack --insecure user delete svc_trilio_wlm_k8s-<suffix>
    # (the trust itself is deleted separately, above, via `trust delete`)

    The juju CLI is installed and logged in to the Sunbeam controller.

  • A T4O 6.2.1 license file is available. Reach out to the Trilio support team for the license file.

  • The following are already part of a standard Sunbeam deployment and require no extra setup for Trilio: MySQL, RabbitMQ, Keystone, and OpenStack Dashboard (Horizon) on the openstack model; openstack-hypervisor (Nova) on the openstack-machines model; microceph, if Ceph is the storage backend.

  • The triliovault-cfg-scripts repository is cloned on the Sunbeam bootstrap node:

  • trilio-ctlplane-bundle.yaml contains a resources: block under each application that pins the Docker image tag. Set both entries to the current tags from the release specific Resources page before deploying:

    The data plane bundle has no resources: section, because trilio-data-mover-sunbeam installs APT packages on the compute host rather than running a container. The DataMover package version is controlled by the triliovault-pkg-source option in trilio-dataplane-bundle.yaml — see the Configuration Reference below.

    This deploys trilio-wlm-k8s and trilio-dm-api-k8s at 3 replicas each and integrates them with Sunbeam's existing mysql, rabbitmq, keystone and traefik applications, including CA certificate distribution for Keystone TLS.

    The script passes --trust, which both charms require in order to patch their own StatefulSets through the Kubernetes API. Relations to Sunbeam applications this cloud does not have are reported as skipped rather than failing.

    Verify:

    Then confirm the cross-model offers the data plane will consume:

    rabbitmq and keystone-credentials must be present — the data-plane step in the next section exits if either is missing. cert-distributor (keystone:send-ca-cert) exists only on TLS-enabled clouds; where it is absent, CA distribution is reported as skipped.

    This deploys trilio-data-mover-sunbeam from Charmhub as Juju application trilio-data-mover, subordinate to openstack-hypervisor — one unit per compute node. It checks that openstack-hypervisor is present in the machine model before deploying anything, then consumes the rabbitmq, keystone-credentials and cert-distributor offers from the control-plane model and adds the DataMover's relations, including the conditional Ceph and CA-certificate ones.

    Ceph is wired only where OpenStack itself uses Ceph, through a same-model relation to microceph — it is not a cross-model offer. The relation gives the DataMover its own credentials for direct rbd access to Ceph-backed Cinder volumes. On a cloud with local or LVM-backed storage there is no microceph to relate to: the script reports the step as skipped and the DataMover runs without it. No configuration is required either way.

    Verify:

    Confirm a DataMover unit exists on every compute node. A subordinate application showing zero units is deployed but not bound to a principal, and performs no work:

    Attach Trilio's Horizon image:

    Get the value of triliovault_tag from the release specific Resources page before deploying:

    Horizon reloads automatically.

    Verify:

    T4O requires a trust between the WLM service user and the cloud administrator so it can act on behalf of tenants during backup and restore.

    Optional parameters, with defaults suitable for a standard Sunbeam deployment:

    • user-domain-name — default admin_domain

    • project-name — default admin

    • project-domain-name — default admin_domain

    Expected result: Cloud admin trust created successfully.

    The create-license action reads the license file from inside the trilio-wlm container of the unit the action runs on. Copy the file to the leader pod first, then apply it by its in-container path.

    The leader is not always pod 0. With three replicas it is frequently trilio-wlm-k8s/1 or /2, so resolve it rather than assuming:

    Expected result: License applied successfully, followed by the license details.

    OpenStack credentials are read automatically from the identity-service relation, so the action takes no password.

    All applications should report active/idle.

    The following options can be set with juju config after deployment. The defaults are suitable for a standard Sunbeam deployment.

    Option
    Default
    Description

    trustee-role

    member, creator

    Keystone roles requested for the per-tenant workload trust. The cloud admin trust created in Step 5 is separate and always requests the admin role.

    api-workers

    2

    Option
    Default
    Description

    triliovault-pkg-source

    Trilio 6.2 APT repository

    APT source line for the DataMover packages.

    debug

    false

    • A charm/channel edit to the bundle file doesn't take effect after re-running deploy_trilio.py: the script only checks whether the application already exists, not whether its channel/revision matches the file. Use juju refresh <application> --channel=<channel> or --revision=<n> directly.

    • required parameter license-file-path not specified from create-license: the action needs the license file already copied into the trilio-wlm container and referenced by its in-container path — see Step 6. juju attach-resource ... license=<file> does not apply it.

    This page is for Canonical OpenStack Sunbeam specifically. If your cloud instead uses the classic MAAS + machine-charm Canonical OpenStack deployment (charms deployed directly with juju deploy against a machine model, no Kubernetes control plane), see Getting started with Trilio on Canonical OpenStack instead. The two are not interchangeable — Sunbeam's trilio-wlm-k8s/trilio-dm-api-k8s charms and the classic trilio-wlm/trilio-dm-api charms are different charms with different deployment models.

    This page covers a fresh install of T4O 6.2.1 onto a Canonical OpenStack Sunbeam cloud that has no prior Trilio deployment.

    Prerequisites

    Canonical OpenStack (Sunbeam)
    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/sunbeam-canonical
    applications:
      trilio-wlm-k8s:
        resources:
          trilio-wlm-image: docker.io/trilio/trilio-wlm-canonical:<triliovault_tag>
    
      trilio-dm-api-k8s:
        resources:
          trilio-dm-api-image: docker.io/trilio/trilio-datamover-api-canonical:<triliovault_tag>
    ./deploy_trilio.py ctlplane
    juju switch openstack
    juju wait-for application trilio-wlm-k8s    --query='status=="active"' --timeout=10m
    juju wait-for application trilio-dm-api-k8s --query='status=="active"' --timeout=10m
    
    # All three units of each application should report active/idle
    juju status trilio-wlm-k8s trilio-dm-api-k8s
    
    # trilio-wlm-k8s pods should each show 3/3 containers ready
    kubectl get pods -n openstack | grep trilio
    juju offers -m openstack | grep -E 'rabbitmq|keystone-credentials|cert-distributor'
    ./deploy_trilio.py dataplane
    juju switch openstack-machines
    juju wait-for application -m openstack-machines trilio-data-mover --query='status=="active"' --timeout=10m
    
    # One unit per compute node, all active/idle
    juju status -m openstack-machines trilio-data-mover
    juju status -m openstack-machines openstack-hypervisor
    # Capture Horizon's current (pre-Trilio) resource state
    pre_trilio_image=$(kubectl get pod -n openstack horizon-0 -o jsonpath='{.spec.containers[?(@.name=="horizon")].image}')
    
    # Save it to a small state file at any safe location
    cat > triliovault-cfg-scripts/sunbeam-canonical/horizon-baseline.yaml <<EOF
    captured_at: <timestamp>
    model: openstack
    pre_trilio_image: ${pre_trilio_image}
    EOF
    juju attach-resource horizon \
      horizon-image=docker.io/trilio/trilio-horizon-plugin-canonical:<triliovault_tag> \
      -m openstack
    juju status horizon -m openstack
    
    kubectl exec -n openstack horizon-0 -c horizon -- \
      python3 -c 'import trilio_dashboard; print(trilio_dashboard.__file__)'
    juju switch openstack
    juju run trilio-wlm-k8s/leader create-cloud-admin-trust password=<cloud-admin-password>
    LEADER=$(juju status -m openstack trilio-wlm-k8s --format=json | python3 -c \
      'import json,sys; a=json.load(sys.stdin)["applications"]["trilio-wlm-k8s"]["units"]; \
       print(next(u for u,v in a.items() if v.get("leader")).replace("/","-"))')
    
    kubectl cp <path-to-license-file> openstack/$LEADER:/tmp/license -c trilio-wlm
    
    juju run -m openstack trilio-wlm-k8s/leader create-license \
      license-file-path=/tmp/license
    # Control plane
    juju switch openstack
    juju status trilio-wlm-k8s trilio-dm-api-k8s
    
    # Data plane
    juju switch openstack-machines
    juju status trilio-data-mover
    
    # Horizon plugin
    kubectl exec -n openstack horizon-0 -c horizon -- \
      python3 -c 'import trilio_dashboard; print(trilio_dashboard.__file__)'

    Value of trilio_branch can be taken from the release specific page.

    Some Sunbeam nodes have no bare kubectl on the PATH — only the Canonical k8s snap, which wraps it as a subcommand. If a plain kubectl command below fails with "command not found," use sudo k8s kubectl ... instead.

    Steps to install the Trilio charms

    1. Set the Docker image tags

    2. Deploy the control plane

    3. Deploy the data plane

    deploy_trilio.py's idempotency check for deploy_bundle() is presence-based only — it checks whether the target application already exists in the model, not whether the bundle file's channel:/revision: for that application matches what's actually deployed. If you edit a pinned revision or channel in the bundle file and re-run the script, it prints "... already deployed" and leaves the old revision/channel running untouched, with no warning that the file and live state now disagree. To change a channel or revision on an already-deployed Trilio application, use juju refresh <application> --channel=<channel> or --revision=<n>

    4. Attach the Horizon plugin

    Capture Horizon's pre-Trilio resource state before attaching Trilio's plugin, using the steps below. This is a manual step for now. It lets a future uninstall restore the exact image Horizon had before Trilio touched it.

    5. Create the cloud admin trust

    6. Apply the license

    juju attach-resource trilio-wlm-k8s license=<file> does not apply the license — the charm does not read that resource. Use the create-license action with license-file-path as shown below. license-file-path is required; running the action without it fails with required parameter license-file-path not specified.

    7. Verify the installation

    Backup targets are NOT configured at deploy time in T4O 6.2.1. Add them after deployment via the T4O CLI or the Horizon UI — see .

    Configuration Reference

    trilio-wlm-k8s

    trilio-data-mover

    Troubleshooting

    Getting started with Trilio on MOSK

    1. Prepare for deployment

    1.1] Install MOSK CLI Client

    Ensure the MOSK CLI client is installed on the node from which you are installing Trilio for OpenStack.

    curl -O https://get.helm.sh/helm-v3.17.2-linux-amd64.tar.gz
    tar -zxvf helm*.tar.gz
    mv linux-amd64/helm /usr/local/bin/helm
    rm -rf linux-amd64 helm*.tar.gz
    

    1.2] [Optional] Install NFS Client Package

    If you plan to use NFS as a backup target, install nfs-common on each Kubernetes node where TrilioVault is running. Skip this step for S3 backup targets.

    SSH into each Kubernetes nodes which have the following labels

    kubectl get nodes --show-labels | grep openstack-control-plane
    kubectl get nodes --show-labels | grep openstack-compute

    Run this command on the respective nodes:

    apt-get install nfs-common -y

    1.3] Install Necessary Dependencies

    Run the following command on the installation node:

    sudo apt update -y && sudo apt install make jq -y

    2] Clone Helm Chart Repository

    Refer to the link to get release specific values of the placeholder, viz trilio_branch.

    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/
    helm dep up
    cd ../../../

    3] Configure Container Image Tags

    Select the appropriate image values file based on your MOSK setup version. Update the Trilio-OpenStack image tags accordingly.

    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/2023.2.yaml

    4] Create the trilio-openstack Namespace

    To isolate trilio-openstack services, create a dedicated Kubernetes namespace:

    kubectl create namespace trilio-openstack
    kubectl config set-context --current --namespace=trilio-openstack

    5] Label Kubernetes Nodes for TrilioVault Control Plane

    Trilio for OpenStack control plane services should run on Kubernetes nodes labeled with triliovault-control-plane=enabled. Only nodes labeled with openstack-control-plane should be selected. For high availability, it is recommended to use three Kubernetes nodes.

    1] Retrieve the OpenStack control plane node names:

    2] Assign the triliovault-control-plane label to the selected nodes:

    3] Verify the nodes with the assigned label:

    Fetch ‘internal_domain_name’ and ‘public_domain_name’ of your kubernetes cluster where MOSK cloud is deployed. Get 'osdpl' object name and describe it to get the domain name as below:

    Example command output: Here 'osh-dev' is the osdpl object name.

    Here internal_domain_name=cluster.local and public_domain_name=triliodata.demo

    a) These credentials are required for Trilio deployment.

    b) Navigate to the utils directory:

    c) Generate the admin credentials file using the previously retrieved domain names

    d) Verify that the credentials file is created:

    i) Check service FQDNs ii) Check TLS Certificates (if TLS enabled)

    e) The cloud admin user in Keystone must have the admin role on the cloud domain. Update the required credentials:

    f) [IMP] Verify and Update Network Interface Values

    (i) Before proceeding, ensure the correct network interface values are configured for live migration and hypervisor communication.

    (ii) Run the following command to inspect the live migration interface:

    (iii) If the value is mcc-lcm → no change needed.

    (iv) If the value is anything else → update it in values.yaml:

    Update the following section:

    Replace "<output>" with the actual network interface name in your environment (e.g., mcc-lcm, tenant, tenant-v,).

    If your setup uses Ceph as the storage backend for Nova/Cinder, configure Ceph settings for Trilio.

    1] Run the Ceph configuration script:

    2] Verify that the output is correctly written to:

    If output is incorrect; perform manual steps:

    i) Edit the Ceph configuration file Set rbd_user and keyring (the user should have read/write access to the Nova/Cinder pools). By default, the cinder/nova user usually has these permissions, but it’s recommended to verify.

    ii) Copy your /etc/ceph/ceph.conf content to following file. Clean existing file content.

    Trilio images are hosted in a private registry. You must create an ImagePullSecret in the trilio-openstack namespace.

    1] Navigate to the utilities directory:

    2] Run the script with Trilio’s Docker registry credentials kubernetes secret:

    3] Verify that the secret has been created successfully:

    10.1.1] Open the install.sh Script

    The install.sh script installs the Trilio Helm chart in the trilio-openstack namespace.

    10.1.2] Select the Appropriate OpenStack MOSK Version

    Use the correct YAML file based on your OpenStack MOSK Version:

    • MOSK 25.1 → mosk25.1.yaml

    10.1.3] Validate values_overrides Configuration

    Ensure the correct configurations are used:

    • Disable Ceph in ceph.yaml if not applicable.

    • Remove tls_public_endpoint.yaml if TLS is unnecessary.

    Execute the installation:

    To add a new backup target, refer to the .

    Example Output:

    If the ingress service doesn’t have an IP assigned in Address column, follow these steps:

    Run this command to patch the ingress with ingressClass annotation

    13.1] Check Helm Release Status

    13.2] Validate Deployed Containers

    Ensure correct image versions are used by checking container tags or SHA digests.

    13.3] Verify Pod Status

    Example Output:

    13.4] Check Job Completion

    Example Output:

    13.5] Verify NFS Backup Target (if applicable)

    Example Output:

    13.6] Validate S3 Backup Target (if applicable)

    Ensure S3 is correctly mounted on all WLM pods.

    Run following commands to fetch hostnames and IP addresses of horizon nodes.

    • Prerequisites: Get following variable details

      1. <TRILIO_DOCKER_REGISTRY_USERNAME>, <TRILIO_DOCKER_REGISTRY_PASSWORD>

      2. <TRILIOVAULT_HORIZON_PLUGIN_IMAGE_TAG> : Please check TrilioVault release notes for TrilioVault horizon docker image tag

    • Get openstack deployment yaml file.

    • Edit your openstackdeployment.yaml and add following block under “spec->services” block. Set correct image tag for horizon plugin image here.

    STATE should be APPLIED.

    • Verify that horizon pods are in running state.

    Installation of triliovault horizon plugin is done. You can login to openstack horizon. You should see ‘Backups’ tab in openstack project space. If you are already logged in to horizon, then please logout and login again.

    Backups-Admin Area

    Trilio provides Backup-as-a-Service, which allows OpenStack Users to manage and control their backups themselves. This doesn't eradicate the need for a Backup Administrator, who has an overview of the complete Backup Solution.

    To provide Backup Administrators with the tools they need does Trilio for OpenStack provide a Backup-Admin area in Horizon in addition to the API and CLI.

    To access the Backups-Admin area follow these steps:

    1. Login to Horizon using admin user.

    2. Click on Admin Tab.

    solutions/openstack/backing-file-update at master · trilioData/solutionsGitHub
    directly instead of re-running the script.

    Number of wlm-api worker processes per unit.

    workloads-workers

    2

    Number of wlm-workloads worker processes per unit.

    dms-worker-threads

    10

    Worker threads in the co-located DMS server.

    region

    RegionOne

    OpenStack region name used for Keystone endpoint registration.

    cloud-admin-domain

    admin_domain

    Domain of the cloud administrator account.

    debug

    false

    Enable debug logging for all WLM services.

    Enable debug logging for the DataMover and DMS services.

    rabbit-quorum-queue

    true

    Use RabbitMQ quorum queues for the DataMover's messaging.

    amqp-durable-queues

    true

    Mark AMQP queues durable.

    wlm-db-url

    empty

    Optional override for the WorkloadManager database URL.

    cinder-http-retries

    10

    Number of times the DataMover retries a Cinder API call before giving up. Raise it on a cloud whose Cinder API is slow to respond or restarts during long backups.

    Resources
    Add a new Backup Target

    ssh to all nodes using IP addresses/hostname fetched in previous step and pull TrilioVault horizon image

    Steps:

    6] Setup Internal RabbitMQ instance

    7] Retrieve and Configure Keystone, Database

    7.1] Fetch Internal and Public Domain Names of the Kubernetes Cluster.

    7.2] Fetch Keystone, RabbitMQ, and Database Admin Credentials.

    8] Configure Ceph Storage (if used as Nova/Cinder Backend)

    9] Create Docker Registry Credentials Secret

    10] Install T4O Helm Chart

    10.1] Review the Installation Script

    10.2] Run the Installation Script

    11] Configure the Backup Target for Trilio-OpenStack

    12] Fetch Trilio FQDNs

    13] Verify Installation

    Trilio-OpenStack Helm Chart Installation is Done!

    14] Install Trilio Horizon Plugin

    14.1] Find horizon nodes

    14.2] SSH to above list of kubernetes nodes and run following commands. [Run this step on all Horizon nodes]

    14.3] Edit your 'openstackdeployment.yaml'

    14.4] Update the openstack cloud

    14.5] Check status of deployment:

    Add a new backup target
    Resources
    kubectl get nodes --show-labels | grep openstack-control-plane
    kubectl label nodes <NODE_NAME_1> triliovault-control-plane=enabled
    kubectl label nodes <NODE_NAME_2> triliovault-control-plane=enabled
    kubectl label nodes <NODE_NAME_3> triliovault-control-plane=enabled
    kubectl get nodes --show-labels | grep triliovault-control-plane
    ```
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./create_rabbitmq.sh
    ```
    kubectl get osdpl -n openstack
    root@ubuntu:~# kubectl get osdpl -n openstack
    NAME      OPENSTACK   AGE     DRAFT
    osh-dev   caracal     7d19h
    root@ubuntu:~# kubectl describe osdpl osh-dev -n openstack | grep domain
      internal_domain_name:             cluster.local
      public_domain_name:               triliodata.demo
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./get_admin_creds_mosk.sh <internal_domain_name> <public_domain_name>
    Example:
    ./get_admin_creds_mosk.sh cluster.local setup.triliodata.demo
    cd ../../../../
    cat triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/admin_creds.yaml
    cat triliovault-cfg-scripts/openstack-helm/trilio-openstack/templates/bin/_triliovault-nova-compute.conf.tpl
    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/keystone.yaml
    $ kubectl describe osdpl osh-dev -n openstack | grep live_migration_interface
    Example output:
        live_migration_interface:  mcc-lcm
    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values.yaml
    libvirt:
      images_rbd_ceph_conf: /etc/ceph/ceph.conf
      live_migration_interface: "<output>"          # Interface used for live migration traffic
      hypervisor_host_interface: "<output>"         # Interface used for live migration traffic
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./get_ceph_mosk.sh
    cat ../values_overrides/ceph.yaml
    cat ../templates/bin/_triliovault-ceph.conf.tpl
    vi ../values_overrides/ceph.yaml
    vi ../templates/bin/_triliovault-ceph.conf.tpl
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./create_image_pull_secret.sh <TRILIO_REGISTRY_USERNAME> <TRILIO_REGISTRY_PASSWORD>
    kubectl describe secret triliovault-image-registry -n trilio-openstack
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
    vi install.sh
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
    ./install.sh
    kubectl -n trilio-openstack get ingress
    root@master:~# kubectl -n trilio-openstack get ingress
    NAME                                   CLASS           HOSTS                                                                                                                   ADDRESS       PORTS     AGE
    triliovault-datamover                  nginx           triliovault-datamover,triliovault-datamover.trilio-openstack,triliovault-datamover.trilio-openstack.svc.cluster.local   192.168.2.5   80        14h
    triliovault-datamover-cluster-fqdn     nginx-cluster   triliovault-datamover.triliodata.demo                                                                                                 80, 443   14h
    triliovault-datamover-namespace-fqdn   nginx           triliovault-datamover.triliodata.demo                                                                                   192.168.2.5   80, 443   14h
    triliovault-wlm                        nginx           triliovault-wlm,triliovault-wlm.trilio-openstack,triliovault-wlm.trilio-openstack.svc.cluster.local                     192.168.2.5   80        14h
    triliovault-wlm-cluster-fqdn           nginx-cluster   triliovault-wlm.triliodata.demo                                                                                                       80, 443   14h
    triliovault-wlm-namespace-fqdn         nginx           triliovault-wlm.triliodata.demo                                                                                         192.168.2.5   80, 443   14h
    
    for i in $(kubectl get ingress -n trilio-openstack -o name); do
      kubectl patch -n trilio-openstack "$i" --type='json' -p='[
        {"op": "remove", "path": "/spec/ingressClassName"},
        {"op": "add", "path": "/metadata/annotations/kubernetes.io~1ingress.class", "value": "openstack-ingress-nginx"}
      ]' || echo "Skipping $i (possibly missing ingressClassName)"
    done
    helm status trilio-openstack
    kubectl get pods -n trilio-openstack
    NAME                                                 READY   STATUS      RESTARTS   AGE
    triliovault-datamover-api-5c7fbb949c-2m8dc           1/1     Running     0          21h
    triliovault-datamover-api-5c7fbb949c-kxspg           1/1     Running     0          21h
    triliovault-datamover-api-5c7fbb949c-z4wkn           1/1     Running     0          21h
    triliovault-datamover-db-init-7k7jg                  0/1     Completed   0          21h
    triliovault-datamover-db-sync-6jkgs                  0/1     Completed   0          21h
    triliovault-datamover-ks-endpoints-gcrht             0/3     Completed   0          21h
    triliovault-datamover-ks-service-nnnvh               0/1     Completed   0          21h
    triliovault-datamover-ks-user-td44v                  0/1     Completed   0          20h
    triliovault-datamover-openstack-compute-node-4gkv8   1/1     Running     0          21h
    triliovault-datamover-openstack-compute-node-6lbc4   1/1     Running     0          21h
    triliovault-datamover-openstack-compute-node-pqslx   1/1     Running     0          21h
    triliovault-wlm-api-7647c4b45c-52449                 1/1     Running     0          21h
    triliovault-wlm-api-7647c4b45c-h47mw                 1/1     Running     0          21h
    triliovault-wlm-api-7647c4b45c-rjbvl                 1/1     Running     0          21h
    triliovault-wlm-cloud-trust-h8xgq                    0/1     Completed   0          20h
    triliovault-wlm-cron-574ff78486-54rqg                1/1     Running     0          21h
    triliovault-wlm-db-init-hvk65                        0/1     Completed   0          21h
    triliovault-wlm-db-sync-hpl4c                        0/1     Completed   0          21h
    triliovault-wlm-ks-endpoints-4bsxl                   0/3     Completed   0          21h
    triliovault-wlm-ks-service-btcb4                     0/1     Completed   0          21h
    triliovault-wlm-ks-user-gnfdh                        0/1     Completed   0          20h
    triliovault-wlm-rabbit-init-ws262                    0/1     Completed   0          21h
    triliovault-wlm-scheduler-669f4758b4-ks7qr           1/1     Running     0          21h
    triliovault-wlm-workloads-5ff86448c-mj8p2            1/1     Running     0          21h
    triliovault-wlm-workloads-5ff86448c-th6f4            1/1     Running     0          21h
    triliovault-wlm-workloads-5ff86448c-zhr4m            1/1     Running     0          21h
    kubectl get jobs -n trilio-openstack
    NAME                                 COMPLETIONS   DURATION   AGE
    triliovault-datamover-db-init        1/1           5s         21h
    triliovault-datamover-db-sync        1/1           8s         21h
    triliovault-datamover-ks-endpoints   1/1           17s        21h
    triliovault-datamover-ks-service     1/1           18s        21h
    triliovault-datamover-ks-user        1/1           19s        21h
    triliovault-wlm-cloud-trust          1/1           2m10s      20h
    triliovault-wlm-db-init              1/1           5s         21h
    triliovault-wlm-db-sync              1/1           20s        21h
    triliovault-wlm-ks-endpoints         1/1           17s        21h
    triliovault-wlm-ks-service           1/1           17s        21h
    triliovault-wlm-ks-user              1/1           19s        21h
    triliovault-wlm-rabbit-init          1/1           4s         21h
    kubectl get pvc -n trilio-openstack
    triliovault-nfs-pvc-172-25-0-10-mnt-tvault-42424   Bound   triliovault-nfs-pv-172-25-0-10-mnt-tvault-42424   20Gi   RWX   nfs   6d
    kubectl get nodes -o wide --show-labels | grep openstack-control-plane=enabled |  awk '{print $1, $6;}'
    # Sample output:
    -------------------
    root@helm1# kubectl get nodes -o wide --show-labels | grep openstack-control-plane=enabled |  awk '{print $1, $6;}'
    helm2 172.25.10.203
    helm3 172.25.10.204
    helm4 172.25.10.205
    # ssh to horizon nodes
    ssh <HORIZON_NODE_IP>
    # Login to TrilioVault Docker Image Registry
    docker login docker.io -u <TRILIO_DOCKER_REGISTRY_USERNAME> -p <TRILIO_DOCKER_REGISTRY_PASSWORD>
    # Pull TrilioVault Horizon Plugin Image
    docker pull docker.io/trilio/trilio-horizon-plugin-helm:<TRILIOVAULT_HORIZON_PLUGIN_IMAGE_TAG>
    ## Get mosk openstack deployment resource name
    kubectl -n openstack get osdpl
    
    ## Example: Here 'osh-dev' is mosk openstack deployment resource name
    kubectl -n openstack get osdpl
    NAME      OPENSTACK   AGE    DRAFT
    osh-dev   victoria    243d
    
    ## Get it's resource definition file in yaml format.
    kubectl -n openstack get osdpl ${OSDPL_RESOURCE_NAME} -o yaml > openstackdeployment.yaml
    ## Example
    kubectl -n openstack get osdpl osh-dev -o yaml > openstackdeployment.yaml
      services:
        dashboard:
          horizon:
            values:
              images:
                tags:
                  horizon: docker.io/trilio/trilio-horizon-plugin-helm:<TRILIOVAULT_HORIZON_PLUGIN_IMAGE_TAG>
    kubectl apply -f openstackdeployment.yaml
    kubectl -n openstack get osdplst
    ##Sample output of update completed state:
    --------------------------------------------
    root@helm1:# kubectl -n openstack get osdplst
    NAME      OPENSTACK VERSION   CONTROLLER VERSION   STATE
    osh-dev   victoria            0.8.3                APPLIED
    kubectl get pods -n openstack | grep horizon
    ## Sample output
    root@helm1:# kubectl get pods -n openstack | grep horizon
    horizon-f9d4c747d-8wmzt                                        1/1     Running     0          4d20h
    horizon-f9d4c747d-lhplg                                        1/1     Running     0          4d19h

    Navigate to Backups-Admin Tab.

  • Navigate to Trilio page.

  • The Backups-Admin area provides the following features.

    It is possible to reduce the shown information down to a single tenant. That way seeing the exact impact the chosen Tenant has.

    The status overview is always visible in the Backups-Admin area. It provides the most needed information on a glance, including:

    • Storage Usage (nfs only)

    • Number of protected VMs compared to number of existing VMs

    • Number of currently running Snapshots

    • Status of TVault Nodes

    • Status of Contego Nodes

    This tab provides information about all currently existing Workloads. It is the most important overview tab for every Backup Administrator and therefor the default tab shown when opening the Backup-Admins area.

    The following information are shown:

    • User-ID that owns the Workload

    • Project that contains the Workload

    • Workload name

    • Availability Zone

    • Amount of protected VMs

    • Performance information about the last 30 backups

      • How much data was backed up (green bars)

      • How long did the Backup take (red line)

    • Piechart showing amount of Full (Blue) Backups compared to Incremental (Red) Backups

    • Number of successful Backups

    • Number of failed Backups

    • Storage used by that Workload

    • Which Backup target is used

    • When is the next Snapshot run

    • What is the general intervall of the Workload

    • Scheduler Status including a Switch to deactivate/activate the Workload

    Administrators often need to figure out, where a lot of resources are used up, or they need to quickly provide usage information to a billing system. This tab helps in these tasks by providing the following information:

    • Storage used by a Tenant

    • VMs protected by a Tenant

    It is possible to drill down to see the same information per workload and finally per protected VM.

    This tab displays information about Trilio cluster nodes. The following information are shown:

    • Node name

    • Node ID

    • Trilio Version of the node

    • IP Address

    • Node Status including a Switch to deactivate/activate the Node

    Node status can be controlled through CLI as well.

    To deactivate the Trilio Node use:

    • --reason➡️Optional reason for disabling workload service

    • <node_name>➡️name of the Trilio node

    To activate the Trilio Node use:

    • <node_name>➡️name of the Trilio node

    This tab displays information about Trilio contego service. The following information are shown:

    • Service-Name

    • Compute Node the service is running on

    • Service Status from OpenStack perspective (enabled/disabled)

    • Version of the Service

    • General Status

    This tab displays information about the backup target storage. It contains the following information:

    • Storage Name

    • Capacity of the storage

    • Total utilization of the storage

    • Status of the storage

    • Statistic information

      • Percentage all storages are used

      • Percentage how much storage is used for full backups

      • Amount of Full backups versus Incremental backups

    Audit logs provide the sequence of workload related activities done by users, like workload creation, snapshot creation, etc. The following information are shown:

    • Time of the entry

    • What task has been done

    • Project the task has performed in

    • User that performed the task

    The Audit log can be searched for strings to find for example only entries down by a specific user.

    Additionally, can the shown timeframe be changed as necessary.

    The license tab provides an overview over the current license and allows to upload new licenses, or validate the current license.

    The following information about an active license are shown:

    • Organization (License name)

    • License ID

    • Purchase date - when was the license created

    • License Expiry Date

    • Maintenance Expiry Date

    • License value

    • License Edition

    • License Version

    • License Type

    • Description of the License

    • Evaluation (True/False)

    • EULA - when was the license agreed

    The policy tab gives Administrators the possibility to work with workload policies.

    This tab manages all global settings for the whole cloud. Trilio has two types of settings:

    1. Email settings

    2. Job scheduler settings.

    These settings will be used by Trilio to send email reports of snapshots and restores to users.

    The following information are required to configure the email settings:

    • SMTP Server

    • SMTP username

    • SMTP password

    • SMTP port

    • SMTP timeout

    • Sender email address

    • Global recipients

    To work with email settings through CLI use the following commands:

    To set an email setting for the first time or after deletion use:

    • --description➡️Optional description (Default=None) ➡️ Not required for email settings

    • --category➡️Optional setting category (Default=None) ➡️ Not required for email settings

    • --type➡️settings type ➡️ set to email_settings

    • --is-public➡️sets if the setting can be seen publicly ➡️ set to False

    • --is-hidden➡️sets if the setting will always be hidden ➡️ set to False

    • --metadata➡️sets if the setting can be seen publicly ➡️ Not required for email settings

    • <name>➡️name of the setting ➡️ Take from the list below

    • <value>➡️value of the setting ➡️ Take value type from the list below

    To update an already set email setting through CLI use:

    • --description➡️Optional description (Default=None) ➡️ Not required for email settings

    • --category➡️Optional setting category (Default=None) ➡️ Not required for email settings

    • --type➡️settings type ➡️ set to email_settings

    • --is-public➡️sets if the setting can be seen publicly ➡️ set to False

    • --is-hidden➡️sets if the setting will always be hidden ➡️ set to False

    • --metadata➡️sets if the setting can be seen publicly ➡️ Not required for email settings

    • <name>➡️name of the setting ➡️ Take from the list below

    • <value>➡️value of the setting ➡️ Take value type from the list below

    To show an already set email setting use:

    • --get_hidden➡️show hidden settings (True) or not (False) ➡️ Not required for email settings, use False if set

    • <setting_name>➡️name of the setting to show➡️ Take from the list below

    To delete a set email setting use:

    • <setting_name>➡️name of the setting to delete ➡️ Take from the list below

    Setting name
    Value type
    example

    smtp_default_recipient

    String

    admin@example.net

    smtp_default_sender

    String

    The Global Job Scheduler can be used to deactivate all scheduled workloads without modifying each one of them.

    To activate/deactivate the Global Job Scheduler through the Backups-Admin area:

    1. Login to Horizon using admin user.

    2. Click on Admin Tab.

    3. Navigate to Backups-Admin Tab.

    4. Navigate to Trilio page.

    5. Navigate to the Settings tab

    6. Click "Disable/Enable Job Scheduler"

    7. Check or Uncheck the box for "Job Scheduler Enabled"

    8. Confirm by clicking on "Change"

    The Global Job Scheduler can be controlled through CLI as well.

    To get the status of the Global Job Scheduler use:

    To deactivate the Global Job Scheduler use:

    To activate the Global Job Scheduler use:

    Access the Backups-Admin area

    workloadmgr workload-service-disable [--reason <reason>] <node_name>
    workloadmgr workload-service-enable <node_name>
    workloadmgr setting-create [--description <description>]
                               [--category <category>]
                               [--type <type>]
                               [--is-public {True,False}]
                               [--is-hidden {True,False}]
                               [--metadata <key=value>]
                               <name> <value>
    workloadmgr setting-update [--description <description>]
                               [--category <category>]
                               [--type <type>]
                               [--is-public {True,False}]
                               [--is-hidden {True,False}]
                               [--metadata <key=value>]
                               <name> <value>
    workloadmgr setting-show [--get_hidden {True,False}] <setting_name>
    workloadmgr setting-delete <setting_name>
    workloadmgr get-global-job-scheduler
    workloadmgr disable-global-job-scheduler
    workloadmgr enable-global-job-scheduler

    Status overview

    The status of nodes is filled when the services are running and in good status.

    Workloads tab

    Usage tab

    The Usage tab includes workloads and VMs that are no longer actively used by a Tenant, but exist on the backup target.

    Nodes tab

    Data Movers tab (Trilio Data Mover Service)

    Storage tab

    Clicking on the Storage name provides an overview of all workloads stored on that storage.

    Audit tab

    License tab

    A license validation is automatically done, when opening the tab.

    Trilio will stop all activities once a license is no longer valid or expired.

    Policy tab

    Please use in the Admin guide to learn more about how to create and use Workload Policies.

    Settings tab

    Email Settings

    Configuring the Email settings is a must-have to provide Email notification to OpenStack users.

    Global recipients is optional. Provide a comma separated list of email addresses (for example admin1@example.net, admin2@example.net) that will be CC'd on every snapshot and restore notification, in addition to the workload owner.

    A test email can be sent directly from the configuration page.

    smtp_global_recipients is optional. It accepts a comma separated list of email addresses that will be CC'd on every snapshot and restore notification, in addition to the workload owner.

    Disable/Enable Job Scheduler

    Getting started with Trilio on OpenStack-Helm

    1. Prepare for deployment

    1.1] Install Helm CLI Client

    Ensure the Helm CLI client is installed on the node from which you are installing Trilio for OpenStack.

    curl -O https://get.helm.sh/helm-v3.17.2-linux-amd64.tar.gz
    tar -zxvf helm*.tar.gz
    mv linux-amd64/helm /usr/local/bin/helm
    rm -rf linux-amd64 helm*.tar.gz
    

    1.2] (Optional) Install NFS Client Package

    If you plan to use NFS as a backup target, install nfs-common on each Kubernetes node where TrilioVault is running. Skip this step for S3 backup targets.

    SSH into each Kubernetes nodes which have the following labels

    kubectl get nodes --show-labels | grep openstack-control-plane
    kubectl get nodes --show-labels | grep openstack-compute

    Run this command on the respective nodes:

    sudo apt-get install nfs-common -y

    1.3] Install Necessary Dependencies

    Run the following command on the installation node:

    sudo apt update -y && sudo apt install make jq -y

    2] Clone Helm Chart Repository

    Refer to the link to get release specific values of the placeholder, viz trilio_branch.

    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/
    helm dep up
    cd ../../../

    3] Configure Container Image Tags

    Select the appropriate image values file based on your OpenStack-Helm setup. Update the Trilio-Openstack image tags accordingly.

    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/2023.2.yaml

    If your OS Helm cloud version is 2023.1 then images yaml file name is 2023.1.yaml

    4] Create the trilio-openstack Namespace

    To isolate trilio-openstack services, create a dedicated Kubernetes namespace:

    Trilio for OpenStack control plane services should run on Kubernetes nodes labeled with triliovault-control-plane=enabled. Only nodes labeled with openstack-control-plane should be selected. For high availability, it is recommended to use three Kubernetes nodes.

    1] Retrieve the OpenStack control plane node names:

    2] Assign the triliovault-control-plane label to the selected nodes:

    3] Verify the nodes with the assigned label:

    The cloud admin user in Keystone must have the admin role on the cloud domain. Update the required credentials in below file:

    1. Separate RabbitMQ Installation:

    2. Fetch Internal and Public Domain Names of the Kubernetes Cluster

    3. Fetch Keystone, RabbitMQ, and Database Admin Credentials a. These credentials are required for Trilio deployment. b. Navigate to the utils directory:

      c. Generate the admin credentials file using the previously retrieved domain names

    If your setup uses Ceph as the storage backend for Nova/Cinder, configure Ceph settings for Trilio.

    Manual Approach

    1] Edit the Ceph configuration file:

    a) Set rbd_user and keyring (the user should have read/write access to the Nova/Cinder pools). b) By default, the cinder/nova user usually has these permissions, but it’s recommended to verify.

    2] Copy the contents of /etc/ceph/ceph.conf into the appropriate Trilio template file:

    Automated Approach

    1] Run the Ceph configuration script:

    2] Verify that the output is correctly written to:

    Trilio images are hosted in a private registry. You must create an ImagePullSecret in the trilio-openstack namespace.

    1] Navigate to the utilities directory:

    2] Run the script with Trilio’s Docker registry credentials kubernetes secret:

    3] Verify that the secret has been created successfully:

    10.1.1] Open the install.sh Script

    The install.sh script installs the Trilio Helm chart in the trilio-openstack namespace.

    10.1.2] Select the Appropriate OpenStack Helm Version

    Use the correct YAML file based on your OpenStack Helm Version:

    • Antelope → 2023.1.yaml

    • Bobcat (Default)→ 2023.2.yaml

    10.1.3] Validate values_overrides Configuration

    Ensure the correct configurations are used:

    • Disable Ceph in ceph.yaml if not applicable.

    • Remove tls_public_endpoint.yaml if TLS is unnecessary.

    Execute the installation:

    10.3.1] Retrieve Ingress External IP

    Example Output:

    To add a new backup target, refer to the .

    Example Output:

    If the ingress service doesn’t have an IP assigned, follow these steps:

    1] Check the Ingress Controller Deployment

    Look for the ingress-nginx-controller deployment, typically in the ingress-nginx or kube-system namespace:

    2] Verify the --watch-namespace Arg

    If the controller has a --watch-namespace argument, it means it’s watching only specific namespaces for ingress resources.

    3] Update watch-namespace to include trilio-openstack

    Edit the deployment to include trilio-openstack in the comma-separated list of namespaces:

    Example --watch-namespace arg:

    4] Restart the Controller

    This will happen automatically when you edit the deployment, but you can manually trigger it if needed:

    13.1] Check Helm Release Status

    13.2] Validate Deployed Containers

    Ensure correct image versions are used by checking container tags or SHA digests.

    13.3] Verify Pod Status

    Example Output:

    13.4] Check Job Completion

    Example Output:

    13.5] Verify NFS Backup Target (if applicable)

    Example Output:

    13.6] Validate S3 Backup Target (if applicable)

    Ensure S3 is correctly mounted on all WLM pods.

    Logs:

    1] triliovault-datamover-api service logs.

    Logs available on kuberentes nodes

    2] trliovault-datamover service logs

    Logs available on kuberentes nodes

    3] triliovault-wlm-api, triliovault-wlm-cron, triliovault-wlm-scheduler, triliovault-wlm-workloads services logs

    Logs available on kuberentes nodes

    Below are the steps to patch the Horizon deployment in an OpenStack Helm setup to install the Trilio Horizon Plugin.

    • Horizon is deployed via OpenStack Helm and is running in the openstack namespace.

    • Docker registry secret triliovault-image-registry must already exist in the openstack namespace from the steps performed during Trilio Installation.

    • If not already created, follow this command:

    Use the command below to patch the Horizon deployment with the Trilio Horizon Plugin image. Update the image tag as needed for your release.

    After patching:

    1. Ensure the Horizon pods are restarted and running with the new image:

    1. Access the Horizon dashboard and verify the TrilioVault section appears in the UI.

    6.2.1

    Learn about artifacts related to Trilio for OpenStack 6.2.1

    Trilio Branch

    Branch of the repository to be used for DevOps scripts.

    trilio_branch : 6.2.1

    Trilio Branch for Grafana setup

    Branch of the repository to enable grafana monitoring on RHOSO18.0.

    trilio_grafana_branch : 6.2.1

    Deployment Scripts

    git clone -b 6.2.1 https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/
    git clone -b 6.2.1 https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/kolla-ansible/ansible
    git clone -b 6.2.1 https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/openstack-helm
    git clone -b 6.2.1 https://github.com/trilioData/triliovault-cfg-scripts.git
    #For MAAS & Charms based Canonical Openstack
    cd triliovault-cfg-scripts/juju-charms/sample_overlay_bundles
    
    #For Sunbeam (Kubernetes based) Canonical Openstack
    cd triliovault-cfg-scripts/sunbeam-canonical

    Container/Revision Information

    RHOSP Version
    Container URLs

    Note: Use the standard operator image for FR5 and the FR6-specific operator image for RHOSO18 FR6 deployments.

    Feature Release
    rabbitmq/mariadb Image Tags

    Important: Use the RabbitMQ and MariaDB image tags that match your RHOSO Feature Release.

    Kolla Version
    triliovault_tag
    triliovault_dms_tag
    kolla_base_distro
    MOSK/Helm Version
    Container URLs
    Parameters / Variables
    Values

    All packages are Python 3 (py3.6 - py3.10) compatible only.

    Repo URL:

    Name
    Version

    Workloads

    Definition

    A workload is a backup job that protects one or more Virtual Machines according to a configured policy. There can be as many workloads as needed. But each VM can only be part of one Workload.

    Using encrypted Workload will lead to longer backup times. The following timings have been seen in Trilio labs:

    Snapshot time for LVM Volume Booted CentOS VM. Disk size 200 GB; total data including OS : ~108GB

    1. For unencrypted WL : 62 min

    List of Workloads

    Using Horizon

    To view all available workloads of a project inside Horizon do:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    The overview in Horizon lists all workloads with the following additional information:

    • Creation time

    • Workload Name

    • Workload description

    • Total amount of Snapshots inside this workload

    • --all {True,False}➡️List all workloads of all projects (valid for admin user only)

    • --nfsshare <nfsshare>➡️List all workloads of nfsshare (valid for admin user only)

    To create a workload inside Horizon do the following steps:

    1. Login to Horizon

    2. Navigate to the Backups

    3. Navigate to Workloads

    4. Click "Create Workload"

    The created Workload will be available after a few seconds and starts to take backups according to the provided schedule and policy.

    • --display-name➡️Optional workload name. (Default=None)

    • --display-description➡️Optional workload description. (Default=None)

    • --source-platform➡️Workload source platform is required. Supported platforms is 'openstack'

    A workload contains many information, which can be seen in the workload overview.

    To enter the workload overview inside Horizon do the following steps:

    1. Login to Horizon

    2. Navigate to the Backups

    3. Navigate to Workloads

    4. Identify the workload to show the details on

    The Workload Details tab provides you with the general most important information about the workload:

    • Name

    • Description

    • Availability Zone

    • List of protected VMs including the information of qemu guest agent availability

    The Workload Snapshots Tab shows the list of all available Snapshots in the chosen Workload.

    From here it is possible to work with the Snapshots, create Snapshots on demand and start Restores.

    The Workload Policy Tab gives an overview of the current configured scheduler and retention policy. The following elements are shown:

    • Scheduler Enabled / Disabled

    • Start Date / Time

    • End Date / Time

    • RPO

    The Workload Filesearch Tab provides access to the powerful search engine, which allows to find files and folders on Snapshots without the need of a restore.

    The Workload Miscellaneous Tab shows the remaining metadata of the Workload. The following information are provided:

    • Creation time

    • last update time

    • Workload ID

    • <workload_id> ➡️ ID/name of the workload to show

    • --verbose➡️option to show additional information about the workload

    Workloads can be modified in all components to match changing needs.

    To edit a workload in Horizon do the following steps:

    1. Login to the Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload to be modified

    • --display-name ➡️ Optional workload name. (Default=None)

    • --display-description➡️Optional workload description. (Default=None)

    • --instance <instance-id=instance-uuid>➡️Specify an instance to include in the workload. Specify option multiple times to include multiple instances. instance-id: include the instance with this UUID

    Once a workload is no longer needed it can be safely deleted.

    To delete a workload do the following steps:

    1. Login to Horizon

    2. Navigate to the Backups

    3. Navigate to Workloads

    4. Identify the workload to be deleted

    • <workload_id> ➡️ ID/name of the workload to delete

    • --database_only <True/False>➡️Keep True if want to delete from database only.(Default=False)

    Workloads that are actively taking backups or restores are locked for further tasks. It is possible to unlock a workload by force if necessary.

    1. Login to the Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload to unlock

    • <workload_id> ➡️ ID of the workload to unlock

    In rare cases it might be necessary to start a backup chain all over again, to ensure the quality of the created backups. To not recreate a Workload in such cases is it possible to reset a Workload.

    The Workload reset will:

    • Cancel all ongoing tasks

    • Delete all existing OpenStack Trilio Snapshots from the protected VMs

    • recalculate the next Snapshot time

    • take a full backup at the next Snapshot

    To reset a Workload do the following steps:

    1. Login to the Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload to reset

    • <workload_id> ➡️ ID/name of the workload to reset

    Managing Trusts

    OpenStack Administrators should never have the need to directly work with the trusts created.

    The cloud-trust is created during the Trilio configuration and further trusts are created as necessary upon creating or modifying a workload.

    List Trusts

    GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts

    Provides the lists of trusts for the given Tenant.

    Path Parameters

    Name
    Type
    Description
    Name
    Type
    Description
    Name
    Type
    Description

    POST https://$(tvm_address):8780/v1/$(tenant_id)/trusts

    Creates a workload in the provided Tenant/Project with the given details.

    Name
    Type
    Description
    Name
    Type
    Description

    GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts/<trust_id>

    Shows all details of a specified trust

    Name
    Type
    Description
    Name
    Type
    Description

    DELETE https://$(tvm_address):8780/v1/$(tenant_id)/trusts/<trust_id>

    Deletes the specified trust.

    Name
    Type
    Description
    Name
    Type
    Description

    GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts/validate/<workload_id>

    Validates the Trust of a given Workload.

    Name
    Type
    Description
    Name
    Type
    Description

    E-Mail Notification Settings

    E-Mail Notification Settings are done through the settings API. Use the values from the following table to set Email Notifications up through API.

    Setting name
    Settings Type
    Value type
    example

    smtp_default___recipient

    email_settings

    POST https://$(tvm_address):8780/v1/$(tenant_id)/settings

    Creates a Trilio setting.

    Name
    Type
    Description
    Name
    Type
    Description

    Setting create requires a Body in json format, to provide the requested information.

    GET https://$(tvm_address):8780/v1/$(tenant_id)/settings/<setting_name>

    Shows all details of a specified setting

    Name
    Type
    Description
    Name
    Type
    Description

    PUT https://$(tvm_address):8780/v1/$(tenant_id)/settings

    Modifies the provided setting with the given details.

    Name
    Type
    Description
    Name
    Type
    Description

    Workload modify requires a Body in json format, to provide the information about the values to modify.

    DELETE https://$(tvm_address):8780/v1/$(tenant_id)/settings/<setting_name>

    Deletes the specified Workload.

    Name
    Type
    Description
    Name
    Type
    Description

    Schedulers

    Disable Workload Scheduler

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/<workload_id>/pause

    Disables the scheduler of a given Workload

    Path Parameters

    Name
    Type
    Description
    Name
    Type
    Description

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/<workload_id>/resume

    Enables the scheduler of a given Workload

    Name
    Type
    Description
    Name
    Type
    Description

    GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts/validate/<workload_id>

    Validates the Scheduler trust for a given Workload

    Name
    Type
    Description
    Name
    Type
    Description

    GET https://$(tvm_address):8780/v1/$(tenant_id)/global_job_scheduler

    Requests the status of the Global Job Scheduler

    Name
    Type
    Description
    Name
    Type
    Description

    POST https://$(tvm_address):8780/v1/$(tenant_id)/global_job_scheduler/disable

    Requests disabling the Global Job Scheduler

    Name
    Type
    Description
    Name
    Type
    Description

    POST https://$(tvm_address):8780/v1/$(tenant_id)/global_job_scheduler/enable

    Requests enabling the Global Job Scheduler

    Name
    Type
    Description
    Name
    Type
    Description

    Upgrading on OpenStack-Helm/MOSK

    Note: Run following steps on node from where you have install openstack cloud helm charts. (Master Node)

    1] Clone trilio-openstack helm chart code repository [Run on Install Client Node]

    • ssh to 'installation client node'

    'Installation Client Node' is the node from where user has executed helm install command for trilio-openstack helm chart

    ## Change name of old 'triliovault-cfg-scripts' repository directory.
    mv triliovault-cfg-scripts triliovault-cfg-scripts-old
    ## Clone latest git repository 'triliovault-cfg-scripts'.
    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/
    helm dep up
    cd ../../../

    2] Set container image tags [Run on Install Client Node]

    Set updated image tags for trilio-openstack images and other images mentioned in following file.

    Edit below file.

    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/2023.2.yaml

    Replace content of above 2023.2.yaml file with below YAML block with upgrade image tags.

    ---
    images:
      tags:
        bootstrap: docker.io/openstackhelm/heat:2023.2-ubuntu_jammy
        db_init: docker.io/openstackhelm/heat:2023.2-ubuntu_jammy
        db_drop: docker.io/openstackhelm/heat:2023.2-ubuntu_jammy
        rabbit_init: docker.io/rabbitmq:3.7-management
        ks_user: docker.io/openstackhelm/heat:2023.2-ubuntu_jammy
        ks_service: docker.io/openstackhelm/heat:2023.2-ubuntu_jammy
        ks_endpoints: docker.io/openstackhelm/heat:2023.2-ubuntu_jammy
        dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0
        image_repo_sync: docker.io/docker:17.07.0
        triliovault_wlm_cloud_trust: docker.io/trilio/trilio-wlm-helm:<image-tag>
        triliovault_wlm_api: docker.io/trilio/trilio-wlm-helm:<image-tag>
        triliovault_wlm_cron: docker.io/trilio/trilio-wlm-helm:<image-tag>
        triliovault_wlm_scheduler: docker.io/trilio/trilio-wlm-helm:<image-tag>
        triliovault_wlm_workloads: docker.io/trilio/trilio-wlm-helm:<image-tag>
        triliovault_wlm_db_sync: docker.io/trilio/trilio-wlm-helm:<image-tag>
        triliovault_datamover: docker.io/trilio/trilio-datamover-helm:<image-tag>
        triliovault_datamover_api: docker.io/trilio/trilio-datamover-api-helm:<image-tag>
        triliovault_datamover_db_sync: docker.io/trilio/trilio-datamover-api-helm:<image-tag>

    The image values file name for MOSK depends on the MOSK cloud version. For example, if your MOSK cloud version is 25.1, the corresponding image YAML file would be named mosk25.1.yaml

    Use the correct YAML file based on your OpenStack Helm Version:

    • Antelope → 2023.1.yaml

    • Bobcat (Default)→ 2023.2.yaml

    • MOSK 25.1 → mosk25.1.yaml

    • If your backup target is of type ‘nfs' then you can provide it’s details in nfs.yaml. Your old nfs share details will be available in file ‘triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/values_overrides/nfs.yaml' Copy those details in following file in given format. You need to provide the same share here.

    • If the backup target for trilio-openstack is of ‘s3' type with S3 backend has TLS enabled with self signed certificates, then user needs store it’s ca certificate in the following file. It will be placed at correct location by deployment scripts. We can copy this certificate from old repo to current one using following command.

    Provide cloud administrator user details in the following file. It should have 'admin' role on cloud domain.

    You can copy these details from old repository file ‘triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/values_overrides/keystone.yaml'

    [For OpenStack Helm]:

    1. If Separate RabbitMQ is not present, install it using following script:

    1. Fetch Internal and Public Domain Names of the Kubernetes Cluster

    2. Generate the admin credentials file using the previously retrieved domain names

    [For MOSK]:

    1. Copy following files from old repository to current one as it is. [No changes from triliovault install side]

    2. If you do not have these old files, then you need to perform the same step from 'TrilioVault install document on Openstack MOSK'

    1. Fetch Internal and Public Domain Names of the Kubernetes Cluster

    2. Generate the admin credentials file using the previously retrieved domain names in

    You can copy ceph.yaml from old repository to current repository as it is. [No changes from triliovault install side]

    No changes here. So old registry credentials should work fine. Just ensure that it exists.

    If user credentials are changed or old secret does not exist; then we need to recreate it. In that case follow this step from installation document.

    • User need to edit following file and review all the yaml files and options provide in command.

    • If any option is not valid for your Openstack Helm setup, you need to edit it.

    • Yaml files that user has used in install.sh should be available in upgrade.sh too.

    • Make sure that nfs.yaml/s3.yaml(Both not required- select as per backup target type) and keystone.yaml should be available in upgrade.sh.

    Trilio For Openstack Helm Chart Upgrade is Done!

    • Follow from section 12.2 to section 12.3 and update the trilio horizon plugin image tag.

    • Set correct image tag for horizon plugin image.

    • Follow further steps from above doc to complete the upgrade of Trilio horizon plugin.

    • Follow from section 12 to section 12.5 and update the trilio horizon plugin image tag.

    • Set correct image tag for horizon plugin image.

    • Follow further steps from above doc to complete the upgrade of Trilio horizon plugin.

    admin@example.net

    smtp_port

    Integer

    587

    smtp_server_name

    String

    Mailserver_A

    smtp_server_username

    String

    admin

    smtp_server_password

    String

    password

    smtp_timeout

    Integer

    10

    smtp_email_enable

    Boolean

    True

    smtp_global_recipients

    String

    admin1@example.net, admin2@example.net

    Workload Policies
    Verify that the credentials file is created:

    5] Label Kubernetes Nodes for TrilioVault Control Plane

    Steps:

    6] Provide Cloud Admin Credentials in keystone.yaml

    7] Retrieve and Configure Keystone, Database and RabbitMQ Credentials

    For Openstack Helm; Please ensure that the correct ca.crt is present inside the secret “trilio-ca-cert” in the openstack namespace. If the secret is created with a different name, make sure to update the reference in the ./get_admin_creds.sh script before executing it.

    8] Configure Ceph Storage (if used as Nova/Cinder Backend)

    9] Create Docker Registry Credentials Secret

    10. Install Trilio for OpenStack Helm Chart

    10.1] Review the Installation Script

    10.2] Run the Installation Script

    10.3] Configure DNS for Public Endpoints

    11] Configure the Backup Target for Trilio-OpenStack

    12] Fetch TrilioVault FQDNs

    13] Verify Installation

    Trilio-OpenStack Helm Chart Installation is Done!

    14] Install Trilio for OpenStack Horizon Plugin

    14.1] Pre-requisites

    14.2] Patch Horizon Deployment

    14.3] Verification

    Add a new backup target
    Resources

    Total amount of succeeded Snapshots

  • Total amount of failed Snapshots

  • Status of the Workload

  • Scheduler Trust

    • This must be shown as Established if the schduler for the workload is eabled.

    • User will have to re-create the trust if it shows as Broken.

  • Encryption

    • Whether the workload is encrypted or not

  • Provide Workload Name and Workload Description on the first tab "Details"
  • Choose if the Workload is encrypted on the first tab "Details"

  • Provide the secret UUID if Workload is encrypted on the first tab "Details"

  • Choose the required Backup Target Type on the first tab "Details"

  • Choose the VMs to protect on the second Tab "Workload Members"

  • Provide the manual snapshot retention count on the tab "Schedule"

  • Choose the Policy if available to use on tab "Schedule"

  • Choose if the scheduler required on tab "Schedule"

  • Decide and provide the schedule and retention counts of the workload on the tab "Schedule"

  • If required check "Pause VM" on the Tab "Options"

  • Click create

  • --jobschedule➡️Specify following key value pairs for jobschedule Specify option multiple times to include multiple keys. 'start_date' : '06/05/2014' 'end_date' : '07/15/2014' 'start_time' : '2:30 PM'

  • --hourly➡️Specify following key value pairs for hourly jobschedule interval= where n is no of hours within list (1,2,3,4,6,8,12,24) retention= snapshot_type=<full|incremental>

  • --daily➡️Specify following key value pairs for daily jobschedule backup_time='1:30 22:30 00:30' retention= snapshot_type=<full|incremental>

  • --weekly➡️Specify following key value pairs for weekly jobschedule backup_day=[mon,tue,wed,thu,fri,sat,sun] retention= snapshot_type=<full|incremental>

  • --monthly➡️Specify following key value pairs for monthly jobschedule month_backup_day=<1-31|last>, 'last': last day of the month retention= snapshot_type=<full|incremental>

  • --yearly➡️Specify following key value pairs for yearly jobschedule backup_month=[jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec] retention= snapshot_type=<full|incremental>

  • --manual➡️Specify following key value pairs for manual jobschedule retention= retention_days_to_keep=. retention_days_to_keep only available for immutable Backup Targets

  • --metadata➡️Specify a key value pairs to include in the workload_type metadata Specify option multiple times to include multiple keys. key=value

  • --policy-id <policy_id>➡️ID of the policy to assign to the workload

  • --encryption <True/False> ➡️Enable/Disable encryption for this workload

  • --secret-uuid <secret_uuid> ➡️UUID of the Barbican secret to be used for the workload

  • --backup-target-type <backup_target_type> : arrow_right:Backup Target Type ID for this workload

  • <instance-id=instance-uuid>➡️Required to set atleast one instance, Specify an instance to include in the workload. Specify option multiple times to include multiple instances

  • Click the workload name to enter the Workload overview
    Time till next Snapshot run
  • Retention Policy and Value

  • Click the small arrow next to "Create Snapshot" to open the sub-menu
  • Click "Edit Workload"

  • Modify the workload as desired - All parameters except backup target type can be changed

  • Click "Update"

  • --jobschedule <key=key-name>➡️Specify following key value pairs for jobschedule Specify option multiple times to include multiple keys. If don't specify timezone, then by default it takes your local machine timezone 'start_date' : '06/05/2014' 'end_date' : '07/15/2014' 'start_time' : '2:30 PM'

  • --hourly➡️Specify following key value pairs for hourly jobschedule interval= where n is no of hours within list (1,2,3,4,6,8,12,24) retention= snapshot_type=<full|incremental>

  • --daily➡️Specify following key value pairs for daily jobschedule backup_time='1:30 22:30 00:30' retention= snapshot_type=<full|incremental>

  • --weekly➡️Specify following key value pairs for weekly jobschedule backup_day=[mon,tue,wed,thu,fri,sat,sun] retention= snapshot_type=<full|incremental>

  • --monthly➡️Specify following key value pairs for monthly jobschedule month_backup_day=<1-31|last>, 'last': last day of the month retention= snapshot_type=<full|incremental>

  • --yearly➡️Specify following key value pairs for yearly jobschedule backup_month=[jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec] retention= snapshot_type=<full|incremental>

  • --manual➡️Specify following key value pairs for manual jobschedule retention= retention_days_to_keep=. retention_days_to_keep only available for immutable Backup Targets

  • --metadata <key=key-name>➡️Specify a key value pairs to include in the workload_type metadata Specify option multiple times to include multiple keys. key=value

  • --policy-id <policy_id>➡️ID of the policy to assign

  • <workload_id> ➡️ID of the workload to edit

  • Click the small arrow next to "Create Snapshot" to open the sub-menu
  • Click "Delete Workload"

  • Confirm by clicking "Delete Workload" yet again

  • Click the small arrow next to "Create Snapshot" to open the sub-menu
  • Click "Unlock Workload"

  • Confirm by clicking "Unlock Workload" yet again

  • Click the small arrow next to "Create Snapshot" to open the sub-menu
  • Click "Reset Workload"

  • Confirm by clicking "Reset Workload" yet again

  • For encrypted WL : 82 min

    Snapshot time for Windows Image booted VM. No additional data except OS. : ~12 GB

    1. For unencrypted WL : 10 min

    2. For encrypted WL : 18 min5

    Using CLI

    Workload Create

    The encryption options of the workload creation process are only available when the Barbican service is installed and available.

    Using Horizon

    Backup Target mounting (6.2+). Starting in Trilio for OpenStack 6.2, the selected Backup Target Type does not need to be pre-mounted on the compute host. The Dynamic Mount Service (DMS) mounts the target on the relevant compute node when a snapshot or restore begins, and unmounts it when the last job for that target finishes.

    Using CLI

    Workload Overview

    Using Horizon

    Details Tab

    The status of the qemu-guest-agent just shows, whether the necessary OpenStack configuration has been done for this VM to provide qemu guest agent integration. It does not check, whether the qemu guest agent is installed and configured on the VM.

    It is possible to navigate to the protected VM directly from the list of protected VMs.

    Snapshots Tab

    Please refer to the Snapshot and Restore User Guide to learn more about those.

    Policy Tab

    Filesearch Tab

    Please refer to the File Search User Guide to learn more about this feature.

    Misc. Tab

    Using CLI

    Edit a Workload

    Editing a Workload will set the User, who edits the Workload, as the new owner.

    Using Horizon

    Using CLI

    Delete a Workload

    All Snapshots need to be deleted before the workload gets deleted. Please refer to the Snapshots User Guide to learn how to delete Snapshots.

    Using Horizon

    Using CLI

    Unlock a Workload

    It is highly recommend to use this feature only as last resort in case of backups/restores being stuck without failing or a restore is required while a backup is running.

    Using Horizon

    Using CLI

    Reset a Workload

    Using Horizon

    Using CLI

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to show

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    trust_id

    string

    ID of the Trust to delete

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to validate the Trust of

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    tvm_name

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    ID of the Tenant / Project to fetch the trusts from

    is_cloud_admin

    boolean

    true/false

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    Query Parameters

    Headers

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 21 Jan 2021 11:21:57 GMT
    Content-Type: application/json
    Content-Length: 868
    Connection: keep-alive
    X-Compute-Request-Id: req-fa48f0ad-aa76-42fa-85ea-1e5461889fb3
    
    {
       "trust":[
          {
             "created_at":"2020-11-26T13:10:53.000000",
             "updated_at":null,
             "deleted_at":null,
             "deleted":false,
             "version":"4.0.115",
             "name":"trust-6e290937-de9b-446a-a406-eb3944e5a034",
             "project_id":"4dfe98a43bfa404785a812020066b4d6",
             "user_id":"cloud_admin",
             "value":"dbe2e160d4c44d7894836a6029644ea0",
             "description":"token id for user adfa32d7746a4341b27377d6f7c61adb project 4dfe98a43bfa404785a812020066b4d6",
             "category":"identity",
             "type":"trust_id",
             "public":false,
             "hidden":true,
             "status":"available",
             "metadata":[
                {
                   "created_at":"2020-11-26T13:10:54.000000",
                   "updated_at":null,
                   "deleted_at":null,
                   "deleted":false,
                   "version":"4.0.115",
                   "id":"e9ec386e-79cf-4f6b-8201-093315648afe",
                   "settings_name":"trust-6e290937-de9b-446a-a406-eb3944e5a034",
                   "settings_project_id":"4dfe98a43bfa404785a812020066b4d6",
                   "key":"role_name",
                   "value":"admin"
                }
             ]
          }
       ]
    }

    Create Trust

    Path Parameters

    Headers

    Body Format

    Show Trust

    Path Parameters

    Headers

    Delete Trust

    Path Parameters

    Headers

    Validate Scheduler Trust

    Path Parameters

    Headers

    Authentication token to use

    ID of the Tenant/Project to create the Trust for

    Authentication token to use

    ID of the Project/Tenant where to find the Workload

    Authentication token to use

    ID of the Tenant where to find the Trust in

    Authentication Token to use

    ID of the Project/Tenant where to find the Workload

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    setting_name

    string

    Name of the setting to show

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    setting_name

    string

    Name of the setting to delete

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    String

    admin@example.net

    smtp_default___sender

    email_settings

    String

    admin@example.net

    smtp_port

    email_settings

    Integer

    587

    smtp_server_name

    email_settings

    String

    Mailserver_A

    smtp_server_username

    email_settings

    String

    admin

    smtp_server_password

    email_settings

    String

    password

    smtp_timeout

    email_settings

    Integer

    10

    smtp_email_enable

    email_settings

    Boolean

    True

    smtp_global_recipients

    email_settings

    String

    admin1@example.net, admin2@example.net

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    smtp_global_recipients is optional. It accepts a comma separated list of email addresses that will be CC'd on every snapshot and restore notification, in addition to the workload owner.

    Create Setting

    Path Parameters

    Headers

    Body format

    Show Setting

    Path Parameters

    Headers

    Modify Setting

    Path Parameters

    Headers

    Body format

    Delete Setting

    Path Parameters

    Headers

    ID of the Tenant/Project to work with

    Authentication token to use

    ID of the Project/Tenant where to find the Workload

    Authentication token to use

    ID of the Tenant/Project to work with w

    Authentication token to use

    ID of the Tenant where to find the Workload in

    Authentication Token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to disable the Scheduler in

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to disable the Scheduler in

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to disable the Scheduler in

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to disable the Scheduler in

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to disable the Scheduler in

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    ID of Tenant/Project the Workload is located in

    workload_id

    string

    ID of the Workload to disable the Scheduler in

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    Headers

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Fri, 13 Nov 2020 11:52:56 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-99f51825-9b47-41ea-814f-8f8141157fc7

    Enable Workload Scheduler

    Path Parameters

    Headers

    Scheduler Trust Status

    Path Parameters

    Headers

    All following API commands require an Authentication token against a user with admin-role in the authentication project.

    Global Job Scheduler status

    Path Parameters

    Headers

    Disable Global Job Scheduler

    Path Parameters

    Headers

    Enable Global Job Scheduler

    Path Parameters

    Headers

    Authentication token to use

    ID of Tenant/Project the Workload is located in

    Authentication token to use

    ID of Tenant/Project the Workload is located in

    Authentication token to use

    ID of Tenant/Project the Workload is located in

    Authentication token to use

    ID of Tenant/Project the Workload is located in

    Authentication token to use

    ID of Tenant/Project the Workload is located in

    Authentication token to use

    db_drop.yaml file should not be included in upgrade.sh

  • If your keystone’s public endpoint is on TLS then include yaml file 'tls_public_endpoint.yaml' from upgrade.sh

  • If your keystone’s all endpoints are on non TLS (http only) then you need to remove yaml file tls_public_endpoint.yaml from upgrade.sh

  • 3] Provide trilio-openstack backup target details [Run on Install Client Node]

    4] Provide cloud admin user credentials - keystone.yaml [Run on Install Client Node]

    5] Keystone, rabbitmq and database creds - admin_creds.yaml [Run on Install Client Node]

    6] ceph.yaml changes [Run on Install Client Node]

    7] Docker registry credentials secret. [Run on Install Client Node]

    8] Review and edit upgrade.sh script [Run on Install Client Node]

    9] Run upgrade script to upgrade Trilio for Openstack [Run on Install Client Node]

    10] Verify that trilio-openstack upgrade finished well using following steps [Run on Install Client Node]

    11] For OpenStack Helm - Upgrade Trilio horizon plugin

    12] For MOSK - Upgrade Trilio horizon plugin

    step 8.1 of this documentation
    this documentation
    this documentation
    kubectl create namespace trilio-openstack
    kubectl config set-context --current --namespace=trilio-openstack
    kubectl get nodes --show-labels | grep openstack-control-plane
    kubectl label nodes <NODE_NAME_1> triliovault-control-plane=enabled
    kubectl label nodes <NODE_NAME_2> triliovault-control-plane=enabled
    kubectl label nodes <NODE_NAME_3> triliovault-control-plane=enabled
    kubectl get nodes --show-labels | grep triliovault-control-plane
    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/keystone.yaml
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./create_rabbitmq.sh
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./get_admin_creds.sh <internal_domain_name> <public_domain_name>
    Example:
    ./get_admin_creds.sh cluster.local triliodata.demo
    cat ../values_overrides/admin_creds.yaml
    cat ../templates/bin/_triliovault-nova-compute.conf.tpl
    cat ../templates/bin/_triliovault-datamover-init.sh.tpl
    cat ../templates/bin/_triliovault-datamover.sh.tpl
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/
    ## Provide rbd_user, keyring. This user needs to have read,write access on vms, volumes pool used for nova, cinder backend.
    ## By default 'nova' user generally has these permissions. But we recommend to verify and use it for triliovault. 
    vi ceph.yaml
    
    ## Copy your /etc/ceph/ceph.conf content to following file. Clean existing file content.
    vi ../templates/bin/_triliovault-ceph.conf.tpl
    vi ../templates/bin/_triliovault-ceph.conf.tpl
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./get_ceph.sh
    cat ../values_overrides/ceph.yaml
    cat ../templates/bin/_triliovault-ceph.conf.tpl
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./create_image_pull_secret.sh <TRILIO_REGISTRY_USERNAME> <TRILIO_REGISTRY_PASSWORD>
    kubectl describe secret triliovault-image-registry -n trilio-openstack
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
    vi install.sh
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
    ./install.sh
    kubectl get service -n openstack | grep LoadBalancer
    public-openstack      LoadBalancer   10.105.43.185    192.168.2.50   80:30162/TCP,443:30829/TCP
    kubectl -n trilio-openstack get ingress
    root@master:~# kubectl -n trilio-openstack get ingress
    NAME                                   CLASS           HOSTS                                                                                                                   ADDRESS       PORTS     AGE
    triliovault-datamover                  nginx           triliovault-datamover,triliovault-datamover.trilio-openstack,triliovault-datamover.trilio-openstack.svc.cluster.local   192.168.2.5   80        14h
    triliovault-datamover-cluster-fqdn     nginx-cluster   triliovault-datamover.triliodata.demo                                                                                                 80, 443   14h
    triliovault-datamover-namespace-fqdn   nginx           triliovault-datamover.triliodata.demo                                                                                   192.168.2.5   80, 443   14h
    triliovault-wlm                        nginx           triliovault-wlm,triliovault-wlm.trilio-openstack,triliovault-wlm.trilio-openstack.svc.cluster.local                     192.168.2.5   80        14h
    triliovault-wlm-cluster-fqdn           nginx-cluster   triliovault-wlm.triliodata.demo                                                                                                       80, 443   14h
    triliovault-wlm-namespace-fqdn         nginx           triliovault-wlm.triliodata.demo                                                                                         192.168.2.5   80, 443   14h
    
    kubectl -n openstack get deployment ingress-nginx-controller -o yaml | grep watch-namespace
    kubectl edit deployment ingress-nginx-controller -n ingress-nginx
    --watch-namespace=trilio-openstack,openstack
    kubectl rollout restart deployment ingress-nginx-controller -n openstack
    helm status trilio-openstack
    kubectl get pods -n trilio-openstack
    NAME                                                 READY   STATUS      RESTARTS   AGE
    rabbitmq-server-0                                    1/1     Running     0          13h
    trilio-object-store-s3-bt2-lhdnx                     1/1     Running     0          13h
    trilio-object-store-s3-bt2-szwtg                     1/1     Running     0          13h
    trilio-object-store-s3-bt2-x9cnr                     1/1     Running     0          13h
    triliovault-datamover-api-7cdf475fdf-cz9nw           1/1     Running     0          13h
    triliovault-datamover-api-7cdf475fdf-mq86z           1/1     Running     0          13h
    triliovault-datamover-api-7cdf475fdf-tm9ww           1/1     Running     0          13h
    triliovault-datamover-db-init-pdf58                  0/1     Completed   0          13h
    triliovault-datamover-db-sync-bln62                  0/1     Completed   0          13h
    triliovault-datamover-ks-endpoints-g744n             0/3     Completed   0          13h
    triliovault-datamover-ks-service-gzdcw               0/1     Completed   0          13h
    triliovault-datamover-ks-user-dvbtd                  0/1     Completed   0          13h
    triliovault-datamover-openstack-compute-node-g258v   1/1     Running     0          13h
    triliovault-datamover-openstack-compute-node-k89b2   1/1     Running     0          13h
    triliovault-datamover-openstack-compute-node-twz5t   1/1     Running     0          13h
    triliovault-datamover-rabbit-init-cx72m              0/1     Completed   0          13h
    triliovault-wlm-api-545cb949dc-7nlr2                 1/1     Running     0          13h
    triliovault-wlm-api-545cb949dc-bvzdb                 1/1     Running     0          13h
    triliovault-wlm-api-545cb949dc-rtwqm                 1/1     Running     0          13h
    triliovault-wlm-cloud-trust-jvv2c                    0/1     Completed   0          13h
    triliovault-wlm-cron-86946df7f5-mxs56                1/1     Running     0          13h
    triliovault-wlm-db-init-7s7v2                        0/1     Completed   0          13h
    triliovault-wlm-db-sync-b88td                        0/1     Completed   0          13h
    triliovault-wlm-ks-endpoints-gkh2l                   0/3     Completed   0          13h
    triliovault-wlm-ks-service-74zj6                     0/1     Completed   0          13h
    triliovault-wlm-ks-user-fb4xs                        0/1     Completed   0          13h
    triliovault-wlm-rabbit-init-2dqq7                    0/1     Completed   0          13h
    triliovault-wlm-scheduler-7cf86b59f4-z6v78           1/1     Running     0          13h
    triliovault-wlm-workloads-6455dc5c9f-8fzn8           1/1     Running     0          13h
    triliovault-wlm-workloads-6455dc5c9f-mq45v           1/1     Running     0          13h
    triliovault-wlm-workloads-6455dc5c9f-rjd6w           1/1     Running     0          13h
    
    kubectl get jobs -n trilio-openstack
    NAME                                 STATUS     COMPLETIONS   DURATION   AGE
    triliovault-datamover-db-init        Complete   1/1           6s         13h
    triliovault-datamover-db-sync        Complete   1/1           9s         13h
    triliovault-datamover-ks-endpoints   Complete   1/1           17s        13h
    triliovault-datamover-ks-service     Complete   1/1           19s        13h
    triliovault-datamover-ks-user        Complete   1/1           20s        13h
    triliovault-datamover-rabbit-init    Complete   1/1           4s         13h
    triliovault-wlm-cloud-trust          Complete   1/1           93s        13h
    triliovault-wlm-db-init              Complete   1/1           5s         13h
    triliovault-wlm-db-sync              Complete   1/1           20s        13h
    triliovault-wlm-ks-endpoints         Complete   1/1           17s        13h
    triliovault-wlm-ks-service           Complete   1/1           19s        13h
    triliovault-wlm-ks-user              Complete   1/1           22s        13h
    triliovault-wlm-rabbit-init          Complete   1/1           4s         13h
    kubectl get pvc -n trilio-openstack
    triliovault-nfs-pvc-172-25-0-10-mnt-tvault-42424   Bound   triliovault-nfs-pv-172-25-0-10-mnt-tvault-42424   20Gi   RWX   nfs   6d
    kubectl get nodes --show-labels | grep triliovault-control-plane
    -- SSH to these kuberentes nodes
    ssh <KUBERNETES_NODE_NAME>
    -- See logs
    vi /var/log/triliovault-datamover-api/triliovault-datamover-api.log
    ## Other approach: kubectl stdout and stderr logs
    -- List triliovault-datamover-api pods
    kubectl get pods | grep triliovault-datamover-api
    -- See logs
    kubectl logs <triliovault-datamover-api-pod-name>
    # Example:
    root@helm1:~# kubectl get pods | grep triliovault-datamover-api
    triliovault-datamover-api-c87899fb7-dq2sd            1/1     Running     0          3d18h
    triliovault-datamover-api-c87899fb7-j4fdz            1/1     Running     0          3d18h
    triliovault-datamover-api-c87899fb7-nm8pt            1/1     Running     0          3d18h
    root@helm1:~# kubectl logs triliovault-datamover-api-c87899fb7-dq2sd
    kubectl get nodes --show-labels | grep openstack-compute-node
    -- SSH to these kuberentes nodes
    ssh <KUBERNETES_NODE_NAME>
    -- See logs
    vi /var/log/triliovault-datamover/triliovault-datamover.log
    ## Other approach: kubectl stdout and stderr logs
    -- List triliovault-datamover-api pods
    kubectl get pods | grep triliovault-datamover-openstack
    -- See logs
    kubectl logs <triliovault-datamover-pod-name>
    # Example:
    root@helm1:~# kubectl get pods | grep triliovault-datamover-openstack
    triliovault-datamover-openstack-compute-node-2krmj   1/1     Running     0          3d19h
    triliovault-datamover-openstack-compute-node-9f5w7   1/1     Running     0          3d19h
    root@helm1:~# kubectl logs triliovault-datamover-openstack-compute-node-2krmj
    kubectl get nodes --show-labels | grep triliovault-control-plane
    -- SSH to these kuberentes nodes
    ssh <KUBERNETES_NODE_NAME>
    -- Log files are available in following directory.
    ls /var/log/triliovault-wlm/
    ## Sample command output
    root@helm4:~# ls -ll /var/log/triliovault-wlm/
    total 26576
    -rw-r--r-- 1 42424 42424  2079322 Mar 20 07:55 triliovault-wlm-api.log
    -rw-r--r-- 1 42424 42424 25000088 Mar 20 00:41 triliovault-wlm-api.log.1
    -rw-r--r-- 1 42424 42424    12261 Mar 16 12:40 triliovault-wlm-cron.log
    -rw-r--r-- 1 42424 42424    10263 Mar 16 12:36 triliovault-wlm-scheduler.log
    -rw-r--r-- 1 42424 42424    87918 Mar 16 12:36 triliovault-wlm-workloads.log
    ## Other approach: kubectl stdout and stderr logs
    -- List triliovault-wlm services pods
    kubectl get pods | grep triliovault-wlm
    -- See logs
    kubectl logs <triliovault-wlm-service-pod-name>
    # Example:
    root@helm1:~# kubectl get pods | grep triliovault-wlm
    triliovault-wlm-api-7b956f7b8-84gtw                  1/1     Running     0          3d19h
    triliovault-wlm-api-7b956f7b8-85mdk                  1/1     Running     0          3d19h
    triliovault-wlm-api-7b956f7b8-hpcpt                  1/1     Running     0          3d19h
    triliovault-wlm-cloud-trust-rdh8n                    0/1     Completed   0          3d19h
    triliovault-wlm-cron-78bdb4b959-wzrfs                1/1     Running     0          3d19h
    triliovault-wlm-db-drop-dhfgj                        0/1     Completed   0          3d19h
    triliovault-wlm-db-init-snrsr                        0/1     Completed   0          3d19h
    triliovault-wlm-db-sync-wffk5                        0/1     Completed   0          3d19h
    triliovault-wlm-ks-endpoints-zvqtf                   0/3     Completed   0          3d19h
    triliovault-wlm-ks-service-6425q                     0/1     Completed   0          3d19h
    triliovault-wlm-ks-user-fmgsx                        0/1     Completed   0          3d19h
    triliovault-wlm-rabbit-init-vsdn6                    0/1     Completed   0          3d19h
    triliovault-wlm-scheduler-649b95ffd6-bkqxt           1/1     Running     0          3d19h
    triliovault-wlm-workloads-6b98679d45-2kjdq           1/1     Running     0          3d19h
    triliovault-wlm-workloads-6b98679d45-mxvhp           1/1     Running     0          3d19h
    triliovault-wlm-workloads-6b98679d45-v4dn8           1/1     Running     0          3d19h
    # kubectl logs triliovault-wlm-api-7b956f7b8-84gtw
    # kubectl logs triliovault-wlm-cron-78bdb4b959-wzrfs
    # kubectl logs triliovault-wlm-scheduler-649b95ffd6-bkqxt
    # kubectl logs triliovault-wlm-workloads-6b98679d45-mxvhp
    kubectl describe secret triliovault-image-registry -n openstack
    kubectl create secret docker-registry triliovault-image-registry \
      --docker-server="docker.io" \
      --docker-username=<TRILIO_REGISTRY_USERNAME> \
      --docker-password=<TRILIO_REGISTRY_PASSWORD> \
      -n openstack
    kubectl -n openstack patch deployment horizon \
      --type='strategic' \
      -p '{
        "spec": {
          "template": {
            "spec": {
              "containers": [
                {
                  "name": "horizon",
                  "image": "docker.io/trilio/trilio-horizon-plugin-helm:<TRILIOVAULT_HORIZON_PLUGIN_IMAGE_TAG>"
                }
              ],
              "imagePullSecrets": [
                {
                  "name": "triliovault-image-registry"
                }
              ]
            }
          }
        }
      }'
    kubectl get pods -n openstack -l application=horizon,component=server -o jsonpath="{.items[*].spec.containers[*].image}" | tr ' ' '\n'
    workloadmgr workload-list [--all {True,False}] [--nfsshare <nfsshare>]
    workloadmgr workload-create [--display-name <display-name>]
                                [--display-description <display-description>]
                                [--source-platform <source-platform>]
                                [--jobschedule <key=key-name>]
                                [--hourly [<key=key-name> ...]]
                                [--daily [<key=key-name> ...]]
                                [--weekly [<key=key-name> ...]]
                                [--monthly [<key=key-name> ...]]
                                [--yearly [<key=key-name> ...]] 
                                [--manual <key=key-name> [<key=key-name> ...]]
                                [--metadata <key=key-name>]
                                [--policy-id <policy_id>]
                                [--encryption <True/False>]
                                [--secret-uuid <secret_uuid>]
                                [--backup-target-type <backup_target_type>]
                                <instance-id=instance-uuid> [<instance-id=instance-uuid> ...]
    workloadmgr workload-show <workload_id> [--verbose <verbose>]
    usage: workloadmgr workload-modify [--display-name <display-name>]
                                       [--display-description <display-description>]
                                       [--instance <instance-id=instance-uuid>]
                                       [--jobschedule <key=key-name>]
                                       [--hourly [<key=key-name> ...]]
                                       [--daily [<key=key-name> ...]]
                                       [--weekly [<key=key-name> ...]]
                                       [--monthly [<key=key-name> ...]]
                                       [--yearly [<key=key-name> ...]]
                                       [--manual [<key=key-name> ...]] 
                                       [--metadata <key=key-name>]
                                       [--policy-id <policy_id>]
                                       <workload_id>
    workloadmgr workload-delete [--database_only <True/False>] <workload_id>
    workloadmgr workload-unlock <workload_id>
    workloadmgr workload-reset <workload_id>
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 21 Jan 2021 11:43:36 GMT
    Content-Type: application/json
    Content-Length: 868
    Connection: keep-alive
    X-Compute-Request-Id: req-2151b327-ea74-4eec-b606-f0df358bc2a0
    
    {
       "trust":[
          {
             "created_at":"2021-01-21T11:43:36.140407",
             "updated_at":null,
             "deleted_at":null,
             "deleted":false,
             "version":"4.0.115",
             "name":"trust-b03daf38-1615-48d6-88f9-a807c728e786",
             "project_id":"4dfe98a43bfa404785a812020066b4d6",
             "user_id":"adfa32d7746a4341b27377d6f7c61adb",
             "value":"1c981a15e7a54242ae54eee6f8d32e6a",
             "description":"token id for user adfa32d7746a4341b27377d6f7c61adb project 4dfe98a43bfa404785a812020066b4d6",
             "category":"identity",
             "type":"trust_id",
             "public":false,
             "hidden":1,
             "status":"available",
             "is_public":false,
             "is_hidden":true,
             "metadata":[
                
             ]
          }
       ]
    }
    {
       "trusts":{
          "role_name":"member",
          "is_cloud_trust":false
       }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 21 Jan 2021 11:39:12 GMT
    Content-Type: application/json
    Content-Length: 888
    Connection: keep-alive
    X-Compute-Request-Id: req-3c2f6acb-9973-4805-bae3-cd8dbcdc2cb4
    
    {
       "trust":{
          "created_at":"2020-11-26T13:15:29.000000",
          "updated_at":null,
          "deleted_at":null,
          "deleted":false,
          "version":"4.0.115",
          "name":"trust-54e24d8d-6bcf-449e-8021-708b4ebc65e1",
          "project_id":"4dfe98a43bfa404785a812020066b4d6",
          "user_id":"adfa32d7746a4341b27377d6f7c61adb",
          "value":"703dfabb4c5942f7a1960736dd84f4d4",
          "description":"token id for user adfa32d7746a4341b27377d6f7c61adb project 4dfe98a43bfa404785a812020066b4d6",
          "category":"identity",
          "type":"trust_id",
          "public":false,
          "hidden":true,
          "status":"available",
          "metadata":[
             {
                "created_at":"2020-11-26T13:15:29.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"86aceea1-9121-43f9-b55c-f862052374ab",
                "settings_name":"trust-54e24d8d-6bcf-449e-8021-708b4ebc65e1",
                "settings_project_id":"4dfe98a43bfa404785a812020066b4d6",
                "key":"role_name",
                "value":"member"
             }
          ]
       }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 21 Jan 2021 11:41:51 GMT
    Content-Type: application/json
    Content-Length: 888
    Connection: keep-alive
    X-Compute-Request-Id: req-d838a475-f4d3-44e9-8807-81a9c32ea2a8
    {
       "scheduler_enabled":true,
       "trust":{
          "created_at":"2021-01-21T11:43:36.000000",
          "updated_at":null,
          "deleted_at":null,
          "deleted":false,
          "version":"4.0.115",
          "name":"trust-b03daf38-1615-48d6-88f9-a807c728e786",
          "project_id":"4dfe98a43bfa404785a812020066b4d6",
          "user_id":"adfa32d7746a4341b27377d6f7c61adb",
          "value":"1c981a15e7a54242ae54eee6f8d32e6a",
          "description":"token id for user adfa32d7746a4341b27377d6f7c61adb project 4dfe98a43bfa404785a812020066b4d6",
          "category":"identity",
          "type":"trust_id",
          "public":false,
          "hidden":true,
          "status":"available",
          "metadata":[
             {
                "created_at":"2021-01-21T11:43:36.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"d98d283a-b096-4a68-826a-36f99781787d",
                "settings_name":"trust-b03daf38-1615-48d6-88f9-a807c728e786",
                "settings_project_id":"4dfe98a43bfa404785a812020066b4d6",
                "key":"role_name",
                "value":"member"
             }
          ]
       },
       "is_valid":true,
       "scheduler_obj":{
          "workload_id":"209c13fa-e743-4ccd-81f7-efdaff277a1f",
          "user_id":"adfa32d7746a4341b27377d6f7c61adb",
          "project_id":"4dfe98a43bfa404785a812020066b4d6",
          "user_domain_id":"default",
          "user":"adfa32d7746a4341b27377d6f7c61adb",
          "tenant":"4dfe98a43bfa404785a812020066b4d6"
       }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 04 Feb 2021 11:55:43 GMT
    Content-Type: application/json
    Content-Length: 403
    Connection: keep-alive
    X-Compute-Request-Id: req-ac16c258-7890-4ae7-b7f4-015b5aa4eb99
    
    {
       "settings":[
          {
             "created_at":"2021-02-04T11:55:43.890855",
             "updated_at":null,
             "deleted_at":null,
             "deleted":false,
             "version":"4.0.115",
             "name":"smtp_port",
             "project_id":"4dfe98a43bfa404785a812020066b4d6",
             "user_id":null,
             "value":"8080",
             "description":null,
             "category":null,
             "type":"email_settings",
             "public":false,
             "hidden":0,
             "status":"available",
             "is_public":false,
             "is_hidden":false
          }
       ]
    }
    {
       "settings":[
          {
             "category":null,
             "name":<String Setting_name>,
             "is_public":false,
             "is_hidden":false,
             "metadata":{
                
             },
             "type":<String Setting type>,
             "value":<String Setting Value>,
             "description":null
          }
       ]
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 04 Feb 2021 12:01:27 GMT
    Content-Type: application/json
    Content-Length: 380
    Connection: keep-alive
    X-Compute-Request-Id: req-404f2808-7276-4c2b-8870-8368a048c28c
    
    {
       "setting":{
          "created_at":"2021-02-04T11:55:43.000000",
          "updated_at":null,
          "deleted_at":null,
          "deleted":false,
          "version":"4.0.115",
          "name":"smtp_port",
          "project_id":"4dfe98a43bfa404785a812020066b4d6",
          "user_id":null,
          "value":"8080",
          "description":null,
          "category":null,
          "type":"email_settings",
          "public":false,
          "hidden":false,
          "status":"available",
          "metadata":[
             
          ]
       }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 04 Feb 2021 12:05:59 GMT
    Content-Type: application/json
    Content-Length: 403
    Connection: keep-alive
    X-Compute-Request-Id: req-e92e2c38-b43a-4046-984e-64cea3a0281f
    
    {
       "settings":[
          {
             "created_at":"2021-02-04T11:55:43.000000",
             "updated_at":null,
             "deleted_at":null,
             "deleted":false,
             "version":"4.0.115",
             "name":"smtp_port",
             "project_id":"4dfe98a43bfa404785a812020066b4d6",
             "user_id":null,
             "value":"8080",
             "description":null,
             "category":null,
             "type":"email_settings",
             "public":false,
             "hidden":0,
             "status":"available",
             "is_public":false,
             "is_hidden":false
          }
       ]
    }
    {
       "settings":[
          {
             "category":null,
             "name":<String Setting_name>,
             "is_public":false,
             "is_hidden":false,
             "metadata":{
                
             },
             "type":<String Setting type>,
             "value":<String Setting Value>,
             "description":null
          }
       ]
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 04 Feb 2021 11:49:17 GMT
    Content-Type: application/json
    Content-Length: 1223
    Connection: keep-alive
    X-Compute-Request-Id: req-5a8303aa-6c90-4cd9-9b6a-8c200f9c2473
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Fri, 13 Nov 2020 12:06:01 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-4eb1863e-3afa-4a2c-b8e6-91a41fe37f78
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Fri, 13 Nov 2020 12:31:49 GMT
    Content-Type: application/json
    Content-Length: 1223
    Connection: keep-alive
    X-Compute-Request-Id: req-c6f826a9-fff7-442b-8886-0770bb97c491
    
    {
       "scheduler_enabled":true,
       "trust":{
          "created_at":"2020-10-23T14:35:11.000000",
          "updated_at":null,
          "deleted_at":null,
          "deleted":false,
          "version":"4.0.115",
          "name":"trust-002bcbaf-c16b-44e6-a9ef-9c1efbfa2e2c",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "value":"871ca24f38454b14b867338cb0e9b46c",
          "description":"token id for user ccddc7e7a015487fa02920f4d4979779 project c76b3355a164498aa95ddbc960adc238",
          "category":"identity",
          "type":"trust_id",
          "public":false,
          "hidden":true,
          "status":"available",
          "metadata":[
             {
                "created_at":"2020-10-23T14:35:11.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"a3cc9a01-3d49-4ff8-ad8e-b12a7b3c68b0",
                "settings_name":"trust-002bcbaf-c16b-44e6-a9ef-9c1efbfa2e2c",
                "settings_project_id":"c76b3355a164498aa95ddbc960adc238",
                "key":"role_name",
                "value":"member"
             }
          ]
       },
       "is_valid":true,
       "scheduler_obj":{
          "workload_id":"4bafaa03-f69a-45d5-a6fc-ae0119c77974",
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "user_domain_id":"default",
          "user":"ccddc7e7a015487fa02920f4d4979779",
          "tenant":"c76b3355a164498aa95ddbc960adc238"
       }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Fri, 13 Nov 2020 12:45:27 GMT
    Content-Type: application/json
    Content-Length: 30
    Connection: keep-alive
    X-Compute-Request-Id: req-cd447ce0-7bd3-4a60-aa92-35fc43b4729b
    
    {"global_job_scheduler": true}
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Fri, 13 Nov 2020 12:49:29 GMT
    Content-Type: application/json
    Content-Length: 31
    Connection: keep-alive
    X-Compute-Request-Id: req-6f49179a-737a-48ab-91b7-7e7c460f5af0
    
    {"global_job_scheduler": false}
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Fri, 13 Nov 2020 12:50:11 GMT
    Content-Type: application/json
    Content-Length: 30
    Connection: keep-alive
    X-Compute-Request-Id: req-ed279acc-9805-4443-af91-44a4420559bc
    
    {"global_job_scheduler": true}
    cp triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/values_overrides/nfs.yaml triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/nfs.yaml
    cp triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/files/s3-cert.pem triliovault-cfg-scripts/openstack-helm/trilio-openstack/files/s3-cert.pem
    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/keystone.yaml
    conf:
      triliovault:
        cloud_admin_user_name: "admin"
        cloud_admin_project_name: "admin"
        cloud_admin_domain_name: "default"
        ## Keystone endpoint interface that triliovault workloadmgr services will use to communicate to other openstack services
        ## Valid values: internal, public, admin
        interface: "internal"
        ## Provide any role name as your preference.
        ## Significance: To run any backups in triliovault an openstack user needs to have this role on given project.
        trustee_role: "creator"
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./create_rabbitmq.sh
    ./get_admin_creds.sh <internal_domain_name> <public_domain_name>
    Example:
    ./get_admin_creds.sh cluster.local triliodata.demo
    cp triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/values_overrides/admin_creds.yaml triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/admin_creds.yaml
    cp triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/templates/bin/_triliovault-nova-compute.conf.tpl triliovault-cfg-scripts/openstack-helm/trilio-openstack/templates/bin/_triliovault-nova-compute.conf.tpl
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./get_admin_creds_mosk.sh <internal_domain_name> <public_domain_name>
    Example:
    ./get_admin_creds_mosk.sh cluster.local setup.triliodata.demo
    cp triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/values_overrides/ceph.yaml triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/ceph.yaml
    cp triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/templates/bin/_triliovault-ceph.conf.tpl triliovault-cfg-scripts/openstack-helm/trilio-openstack/templates/bin/_triliovault-ceph.conf.tpl
    # kubectl get secrets | grep triliovault-image-registry
    triliovault-image-registry                                 kubernetes.io/dockerconfigjson        1      89d
    vi triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/upgrade.sh
    #!/bin/bash -x
    cd ../../
    helm upgrade trilio-openstack ./trilio-openstack --namespace=trilio-openstack \
    --values=./trilio-openstack/values_overrides/image_pull_secrets.yaml \
    --values=./trilio-openstack/values_overrides/keystone.yaml \
    --values=./trilio-openstack/values_overrides/nfs.yaml \
    --values=./trilio-openstack/values_overrides/2023.2.yaml \
    --values=./trilio-openstack/values_overrides/admin_creds.yaml \
    --values=./trilio-openstack/values_overrides/tls_public_endpoint.yaml \
    --values=./trilio-openstack/values_overrides/ceph.yaml \
    --values=./trilio-openstack/values_overrides/ingress.yaml \
    --values=./trilio-openstack/values_overrides/triliovault_passwords.yaml
    echo -e "Waiting for triliovault pods to get into running state"
    ./trilio-openstack/utils/wait_for_pods.sh trilio-openstack
    kubectl get pods -n trilio-openstack
    cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
    ./upgrade.sh
    ## Check trilio-openstack helm chart version. It should be latest, mentioned in file 'triliovault-cfg-scripts/openstack-helm/trilio-openstack/Chart.yaml'
    helm ls | grep trilio-openstack
    
    ## Check status of trilio-openstack helm chart release
    helm status trilio-openstack
    
    ## Check if all pods are in running/Completed state.
    kubectl get pods -n trilio-openstack
    Sample Output:
    ----------------------
    # kubectl get pods -n trilio-openstack
    NAME                                                 READY   STATUS      RESTARTS   AGE
    triliovault-datamover-api-5877ff9b48-49wsq           1/1     Running     0          6d
    triliovault-datamover-api-5877ff9b48-8zfmh           1/1     Running     0          6d
    triliovault-datamover-api-5877ff9b48-xx4rm           1/1     Running     0          6d
    triliovault-datamover-db-init-r4j9w                  0/1     Completed   0          6d
    triliovault-datamover-db-sync-c254n                  0/1     Completed   0          6d
    triliovault-datamover-ks-endpoints-8qnt8             0/3     Completed   0          6d
    triliovault-datamover-ks-service-hps97               0/1     Completed   0          6d
    triliovault-datamover-ks-user-sgrz6                  0/1     Completed   0          6d
    triliovault-datamover-openstack-compute-node-2s7k7   1/1     Running     0          6d
    triliovault-datamover-openstack-compute-node-64sm5   1/1     Running     0          6d
    triliovault-wlm-api-5bbc74cb4b-69b2b                 1/1     Running     0          6d
    triliovault-wlm-api-5bbc74cb4b-hbzfj                 1/1     Running     0          6d
    triliovault-wlm-api-5bbc74cb4b-zxlcl                 1/1     Running     0          6d
    triliovault-wlm-cloud-trust-hnxj8                    0/1     Completed   0          6d
    triliovault-wlm-cron-764658cb59-b8jx6                1/1     Running     0          6d
    triliovault-wlm-db-init-rbpw2                        0/1     Completed   0          6d
    triliovault-wlm-db-sync-p97z8                        0/1     Completed   0          6d
    triliovault-wlm-ks-endpoints-tx65s                   0/3     Completed   0          6d
    triliovault-wlm-ks-service-9mkkt                     0/1     Completed   0          6d
    triliovault-wlm-ks-user-x5xrx                        0/1     Completed   0          6d
    triliovault-wlm-rabbit-init-qqzwr                    0/1     Completed   0          6d
    triliovault-wlm-scheduler-6c85688899-55tz7           1/1     Running     0          6d
    triliovault-wlm-workloads-f9dc944db-5w7s9            1/1     Running     0          6d
    triliovault-wlm-workloads-f9dc944db-84wj7            1/1     Running     0          6d
    triliovault-wlm-workloads-f9dc944db-ccdvz            1/1     Running     0          6d
    
    ## Check if jobs finished well
    kubectl get jobs -n trilio-openstack
    Sample Output:
    --------------
    NAME                                 COMPLETIONS   DURATION   AGE
    triliovault-datamover-db-init        1/1           4s         6d
    triliovault-datamover-db-sync        1/1           8s         6d
    triliovault-datamover-ks-endpoints   1/1           19s        6d
    triliovault-datamover-ks-service     1/1           8s         6d
    triliovault-datamover-ks-user        1/1           21s        6d
    triliovault-wlm-cloud-trust          1/1           3m10s      6d
    triliovault-wlm-db-init              1/1           4s         6d
    triliovault-wlm-db-sync              1/1           13s        6d
    triliovault-wlm-ks-endpoints         1/1           20s        6d
    triliovault-wlm-ks-service           1/1           7s         6d
    triliovault-wlm-ks-user              1/1           20s        6d
    triliovault-wlm-rabbit-init          1/1           9s         6d
    
    ## If you are using NFS backup target, check if nfs pvc got into Bound state
    
    
    kubectl get pvc -n trilio-openstack
    Sample Output:
    -------------
    NAME                                               STATUS   VOLUME                                            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    triliovault-nfs-pvc-172-25-0-10-mnt-tvault-42424   Bound    triliovault-nfs-pv-172-25-0-10-mnt-tvault-42424   20Gi       RWX            nfs            6d

    6.2.1-2025.2

    6.2.1-2025.2

    ubuntu rocky

    Kolla Version
    Container URLs

    Kolla Rocky Flamingo (2025.2)

    Kolla Ubuntu Flamingo (2025.2)

    Kolla Rocky Epoxy (2025.1)

    OpenStack Epoxy (MOSK25.2)

    Charm names

    Supported Releases

    Revisions

    Jammy (Ubuntu 22.04)

    90

    Jammy (Ubuntu 22.04)

    46

    Sunbeam (Kubernetes Based) Canonical charms

    Supported Releases

    Revisions

    Noble (Ubuntu 24.04)

    24

    Noble (Ubuntu 24.04)

    Canonical Version
    triliovault_tag
    Container URLs

    Sunbeam Canonical Caracal (2024.1)

    6.2.1-2024.1

    6.2.1.9

    workloadmgrclient

    6.2.1.6

    Repo URL:

    deb [trusted=yes] https://apt.fury.io/trilio-6-2/ /
    Name
    Version

    python3-contegoclient

    6.2.1.2

    python3-dmapi

    6.2.1.4

    Repo URL:

    https://yum.fury.io/trilio-6-2/

    To enable, add the following file /etc/yum.repos.d/fury.repo:

    [trilio-fury]
    name=Trilio Gemfury Private Repo
    baseurl=https://yum.fury.io/trilio-6-2/
    enabled=1
    gpgcheck=0
    Name
    Linux Distribution
    Version

    python3-contegoclient-el9

    RHEL9

    6.2.1.2-6.2

    RHOSP Version

    Feature Release

    Operator Image Tag

    Channel Operator Hub

    tvo-operator Version Operator Hub

    RHOSO 18.0

    FR5

    6.2.1-rhoso18.0

    6.2.x

    6.2.1

    RHOSO 18.0

    FR6

    6.2.1-fr6-rhoso18.0

    6.2.x

    6.2.2

    RHOSO 18.0 application images (FR5/FR6)

    registry.connect.redhat.com/trilio/trilio-datamover-rhoso:6.2.1-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-datamover-api-rhoso:6.2.1-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-horizon-plugin-rhoso:6.2.1-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-wlm:6.2.1-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-dms-rhoso:6.2.1-rhoso18.0
    registry.connect.redhat.com/trilio/trilio-ansible-runner-rhoso:6.2.1-rhoso18.0

    tvo-operator<=FR5

    registry.connect.redhat.com/trilio/trilio-openstack-operator-rhoso:6.2.1-rhoso18.0

    tvo-operator=FR6

    FR5

    registry.redhat.io/rhoso/openstack-rabbitmq-rhel9:18.0.18
    registry.redhat.io/rhoso/openstack-mariadb-rhel9:18.0.18

    FR6

    registry.redhat.io/rhoso/openstack-rabbitmq-rhel9:18.0.21
    registry.redhat.io/rhoso/openstack-mariadb-rhel9:18.0.21

    Kolla Epoxy (2025.1)

    6.2.1-2025.1

    6.2.1-2025.1

    ubuntu rocky

    OpenStack Helm Bobcat (2023.2)

    docker.io/trilio/trilio-datamover-helm:6.2.1-2023.2
    docker.io/trilio/trilio-datamover-api-helm:6.2.1-2023.2
    docker.io/trilio/trilio-horizon-plugin-helm:6.2.1-2023.2
    docker.io/trilio/trilio-wlm-helm:6.2.1-2023.2
    docker.io/trilio/trilio-dms-helm:6.2.1-2023.2

    OpenStack Helm Epoxy (2025.1)

    docker.io/trilio/trilio-datamover-helm:6.2.1-2025.1
    docker.io/trilio/trilio-datamover-api-helm:6.2.1-2025.1
    docker.io/trilio/trilio-horizon-plugin-helm:6.2.1-2025.1
    docker.io/trilio/trilio-wlm-helm:6.2.1-2025.1
    docker.io/trilio/trilio-dms-helm:6.2.1-2025.1

    OpenStack Caracal (MOSK25.1)

    triliovault-pkg-source

    deb [trusted=yes] https://apt.fury.io/trilio-6-2 /

    channel

    6.2/stable

    https://pypi.fury.io/trilio-6-2/

    contegoclient

    6.2.1.2

    tvault-horizon-plugin

    6.2.1.5

    Package Repositories & Versions

    registry.connect.redhat.com/trilio/trilio-openstack-operator-rhoso:6.2.1-fr6-rhoso18.0

    Kolla Flamingo (2025.2)

    workloadmgr

    Workload Import & Migration

    Each Trilio Workload has a dedicated owner. The ownership of a Workload is defined by:

    • OpenStack User - The OpenStack User-ID is assigned to a Workload

    • OpenStack Project - The OpenStack Project-ID is assigned to a Workload

    • OpenStack Cloud - The Trilio Serviceuser-ID is assigned to a Workload

    OpenStack Users can update the User ownership of a Workload by modifying the Workload.

    This ownership secures, that only the owners of a Workload are able to work with it.

    OpenStack Administrators can reassign Workloads or reimport Workloads from older Trilio installations.

    Workload import allows to import Workloads existing on the Backup Target into the Trilio database.

    To get a list of importable Workloads use the following CLI command:

    • --project-id <project-id> ➡️ List workloads belonging to the given project only. If not provided, all importable workloads are considered.

    • --source-bt <source-bt> [<source-bt> ...] ➡️ List workloads belonging to the given backup target(s) only. If not provided, all available Backup Targets are considered.

    To import Workloads into the Trilio database use the following CLI command:

    • --workload-ids <workload_ids> [<workload_ids> ...] ➡️ Specify workload ids to import only the specified workloads. If not provided, all available workloads from the source Backup Target Type are imported.

    • --source-btt <source-btt> [<source-btt> ...] ➡️ Search workloads in the given Backup Target Type ids. If not provided, the default Backup Target Type is considered. Only a single --source-btt is allowed when --workload-ids is provided.

    The command returns a JOB-ID; track the progress with .

    The definition of an orphaned Workload is from the perspective of a specific Trilio installation. Any workload that is located on the Backup Target Storage, but whose owning tenant/user is not valid in the current cloud, is considered orphaned.

    Further is to divide between Workloads that were previously owned by Projects/Users in the same cloud or are migrated from a different cloud.

    The following CLI command provides the list of orphaned workloads:

    • --migrate_cloud {True,False} ➡️ Set to True if you want to list workloads from other clouds as well. Default is False.

    OpenStack administrators are able to reassign a Workload to a new owner. This involves the possibility to migrate a Workload from one cloud to another or between projects.

    Use the following CLI command to reassign a Workload:

    • --old_tenant_ids <old_tenant_id> ➡️ Specify old tenant ids from which workloads need to be reassigned to the new tenant. Specify multiple times to choose Workloads from multiple tenants.

    • --new_tenant_id <new_tenant_id> ➡️ Specify the new tenant id to which the workloads need to be reassigned. Only one target tenant can be specified. Required (together with --user_id) unless --map_file is used.

    Workload import, workload reassignment and orphaned workload discovery are combined into a single, job-based Import & Reassign workflow. All operations run asynchronously: each command returns a JOB-ID and the results or progress of the operation are fetched with workloadmgr job-detail-show <job-id>.

    The workflow consists of the following steps:

    1. Discover the workloads available for import and/or reassignment using workloadmgr workload-get-import-reassign-list. The command returns a JOB-ID.

    2. Inspect the discovery results using workloadmgr job-detail-show <job-id>. Add --generate-yaml to produce a pre-filled reassign map file.

    The unified list command discovers all workloads on the Backup Target(s) that can be imported into the Trilio database or reassigned to a new owner.

    • --old-tenant-ids <old_tenant_id> [<old_tenant_id> ...] ➡️ List workloads belonging to the given old tenant ids. Mutually exclusive with --orphaned.

    • --orphaned ➡️ Discover orphaned workloads (workloads whose tenant/user is not valid in the current cloud) without specifying any ids. Mutually exclusive with --old-tenant-ids. Combine with --migrate-cloud to also discover orphaned workloads on other clouds' backup targets. This replaces the deprecated workload-get-orphaned-workloads-list

    At least one of --old-tenant-ids, --orphaned, --source-btt or --source-btt-all must be provided.

    The command returns a JOB-ID:

    • <jobid> ➡️ The job id returned by any Import & Reassign command.

    • --generate-yaml ➡️ For a discovery job (list_import_reassign), write a reassign_map.yaml pre-filled with the discovered workload ids to the system temporary directory. Fill in the new_tenant_id/user_id/source_btt

    For a discovery job the output contains the job header and, per Backup Target Type searched, the discovered workloads:

    • workload_to_import ➡️ Workloads found on the Backup Target that are not known to this Trilio installation. These will be imported.

    • workload_to_reassign ➡️ Workloads that already exist in the Trilio database. These will only be reassigned to the new owner.

    • source_btt ➡️ The Backup Target Type id the workloads were found in.

    For an import/reassign operation job the output contains the job header followed by the progress of the reassigned workloads (workload_to_update, updated_workloads, source_btt, error_message) and of the imported workloads (workload_to_import, source_btt, error_message, wl_import_job_id, wl_import_job_details).

    The unified operation imports workloads from the Backup Target and, when a reassignment target is provided, reassigns them to that tenant/user.

    • --workload-ids <workload_ids> [<workload_ids> ...] ➡️ Specify workload ids to import/reassign. Mutually exclusive with --old-tenant-ids.

    • --old-tenant-ids <old_tenant_ids> [<old_tenant_ids> ...] ➡️ Specify old tenant ids whose workloads need to be imported/reassigned. Mutually exclusive with --workload-ids.

    One of --workload-ids, --old-tenant-ids or --map-file must be provided.

    The command prints workloads that failed validation, workloads that were reassigned immediately (already present in the database) and the JOB-IDs of the asynchronous import operations:

    A sample mapping file with explanations is shown below. The easiest way to produce one is workloadmgr job-detail-show <jobid> --generate-yaml on a discovery job:

    All jobs created by the Import & Reassign workflow (and every other job type job-detail-show can render) can be listed, newest first and paginated:

    • --limit <limit> ➡️ Maximum number of jobs to return.

    • --marker <marker> ➡️ Return jobs older than (with a job id less than) this job id. Use the last job id of the previous page to fetch the next page.

    • --action <action> ➡️ Narrow to the given job action(s). Repeat the option to pass several. If not provided, all job types are listed. One of:

    The Import & Reassign workflow uses the actions list_import_reassign (discovery jobs) and import_reassign (operation jobs).

    Job records that are no longer needed can be deleted in bulk:

    • <jobid> [<jobid> ...] ➡️ One or more job ids to delete (space separated for bulk deletion). Deleting a job also removes its detail records.

    After upgrading Trilio, existing workload and policy database records can be converted to the current release schema without re-importing them:

    The command takes no arguments and runs cloud-wide across all backup targets: it converts old policy and workload job-schedule fields to the current schema and refreshes each workload's backup-target-type metadata. It returns a JOB-ID; track the progress with . This replaces the deprecated workload-importworkloads --inplace-upgrade option.

    Note:- We cannot reassign the immutable backup target workload from one cloud to another. To do this, we need to follow the steps outlined below

    Steps:-

    1. Download the immutable workload directory from its mount path and upload/copy it to the non-immutable backup target mount path.

    2. We need to update the backup_target_types and backup_media_target metadata property of the workload and all it’s snapshots at backup target to the current backup target where it exists. Here reference Please perform following steps to accomplish the task.

    3. Check the original backup_target_types and backup_media_target metadata property of the workload using either less or jq command. If you already knows this information then you may skip this step.

    1. Find & replace the backup_target_types property of the workload and it’s all respective snapshots

    1. Find & replace the backup_media_target property of the workload and it’s all respective snapshots

    1. Verify the changes

    1. Now try reassigning the workload.

    Upgrading on Canonical

    This page covers upgrading Trilio charms on a Canonical (Charmed) OpenStack cloud from an existing release (5.x, 6.0, 6.1, or 6.2.0) to T4O 6.2.1.

    The following features have been removed in T4O 6.2 for Canonical OpenStack charms:

    • Static backup targets — The trilio-backup-targets charm config option (present on both trilio-wlm and trilio-data-mover) is removed. NFS and S3 backup targets are no longer configured via charm config.

    --target-btt <target-btt> ➡️ Backup Target Type id to assign the imported workloads to. If not provided, the workload's original Backup Target Type is used. Warning: if the Backup Target Type of a workload changes, its snapshots are not imported and the next snapshot will be a full snapshot in the newly assigned Backup Target Type.

  • --source-btt-all ➡️ Search in all Backup Target Types. Only allowed when --workload-ids is NOT provided.

  • --inplace-upgrade ➡️ DEPRECATED. Update all workload and policy records in the database to the current release version instead of importing. Please use the newly added workload-inplace-db-upgrade command instead.

  • --workload-ids <workload_ids> [<workload_ids> ...] ➡️ Specify workload ids that need to be reassigned to the new tenant. If not provided, all the workloads from the old tenant get reassigned to the new tenant.

  • --user_id <user_id> ➡️ Specify the user id to which the workloads need to be reassigned. Only one target user can be specified.

  • --migrate_cloud {True,False} ➡️ Set to True if you want to reassign workloads from other clouds as well. Default is False.

  • --source-btt <source-btt> [<source-btt> ...] ➡️ Search workloads in the given Backup Target Type ids. If not provided, the default Backup Target Type is considered. Only a single --source-btt is allowed when --workload-ids is provided.

  • --source-btt-all ➡️ Search in all Backup Target Types. Only allowed when --workload-ids is NOT provided. --old_tenant_ids and --new_tenant_id must be provided to use it.

  • --map_file <map_file> ➡️ Path (relative or absolute) to a reassign map file in YAML format, listing old workloads mapped to new tenants. See the sample mapping file.

  • Execute the import/reassign operation using workloadmgr workload-import-reassign. The command returns one or more JOB-IDs.
  • Track the operation with workloadmgr job-detail-show <job-id>. Jobs can be listed with workloadmgr job-list and cleaned up with workloadmgr job-delete.

  • command.
  • --source-btt <source-btt> [<source-btt> ...] ➡️ Search workloads in the given Backup Target Type ids only. Mutually exclusive with --source-btt-all. If neither is provided, the default Backup Target Type is considered.

  • --source-btt-all ➡️ Search in all Backup Target Types. Mutually exclusive with --source-btt.

  • --migrate-cloud ➡️ Include workloads owned by other clouds as well. Default is False.

  • placeholders and feed the file back via
    workloadmgr workload-import-reassign --map-file
    . This replaces the deprecated
    workload-get-orphaned-workloads-list --generate_yaml
    output.
  • --output <output> ➡️ Optional file path to save a downloadable artifact produced by other job types (e.g. the tenants-chargeback CSV job). Not used for Import & Reassign jobs.

  • current_cloud ➡️ Whether the workload's owning tenant belongs to the current cloud. If False, --migrate-cloud is required to import/reassign it.

  • error_message ➡️ Any error hit while listing the workloads of this Backup Target Type.

  • --new-tenant-id <new_tenant_id> ➡️ Optional. New tenant id to reassign the workloads to. If set, --user-id is required. When omitted, the command performs a pure import and the workloads keep their original owner.
  • --user-id <user_id> ➡️ Optional. User id to reassign the workloads to. Required when --new-tenant-id is provided. The user must exist in the new tenant and hold the trustee role.

  • --migrate-cloud ➡️ Include workloads from other clouds as well. Default is False.

  • --source-btt <source-btt> [<source-btt> ...] ➡️ Search workloads in the given Backup Target Type ids. If not provided, the default Backup Target Type is considered. Multiple values are allowed, including together with --workload-ids; when a workload exists in more than one Backup Target Type, the latest copy is imported.

  • --source-btt-all ➡️ Search in all Backup Target Types. Not allowed together with --workload-ids. Mutually exclusive with --source-btt.

  • --target-btt <target-btt> ➡️ Backup Target Type id to assign the imported workloads to. If not provided, the workload's original Backup Target Type is used.

  • --map-file <map_file> ➡️ Path (relative or absolute) to a YAML reassign map file describing multiple mappings in one call. Mutually exclusive with --workload-ids, --old-tenant-ids, --new-tenant-id and --user-id; the remaining options are ignored, as each mapping in the file carries its own values.

  • import_workloads
    ,
    list_importable_workloads
    ,
    inplace_upgrade_db_records
    ,
    tenants-chargeback-csv
    ,
    list_import_reassign
    ,
    list_reassign_workloads
    ,
    import_reassign
    ,
    workload_reassign
    .

    Import workloads

    The Workload import is designed to import Workloads, which are owned by the Cloud.

    It will not import or list any Workloads that are owned by a different cloud.

    workload-get-importworkloads-list

    DEPRECATED: use workload-get-import-reassign-list instead.

    Response change: the command no longer prints the importable workload list directly. It now returns a JOB-ID; fetch the importable workload list with job-detail-show.

    workload-importworkloads

    DEPRECATED: use workload-import-reassign instead.

    Orphaned Workloads

    DEPRECATED: use workload-get-import-reassign-list with --orphaned instead. The former --generate_yaml option has been replaced by job-detail-show --generate-yaml.

    Response change: the command no longer prints the orphaned workload list directly and no longer accepts --generate_yaml. It now returns a JOB-ID; fetch the orphaned workload list with job-detail-show and generate a reassign map with workloadmgr job-detail-show <job-id> --generate-yaml.

    Running this command against a Backup Target with many Workloads can take a bit of time. Trilio is reading the complete Storage and verifies every found Workload against the Workloads known in the database.

    Reassigning Workloads

    DEPRECATED: use workload-import-reassign instead.

    Reassigning a workload only changes the database of the target Trilio installation. When the Workload was managed before by a different Trilio installation, will that installation not be updated.

    Response change: the command now delegates to the unified import + reassign operation. Instead of only printing the reassigned workloads, it prints the workloads that failed validation, the workloads that were reassigned immediately (already present in the database) and the JOB-IDs of the asynchronous import operations; track those with job-detail-show.

    Unified Import and Reassign workflow

    All Import & Reassign commands are admin-only operations.

    workload-get-import-reassign-list

    Running the discovery against a Backup Target with many Workloads can take a bit of time. Trilio is reading the complete storage and verifies every found Workload against the Workloads known in the database. Re-run job-detail-show until the job status is no longer in progress.

    job-detail-show

    workload-import-reassign

    If --target-btt changes the Backup Target Type of a workload, its existing snapshots are not imported and the next snapshot in the newly assigned Backup Target Type will be a full snapshot.

    job-list

    job-delete

    workload-inplace-db-upgrade

    Reassigning workloads on immutable backup targets

    job-detail-show
    job-detail-show

    Kolla Ubuntu Epoxy (2025.1)

    trilio-charmers-trilio-data-mover

    Jammy (Ubuntu 22.04)

    98

    trilio-charmers-trilio-horizon-plugin

    Jammy (Ubuntu 22.04)

    29

    11

    trilio-data-mover-sunbeam

    Noble (Ubuntu 24.04)

    18

    python3-namedatomiclock

    1.1.3

    python3-s3-fuse-plugin

    10.2.1.2

    python3-trilio-dms

    6.2.1.5

    python3-tvault-contego

    6.2.1.4

    python3-tvault-horizon-plugin

    6.2.1.5

    python3-workloadmgrclient

    6.2.1.6

    workloadmgr

    6.2.1.9

    python3-dmapi-el9

    RHEL9

    6.2.1.4-6.2

    python3-s3fuse-plugin-el9

    RHEL9

    10.2.1.2-6.2

    python3-trilio-dms-el9

    RHEL9

    6.2.1.5-6.2

    python3-trilio-fusepy

    RHEL9

    3.0.1-1

    python3-trilio-fusepy-el9

    RHEL9

    3.0.1-1

    python3-tvault-contego-el9

    RHEL9

    6.2.1.4-6.2

    python3-tvault-horizon-plugin-el9

    RHEL9

    6.2.1.5-6.2

    python3-workloadmgrclient-el9

    RHEL9

    6.2.1.6-6.2

    python3-workloadmgr-el9

    RHEL9

    6.2.1.9-6.2

    trilio-charmers-trilio-wlm
    trilio-charmers-trilio-dm-api
    trilio-wlm-k8s
    trilio-dm-api-k8s
    workloadmgr workload-get-importworkloads-list [--project-id <project-id>]
                                                  [--source-bt <source-bt> [<source-bt> ...]]
    workloadmgr workload-importworkloads [--workload-ids <workload_ids> [<workload_ids> ...]]
                                         [--source-btt <source-btt> [<source-btt> ...]]
                                         [--target-btt <target-btt>]
                                         [--source-btt-all]
                                         [--inplace-upgrade]
    workloadmgr workload-get-orphaned-workloads-list [--migrate_cloud {True,False}]
    workloadmgr workload-reassign-workloads
                                            [--old_tenant_ids <old_tenant_id>]
                                            [--new_tenant_id <new_tenant_id>]
                                            [--workload-ids <workload_ids> [<workload_ids> ...]]
                                            [--user_id <user_id>]
                                            [--migrate_cloud {True,False}]
                                            [--source-btt <source-btt> [<source-btt> ...]]
                                            [--source-btt-all]
                                            [--map_file <map_file>]
    workloadmgr workload-get-import-reassign-list
                                            [--old-tenant-ids <old_tenant_id> [<old_tenant_id> ...]]
                                            [--orphaned]
                                            [--source-btt <source-btt> [<source-btt> ...]]
                                            [--source-btt-all]
                                            [--migrate-cloud]
    +--------+
    | JOB-ID |
    +--------+
    | 101    |
    +--------+
    workloadmgr job-detail-show <jobid> [--generate-yaml] [--output <output>]
    workloadmgr workload-import-reassign
                                            [--workload-ids <workload_ids> [<workload_ids> ...]]
                                            [--old-tenant-ids <old_tenant_ids> [<old_tenant_ids> ...]]
                                            [--new-tenant-id <new_tenant_id>]
                                            [--user-id <user_id>]
                                            [--migrate-cloud]
                                            [--source-btt <source-btt> [<source-btt> ...]]
                                            [--source-btt-all]
                                            [--target-btt <target-btt>]
                                            [--map-file <map_file>]
    Track progress using cmd: workloadmgr job-detail-show <job-id>
    +--------+
    | JOB-ID |
    +--------+
    | 102    |
    +--------+
    reassign_mappings:
       - old_tenant_ids: [] # provide either a list of old_tenant_ids or workload_ids
         new_tenant_id: new_tenant_id # optional; omit together with user_id for a pure import
         user_id: user_id # required when new_tenant_id is provided
         source_btt: [] # list of source BTT ids in which the workloads are searched
         source_btt_all: False # True searches all available BTTs (not allowed with workload_ids)
         workload_ids: [] # provide either a list of old_tenant_ids or workload_ids
         migrate_cloud: False # True also reassigns workloads from other clouds
         target_btt: null # optional; BTT id to assign the imported workloads to
         upgrade: True # optional; upgrade imported records to the current release schema
    
       - old_tenant_ids: []
         new_tenant_id: new_tenant_id
         user_id: user_id
         source_btt: []
         source_btt_all: False
         workload_ids: []
         migrate_cloud: False
    workloadmgr job-list [--limit <limit>] [--marker <marker>] [--action <action>]
    workloadmgr job-delete <jobid> [<jobid> ...]
    workloadmgr workload-inplace-db-upgrade
        a. Using less command
            i. less <file_system_mountpath>/workload_<workload_uuid>/workload_db
            ii. Example
                1. less /var/trilio/triliovault-mounts/L2hvbWUva29sbGEv/workload_385d0e94-d602-4963-96c2-28bebea352f1/workload_db
            iii. search backup_target_types and backup_media_target in the file and note down it’s respective values
    
        b. Using jq command
            i. jq '.metadata[] | select(.key == "backup_media_target") | .value' <file_system_mountpath>/workload_<workload_uuid>/workload_db
            ii. Example
                jq '.metadata[] | select(.key == "backup_target_types") | .value' /var/trilio/triliovault-mounts/L2hvbWUva29sbGEv/workload_385d0e94-d602-4963-96c2-28bebea352f1_backup/workload_db
            iii. search backup_target_types and backup_media_target and note down it’s respective values
        a. grep -rl 'old_BTT' <file_system_mountpath>/workload_<workload_uuid> | xargs sed -i 's/<old_BTT>/<new_BTT>/g'
        b. Here,
            i. old_BTT  ---> Old Backup Target Type name
            ii. new_BTT ---> New Backup Target Type name  
        c. Example
            i. grep -rl 'nfs_1' /var/trilio/triliovault-mounts/L2hvbWUva29sbGEv/workload_385d0e94-d602-4963-96c2-28bebea352f1 | xargs sed -i 's/nfs_1/nfs_2/g'
        a. grep -rl '<old_filesystem_export>' <file_system_mountpath>/workload_<workload_uuid> | xargs sed -i 's/<old_filesystem_export>/<new_filesystem_export>/g'
        b. Here,
            i. old_filesystem_export  ---> File system export path of old Backup Target
            ii. new_filesystem_export ---> File system export path of new Backup Target
        c. Note: Please make sure to use {{}} before every {{/ }} character in old_filesystem_export & new_filesystem_export places.
        d. Example
            i. grep -rl '192.168.0.51:/home/kolla/' /var/trilio/triliovault-mounts/L2hvbWUva29sbGEv/workload_385d0e94-d602-4963-96c2-28bebea352f1 | xargs sed -i 's/192.168.0.51:\/home\/kolla\//192.168.0.52:\/home\/kolla_new\//g'
            ii. Here the original filesystem export is 192.168.0.51:/home/kolla/ which we have mentioned in above command as 192.168.0.51:\/home\/kolla\/ by adding additional }} before every {{/ character. The same changes are expected for new filesystem export path as well.
    
        a. The following commands must show the files having the updated changes.
            i. grep -rl 'new_BTT' <file_system_mountpath>/workload_<workload_uuid>
            ii. grep -rl '<new_filesystem_export>' <file_system_mountpath>/workload_<workload_uuid>
    docker.io/trilio/kolla-rocky-trilio-datamover:6.2.1-2025.1
    docker.io/trilio/kolla-rocky-trilio-datamover-api:6.2.1-2025.1
    docker.io/trilio/kolla-rocky-trilio-horizon-plugin:6.2.1-2025.1
    docker.io/trilio/kolla-rocky-trilio-wlm:6.2.1-2025.1
    docker.io/trilio/kolla-rocky-trilio-dms:6.2.1-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-datamover:6.2.1-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-datamover-api:6.2.1-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-horizon-plugin:6.2.1-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-wlm:6.2.1-2025.1
    docker.io/trilio/kolla-ubuntu-trilio-dms:6.2.1-2025.1
    docker.io/trilio/kolla-rocky-trilio-datamover:6.2.1-2025.2
    docker.io/trilio/kolla-rocky-trilio-datamover-api:6.2.1-2025.2
    docker.io/trilio/kolla-rocky-trilio-horizon-plugin:6.2.1-2025.2
    docker.io/trilio/kolla-rocky-trilio-wlm:6.2.1-2025.2
    docker.io/trilio/kolla-rocky-trilio-dms:6.2.1-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-datamover:6.2.1-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-datamover-api:6.2.1-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-horizon-plugin:6.2.1-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-wlm:6.2.1-2025.2
    docker.io/trilio/kolla-ubuntu-trilio-dms:6.2.1-2025.2
    docker.io/trilio/trilio-datamover-helm:6.2.1-mosk25.1
    docker.io/trilio/trilio-datamover-api-helm:6.2.1-mosk25.1
    docker.io/trilio/trilio-horizon-plugin-helm:6.2.1-mosk25.1
    docker.io/trilio/trilio-wlm-helm:6.2.1-mosk25.1
    docker.io/trilio/trilio-dms-helm:6.2.1-mosk25.1
    docker.io/trilio/trilio-datamover-helm:6.2.1-mosk25.2
    docker.io/trilio/trilio-datamover-api-helm:6.2.1-mosk25.2
    docker.io/trilio/trilio-horizon-plugin-helm:6.2.1-mosk25.2
    docker.io/trilio/trilio-wlm-helm:6.2.1-mosk25.2
    docker.io/trilio/trilio-dms-helm:6.2.1-mosk25.2
    docker.io/trilio/trilio-wlm-canonical:6.2.1-2024.1
    docker.io/trilio/trilio-datamover-api-canonical:6.2.1-2024.1
    docker.io/trilio/trilio-horizon-plugin-canonical:6.2.1-2024.1
    tvault-object-store service — The service that managed NFS/FUSE mount lifecycle is removed. The 6.2 charm automatically disables and stops it after package installation if the unit file is present.
  • Object-store config templates — triliovault-object-store.conf, object_store_logging.conf, and tvault-object-store.service are removed from all charms.

  • These changes are part of the Dynamic Mount Service (DMS), introduced in 6.2, which replaces the per-backup-target object-store containers with a single mount-management service per host.

    Some commands differ between Juju 2.x and Juju 3.x. Both variants are shown throughout this page where applicable.

    Operation
    Juju 2.x
    Juju 3.x

    Upgrade charm

    juju upgrade-charm

    juju refresh

    Add relation

    juju add-relation

    Two constraints catch people out when running actions across all units:

    • There is no <application>/* wildcard. Both juju run (3.x) and juju run-action (2.x) accept only a specific unit ID (trilio-data-mover/19) or leader syntax (trilio-data-mover/leader). Passing trilio-data-mover/* fails with ERROR invalid unit or action name "trilio-data-mover/*". /leader is not a substitute where an action must run on every unit.

    • --wait requires a duration unit. --wait=300 fails with ERROR invalid value "300" for option --wait: time: missing unit in duration "300". Use --wait=300s.

    Because of the first constraint, this page uses the trilio_units helper below to enumerate units from juju status. Define it once in your shell before running Steps 4 and 7:

    Verify it before relying on it — it should list every Trilio unit in your model:

    In releases prior to 6.2 (5.x, 6.0, 6.1), backup targets were defined in the overlay bundle under both trilio-wlm and trilio-data-mover options as a JSON list. Example:

    These targets were mounted under /var/triliovault-mounts/ on all compute nodes (data-mover) and WLM nodes — NFS targets as NFS mounts, S3 targets as s3vaultfuse FUSE mounts.

    Ensure no snapshot or restore is running, and disable the Global Job Scheduler, before starting the upgrade.

    Take a backup of your existing overlay bundle before making any changes. You will need it in Step 8 to recreate backup targets in 6.2 — the script reads trilio-backup-targets directly from the file.

    Do not modify the old bundle. Instead, create a new 6.2 overlay bundle based on the updated sample provided in the triliovault-cfg-scripts repository:

    This sample bundle already has the following 6.2 changes applied:

    • trilio-backup-targets removed from both trilio-wlm and trilio-data-mover

    • backup-target-type removed

    • trilio-data-mover:identity-service → keystone:identity-service relation added (new in 6.2.0) — required for DMS server configuration

    • Charm channel updated to 6.2/stable

    Copy the sample and customise it for your environment:

    This new bundle file is NOT deployed as part of this upgrade. The charm upgrade itself happens entirely via the per-application juju refresh/juju upgrade-charm commands in Step 2 (plus the package source change in Step 3 and the relation add in Step 5) — there is no juju deploy --overlay step in the upgrade flow. Preparing this bundle here serves two purposes only: (1) its triliovault-pkg-source and revision variables are the reference you copy into the Step 2 and Step 3 commands, and (2) it becomes your up-to-date bundle for any future fresh installs or disaster-recovery redeploys matching this exact release — it is not consumed by any command in this upgrade flow.

    Refresh each Trilio charm from Charmhub using the 6.2/stable channel and the revision numbers from the 6.2.1 release build resources:

    Juju 3.x:

    Juju 2.x:

    Revision numbers are published in the build resources for each release. The 6.2 sample overlay bundle (tvo-overlay-bundle.yaml) includes revision variables at the top — update those values from the build resources; that bundle is what future fresh installs deploy with juju deploy ./openstack_base_file.yaml --overlay tvo-overlay-bundle-6.2.yaml. For upgrades, use the per-application commands above.

    The 6.2 charm automatically stops and disables the tvault-object-store service on each unit after package installation if the service unit file is present.

    Some units may report blocked or waiting immediately after the refresh — this is expected until Steps 3 and 4 have been completed.

    Each Trilio release publishes its packages to its own APT repository, so after a charm refresh the triliovault-pkg-source config option still points at the repository of the release you are upgrading from. Until it is updated, the charms keep installing packages from the old repository and the new release's packages are never fetched.

    Required when upgrading from 5.x, 6.0, or 6.1 — the package repository changes with the release. Skip only when the source is genuinely unchanged (for example a 6.2.X → 6.2.Y charm-only refresh on the same repository).

    Example — the repository changes between 6.1 and 6.2:

    Release

    triliovault-pkg-source

    6.1

    deb [trusted=yes] https://apt.fury.io/trilio-6-1/ /

    6.2.1

    deb [trusted=yes] https://apt.fury.io/trilio-6-2 /

    Do not change the package source until every unit is running the new charm revision and is in idle agent state. The package source change is applied by whichever charm code is active at that moment. If it is applied while the previous release's charm is still running, that older charm consumes the change and installs its own package list; the new charm revision then sees the source as already up to date, skips installation, and any package introduced in the new release is never installed — leaving units blocked on a service that was never deployed.

    Each application must report the charm revision you set in Step 2, and every unit must show agent status idle.

    Use the same triliovault-pkg-source value as your prepared 6.2 overlay bundle (Step 1), so the bundle and the running deployment stay in sync:

    Changing this value triggers a package install on each unit automatically. Wait for all units to return to idle before continuing:

    Required — run this step in all cases, including when Step 3 already changed the package source. A plain juju refresh / juju upgrade-charm only swaps the charm hook code — it does not reinstall the Trilio apt packages or apply any pending database migrations on its own. The update-trilio action forces the package upgrade and applies pending DB migrations. It is idempotent and safe to re-run.

    The action must run on every unit of each application, not just the leader — packages are installed per unit. Define the trilio_units helper from the Action syntax section above first, then run the loop below. It preserves the application order (WLM first, so its DB migrations land before the other services reconnect) and prints each unit's result.

    Juju 3.x:

    Juju 2.x:

    Check the status: field in every unit's output before continuing — it must read completed. A unit that was skipped or that failed will not have had its packages upgraded, and the failure is easy to miss in a long loop.

    Verify the package versions updated on each application:

    Every listed package must show status ii (installed) and the new release version. A package shown as rc, or missing entirely, means the upgrade did not reach that unit — re-run update-trilio on it before continuing.

    T4O 6.2.0 introduced one Juju relation that does not exist in 6.1 or earlier, and it must be added explicitly during an upgrade — the overlay bundle is not deployed, so relations declared in it are never created.

    Relation
    Introduced in
    Purpose
    Required when upgrading from

    trilio-data-mover:identity-service ↔ keystone:identity-service

    6.2.0

    Supplies the Keystone URL used to render the DMS server config on compute nodes (replaces the keystone-auth-url config option)

    5.x, 6.0, 6.1

    Adding a relation that is already present is harmless — Juju reports it and makes no change.

    Juju 3.x:

    Juju 2.x:

    Verify the relation is present before continuing:

    Then confirm the DMS client on the DMAPI node can actually authenticate against the workloadmgr database. Checking only that db_url is populated is not sufficient — the config can render a perfectly valid-looking URL whose credential has no matching MySQL grant, which is exactly how TVAULT-7592 reached QA:

    The output must be OK: DMS client authenticated as workloadmgr. If it fails with Access denied for user 'workloadmgr'@<dmapi-ip>, the DMAPI host has no grant on the workloadmgr database. Confirm with SELECT user,host FROM mysql.user WHERE user='workloadmgr'; on the mysql-innodb-cluster primary — there must be a row for the trilio-dm-api unit's address as well as the trilio-wlm one. A blank db_url instead means the charm has not yet been answered on shared-db; wait for the unit to leave blocked and re-check.

    Wait until all Trilio units are in active/idle state before proceeding. Do not run the unmount steps while any unit is still in a waiting, maintenance, or error state.

    Expected output — all units should show:

    Do not proceed to Step 7 until all trilio-wlm and trilio-data-mover units are in active/idle state. Running the unmount action while a unit is still configuring or restarting services may leave the unit in an inconsistent state.

    Run the unmount-old-backup-targets action on all WLM and data-mover units. The action:

    • Stops and disables all tvault-object-store-*.service systemd units so they cannot remount targets

    • Kills any running s3vaultfuse processes

    • Lazy-unmounts all mounts under /var/triliovault-mounts deepest-first — NFS with umount -l -f, FUSE with umount -l

    A helper script is provided in the triliovault-cfg-scripts repository that automatically detects the Juju client version, runs the action on all units, and verifies that no stale mounts remain. The script runs with bash -x so each command is printed as it executes, making it easy to follow progress and diagnose any failures. It exits with a non-zero status and prints a clear FAILED message if any stale mounts are still present after cleanup.

    If the script exits with SUCCESS, proceed directly to Step 8. If it exits with FAILED, review the listed units and investigate manually before continuing.

    To run the action manually instead, use the trilio_units helper from the Action syntax section above:

    Juju 3.x:

    Juju 2.x:

    The action is idempotent, so re-running it on a unit that is already clean is harmless.

    After unmounting old backup targets, recreate them in T4O 6.2 using the upgrade_backup_targets_62.sh script. Run this script from the Juju controller node — it connects to the WLM unit via juju ssh and executes all commands remotely. No need to copy files to the WLM unit manually.

    This step is only needed when upgrading from a previous release (5.x, 6.0, 6.1) that used static backup targets configured via trilio-backup-targets. For fresh 6.2 installations, this step does not apply — see Getting started with Trilio on Canonical OpenStack instead.

    The script:

    • Reads trilio-backup-targets from the backed-up overlay bundle file

    • Automatically finds the active/blocked WLM leader unit

    • Checks if each backup target already exists by backend endpoint — creates if not found, updates if found

    • NFS targets: creates with NFS mount options; if already exists, updates mount options via workloadmgr backup-target-modify

    • S3 targets: creates a Barbican secret using trilio-dms-cli and openstack secret store, then creates or updates the backup target with --secret-ref

    • Prints every command and its full output to the screen

    Prerequisites (on the Juju controller node):

    • OpenRC file with OpenStack admin credentials

    • Backed-up overlay bundle YAML from the previous release

    Run the script: edit the old bundle file path and OpenStack RC file path.

    The script exits with code 0 if all targets were created/updated successfully, or code 1 if any errors occurred.

    The script sources the OpenRC file on the controller node to resolve any variable substitutions, strips OS_CACERT, and copies a clean literal-value file to the WLM unit over juju scp. The temp file is removed from the WLM unit automatically on exit.

    The sample overlay bundle for T4O 6.2 is available in the triliovault-cfg-scripts repository under:

    • T4O 6.2.0 adds one relation that does not exist in 6.1 or earlier: trilio-data-mover:identity-service ↔ keystone:identity-service. It must be added explicitly during an upgrade — the overlay bundle is not deployed, so relations declared in it are never created. See Step 5.

    • The unmount-old-backup-targets action is idempotent — safe to run multiple times.

    • The trilio-backup-targets and backup-target-type charm config options are absent in 6.2 charms — remove them from your overlay bundle before deploying.

    • The triliovault-pkg-source change (Step 3) must always be applied after the charm refresh in Step 2 has settled on every unit, never before or during it. Applying it first causes the outgoing charm to consume the change and skip packages added in the new release.

    • The update-trilio action (Step 4) exists on all four charms and must be run after every juju refresh/juju upgrade-charm — otherwise the new packages and pending DB migrations may never actually be applied.

    • The overlay bundle prepared in Step 1 is a reference/future-install artifact only — it is never deployed via juju deploy --overlay during an upgrade. The upgrade itself is applied entirely through Steps 2–5 (per-application juju refresh, the package source change, the update-trilio action, and the new Keystone relation).

    This page is for upgrading an existing Trilio deployment. If you are deploying T4O 6.2.1 fresh onto a Canonical OpenStack cloud that has no prior Trilio installation, see Getting started with Trilio on Canonical OpenStack instead.

    What Changed in 6.2

    # Prints every unit of the given Trilio applications, including subordinates.
    # trilio-data-mover and trilio-horizon-plugin are subordinate charms, so their
    # units appear under the principal's "subordinates" — not under the
    # application's own "units" — and a naive loop over applications misses them.
    # To run, just paste the below code in any shell session from where the juju commands will be executed.
    trilio_units() {
      juju status --format=json | python3 -c "
    import sys, json
    d = json.load(sys.stdin)
    prefixes = tuple(a + '/' for a in sys.argv[1:])
    found = []
    for app in d['applications'].values():
        for name, unit in app.get('units', {}).items():
            if name.startswith(prefixes):
                found.append(name)
            for sub in unit.get('subordinates', {}):
                if sub.startswith(prefixes):
                    found.append(sub)
    for u in sorted(found):
        print(u)
    " "$@"
    }
    #Usage
    trilio_units trilio-wlm trilio-dm-api trilio-data-mover trilio-horizon-plugin
    applications:
      trilio-data-mover:
        options:
          trilio-backup-targets: >
            [
              {
                "backup-target-name": "S3_BT1",
                "backup-target-type": "s3",
                "s3-type": "amazon_s3",
                ...
              },
              {
                "backup-target-name": "NFS_BT2",
                "backup-target-type": "nfs",
                "nfs-shares": "192.2.1.33:/var/nfsshare1",
                "nfs-options": "nolock,soft,timeo=600,..."
              }
            ]
      trilio-wlm:
        options:
          trilio-backup-targets: >
            [ ... same targets ... ]
    cp tvo-overlay-bundle-<previous-release>.yaml tvo-overlay-bundle-<previous-release>-backup.yaml
    juju-charms/sample_overlay_bundles/tvo-overlay-bundle.yaml
    cp juju-charms/sample_overlay_bundles/tvo-overlay-bundle.yaml tvo-overlay-bundle-6.2.yaml
    # Edit tvo-overlay-bundle-6.2.yaml — update triliovault-pkg-source and revision numbers
    juju refresh trilio-wlm --channel 6.2/stable --revision <WLM_REVISION>
    juju refresh trilio-data-mover --channel 6.2/stable --revision <DM_REVISION>
    juju refresh trilio-dm-api --channel 6.2/stable --revision <DMAPI_REVISION>
    juju refresh trilio-horizon-plugin --channel 6.2/stable --revision <HORIZON_PLUGIN_REVISION>
    juju upgrade-charm trilio-wlm --channel 6.2/stable --revision <WLM_REVISION>
    juju upgrade-charm trilio-data-mover --channel 6.2/stable --revision <DM_REVISION>
    juju upgrade-charm trilio-dm-api --channel 6.2/stable --revision <DMAPI_REVISION>
    juju upgrade-charm trilio-horizon-plugin --channel 6.2/stable --revision <HORIZON_PLUGIN_REVISION>
    juju status trilio-wlm trilio-data-mover trilio-dm-api trilio-horizon-plugin
    PKG_SOURCE='deb [trusted=yes] https://apt.fury.io/trilio-6-2 /'
    
    juju config trilio-wlm            triliovault-pkg-source="$PKG_SOURCE"
    juju config trilio-data-mover     triliovault-pkg-source="$PKG_SOURCE"
    juju config trilio-dm-api         triliovault-pkg-source="$PKG_SOURCE"
    juju config trilio-horizon-plugin triliovault-pkg-source="$PKG_SOURCE"
    watch -n 5 juju status trilio-wlm trilio-data-mover trilio-dm-api trilio-horizon-plugin
    juju config trilio-data-mover triliovault-pkg-source
    juju config trilio-dm-api triliovault-pkg-source
    juju config trilio-wlm triliovault-pkg-source
    juju config trilio-horizon-plugin triliovault-pkg-source
    for app in trilio-wlm trilio-dm-api trilio-data-mover trilio-horizon-plugin; do
      for unit in $(trilio_units $app); do
        echo "=== $unit ==="
        juju run "$unit" update-trilio --wait=300s --format=yaml
      done
    done
    for app in trilio-wlm trilio-dm-api trilio-data-mover trilio-horizon-plugin; do
      for unit in $(trilio_units $app); do
        echo "=== $unit ==="
        juju run-action "$unit" update-trilio --wait=300s --format=yaml
      done
    done
    #Examples
    juju ssh trilio-wlm/0 "dpkg -l workloadmgr | tail -1"
    juju exec --application trilio-data-mover "dpkg -l python3-tvault-contego python3-trilio-dms | tail -2"
    juju integrate trilio-data-mover:identity-service keystone:identity-service
    juju add-relation trilio-data-mover:identity-service keystone:identity-service
    juju status --relations | grep 'trilio-data-mover:identity-service'
    cat > /tmp/dms_db_check.py <<'EOF'
    import configparser, pymysql, urllib.parse as up
    c = configparser.ConfigParser(); c.read("/etc/triliovault-dms/client.conf")
    u = up.urlparse(c["client"]["db_url"])
    if not u.hostname:
        raise SystemExit("FAILED: db_url is empty in client.conf")
    pymysql.connect(host=u.hostname, port=u.port or 3306, user=u.username,
                    password=up.unquote(u.password), database=u.path.lstrip("/"))
    print("OK: DMS client authenticated as", u.username)
    EOF
    
    juju scp /tmp/dms_db_check.py trilio-dm-api/leader:/tmp/dms_db_check.py
    juju ssh trilio-dm-api/leader "sudo python3 /tmp/dms_db_check.py; rm -f /tmp/dms_db_check.py"
    watch -n 5 juju status trilio-wlm trilio-data-mover trilio-dm-api
    Agent    Status   Message
    idle     active   Unit is ready
    bash juju-charms/unmount-backup-targets.sh
    for unit in $(trilio_units trilio-wlm trilio-data-mover); do
      echo "=== $unit ==="
      juju run "$unit" unmount-old-backup-targets --wait=300s
    done
    for unit in $(trilio_units trilio-wlm trilio-data-mover); do
      echo "=== $unit ==="
      juju run-action "$unit" unmount-old-backup-targets --wait=300s
    done
    ./juju-charms/upgrade_backup_targets_62.sh \
      -b tvo-overlay-bundle-<previous-release>.yaml \
      -r /home/ubuntu/openrc
    juju-charms/sample_overlay_bundles/tvo-overlay-bundle.yaml   # 6.2 — use as base for new deployments and upgrades

    Juju Version Note

    Action syntax — applies to every action on this page

    Previous Release Bundle Structure (Reference)

    Prerequisites

    1] Prepare the 6.2.1 Overlay Bundle

    Upgrading: juju refresh upgrades charm code in-place — existing units stay on their current machines. Machine placements in the new bundle are not used during an upgrade and do not need to be updated. Machine placements only matter for a fresh install — see .

    2] Upgrade the Charms

    3] Update the Trilio Package Source

    3.1 — Confirm Step 2 has fully settled first

    3.2 — Set the new package source on all four charms

    3.3 — Verify the source was applied for all applications

    4] Run Post-Upgrade Package and Database Migration (update-trilio Action)

    5] Add the New Relation

    6] Wait for All Units to Settle

    7] Unmount Old Backup Targets

    8] Recreate Backup Targets

    Sample Overlay Bundle (Reference)

    Notes

    Upgrading on RHOSO

    Upgrading from 6.1.x to 6.2.x

    Trilio for OpenStack 6.2.x replaces the per-backup-target object-store containers with the Dynamic Mount Service (DMS) — a single server container per host. Upgrading from 6.1.x therefore requires more than an image/package bump; the per-BT containers must be removed before the DMS containers are deployed.

    The high-level flow is:

    1. Tear down the 6.1 per-BT pods/containers first. Before deploying any 6.2.x image, remove the existing triliovault-object-store-<bt-name> pods on the control plane and the matching per-BT backup-target containers on each compute node. They are replaced by a single trilio-dms-server per host and must not coexist with it.

    2. Migrate existing backup targets to the 6.2.x schema. A migration script generates the Barbican secrets for each S3 backup target (using the S3 credentials currently stored in the WLM config), updates each backup target row with the resulting secret_ref, and adds the backup_target_mount_ledger table on both the workloadmgr and dmapi schemas.

    3. Deploy the 6.2.x control plane and data plane. Run the upgrade playbook targeted at the 6.2.x triliovault-cfg-scripts branch. It rolls out the 6.2.x control-plane images (wlm, dmapi, horizon-plugin), deploys trilio-dms-server on the controller and on every compute node that needs backup-target access, and lays down /etc/triliovault-dms/{server,client}.conf plus the rootwrap files.

    4. Verify. After the upgrade, confirm that:

      • trilio-dms-server pods are running in the trilio-openstack namespace, one per controller, and the matching trilio-dms-server containers are running on each compute node;

      • no triliovault-object-store-<bt-name>

    Existing backup targets, backup-target types, workloads, snapshots, and policies are preserved across the upgrade; no workload data is migrated.

    The general upgrade flow (control-plane refresh, data-plane refresh, Horizon plugin update, dynamic backup-target refresh) below remains the same as for 6.1.x upgrades.


    If any config parameter is changed in tvo-operator-inputs.yaml, like DB user password or service endpoints, you can apply the changes using the following command.

    Above command will output ‘configured' or 'unchanged’ depending upon changes happened in tvo-operator-inputs.yaml.


    Please ensure the following requirements are met before starting the upgrade process:

    • No Snapshot or Restore is running

    • Global job scheduler is disabled

    • T4O should have been upgraded to the 6.1.7 or higher release.

    Please follow the steps below to upgrade to the new build on the RHOSO18 setup.

    Take a backup of existing triliovault-cfg-scripts and clone latest triliovault-cfg-scripts github repository.

    In T4O 6.2.x, pre-mounted backup targets are not required. The T4O core code mounts the backup target when a backup is triggered. Therefore, existing backup targets must be unmounted from the cloud and related pods/containers removed.


    Select the appropriate upgrade path based on your current T4O version.

    Current T4O Version
    Upgrade Path

    Before upgrading to T4O 6.2.x, collect all backup target configurations from the current T4O 6.1.7+ installation. This script reads backup targets from the old tvo-operator-inputs.yaml and from any dynamic TVOBackupTarget CRs in the trilio-openstack namespace, writes a combined inventory YAML file, and verifies that the inventory matches workloadmgr backup-target-list exactly (count and names).

    • Reads backup_target / backup_targets section from tvo-operator-inputs.yaml (if present)

    • Reads all TVOBackupTarget CR instances from the trilio-openstack namespace

    • Merges both sources into existing_list_of_backup_targets.yaml

    • oc CLI logged in with cluster-admin (or appropriate RBAC permissions)

    • python3 with PyYAML (pip3 install pyyaml)

    • jq command

    The T4O-6.1.7+ tvo-operator-inputs.yaml file used for installation should be present in the old cfg directory.

    Run the script and provide the T4O 6.1.7+ tvo-operator-inputs.yaml file path as an argument:

    This produces existing_list_of_backup_targets.yaml file.

    Open the file and verify it contains all backup targets from the current T4O installation, especially S3 credentials:


    Before deploying the control plane, run the following script to add the required Helm ownership metadata to the existing Galera and RabbitMQ resources.

    In earlier T4O releases, the Galera and RabbitMQ resources were created without the Helm ownership metadata required for the 6.2.1 upgrade. This script updates the existing resources with the required ownership metadata so Helm can manage them during the control plane upgrade. Skipping this step may cause the upgrade to fail.

    Expected: All required services should be in Running or Completed state.

    Note: The job-triliovault-wlm-cloud-trust pod may remain in the Running state during the upgrade. Do not wait for this job to complete before proceeding with the remaining upgrade steps. It will automatically transition to the Completed state once the migration script finishes updating the required S3 secret references.


    1. No orphaned object store or NFS DaemonSets remain:

    Expected: No output

    1. No orphaned object store Kubernetes resources remain:

    Expected: "Not found" error for each command.

    1. No hung mounts on control plane nodes (repeat for each node labeled trilio-control-plane=enabled):

    Expected: No output

    1. No stale empty directories under vault_data_dir (repeat for each control plane node):

    Expected: No output. If stale empty directories are present under /var/lib/trilio/triliovault-mounts/ but no active mount points are listed, they can be safely ignored.

    1. Verify T4O control plane pods are in healthy state:

    Expected: All required services should be in Running or Completed state.


    Follow


    This step will unmount backup targets mounted as part of T4O 6.1.7+. It will also remove object store and NFS containers and their config files from compute nodes.

    • Set the correct list of data plane node set names (you need to run this for all data plane node sets). You can copy these from the data plane deployment templates or get them using the following command:

    • Save the changes.

    Run:

    1. Check the OpenStackDataPlaneDeployment completed successfully:

    Expected: Ready = True (Confirms the cleanup job has successfully completed on data plane nodes)

    1. Check Ansible runner job logs for success:

    Expected: failed=0, unreachable=0 (Ensures all tasks executed successfully without errors on any host)

    1. No old object store or NFS containers on compute nodes (SSH into a compute node and run):

    Expected: no output (Confirms old backup target containers are removed)

    1. No hung mounts on compute nodes (SSH into a compute node and run):

    Expected: no output (Ensures no stale backup target mounts remain)

    1. No stale empty directories under vault_data_dir (SSH into a compute node and run):

    Expected: empty (Verifies cleanup of leftover mount directories)

    1. Datamover service is healthy on compute nodes (SSH into a compute node and run):

    Expected: active (running confirms datamover service is running properly after cleanup)

    1. Verify that only the required Trilio containers are running on the compute node.

    Expected: Only triliovault-datamover and triliovault-dms containers should be listed.


    Follow and update the Horizon plugin with the new image tag.


    Note: This step is required only if your deployment includes one or more S3 backup targets. If your deployment uses only NFS backup targets, you can skip this step.

    After cleanup is complete, migrate the existing backup targets using the inventory file collected in Step 3 of this documentation.

    In T4O 6.2.x, S3 credentials are no longer stored in Kubernetes secrets — they are stored in OpenStack Barbican. The migration script handles this automatically for each S3 backup target:

    • Runs trilio-dms-cli secret-payload create to build the Barbican secret JSON

    • Validates the JSON with trilio-dms-cli secret-payload validate

    • Stores the secret in Barbican via openstack secret store

    Note: NFS backup targets are listed but skipped — they do not require a Barbican secret.

    All operations run inside a temporary migration pod launched from the trilio-wlm image.

    This pod:

    • Includes workloadmgr, trilio-dms-cli, and the openstack CLI

    • Mounts the triliovault-cloudrc ConfigMap

    • Injects OS_PASSWORD

    No manual credential setup is required.

    1. List backup targets via CLI:

    Expected: All previously configured backup targets are listed with an online status.

    1. Verify Barbican secrets were created (one per S3 backup target):

    Expected: One Barbican secret named secret-key-<backup-target-name> per S3 backup target.

    After successful migration, you can remove the temporary inventory file.


    To add a new backup target, refer to the .



    Before deploying the control plane, run the following script to add the required Helm ownership metadata to the existing Galera and RabbitMQ resources.

    In earlier T4O releases, the Galera and RabbitMQ resources were created without the Helm ownership metadata required for the 6.2.1 upgrade. This script updates the existing resources with the required ownership metadata so Helm can manage them during the control plane upgrade. Skipping this step may cause the upgrade to fail.

    Expected: All required services should be in Running or Completed state.


    Follow


    Follow and update the Horizon plugin with the new image tag.


    To add a new backup target, refer to the .


    Workload Quotas

    GET https://$(tvm_address):8780/v1/$(tenant_id)/project_quota_types

    Lists all available Quota Types

    Name
    Type
    Description

    juju integrate

    Run an action

    juju run-action

    juju run

    Getting started with Trilio on Canonical OpenStack
    pods or per-BT backup-target containers remain;
  • each existing backup target lists a non-empty secret_ref (for S3) and reaches online status;

  • a fresh snapshot and restore against each backup target succeed end-to-end.

  • Verifies inventory count and names match workloadmgr backup-target-list and reports any mismatches

  • Updates the existing backup target in WLM using workloadmgr backup-target-modify

    from
    openstack-secret

    6.1.7+

    3] Upgrade Path 1: Upgrade T4O 6.1.7+ to 6.2.1

    6.2.0

    4] Upgrade Path 2: Upgrade T4O 6.2.0 to 6.2.1

    1] Configuration change

    2] Upgrade to New Build

    Choose Upgrade Path

    3] Upgrade Path 1: Upgrade T4O 6.1.7+ to 6.2.1

    3.1] Collect Existing Backup Targets

    What the script does:

    Prerequisites:

    3.2] Upgrade T4O to 6.2.1 Operator and Control Plane

    3.2.1] Follow step 1.4 of this documentation

    3.2.2] Follow step 2.1 of this documentation

    3.2.3] Follow step 2.2 of this documentation

    3.2.4] Patch Helm Ownership Metadata

    3.2.5] Run Deploy Command

    3.2.6] Verify Successful Deployment of T4O Control Plane Services

    3.3] Run T4O Backup Target Uninstall and Unmount for Control Plane

    Verify:

    3.4] Upgrade T4O Data Plane to 6.2.1 Release

    3.5] Run Backup Target Uninstall and Unmount on Data Plane Nodes

    Verify:

    3.6] Upgrade Trilio Horizon Plugin

    3.7] Update T4O 6.1.7+ Backup Targets to T4O 6.2.1

    Run the migration:

    Verify:

    Cleanup:

    3.8] Install a new Backup Target

    4] Upgrade Path 2: Upgrade T4O 6.2.0 to 6.2.1

    4.1] Upgrade T4O to 6.2.1 Operator and Control Plane

    4.1.1] Follow step 2.1 of this documentation

    4.1.2] Follow step 2.2 of this documentation

    4.1.3] Patch Helm Ownership Metadata

    4.1.4] Run Deploy Command

    4.1.5] Verify successful deployment of T4O control plane services

    4.2] Upgrade T4O Data Plane to 6.2.1 Release

    4.3] Upgrade Trilio Horizon Plugin

    4.4] Install a new Backup Target

    step 3 to 3.8 of this documentation
    step 4 of this documentation
    Adding a New Backup Target on RHOSO18
    steps 3.2 to 3.8 of this documentation
    step 4 of this documentation
    Adding a New Backup Target on RHOSO18
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts
    ./deploy_tvo_control_plane.sh
    mv triliovault-cfg-scripts triliovault-cfg-scripts-old
    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    # Check if pyyaml module is available
    python3 -c "import yaml; print('pyyaml: available, version:', yaml.__version__)" 2>/dev/null || echo "pyyaml: NOT available"
    
    # If not available, install
    pip3 install pyyaml
    
    # Check if jq command is available
    which jq &>/dev/null && echo "jq: available, version: $(jq --version), path: $(which jq)" || echo "jq: NOT available"
    
    # If not available, install
    dnf install jq
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    bash collect_backup_targets.sh -i /path/to/old/tvo-operator-inputs.yaml
    vi existing_list_of_backup_targets.yaml
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    chmod +x patch_helm_ownership_metadata.sh
    ./patch_helm_ownership_metadata.sh
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    ./deploy_tvo_control_plane.sh
    [openstackdev@localhost ctlplane-scripts]$ oc -n trilio-openstack get pods
    NAME                                                READY   STATUS      RESTARTS   AGE
    job-triliovault-datamover-api-db-init-gwrpm         0/1     Completed   0          9m51s
    job-triliovault-datamover-api-keystone-init-fzkw8   0/1     Completed   0          11m
    job-triliovault-datamover-api-rabbitmq-init-8qhrq   0/1     Completed   0          10m
    job-triliovault-wlm-cloud-trust-kxj8g               0/1     Completed   0          3h41m
    job-triliovault-wlm-db-init-pl97t                   0/1     Completed   0          9m47s
    job-triliovault-wlm-keystone-init-7spqh             0/1     Completed   0          10m
    job-triliovault-wlm-rabbitmq-init-8tf2x             0/1     Completed   0          9m56s
    trilio-galera-cluster-galera-0                      1/1     Running     0          11m
    trilio-galera-cluster-galera-1                      1/1     Running     0          11m
    trilio-galera-cluster-galera-2                      1/1     Running     0          11m
    trilio-galera-wait-job-swwg9                        0/1     Completed   0          11m
    trilio-rabbitmq-cluster-server-0                    1/1     Running     0          12m
    trilio-rabbitmq-cluster-server-1                    1/1     Running     0          12m
    trilio-rabbitmq-cluster-server-2                    1/1     Running     0          12m
    triliovault-datamover-api-84c56cd576-f5x95          1/1     Running     0          9m36s
    triliovault-datamover-api-84c56cd576-hdsn4          1/1     Running     0          9m36s
    triliovault-datamover-api-84c56cd576-hqqg9          1/1     Running     0          9m36s
    triliovault-dms-bnlr2                               1/1     Running     0          9m36s
    triliovault-dms-hsqz8                               1/1     Running     0          9m36s
    triliovault-dms-tlclz                               1/1     Running     0          9m36s
    triliovault-object-store-bt1-s3-dv2lq               1/1     Running     0          3h41m
    triliovault-object-store-bt1-s3-hqxfs               1/1     Running     0          3h41m
    triliovault-object-store-bt1-s3-krszz               1/1     Running     0          3h41m
    triliovault-object-store-bt2-s3-jtkc6               1/1     Running     0          3h41m
    triliovault-object-store-bt2-s3-q287h               1/1     Running     0          3h41m
    triliovault-object-store-bt2-s3-sbg7n               1/1     Running     0          3h41m
    triliovault-object-store-s3-bt3-7djh4               1/1     Running     0          3h24m
    triliovault-object-store-s3-bt3-bq4p9               1/1     Running     0          3h24m
    triliovault-object-store-s3-bt3-jr6b6               1/1     Running     0          3h24m
    triliovault-object-store-s3-bt4-5drpq               1/1     Running     0          53m
    triliovault-object-store-s3-bt4-sszpr               1/1     Running     0          53m
    triliovault-object-store-s3-bt4-ztblr               1/1     Running     0          53m
    triliovault-wlm-api-6fd6cc99bb-6l4zm                1/1     Running     0          9m36s
    triliovault-wlm-api-6fd6cc99bb-kdfrb                1/1     Running     0          9m36s
    triliovault-wlm-api-6fd6cc99bb-xctst                1/1     Running     0          9m36s
    triliovault-wlm-cron-65f5bbf67f-25t98               1/1     Running     0          9m36s
    triliovault-wlm-scheduler-759c5848db-fnkcn          1/1     Running     0          9m36s
    triliovault-wlm-scheduler-759c5848db-mknm8          1/1     Running     0          9m36s
    triliovault-wlm-scheduler-759c5848db-pnkgs          1/1     Running     0          9m36s
    triliovault-wlm-workloads-69d5575c7b-5ltk6          1/1     Running     0          9m36s
    triliovault-wlm-workloads-69d5575c7b-djpx2          1/1     Running     0          9m36s
    triliovault-wlm-workloads-69d5575c7b-rdghd          1/1     Running     0          9m36s
    [openstackdev@localhost ctlplane-scripts]$
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    chmod +x cleanup_backup_targets_ctlplane.sh
    ./cleanup_backup_targets_ctlplane.sh
    oc -n trilio-openstack get daemonsets | grep -E "triliovault-object-store|triliovault-nfs-mount"
    oc -n trilio-openstack get secret triliovault-object-store-etc
    oc -n trilio-openstack get configmap triliovault-object-store-bin
    oc -n trilio-openstack get serviceaccount triliovault-object-store
    oc debug node/<node-name> -- chroot /host findmnt -r | grep triliovault-mounts
    oc debug node/<node-name> -- chroot /host ls /var/lib/trilio/triliovault-mounts/
    [openstackdev@localhost ctlplane-scripts]$ oc -n trilio-openstack get pods
    NAME                                                READY   STATUS      RESTARTS   AGE
    job-triliovault-datamover-api-db-init-gwrpm         0/1     Completed   0          16m
    job-triliovault-datamover-api-keystone-init-fzkw8   0/1     Completed   0          17m
    job-triliovault-datamover-api-rabbitmq-init-8qhrq   0/1     Completed   0          16m
    job-triliovault-wlm-cloud-trust-kxj8g               0/1     Completed   0          3h47m
    job-triliovault-wlm-db-init-pl97t                   0/1     Completed   0          16m
    job-triliovault-wlm-keystone-init-7spqh             0/1     Completed   0          16m
    job-triliovault-wlm-rabbitmq-init-8tf2x             0/1     Completed   0          16m
    trilio-galera-cluster-galera-0                      1/1     Running     0          18m
    trilio-galera-cluster-galera-1                      1/1     Running     0          18m
    trilio-galera-cluster-galera-2                      1/1     Running     0          18m
    trilio-galera-wait-job-swwg9                        0/1     Completed   0          18m
    trilio-rabbitmq-cluster-server-0                    1/1     Running     0          19m
    trilio-rabbitmq-cluster-server-1                    1/1     Running     0          19m
    trilio-rabbitmq-cluster-server-2                    1/1     Running     0          19m
    triliovault-datamover-api-84c56cd576-f5x95          1/1     Running     0          15m
    triliovault-datamover-api-84c56cd576-hdsn4          1/1     Running     0          15m
    triliovault-datamover-api-84c56cd576-hqqg9          1/1     Running     0          15m
    triliovault-dms-bnlr2                               1/1     Running     0          15m
    triliovault-dms-hsqz8                               1/1     Running     0          15m
    triliovault-dms-tlclz                               1/1     Running     0          15m
    triliovault-wlm-api-6fd6cc99bb-6l4zm                1/1     Running     0          15m
    triliovault-wlm-api-6fd6cc99bb-kdfrb                1/1     Running     0          15m
    triliovault-wlm-api-6fd6cc99bb-xctst                1/1     Running     0          15m
    triliovault-wlm-cron-65f5bbf67f-25t98               1/1     Running     0          15m
    triliovault-wlm-scheduler-759c5848db-fnkcn          1/1     Running     0          15m
    triliovault-wlm-scheduler-759c5848db-mknm8          1/1     Running     0          15m
    triliovault-wlm-scheduler-759c5848db-pnkgs          1/1     Running     0          15m
    triliovault-wlm-workloads-69d5575c7b-5ltk6          1/1     Running     0          15m
    triliovault-wlm-workloads-69d5575c7b-djpx2          1/1     Running     0          15m
    triliovault-wlm-workloads-69d5575c7b-rdghd          1/1     Running     0          15m
    [openstackdev@localhost ctlplane-scripts]$
    oc -n openstack get OpenStackDataPlaneNodeSet
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
    vi trilio-backup-target-cleanup-deployment.yaml
    oc -n openstack apply -f trilio-backup-target-cleanup-deployment.yaml
    oc -n openstack get openstackdataplanedeployment edpm-trilio-upgrade-cleanup-1
    oc -n openstack logs job/<ansible-runner-job-name>
    sudo podman ps -a | grep -E "triliovault-object-store|triliovault-nfs-container"
    sudo findmnt -r | grep triliovault-mounts
    ls /var/lib/trilio/triliovault-mounts/
    sudo systemctl status edpm_triliovault-datamover.service
    podman ps -a | grep trilio-
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    bash update_backup_targets_62.sh
    oc -n trilio-openstack get pods | grep wlm-api
    oc -n trilio-openstack exec -it <trilio-wlm-api-pod-name> bash
    source <admin rc file>
    
    
    workloadmgr backup-target-list
    openstack secret list | grep secret-key-
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    rm -f existing_list_of_backup_targets.yaml
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    chmod +x patch_helm_ownership_metadata.sh
    ./patch_helm_ownership_metadata.sh
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    ./deploy_tvo_control_plane.sh
    [root@localhost ctlplane-scripts]# oc -n trilio-openstack get pods
    NAME                                                READY   STATUS      RESTARTS   AGE
    job-triliovault-datamover-api-db-init-v8n7q         0/1     Completed   0          32m
    job-triliovault-datamover-api-keystone-init-wn2jl   0/1     Completed   0          33m
    job-triliovault-datamover-api-rabbitmq-init-btplt   0/1     Completed   0          32m
    job-triliovault-wlm-cloud-trust-w2rlw               0/1     Completed   0          32m
    job-triliovault-wlm-db-init-tcz9z                   0/1     Completed   0          32m
    job-triliovault-wlm-keystone-init-fjfhg             0/1     Completed   0          32m
    job-triliovault-wlm-rabbitmq-init-mprs2             0/1     Completed   0          32m
    trilio-galera-cluster-galera-0                      1/1     Running     0          33m
    trilio-galera-cluster-galera-1                      1/1     Running     0          33m
    trilio-galera-cluster-galera-2                      1/1     Running     0          33m
    trilio-galera-wait-job-nbsww                        0/1     Completed   0          33m
    trilio-rabbitmq-cluster-server-0                    1/1     Running     0          35m
    trilio-rabbitmq-cluster-server-1                    1/1     Running     0          35m
    trilio-rabbitmq-cluster-server-2                    1/1     Running     0          35m
    triliovault-datamover-api-5989dcb4c5-4b5bs          1/1     Running     0          32m
    triliovault-datamover-api-5989dcb4c5-5gk6d          1/1     Running     0          32m
    triliovault-datamover-api-5989dcb4c5-rq8mg          1/1     Running     0          32m
    triliovault-dms-68hfb                               1/1     Running     0          32m
    triliovault-dms-8j5jg                               1/1     Running     0          32m
    triliovault-dms-w47dp                               1/1     Running     0          32m
    triliovault-wlm-api-5fd4bf65c6-8pvj5                1/1     Running     0          32m
    triliovault-wlm-api-5fd4bf65c6-9lhmh                1/1     Running     0          32m
    triliovault-wlm-api-5fd4bf65c6-mn49n                1/1     Running     0          32m
    triliovault-wlm-cron-7f85f75bb5-9vbdr               1/1     Running     0          32m
    triliovault-wlm-scheduler-7dc4764b4d-2v2ck          1/1     Running     0          32m
    triliovault-wlm-scheduler-7dc4764b4d-58wxk          1/1     Running     0          32m
    triliovault-wlm-scheduler-7dc4764b4d-pxs2r          1/1     Running     0          32m
    triliovault-wlm-workloads-5946d56cd4-c6cmd          1/1     Running     0          32m
    triliovault-wlm-workloads-5946d56cd4-cgc8h          1/1     Running     0          32m
    triliovault-wlm-workloads-5946d56cd4-n74hd          1/1     Running     0          32m
    [root@localhost ctlplane-scripts]#

    IP or FQDN of Trilio service

    tenant_id

    string

    ID of Tenant/Project

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 18 Nov 2020 15:40:56 GMT
    Content-Type: application/json
    Content-Length: 1625
    Connection: keep-alive
    X-Compute-Request-Id: req-2ad95c02-54c6-4908-887b-c16c5e2f20fe
    
    {
       "quota_types":[
          {
    
    

    GET https://$(tvm_address):8780/v1/$(tenant_id)/projects_quota_types/<quota_type_id>

    Requests the details of a Quota Type

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 18 Nov 2020 15:44:43 GMT
    Content-Type: application/json
    Content-Length: 342
    Connection: keep-alive
    X-Compute-Request-Id: req-5bf629fe-ffa2-4c90-b704-5178ba2ab09b
    
    {
       "quota_type":{
          "created_at":"2020-10-19T10:05:52.000000",
          "updated_at":"2020-10-19T10:07:32.000000",
          "deleted_at":null,
          "deleted":false,
          "version":"4.0.115",
          "id":"1c5d4290-2e08-11ea-889c-7440bb00b67d",
          "display_name":"Workloads",
          "display_description":"Total number of workload creation allowed per project",
          "status":"available"
       }
    }

    POST https://$(tvm_address):8780/v1/$(tenant_id)/project_allowed_quotas/<project_id>

    Creates an allowed Quota with the given parameters

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 18 Nov 2020 15:51:51 GMT
    Content-Type: application/json
    Content-Length: 24
    Connection: keep-alive
    X-Compute-Request-Id: req-08c8cdb6-b249-4650-91fb-79a6f7497927
    
    {
       "allowed_quotas":[
          {
             
          }
       ]
    }

    GET https://$(tvm_address):8780/v1/$(tenant_id)/project_allowed_quotas/<project_id>

    Lists all allowed Quotas for a given project.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 18 Nov 2020 16:01:39 GMT
    Content-Type: application/json
    Content-Length: 766
    Connection: keep-alive
    X-Compute-Request-Id: req-e570ce15-de0d-48ac-a9e8-60af429aebc0
    
    {
       "allowed_quotas":[
          {
             "id":"262b117d-e406-4209-8964-004b19a8d422",
             "project_id":"c76b3355a164498aa95ddbc960adc238",
             "quota_type_id":"1c5d4290-2e08-11ea-889c-7440bb00b67d",
             "allowed_value":5,
             "high_watermark":4,
             "version":"4.0.115",
             "quota_type_name":"Workloads"
          },
          {
             "id":"68e7203d-8a38-4776-ba58-051e6d289ee0",
             "project_id":"c76b3355a164498aa95ddbc960adc238",
             "quota_type_id":"f02dd7a6-2e08-11ea-889c-7440bb00b67d",
             "allowed_value":-1,
             "high_watermark":-1,
             "version":"4.0.115",
             "quota_type_name":"Storage"
          },
          {
             "id":"ed67765b-aea8-4898-bb1c-7c01ecb897d2",
             "project_id":"c76b3355a164498aa95ddbc960adc238",
             "quota_type_id":"be323f58-2e08-11ea-889c-7440bb00b67d",
             "allowed_value":50,
             "high_watermark":25,
             "version":"4.0.115",
             "quota_type_name":"VMs"
          }
       ]
    }

    GET https://$(tvm_address):8780/v1/$(tenant_id)/project_allowed_quota/<allowed_quota_id>

    Shows details for a given allowed Quota

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 18 Nov 2020 16:15:07 GMT
    Content-Type: application/json
    Content-Length: 268
    Connection: keep-alive
    X-Compute-Request-Id: req-d87a57cd-c14c-44dd-931e-363158376cb7
    
    {
       "allowed_quotas":{
          "id":"262b117d-e406-4209-8964-004b19a8d422",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "quota_type_id":"1c5d4290-2e08-11ea-889c-7440bb00b67d",
          "allowed_value":5,
          "high_watermark":4,
          "version":"4.0.115",
          "quota_type_name":"Workloads"
       }
    }

    PUT https://$(tvm_address):8780/v1/$(tenant_id)/update_allowed_quota/<allowed_quota_id>

    Updates an allowed Quota with the given parameters

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Wed, 18 Nov 2020 16:24:04 GMT
    Content-Type: application/json
    Content-Length: 24
    Connection: keep-alive
    X-Compute-Request-Id: req-a4c02ee5-b86e-4808-92ba-c363b287f1a2
    
    {"allowed_quotas": [{}]}

    DELETE https://$(tvm_address):8780/v1/$(tenant_id)/project_allowed_quotas/<allowed_quota_id>

    Deletes a given allowed Quota

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Wed, 18 Nov 2020 16:33:09 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 0
    Connection: keep-alive

    tvm_address

    List Quota Types

    Path Parameters

    string

    {
       "allowed_quotas":[
          {
             "project_id":"<project_id>",
             "quota_type_id":"<quota_type_id>",
             "allowed_value":"<integer>",
             "high_watermark":"<Integer>"
          }
       ]
    }
    {
       "allowed_quotas":{
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "allowed_value":"20000",
          "high_watermark":"18000"
       }
    }

    Headers

    Show Quota Type

    Path Parameters

    Headers

    Create allowed Quota

    Path Parameters

    Headers

    Body Format

    List allowed Quota

    Path Parameters

    Headers

    Show allowed Quota

    Path Parameters

    Headers

    Update allowed Quota

    Path Parameters

    Headers

    Body Format

    Delete allowed Quota

    Path Parameters

    Headers

    "created_at":"2020-10-19T10:05:52.000000",
    "updated_at":"2020-10-19T10:07:32.000000",
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"1c5d4290-2e08-11ea-889c-7440bb00b67d",
    "display_name":"Workloads",
    "display_description":"Total number of workload creation allowed per project",
    "status":"available"
    },
    {
    "created_at":"2020-10-19T10:05:52.000000",
    "updated_at":"2020-10-19T10:07:32.000000",
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"b7273a06-2e08-11ea-889c-7440bb00b67d",
    "display_name":"Snapshots",
    "display_description":"Total number of snapshot creation allowed per project",
    "status":"available"
    },
    {
    "created_at":"2020-10-19T10:05:52.000000",
    "updated_at":"2020-10-19T10:07:32.000000",
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"be323f58-2e08-11ea-889c-7440bb00b67d",
    "display_name":"VMs",
    "display_description":"Total number of VMs allowed per project",
    "status":"available"
    },
    {
    "created_at":"2020-10-19T10:05:52.000000",
    "updated_at":"2020-10-19T10:07:32.000000",
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"c61324d0-2e08-11ea-889c-7440bb00b67d",
    "display_name":"Volumes",
    "display_description":"Total number of volume attachments allowed per project",
    "status":"available"
    },
    {
    "created_at":"2020-10-19T10:05:52.000000",
    "updated_at":"2020-10-19T10:07:32.000000",
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"f02dd7a6-2e08-11ea-889c-7440bb00b67d",
    "display_name":"Storage",
    "display_description":"Total storage (in Bytes) allowed per project",
    "status":"available"
    }
    ]
    }

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of Tenant/Project to work in

    quota_type_id

    string

    ID of the Quota Type to show

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to work in

    project_id

    string

    ID of the Tenant/Project to create the allowed Quota in

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to work in

    project_id

    string

    ID of the Tenant/Project to list allowed Quotas from

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to work in

    <allowed_quota_id>

    string

    ID of the allowed Quota to show

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to work in

    <allowed_quota_id>

    string

    ID of the allowed Quota to update

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to work in

    <allowed_quota_id>

    string

    ID of the allowed Quota to delete

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Logo

    Snapshots

    List Snapshots

    GET https://$(tvm_address):8780/v1/$(tenant_id)/snapshots

    Lists all Snapshots.

    Path Parameters

    Name
    Type
    Description

    tvm_address

    Name
    Type
    Description
    Name
    Type
    Description

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/<workload_id>

    Name
    Type
    Description
    Name
    Type
    Description
    Name
    Type
    Description

    When creating a Snapshot it is possible to provide additional information

    GET https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>

    Shows the details of a specified Snapshot

    Name
    Type
    Description
    Name
    Type
    Description

    DELETE https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>

    Deletes a specified Snapshot

    Name
    Type
    Description
    Name
    Type
    Description

    GET https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>/cancel

    Cancels the Snapshot process of a given Snapshot

    Name
    Type
    Description
    Name
    Type
    Description

    date_from

    string

    starting date of Snapshots to show

    </p>

    Format: YYYY-MM-DDTHH:MM:SS

    string

    ending date of Snapshots to show

    </p>

    Format: YYYY-MM-DDTHH:MM:SS

    all

    boolean

    admin role required - True lists all Snapshots of all Workloads

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    workload_id

    string

    ID of the Workload to take the Snapshot in

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    snapshot_id

    string

    ID of the Snapshot to show

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    snapshot_id

    string

    ID of the Snapshot to delete

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    snapshot_id

    string

    ID of the Snapshot to cancel

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    ID of the Tenant/Projects to fetch the Snapshots from

    host

    string

    host name of the TVM that took the Snapshot

    workload_id

    string

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of the Trilio Service

    tenant_id

    string

    full

    boolean

    True creates a full Snapshot

    X-Auth-Project-Id

    string

    Project to run authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of the Trilio Service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run authentication against

    X-Auth-Token

    string

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    X-Auth-Project-Id

    string

    Project to run authentication against

    X-Auth-Token

    string

    Query Parameters

    Headers

    Take Snapshot

    Path Parameters

    Query Parameters

    Headers

    Body format

    This Body is completely optional

    Show Snapshot

    Path Parameters

    Headers

    server_group (6.2.1 and later)

    Each entry in instances carries the Nova server group the instance was a member of when the Snapshot was taken:

    • id ➡️ ID of the Nova server group

    • name ➡️ Name of the Nova server group

    • policies ➡️ The group's placement policy, e.g. affinity, anti-affinity, soft-affinity, soft-anti-affinity

    server_group is null for instances that were not a member of any server group. The field is only returned by this Show Snapshot call.

    Delete Snapshot

    Path Parameters

    Headers

    Cancel Snapshot

    Path Parameters

    Headers

    ID of the Workload to list the Snapshots off

    Authentication token to use

    ID of the Tenant/Project to take the Snapshot in

    Authentication token to use

    ID of the Tenant/Project to take the Snapshot from

    Authentication token to use

    ID of the Tenant/Project to find the Snapshot in

    Authentication token to use

    ID of the Tenant/Project to find the Snapshot in

    Authentication token to use

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 04 Nov 2020 12:58:38 GMT
    Content-Type: application/json
    Content-Length: 266
    Connection: keep-alive
    X-Compute-Request-Id: req-ed391cf9-aa56-4c53-8153-fd7fb238c4b9
    
    {
       "snapshots":[
          {
             "id":"1ff16412-a0cd-4e6a-9b4a-b5d4440fffc4",
             "created_at":"2020-11-02T14:03:18.000000",
             "status":"available",
             "snapshot_type":"full",
             "workload_id":"18b809de-d7c8-41e2-867d-4a306407fb11",
             "name":"snapshot",
             "description":"-",
             "host":"TVM1"
          }
       ]
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 04 Nov 2020 13:58:38 GMT
    Content-Type: application/json
    Content-Length: 283
    Connection: keep-alive
    X-Compute-Request-Id: req-fb8dc382-e5de-4665-8d88-c75b2e473f5c
    
    {
       "snapshot":{
          "id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
          "created_at":"2020-11-04T13:58:37.694637",
          "status":"creating",
          "snapshot_type":"full",
          "workload_id":"18b809de-d7c8-41e2-867d-4a306407fb11",
          "name":"API taken 2",
          "description":"API taken description 2",
          "host":""
       }
    }
    {
       "snapshot":{
          "is_scheduled":<true/false>,
          "name":"<name>",
          "description":"<description>"
       }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 04 Nov 2020 14:07:18 GMT
    Content-Type: application/json
    Content-Length: 6609
    Connection: keep-alive
    X-Compute-Request-Id: req-f88fb28f-f4ce-4585-9c3c-ebe08a3f60cd
    
    {
       "snapshot":{
          "id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
          "created_at":"2020-11-04T13:58:37.000000",
          "updated_at":"2020-11-04T14:06:03.000000",
          "finished_at":"2020-11-04T14:06:03.000000",
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "status":"available",
          "snapshot_type":"full",
          "workload_id":"18b809de-d7c8-41e2-867d-4a306407fb11",
          "instances":[
             {
                "id":"67d6a100-fee6-4aa5-83a1-66b070d2eabe",
                "name":"cirros-2",
                "status":"available",
                "metadata":{
                   "availability_zone":"nova",
                   "config_drive":"",
                   "data_transfer_time":"0",
                   "object_store_transfer_time":"0",
                   "root_partition_type":"Linux",
                   "trilio_ordered_interfaces":"192.168.100.80",
                   "vm_metadata":"{\"workload_name\": \"Workload_1\", \"workload_id\": \"18b809de-d7c8-41e2-867d-4a306407fb11\", \"trilio_ordered_interfaces\": \"192.168.100.80\", \"config_drive\": \"\"}",
                   "workload_id":"18b809de-d7c8-41e2-867d-4a306407fb11",
                   "workload_name":"Workload_1"
                },
                "flavor":{
                   "vcpus":"1",
                   "ram":"512",
                   "disk":"1",
                   "ephemeral":"0"
                },
                "security_group":[
                   {
                      "name":"default",
                      "security_group_type":"neutron"
                   }
                ],
                "server_group":{
                   "id":"9c2b5d6f-8f42-4f0e-b0a0-1c2e3d4a5b6c",
                   "name":"db-anti-affinity",
                   "policies":"anti-affinity"
                },
                "nics":[
                   {
                      "mac_address":"fa:16:3e:cf:10:91",
                      "ip_address":"192.168.100.80",
                      "network":{
                         "id":"5fb7027d-a2ac-4a21-9ee1-438c281d2b26",
                         "name":"robert_internal",
                         "cidr":null,
                         "network_type":"neutron",
                         "subnet":{
                            "id":"b7b54304-aa82-4d50-91e6-66445ab56db4",
                            "name":"robert_internal",
                            "cidr":"192.168.100.0/24",
                            "ip_version":4,
                            "gateway_ip":"192.168.100.1"
                         }
                      }
                   }
                ],
                "vdisks":[
                   {
                      "label":null,
                      "resource_id":"fa888089-5715-4228-9e5a-699f8f9d59ba",
                      "restore_size":1073741824,
                      "vm_id":"67d6a100-fee6-4aa5-83a1-66b070d2eabe",
                      "volume_id":"51491d30-9818-4332-b056-1f174e65d3e3",
                      "volume_name":"51491d30-9818-4332-b056-1f174e65d3e3",
                      "volume_size":"1",
                      "volume_type":"iscsi",
                      "volume_mountpoint":"/dev/vda",
                      "availability_zone":"nova",
                      "metadata":{
                         "readonly":"False",
                         "attached_mode":"rw"
                      }
                   }
                ]
             },
             {
                "id":"e33c1eea-c533-4945-864d-0da1fc002070",
                "name":"cirros-1",
                "status":"available",
                "metadata":{
                   "availability_zone":"nova",
                   "config_drive":"",
                   "data_transfer_time":"0",
                   "object_store_transfer_time":"0",
                   "root_partition_type":"Linux",
                   "trilio_ordered_interfaces":"192.168.100.176",
                   "vm_metadata":"{\"workload_name\": \"Workload_1\", \"workload_id\": \"18b809de-d7c8-41e2-867d-4a306407fb11\", \"trilio_ordered_interfaces\": \"192.168.100.176\", \"config_drive\": \"\"}",
                   "workload_id":"18b809de-d7c8-41e2-867d-4a306407fb11",
                   "workload_name":"Workload_1"
                },
                "flavor":{
                   "vcpus":"1",
                   "ram":"512",
                   "disk":"1",
                   "ephemeral":"0"
                },
                "security_group":[
                   {
                      "name":"default",
                      "security_group_type":"neutron"
                   }
                ],
                "server_group":null,
                "nics":[
                   {
                      "mac_address":"fa:16:3e:cf:4d:27",
                      "ip_address":"192.168.100.176",
                      "network":{
                         "id":"5fb7027d-a2ac-4a21-9ee1-438c281d2b26",
                         "name":"robert_internal",
                         "cidr":null,
                         "network_type":"neutron",
                         "subnet":{
                            "id":"b7b54304-aa82-4d50-91e6-66445ab56db4",
                            "name":"robert_internal",
                            "cidr":"192.168.100.0/24",
                            "ip_version":4,
                            "gateway_ip":"192.168.100.1"
                         }
                      }
                   }
                ],
                "vdisks":[
                   {
                      "label":null,
                      "resource_id":"c8293bb0-031a-4d33-92ee-188380211483",
                      "restore_size":1073741824,
                      "vm_id":"e33c1eea-c533-4945-864d-0da1fc002070",
                      "volume_id":"365ad75b-ca76-46cb-8eea-435535fd2e22",
                      "volume_name":"365ad75b-ca76-46cb-8eea-435535fd2e22",
                      "volume_size":"1",
                      "volume_type":"iscsi",
                      "volume_mountpoint":"/dev/vda",
                      "availability_zone":"nova",
                      "metadata":{
                         "readonly":"False",
                         "attached_mode":"rw"
                      }
                   }
                ]
             }
          ],
          "name":"API taken 2",
          "description":"API taken description 2",
          "host":"TVM1",
          "size":44171264,
          "restore_size":2147483648,
          "uploaded_size":44171264,
          "progress_percent":100,
          "progress_msg":"Snapshot of workload is complete",
          "warning_msg":null,
          "error_msg":null,
          "time_taken":428,
          "pinned":false,
          "metadata":[
             {
                "created_at":"2020-11-04T14:05:57.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"16fc1ce5-81b2-4c07-ac63-6c9232e0418f",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"backup_media_target",
                "value":"10.10.2.20:/upstream"
             },
             {
                "created_at":"2020-11-04T13:58:37.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"5a56bbad-9957-4fb3-9bbc-469ec571b549",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"cancel_requested",
                "value":"0"
             },
             {
                "created_at":"2020-11-04T14:05:29.000000",
                "updated_at":"2020-11-04T14:05:45.000000",
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"d36abef7-9663-4d88-8f2e-ef914f068fb4",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"data_transfer_time",
                "value":"0"
             },
             {
                "created_at":"2020-11-04T14:05:57.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"c75f9151-ef87-4a74-acf1-42bd2588ee64",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"hostnames",
                "value":"[\"cirros-1\", \"cirros-2\"]"
             },
             {
                "created_at":"2020-11-04T14:05:29.000000",
                "updated_at":"2020-11-04T14:05:45.000000",
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"02916cce-79a2-4ad9-a7f6-9d9f59aa8424",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"object_store_transfer_time",
                "value":"0"
             },
             {
                "created_at":"2020-11-04T14:05:57.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"96efad2f-a24f-4cde-8e21-9cd78f78381b",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"pause_at_snapshot",
                "value":"0"
             },
             {
                "created_at":"2020-11-04T14:05:57.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"572a0b21-a415-498f-b7fa-6144d850ef56",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"policy_id",
                "value":"b79aa5f3-405b-4da4-96e2-893abf7cb5fd"
             },
             {
                "created_at":"2020-11-04T14:05:57.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"dfd7314d-8443-4a95-8e2a-7aad35ef97ea",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"preferredgroup",
                "value":"[]"
             },
             {
                "created_at":"2020-11-04T14:05:57.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"2e17e1e4-4bb1-48a9-8f11-c4cd2cfca2a9",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"topology",
                "value":"\"\\\"\\\"\""
             },
             {
                "created_at":"2020-11-04T14:05:57.000000",
                "updated_at":null,
                "deleted_at":null,
                "deleted":false,
                "version":"4.0.115",
                "id":"33762790-8743-4e20-9f50-3505a00dbe76",
                "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
                "key":"workload_approx_backup_size",
                "value":"6"
             }
          ],
          "restores_info":""
       }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 04 Nov 2020 14:18:36 GMT
    Content-Type: application/json
    Content-Length: 56
    Connection: keep-alive
    X-Compute-Request-Id: req-82ffb2b6-b28e-4c73-89a4-310890960dbc
    
    {"task": {"id": "a73de236-6379-424a-abc7-33d553e050b7"}}
    
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Wed, 04 Nov 2020 14:26:44 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-47a5a426-c241-429e-9d69-d40aed0dd68d

    Trilio Installation on RHOSP

    The Red Hat OpenStack Platform Director is the supported and recommended method to deploy and maintain any RHOSP installation.

    Trilio is integrating natively into the RHOSP Director. Manual deployment methods are not supported for RHOSP.

    1. Prepare for deployment

    Refer to the link Resources to get release specific values of the placeholders, viz Container URLs, trilio_branch, RHOSP Version and CONTAINER-TAG-VERSION in this document as per the OpenStack environment:

    1.1] Select 'backup target' type

    Backup target storage is used to store backup images taken by Trilio and details needed for configuration:

    The following backup target types are supported by Trilio

    a) NFS

    Need NFS share path

    b) Amazon S3

    - S3 Access Key - Secret Key - Region - Bucket name

    c) Other S3 compatible storage (Like Ceph based S3)

    - S3 Access Key - Secret Key - Region - Endpoint URL (Valid for S3 other than Amazon S3) - Bucket name

    The following steps are to be done on the undercloud node on an already installed RHOSP environment. The overcloud-deploy command has to be run successfully already and the overcloud should be available.

    The following command clones the triliovault-cfg-scripts github repository.

    If your backup target is CEPH S3 with SSL and SSL certificates are self-signed or authorized by a private CA, then the user needs to provide a CA chain certificate to validate the SSL requests. For all s3 backup target with self signed TLS certificates, user need to copy ca chain files in following location and in given file name format in trilio puppet module. Edit <S3_BACKUP_TARGET_NAME>, <S3_SELF_SIGNED_CERT_CA_CHAIN_FILE> parameters in following command.

    For example if S3_BACKUP_TARGET_NAME = BT2_S3 and your S3_SELF_SIGNED_CERT_CA_CHAIN_FILE='s3-ca.pem' then command to copy this ca chain file to trilio puppet module would be

    Trilio contains multiple services. Add these services to your roles_data.yaml.

    Add the following services to the roles_data.yaml

    This service needs to share the same role as the keystone and database service. In the case of the pre-defined roles, these services will run on the role Controller. In the case of custom-defined roles, it is necessary to use the same role where OS::TripleO::Services::Keystone service installed.

    Add the following line to the identified role:

    Note : If s3 backup target is NOT used, the above entry of TrilioObjectStore should not be done in role data file

    This service needs to share the same role as the nova-compute service. In the case of the pre-defined roles will the nova-compute service run on the role Compute. In the case of custom-defined roles, it is necessary to use the role that the nova-compute service uses.

    Add the following line to the identified role:

    Trilio containers are pushed to the RedHat Container Registry. Registry URL: 'registry.connect.redhat.com'. For Container URLs, please refer

    There are three registry methods available in the RedHat OpenStack Platform.

    1. Remote Registry

    2. Local Registry

    3. Satellite Server

    Follow this section when 'Remote Registry' is used.

    In this method, container images get downloaded directly on overcloud nodes during overcloud deploy/update command execution. Users can set the remote registry to a redhat registry or any other private registry that they want to use. The user needs to provide credentials for the registry in containers-prepare-parameter.yaml file.

    1. Make sure other OpenStack service images are also using the same method to pull container images. If it's not the case you can not use this method.

    2. Populate containers-prepare-parameter.yaml with content like the following. Important parameters are push_destination: false, ContainerImageRegistryLogin: true and registry credentials. Trilio container images are published to registry registry.connect.redhat.com. Credentials of registry 'registry.redhat.io' will work for registry.connect.redhat.com registry too.

    Note: This file containers-prepare-parameter.yaml

    Redhat document for remote registry method:

    Note: File 'containers-prepare-parameter.yaml' gets created as output of command 'openstack tripleo container image prepare'. Refer above document by RedHat

    3. Make sure you have network connectivity to the above registries from all overcloud nodes. Otherwise image pull operation will fail.

    4. The user needs to manually populate the trilio_env.yaml file with Trilio container image URLs as given below:

    At this step, you have configured Trilio image URLs in the necessary environment file.

    Follow this section when 'local registry' is used on the undercloud.

    In this case, it is necessary to push the Trilio containers to the undercloud registry. Trilio provides shell scripts that will pull the containers from registry.connect.redhat.com and push them to the undercloud and update the trilio_env.yaml.

    At this step, you have downloaded Trilio container images and configured Trilio image URLs in the necessary environment file.

    Follow this section when a Satellite Server is used for the container registry.

    Pull the Trilio containers on the Red Hat Satellite using the given

    Populate the trilio_env.yaml with container URLs.

    At this step, you have downloaded Trilio container images into the RedHat satellite server and configured Trilio image URLs in the necessary environment file.

    Edit /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env.yaml file and provide backup target details and other necessary details in the provided environment file. This environment file will be used in the overcloud deployment to configure Trilio components. Container image names have already been populated in the preparation of the container images. Still, it is recommended to verify the container URLs.

    You don't need to provide anything for resource_registry, keep it as it is.

    Parameter
    Description

    T4O supports setting up multiple target backend for storing snapshots. User can define any number of storage backends as required. At a high level, NFS and S3 are supported.

    Following table provides the details of parameters to be set in trilio_env.yaml file against all the S3 target backends.

    Parameters
    Description

    Following table provides the details of parameters to be set in trilio_env.yaml file against all the NFS target backends.

    Parameters
    Description

    After you fill in details of backup targets in trilio_env.yaml, user needs to run following script from ‘scripts' directory on undercloud node. This script will update ‘services/triliovault-object-store.yaml' file. User don’t need to verify that.

    The output will be written to

    For TrilioVault functionality to work, we need the following Linux kernel modules to be loaded on all controllers and compute nodes(Where Trilio WLM and Datamover services are going to be installed).

    This YAML file holds the default values, like default Trustee Role is creator and Keystone endpoint interface is Internal. There are some other parameters as well those User can update as per their requirements.

    1. trilio_env.yaml

    2. roles_data.yaml

    3. trilio_passwords.yaml

    To include new environment files use -e option and for roles data files use -r option.\

    Below is an example of an overcloud deploy command with Trilio environment:

    Please follow to verify the deployment.

    Trilio components will be deployed using puppet scripts.

    In case of the overcloud deployment failing do the following command provide the list of errors. The following document also provides valuable insights:

    => If any Trilio containers do not start well or are in a restarting state on the Controller/Compute node, use the following logs to debug.

    Get the overcloud Controller and Compute hostnames from the following command. Check Name column. Use exact host names in the triliovault_nfs_map_input.yml file.

    Edit the input map file triliovault_nfs_map_input.yml and fill in all the details. Refer to for details about the structure.

    Below is an example of how you can set the multi-IP NFS details:

    Expand the map file to create a one-to-one mapping of the compute nodes and the NFS shares.

    The result will be stored in the triliovault_nfs_map_output.yml file

    Open file triliovault_nfs_map_output.yml available in the current directory and validate that all compute nodes are covered with all the necessary NFS shares.

    Validate the changes in the file triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_nfs_map.yaml

    Following is the HAproxy conf file location on HAproxy nodes of the overcloud. Trilio Datamover API service HAproxy configuration gets added to this file.

    Trilio Datamover HAproxy default configuration from the above file looks as follows:

    The user can change the following configuration parameter values.

    To change these default values, you need to do the following steps. i) On the undercloud node, open the following file for editing.

    ii) Search the following entries and edit as required

    iii) Save the changes and do the overcloud deployment again to reflect these changes for overcloud nodes.

    i) If the user wants to add one or more extra volume/directory mounts to the Trilio Datamover Service container, they can use a variable named 'TrilioDatamoverOptVolumes' is available in the below file.

    ii) The variable 'TrilioDatamoverOptVolumes' accepts a list of volume/bind mounts. User needs to edit the file and add their volume mounts in the below format.

    iii) Lastly you need to do overcloud deploy/update.

    After successful deployment, you will see that volume/directory mount will be mounted inside the Trilio Datamover Service container.

    We are using cinder's ceph user for interacting with Ceph cinder storage. This user name is defined using parameter - 'ceph_cinder_user'.

    Trilio Installation on RHOSO

    The Red Hat OpenStack Services on OpenShift 18.0 is the supported and recommended method to deploy and maintain any RHOSO installation.

    Trilio is integrating natively into the RHOSO. Manual deployment methods are not supported for RHOSO.

    6.2 and later. Trilio for OpenStack 6.2 introduces the , which runs alongside the existing Trilio services on the controller and on each compute node. Deployment scripts in triliovault-cfg-scripts (branch 6.2.x) deploy DMS automatically as part of the steps below; no additional operator action is required.

    1. Prepare for deployment

    Refer to the link Resources to get release specific values of the placeholders, viz Container URLs, trilio_branch, RHOSO Version and CONTAINER-TAG-VERSION in this document as per the OpenStack environment:

    1.1] Pre-requisites

    • Podman tool should be available on the bastion host.

    • All commands must be executed from the bastion host where RHOSO OpenStack was installed.

    • Install the ruamel.yaml package using the following command: pip3 install ruamel.yaml

    • Ensure OpenStack Barbican service is installed, configured, and operational before proceeding with the Trilio deployment.

    The following steps are to be done on the bastion node on an already installed RHOSO environment.

    The following command clones the triliovault-cfg-scripts github repository.

    In this secret we keep passwords in base64 encoded form.

    In this trilio-openstack-secret.yaml file you need to fill the base64 encoded strings for container registry password and other passwords.

    To get base64 encoded string please use following linux command

    If you want to using old db approach you can remove the DbRootPassword parameter

    Parameter
    Description

    Following script creates image pull secret for Trilio container images. User need to pass image registry url and authentication user name of that registry. This script reads registry user password from trilio-openstack-secret secret.

    By default Trilio container images are available in RedHat connect registry, it's url is registry.connect.redhat.com. User needs to provide this registry url and it's user name to the script.

    If user wants to use a different registry to keep the Trilio container images, then user need to pull Trilio images from registry.connect.redhat.com and push them to user's registry. In this case user need to provide it's registry url and user name to following command.

    You can install the Trilio for OpenStack Operator using either of the following methods (2.1.1 or 2.1.2).


    1. Please get value of parameter TVO_OPERATOR_CONTAINER_IMAGE_URL from . This is Trilio for OpenStack Operator container image tag.

    2. Run the following commands:


    1. Log in to the OpenShift Console using the admin user.

    2. Create a namespace named tvo-operator-system.

    3. Switch to the tvo-operator-system namespace.


    Note: You can use either method based on your deployment preference. Script-based installation is recommended for automated or CLI-driven environments.

    • Verify the tvo operator pod got created

    • Verify that operator CRD is installed

    This file named tvo-operator-inputs.yaml is used to create CR of kind TVOControlPlane. This CR is responsible to deploy Trilio control plane services.

    Run the script below to fill in some of the details automatically in tvo-operator-inputs.yaml.

    Note: Based on the detected RHOSO version, the set_operator_inputs.py script automatically selects the appropriate template (tvo-operator-inputs-till-fr5.yaml or tvo-operator-inputs-fr6-onwards.yaml) and updates the tvo-operator-inputs.yaml file. Users do not need to manually choose the template file.

    Above script automatically fills in some details like Trilio image tags, memcached_servers, keystone, database, and rabbitmq.

    Review the file tvo-operator-inputs.yaml and make sure all the details are correct. If there is any change required, you can edit this file. Above script only takes default parameters during script execution.

    Operator parameter details from file tvo-operator-inputs.yaml that user need to edit:

    Note: Trilio supports two database deployment approaches, depending on the deployment model:

    1. OpenStack Galera (Old Database approach)

      • Trilio uses the already deployed Galera from 'OpenStack' namespace to create necessary databases.

      • Please refer following configuration parameters to use old database approach. User need to set this parameters in tvo-operator-inputs.yaml file.

    1. Trilio Galera (New Database approach)

      • Trilio deploys fresh Galera cluster in 'trilio-openstack' namespace and uses it to create necessary databases.

      • Please refer following configuration parameters to use new database approach. User need to set this parameters in tvo-operator-inputs.yaml file.

    Parameter
    Description
    Edit Mode

    Trilio control plane services will be deployed on OpenShift nodes having label trilio-control-plane=enabled . It is recommended to use three Kubernetes nodes for Trilio control plane services. Please use following commands to assign correct labels to nodes.

    Get list of OpenShift nodes

    Assign ‘trilio-control-plane=enabled' label to any three nodes of your choice where you want to deploy TVO control plane services.

    Verify list of nodes having 'trilio-control-plane=enabled' label

    Following script creates TLS certificates for Trilio services and defines secrets having these certs.

    Edit '$PUBLIC_ENDPOINT_DOMAIN' parameter in utils/certicate.yaml file and set it to correct value. Refer openstack keystone service public endpoint.

    Create certificates and secrets

    You can verify if these cert secrets are created in 'trilio-openstack' namespace.

    Set context to ‘openstack' namespace. All the trilio data plane resources will be created in 'openstack’ namespace.

    Run the script below to fill in some of the details automatically in cm-trilio-datamover.yaml.

    Above script automatically fills in some details like rabbit_host, rabbit_ssl, database_host, database_port.

    User need to manually fill in trilio-container-image-tags for datamover, wlm and dms images, trilio_container_registry_username and trilio_container_registry_url in the file cm-trilio-datamover.yaml.

    Review the file cm-trilio-datamover.yaml and make sure all the details are correct. If there is any change required, you can edit this file.

    Parameter
    Description
    Edit Mode

    Create config map having all input parameters for Trilio data plane services deployment.

    In this step we will trigger the ansible scripts execution to deploy Trilio data plane components. Get Data Plane NodeSet names using following command

    Edit two things in following file

    • Set Unique ‘name' for every ansible execution for ‘OpenStackDataPlaneDeployment’

    • Set correct name for 'nodeSets’ parameter. Take nodeSet name from previous step.

    To check list of deployment names alreday used, please use following command

    Trigger Trilio Data plane deployment execution

    Edit parameter name : <OpenStackDataPlaneDeployment_NAME>, use name from above steps.

    If it fails or completes and you want to run it again, you need to change the name of CR resource ‘OpenStackDataPlaneDeployment' to something new and unique in following template 'trilio-data-plane-deployment.yaml' and create it again using oc create command.

    Login to one of the compute node and check trilio compute service containers.

    Pre-requisite: You should have created image pull secret for Trilio container images.

    Edit the openstackversion CR resource/object and change horizonImage undercustomContainerImages Set 'horizonImage:' to Trilio Horizon Plugin container image url as shown below.

    For example: if resource name is 'openstack-controlplane'

    Use escape + Colon + wq, like the linux vi editor.

    Run the following command to set the route timeout to 180 seconds:

    This annotation configures the HAProxy router to allow backend requests up to the specified timeout duration.

    Confirm that the timeout annotation has been applied successfully:

    You should see an output similar to:

    You can access the OpenStack horizon using your same URL and login using same credentials. This openstack horizon will have Trilio UI components as well by verifying using the UI horizon.

    To add a new backup target, refer to the .

    Trilio pods can attach additional networks using the networks parameter in tvo-operator-inputs.yaml. This enables Trilio components to connect to custom or isolated networks.


    If a network exists in the openstack namespace, it must be copied to trilio-openstack.

    Example: copying the storage network.


    • Export NAD from openstack

    • Remove namespace-specific metadata

    • Apply NAD in trilio-openstack


    Each Trilio pod includes a networks field where you can specify additional networks.


    Provide a comma-separated list of network names. These networks must exist in the trilio-openstack namespace.

    Example:

    This attaches the storage and tenant networks to the triliovault_wlm_api pod.


    Note:

    • All networks listed in networks must exist as NADs in trilio-openstack.

    • If a network exists in another namespace, export and recreate it in trilio-openstack.

    CloudAdminPassword

    Provide the cloudadmin user's password of your overcloud

    ContainerTriliovaultDatamoverImage

    Trilio Datamover Container image name have already been populated in the preparation of the container images.

    Still it is recommended to verify the container URL.

    ContainerTriliovaultDatamoverApiImage

    Trilio DatamoverApi Container image name have already been populated in the preparation of the container images.

    Still it is recommended to verify the container URL.

    ContainerTriliovaultWlmImage

    Trilio WLM Container image name have already been populated in the preparation of the container images.

    Still it is recommended to verify the container URL.

    ContainerHorizonImage

    Horizon Container image name have already been populated in the preparation of the container images.

    Still it is recommended to verify the container URL.

    TrilioBackupTargets

    List of Backup Targets for TrilioVault. These backup targets will be used to store backups taken by TrilioVault. Backup target examples and format of NFS and S3 types are already provided in the trilio_env.yaml file. Details of respective prameters under TrilioBackupTargets given in next section

    TrilioDatamoverOptVolumes

    User can specify list of extra volumes that they want to mount on 'triliovault_datamover' container.

    Refer the Configure Custom Volume/Directory Mounts for the Trilio Datamover Service section in this doc

    s3_type

    Could be either of amazon s3 OR ceph_s3 depending upon which S3 is to be configured with T4O.

    s3_access_key

    S3 Access Key

    s3_secret_key

    S3 Secret Key

    s3_region_name

    S3 Region name

    s3_bucket

    S3 Bucket

    s3_endpoint_url

    S3 endpoint url

    s3_signature_version

    Provide S3 signature version

    s3_auth_version

    Provide S3 auth version

    s3_ssl_enabled

    true

    s3_ssl_verify

    true

    s3_self_signed_cert

    true

    s3_bucket_object_lock_enabled

    If S3 bucket is having object lock enabled, then this should be set as true else false

    nfs_options

    'nolock,soft,timeo=600,intr,lookupcache=none,nfsvers=3,retrans=10' These parameter set NFS mount options. Keep default values, unless a special requirement exists

    is_multi_ip_nfs

    true or false depending upon whether the storage backend is NFS having single or multiple IP.

    nfs_shares

    NFS IP and share path. To be kept in case of single IP NFS. Eg. 11.30.1.10:/mnt/share

    multi_ip_nfs_map

    NFS IPs and share paths. To be kept in case of multiple NFS IPs. Sample below multi_ip_nfs_map:  controller1: 192.168.2.3:/var/nfsshare  controller2: 192.168.2.4:/var/nfsshare  compute0: 192.168.3.2:/var/nfsshare  compute1: 192.168.3.4:/var/nfsshare

    trilio_defaults.yaml
  • Use the correct Trilio endpoint map file as per the available Keystone endpoint configuration. You have to remove your OpenStack's endpoint map file from overcloud deploy command and instead of that use Trilio endpoint map file.

    1. Instead of tls-endpoints-public-dns.yaml file, use triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env_tls_endpoints_public_dns.yaml

    2. Instead of tls-endpoints-public-ip.yaml file, usetriliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env_tls_endpoints_public_ip.yaml

    3. Instead of tls-everywhere-endpoints-dns.yaml file, usetriliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env_tls_everywhere_dns.yaml

    4. Instead of no-tls-endpoints-public-ip.yaml file, usetriliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env_non_tls_endpoints_ip.yaml

  • CloudAdminUserName

    Default value is admin.

    Provide the cloudadmin user name of your overcloud

    CloudAdminProjectName

    Default value is admin.

    Provide the cloudadmin project name of your overcloud

    CloudAdminDomainName

    backup_target_name

    User Defined Name of the target backend. Can be any name which can help in quick identifying respective target

    backup_target_type

    s3

    is_default

    backup_target_name

    User Defined Name of the target backend. Can be any name which can help in quick identifying respective target

    backup_target_type

    nfs

    is_default

    1.2] Clone triliovault-cfg-scripts repository

    All commands need to be run as a stack user on the undercloud node

    Refer to the word <RHOSP_RELEASE_DIRECTORY> as rhosp17 in the below sections

    1.3] Set executable permissions for all shell scripts

    1.4] If the backup target type is 'Ceph based S3' with SSL:

    2] Update the overcloud roles data file to include Trilio services

    In the case of uncustomized roles_data.yaml can the default file be found on the undercloud at:

    /usr/share/openstack-tripleo-heat-templates/roles_data.yaml

    All commands need to be run as a 'stack' user

    2.1] Add Trilio Datamover Api and Trilio Workload Manager services to role data file

    2.2] Add Trilio Datamover Service to role data file

    3] Prepare Trilio container images

    All commands need to be run as a 'stack' user

    3.1] Remote Registry

    trilio_env.yaml file path:

    cd triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/

    3.2] Local Registry

    3.3] Red Hat Satellite Server

    4] Provide environment details in trilio-env.yaml

    4.1] TrilioBackupTargets Details

    4.2] Update triliovault object store yaml

    5.1] Change the directory and run the script

    5.2] Output will be written to the below file.

    Include this file in your overcloud deploy command as an environment file with the option "-e"

    6] Fetch ids of required OpenStack resources

    6.1] User needs to source 'overcloudrc' file of cloud admin user. This is needed to run OpenStack CLI.

    For only this section user needs to source the cloudrc file of overcloud node

    6.2] User must have filled in the cloud admin user details of overcloud in 'trilio_env.yaml' file in the 'Provide environment details in trilio-env.yaml' section. If not please do so.

    6.3] Cloud admin user should have admin role on cloud admin domain

    6.4] After this, user can run the following script.

    7] Load necessary Linux drivers on all Controller and Compute nodes

    7.1] Install nbd module

    7.2] Install fuse module

    8] Upload Trilio puppet module

    All commands need to be run as a 'stack' user on undercloud node

    8.1] Source the stackrc

    8.2] The following commands upload the Trilio puppet module to the overcloud registry. The actual upload happens upon the next deployment.

    9] Deploy overcloud with Trilio environment

    9.1] Include the environment file trilio_defaults.yaml in overcloud deploy command with `-e` option as shown below.

    9.2] Additionally include the following heat environment files and roles data file we mentioned in the above sections in an overcloud deploy command:

    Post-deployment for the multipath enabled environment, log into respective Datamover container and add uxsock_timeout with value as 60000 (i.e. 60 sec) in /etc/multipath.conf. Restart datamover container

    10] Verify deployment

    11] Troubleshooting for overcloud deployment failures

    12] Advanced Settings/Configuration

    12.1] Configure Multi-IP NFS

    This section is only required when the Multi-IP feature for NFS is required.

    This feature allows us to set the IP to access the NFS Volume per datamover instead of globally.

    i] On Undercloud node, change the directory

    ii] Edit file triliovault_nfs_map_input.yml in the current directory and provide compute host and NFS share/IP map.

    Run this command on undercloud by sourcing stackrc.

    You can not configure the different IPs for the Controllers/WLM nodes, you need to use the same share on all the controller nodes. You can configure the different IPs for Compute/Datamover nodes

    iii] Update pyyaml on the undercloud node only

    If pip isn't available please install pip on the undercloud.

    iv] Validate output map file

    v] Append this output map file to triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_nfs_map.yaml

    vi] Include the environment file (trilio_nfs_map.yaml) in overcloud deploy command with '-e' option as shown below.

    vii] Ensure that MultiIPNfsEnabled is set to true in the trilio_env.yaml file and that NFS is used as a backup target.

    viii] After this you need to run the overcloud deployment.

    12.2] Haproxy customized configuration for Trilio dmapi service

    The existing default HAproxy configuration works fine with most of the environments. Only when timeout issues with the Trilio Datamover Api are observed or other reasons are known, change the configuration as described here.

    12.3] Configure Custom Volume/Directory Mounts for the Trilio Datamover Service

    To add one more extra volume/directoy mount to the Trilio Datamover Service container it is necessary that volumes/directories should already be mounted on the Compute host

    12.4] Advanced Ceph Configration (Optional)

    Details about multiple ceph configuration can be found here.

    Resources
    https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/16.1/html/director_installation_and_usage/preparing-for-director-installation#container-image-preparation-parameters
    Red Hat registry URLs.
    this documentation
    https://docs.openstack.org/tripleo-docs/latest/install/troubleshooting/troubleshooting-overcloud.html
    this page

    Default value is default.

    Provide the cloudadmin project name of your overcloud

    Can be true or false. Ideally, any one of the multiple target backends specified in trilio_env.yaml file must be marked as true.

    Can be true or false. Ideally, any one of the multiple target backends specified in trilio_env.yaml file must be marked as true.

    cd /home/stack
    source stackrc
    git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>
    cd triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/scripts/
    chmod +x *.sh
     cp <S3_SELF_SIGNED_CERT_CA_CHAIN_FILE> /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/puppet/trilio/files/s3-cert-<S3_BACKUP_TARGET_NAME>.pem
    
    cp s3-ca.pem /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/puppet/trilio/files/s3-cert-BT2_S3.pem
    - OS::TripleO::Services::TrilioDatamoverApi
    - OS::TripleO::Services::TrilioWlmApi
    - OS::TripleO::Services::TrilioWlmWorkloads
    - OS::TripleO::Services::TrilioWlmScheduler
    - OS::TripleO::Services::TrilioWlmCron
    - OS::TripleO::Services::TrilioObjectStore
    - OS::TripleO::Services::TrilioDatamover
    - OS::TripleO::Services::TrilioObjectStore
    File Name: containers-prepare-parameter.yaml
    parameter_defaults:
      ContainerImagePrepare:
      - push_destination: false
        set:
          namespace: registry.redhat.io/...
          ...
      ...
      ContainerImageRegistryCredentials:
        registry.redhat.io:
          myuser: 'p@55w0rd!'
        registry.connect.redhat.com:
          myuser: 'p@55w0rd!'
      ContainerImageRegistryLogin: true
    $ grep '<CONTAINER-TAG-VERSION>-rhosp17.1' trilio_env.yaml
       ContainerTriliovaultDatamoverImage: undercloudqa162.ctlplane.trilio.local:8787/trilio/trilio-datamover:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerTriliovaultDatamoverApiImage: undercloudqa162.ctlplane.trilio.local:8787/trilio/trilio-datamover-api:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerTriliovaultWlmImage: undercloudqa162.ctlplane.trilio.local:8787/trilio/trilio-wlm:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerHorizonImage: undercloudqa162.ctlplane.trilio.local:8787/trilio/trilio-horizon-plugin:<CONTAINER-TAG-VERSION>-rhosp17.1
    cd /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/scripts/
    
    sudo ./prepare_trilio_images.sh <UNDERCLOUD_REGISTRY_HOSTNAME> <CONTAINER-TAG-VERSION>-rhosp17.1
    
    ## Example of running the script with parameters
    sudo ./prepare_trilio_images.sh undercloudqa17.ctlplane.trilio.local 6.0.0-rhosp17.1
    
    
    ## Verify changes
    grep '<CONTAINER-TAG-VERSION>-rhosp17.1' ../environments/trilio_env.yaml
       ContainerTriliovaultDatamoverImage: undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-datamover:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerTriliovaultDatamoverApiImage: undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-datamover-api:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerTriliovaultWlmImage: undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-wlm:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerHorizonImage: undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-horizon-plugin:<CONTAINER-TAG-VERSION>-rhosp17.1
    
    $  openstack tripleo container image list | grep <CONTAINER-TAG-VERSION>-rhosp17.1
    | docker://undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-datamover-api:<CONTAINER-TAG-VERSION>-rhosp17.1                |
    | docker://undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-horizon-plugin:<CONTAINER-TAG-VERSION>-rhosp17.1               |
    | docker://undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-datamover:<CONTAINER-TAG-VERSION>-rhosp17.1                    |
    | docker://undercloudqa17.ctlplane.trilio.local:8787/trilio/trilio-wlm:<CONTAINER-TAG-VERSION>-rhosp17.1                          |
    cd /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/environments
    
    $ grep '<CONTAINER-TAG-VERSION>-rhosp17.1' trilio_env.yaml
       ContainerTriliovaultDatamoverImage: <SATELLITE_REGISTRY_URL>/trilio/trilio-datamover:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerTriliovaultDatamoverApiImage: <SATELLITE_REGISTRY_URL>/trilio/trilio-datamover-api:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerTriliovaultWlmImage: <SATELLITE_REGISTRY_URL>/trilio/trilio-wlm:<CONTAINER-TAG-VERSION>-rhosp17.1
       ContainerHorizonImage: <SATELLITE_REGISTRY_URL>/trilio/trilio-horizon-plugin:<CONTAINER-TAG-VERSION>-rhosp17.1
    cd redhat-director-scripts/rhosp17/scripts/
    dnf install python3-ruamel-yaml
    python3 update_object_store_yaml.py
    cd /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/scripts/
    ./generate_passwords.sh
    -e /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/passwords.yaml
    source <OVERCLOUD_RC_FILE>
    vi /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env.yaml
    openstack role add --user <cloud-Admin-UserName> --domain <Cloud-Admin-DomainName> admin
    
    # Example
    openstack role add --user admin --domain default admin
    cd /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/scripts
    ./create_wlm_ids_conf.sh
    cat /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/puppet/trilio/files/triliovault_wlm_ids.conf
    modprobe nbd nbds_max=128
    lsmod | grep nbd
    modprobe fuse
    lsmod | grep fuse
    source stackrc
    cd /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/scripts/
    ./upload_puppet_module.sh
    
    ## Output of above command looks like following
    Creating tarball...
    Tarball created.
    renamed '/tmp/puppet-modules-MUIyvXI/puppet-modules.tar.gz' -> '/var/lib/tripleo/artifacts/overcloud-artifacts/puppet-modules.tar.gz'
    Creating heat environment file: /home/stack/.tripleo/environments/puppet-modules-url.yaml
    [stack@uc17-1 scripts]$ cat /home/stack/.tripleo/environments/puppet-modules-url.yaml
    parameter_defaults:
      DeployArtifactFILEs:
      - /var/lib/tripleo/artifacts/overcloud-artifacts/puppet-modules.tar.gz
    
    ## Above command creates following file.
    ls -ll /home/stack/.tripleo/environments/puppet-modules-url.yaml
    -e /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_defaults.yaml 
    openstack overcloud deploy --stack overcloudtrain5 --templates \
      --libvirt-type qemu \
      --ntp-server 192.168.1.34 \
      -e /home/stack/templates/node-info.yaml \
      -e /home/stack/containers-prepare-parameter.yaml \
      -e /home/stack/templates/ceph-config.yaml \
      -e /home/stack/templates/cinder_size.yaml \
      -e /usr/share/openstack-tripleo-heat-templates/environments/services/barbican.yaml \
      -e /usr/share/openstack-tripleo-heat-templates/environments/barbican-backend-simple-crypto.yaml \
      -e /home/stack/templates/configure-barbican.yaml \
      -e /home/stack/templates/multidomain_horizon.yaml \
      -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs.yaml \
      -e /usr/share/openstack-tripleo-heat-templates/environments/ssl/enable-internal-tls.yaml \
      -e /home/stack/templates/tls-parameters.yaml \
      -e /usr/share/openstack-tripleo-heat-templates/environments/services/haproxy-public-tls-certmonger.yaml \
      -e /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/environments/trilio_env.yaml \
      -e /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/environments/trilio_env_tls_everywhere_dns.yaml \
      -e /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/environments/trilio_defaults.yaml \
      -e /home/stack/triliovault-cfg-scripts/redhat-director-scripts/rhosp17/environments/trilio_passwords.yaml \
      -r /usr/share/openstack-tripleo-heat-templates/roles_data.yaml
    openstack stack failures list overcloud
    heat stack-list --show-nested -f "status=FAILED"
    heat resource-list --nested-depth 5 overcloud | grep FAILED
    podman logs <trilio-container-name>
    
    tailf /var/log/containers/<trilio-container-name>/<trilio-container-name>.log
    cd triliovault-cfg-scripts/common/
    (undercloud) [stack@ucqa161 ~]$ openstack server list
    +--------------------------------------+-------------------------------+--------+----------------------+----------------+---------+
    | ID                                   | Name                          | Status | Networks             | Image          | Flavor  |
    +--------------------------------------+-------------------------------+--------+----------------------+----------------+---------+
    | 8c3d04ae-fcdd-431c-afa6-9a50f3cb2c0d | overcloudtrain1-controller-2  | ACTIVE | ctlplane=172.30.5.18 | overcloud-full | control |
    | 103dfd3e-d073-4123-9223-b8cf8c7398fe | overcloudtrain1-controller-0  | ACTIVE | ctlplane=172.30.5.11 | overcloud-full | control |
    | a3541849-2e9b-4aa0-9fa9-91e7d24f0149 | overcloudtrain1-controller-1  | ACTIVE | ctlplane=172.30.5.25 | overcloud-full | control |
    | 74a9f530-0c7b-49c4-9a1f-87e7eeda91c0 | overcloudtrain1-novacompute-0 | ACTIVE | ctlplane=172.30.5.30 | overcloud-full | compute |
    | c1664ac3-7d9c-4a36-b375-0e4ee19e93e4 | overcloudtrain1-novacompute-1 | ACTIVE | ctlplane=172.30.5.15 | overcloud-full | compute |
    +--------------------------------------+-------------------------------+--------+----------------------+----------------+---------+
    $ cat /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_nfs_map.yaml
    # TriliovaultMultiIPNfsMap represents datamover, WLM nodes (compute and controller nodes) and it's NFS share mapping.
    parameter_defaults:
      TriliovaultMultiIPNfsMap:
        overcloudtrain4-controller-0: 172.30.1.11:/rhospnfs
        overcloudtrain4-controller-1: 172.30.1.11:/rhospnfs
        overcloudtrain4-controller-2: 172.30.1.11:/rhospnfs
        overcloudtrain4-novacompute-0: 172.30.1.12:/rhospnfs
        overcloudtrain4-novacompute-1: 172.30.1.13:/rhospnfs
    sudo pip3 install PyYAML==5.1 3
    python3 ./generate_nfs_map.py
    grep ':.*:' triliovault_nfs_map_output.yml >> ../redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_nfs_map.yaml
    
    -e /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_nfs_map.yaml
    /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env.yaml
    /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg
    listen triliovault_datamover_api
      bind 172.30.4.53:13784 transparent ssl crt /etc/pki/tls/private/overcloud_endpoint.pem
      bind 172.30.4.53:8784 transparent ssl crt /etc/pki/tls/certs/haproxy/overcloud-haproxy-internal_api.pem
      balance roundrobin
      http-request set-header X-Forwarded-Proto https if { ssl_fc }
      http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
      http-request set-header X-Forwarded-Port %[dst_port]
      maxconn 50000
      option httpchk
      option httplog
      option forwardfor
      retries 5
      timeout check 10m
      timeout client 10m
      timeout connect 10m
      timeout http-request 10m
      timeout queue 10m
      timeout server 10m
      server overcloudtraindev2-controller-0.internalapi.trilio.local 172.30.4.57:8784 check fall 5 inter 2000 rise 2 verifyhost overcloudtraindev2-controller-0.internalapi.trilio.local
    retries 5
    timeout http-request 10m
    timeout queue 10m
    timeout connect 10m
    timeout client 10m
    timeout server 10m
    timeout check 10m
    balance roundrobin
    maxconn 50000
    /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/services/triliovault-datamover-api.yaml
              tripleo::haproxy::trilio_datamover_api::options:
                 'retries': '5'
                 'maxconn': '50000'
                 'balance': 'roundrobin'
                 'timeout http-request': '10m'
                 'timeout queue': '10m'
                 'timeout connect': '10m'
                 'timeout client': '10m'
                 'timeout server': '10m'
                 'timeout check': '10m'
    triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env.yaml
    TrilioDatamoverOptVolumes:
       - <mount-dir-on-compute-host>:<mount-dir-inside-the-datamover-container>
    
    ## For example, below is the `/mnt/mount-on-host` mount directory mounted on Compute host that directory you want to mount on the `/mnt/mount-inside-container` directory inside the Datamover container
    
    [root@overcloudtrain5-novacompute-0 heat-admin]# df -h | grep 172.
    172.25.0.10:/mnt/tvault/42436   2.5T  2.3T  234G  91% /mnt/mount-on-host
    
    ## Then provide that mount in the below format
    
    TrilioDatamoverOptVolumes:
       - /mnt/mount-on-host:/mnt/mount-inside-container
    [root@overcloudtrain5-novacompute-0 heat-admin]# podman exec -itu root triliovault_datamover bash
    [root@overcloudtrain5-novacompute-0 heat-admin]# df -h | grep 172.
    172.25.0.10:/mnt/tvault/42436   2.5T  2.3T  234G  91% /mnt/mount-inside-container

    DmapiRabbitPassword

    User needs to set this value as per their choice, but it must be Base64 encoded.

    WlmDatabasePassword

    User needs to set this value as per their choice, but it must be Base64 encoded.

    WlmKeystonePassword

    User needs to set this value as per their choice, but it must be Base64 encoded.

    WlmRabbitPassword

    User needs to set this value as per their choice, but it must be Base64 encoded.

    ContainerRegistryPassword

    User need to set this right value but it must be Base64 encoded.

    Navigate to Operator Hub.
  • Search for "Trilio for OpenStack" in the search box.

  • Select the "Trilio for OpenStack" operator and click on it.

  • Choose a channel and select the latest available operator version in Resources

  • Click on Install button.

  • Select the default install mode for all namespaces.

  • Choose Automatic as the update strategy.

  • Click Install button and wait a few minutes until the status shows "Operator Installed" message on the screen.

  • Manual

    common

    - trustee_role should be creator,member if barbican is enabled. Otherwise trustee_role should be member. Any openstack user that wants to create backup jobs and take backups needs this role in respective openstack project. - memcached_servers value should be fetched using command oc -n openstack get memcached -o jsonpath='{.items[*].status.serverList[*]}'| tr ' ' ',' - metallb_address_pool: Do not change (Review rabbitmq.common.metallb_address_pool parameter value. You can use control plane network pool as well. Any address pool will work as long as it has at least one free IP address available) using command: oc get ipaddresspool -n metallb-system

    Automated

    openstack

    - 'namespace': Namespace named in which openstack control plane services are installed. - 'osp_secret_name': OpenStack secret name which holds all the admin passwords for openstack services.

    Automated

    keystone.common

    - 'keystone_interface' set it to any of the value [’internal', 'public']. This interface will be used for communication between TVO and OpenStack services. - 'service_project_name': This is project name where all services are registered. - ‘service_project_domain_name': service project’s domain name - 'admin_role_name': Admin role name - 'cloud_admin_user_name': OpenStack cloud admin user name - 'cloud_admin_project_name': Cloud admin project name - 'auth_url': Keystone auth url of respective interface provided in keystone_interface parameter. - ‘auth_uri': Just append '/v3’ to auth_url - 'keystone_auth_protocol': https or http Auth protocol of keystone endpoint url of provided keystone_interface - 'keystone_auth_host': Full host name from keystone auth_url

    Automated

    keystone.commom.is_self_signed_ssl_cert

    True/False, Whether the TLS certs used by keystone endpoint url mentioned in auth_url parameter uses self signed certs or not

    Manual

    keystone.datamover_api and keystone.wlm_api

    For both components datamover_api and wlm_api we have same set of parameters. - ‘user': This is openstack user that is used by service datamover_api. Please don’t change this one. - ‘service_name': Don’t need to change - 'service_type': Don’t need to change - 'service_desc': Don’t need to change - ‘internal_endpoint': Trilio service internal endpoint. Please refer other openstack service endpoints and set this one accordingly. - ‘public_endpoint': User just need to set replace parameter 'PUBLIC_ENDPOINT_DOMAIN’ here. Please refer other openstack services public endpoint url. - ‘public_auth_host': FQDN mentioned in parameter 'public_endpoint’

    Automated

    database.common use_trilio_galera

    - For new approach, separate galera cluster for Trilio, set this to 'true'. - For old approach, using openstack’s galera, set this to 'false'.

    Manual

    database.common

    - 'root_user_name': Do not change. Keep this as it is. Don’t need to change unless you know that root username is changed. - 'Database port': Do not change

    Manual

    database.common host

    - If user wants to use old DB install approach, set this value to: openstack.openstack.svc - If user wants to use new DB installation approach, set this value to: trilio-galera-cluster. trilio-openstack.svc

    Manual

    database.datamover_api and database.wlm_api

    - 'user': Do not change - 'database': Do not change

    Automated

    rabbitmq.common

    - 'host': Do not change - 'port': Do not change - 'driver': Do not change - ‘ssl': If SSL/TLS is enabled on rabbitmq, set this to true other wise set it to false. This is boolean parameter. - 'namespace': Do not change - Review ‘rabbitmq.cluster.resources' parameters and adjust as per the need in tvo-operator-inputs.yaml. Default values are sufficient and don’t need to change until you explicitly face any issue.

    Automated

    rabbitmq.datamover_api and rabbitmq.wlm_api

    - 'user': Do not change this. - 'vhost': Do not change this

    Automated

    pod(optional)

    These parameters sets additional networks on pods. Please refer to .

    Manual

    pod.replicas

    These parameters sets number of replicas for Trilio components. Default values are standard. Unless needed you don’t need to change it. Please note that number of replicas for triliovault_wlm_cron pod should always be set to 1.

    Automated

    cinder_backend_ceph, libvirt_images_rbd_ceph_conf, ceph_cinder_user and oslomsg_rpc_use_ssl

    User does not need to change these parameters

    Manual

    images

    Please refer to

    Manual

    trilio_container_registry_username, trilio_container_registry_url

    User needs to update the following fileds with using either Docker or the Redhat registry details, as per the requirement.

    Manual

    Verify NADs
  • Example output:

      NAME      AGE
      storage   2m5s
  • git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    oc create namespace trilio-openstack
    echo -n "<password_string>" | base64

    DbRootPassword

    - User needs to set this value as per their choice, but it must be Base64 encoded. - If user wants to use old DB approch please remove this parameter, This parameter is only needed for new DB approach. Please refer to section 2.2 for details on database approaches

    DmapiDatabasePassword

    User needs to set this value as per their choice, but it must be Base64 encoded.

    DmapiKeystonePassword

    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    vi trilio-openstack-secret.yaml
    oc -n trilio-openstack apply -f trilio-openstack-secret.yaml
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    chmod +x create-image-pull-secret.sh
    ./create-image-pull-secret.sh <IMAGE_REGISTRY_URL> <IMAGE_REGISTRY_USER>
    
    Note: Use the following URLs for Trilio image registries, as needed.
    Default RedHat registry url for Trilio images: registry.connect.redhat.com
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts
    chmod +x install_operator.sh
    ./install_operator.sh <TVO_OPERATOR_CONTAINER_IMAGE_URL>
    
    
    Example:-
        Redhat_registry_tvo_operator_conatiner_image_Url:- ./install_operator.sh registry.connect.redhat.com/trilio/trilio-openstack-operator-rhoso:6.1.0-rhoso18.0
    oc get pods -A | grep tvo-operator
    oc get crds | grep tvo
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts
    chmod +x set_operator_inputs.py
    ./set_operator_inputs.py <TRILIO-CONTAINER-IMAGE-TAG>
    vi tvo-operator-inputs.yaml
      database:
        common:
          use_trilio_galera: false
          root_user_name: "root"
          host: "openstack.openstack.svc"
          port: 3306
      database:
        common:
          use_trilio_galera: true
          root_user_name: "root"
          host: "trilio-galera-cluster.trilio-openstack.svc"
          port: 3306

    images

    Please refer to Resources

    Automated

    rabbitmq and galera images

    oc get nodes
    oc label nodes <Openshift_node_name1> trilio-control-plane=enabled
    oc label nodes <Openshift_node_name2> trilio-control-plane=enabled
    oc label nodes <Openshift_node_name3> trilio-control-plane=enabled
    oc get nodes -l trilio-control-plane=enabled
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    vi certificate.yaml
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    ./create_cert_secrets.sh
    oc -n trilio-openstack describe secret cert-triliovault-datamover-public-svc
    oc -n trilio-openstack describe secret cert-triliovault-datamover-internal-svc
    oc -n trilio-openstack describe secret cert-triliovault-wlm-public-svc
    oc -n trilio-openstack describe secret cert-triliovault-wlm-internal-svc
    oc -n trilio-openstack describe secret cert-trilio-rabbitmq-cluster
    oc -n trilio-openstack describe secret cert-trilio-galera-cluster
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
    ./deploy_tvo_control_plane.sh
    oc get pods -A | grep tvo-operator
    
    oc -n <namespace> logs -f <pod-name> 
    oc -n trilio-openstack get tvocontrolplane 
    oc describe tvocontrolplane <TVO_CONTROL_PLANE_OBEJCT_NAME> -n trilio-openstack
    [root@localhost ctlplane-scripts]# oc -n trilio-openstack get pods
    NAME                                                READY   STATUS      RESTARTS   AGE
    job-triliovault-datamover-api-db-init-lczz7         0/1     Completed   0          3h41m
    job-triliovault-datamover-api-keystone-init-fhhtj   0/1     Completed   0          3h42m
    job-triliovault-datamover-api-rabbitmq-init-x64dx   0/1     Completed   0          3h42m
    job-triliovault-wlm-cloud-trust-hrqzz               0/1     Completed   0          3h41m
    job-triliovault-wlm-db-init-gsrxg                   0/1     Completed   0          3h41m
    job-triliovault-wlm-keystone-init-z6m8b             0/1     Completed   0          3h42m
    job-triliovault-wlm-rabbitmq-init-vbg2g             0/1     Completed   0          3h41m
    trilio-galera-cluster-galera-0                      1/1     Running     0          3h43m
    trilio-galera-cluster-galera-1                      1/1     Running     0          3h43m
    trilio-galera-cluster-galera-2                      1/1     Running     0          3h43m
    trilio-galera-wait-job-24ndf                        0/1     Completed   0          3h43m
    trilio-rabbitmq-cluster-server-0                    1/1     Running     0          3h44m
    trilio-rabbitmq-cluster-server-1                    1/1     Running     0          3h44m
    trilio-rabbitmq-cluster-server-2                    1/1     Running     0          3h44m
    triliovault-datamover-api-79bddd57b9-5vfbx          1/1     Running     0          3h41m
    triliovault-datamover-api-79bddd57b9-9t6hb          1/1     Running     0          3h41m
    triliovault-datamover-api-79bddd57b9-bjfqv          1/1     Running     0          3h41m
    triliovault-dms-72ldp                               1/1     Running     0          3h41m
    triliovault-dms-bvtwf                               1/1     Running     0          3h41m
    triliovault-dms-c6ngz                               1/1     Running     0          3h41m
    triliovault-wlm-api-659f69b748-d2jt8                1/1     Running     0          3h41m
    triliovault-wlm-api-659f69b748-krp4k                1/1     Running     0          3h41m
    triliovault-wlm-api-659f69b748-s5d6t                1/1     Running     0          3h41m
    triliovault-wlm-cron-7bbb755bf-c5w8h                1/1     Running     0          3h41m
    triliovault-wlm-scheduler-c54c696dd-hgqgw           1/1     Running     0          3h41m
    triliovault-wlm-scheduler-c54c696dd-vcv6z           1/1     Running     0          3h41m
    triliovault-wlm-scheduler-c54c696dd-zfz4g           1/1     Running     0          3h41m
    triliovault-wlm-workloads-555998ff8-6jdsj           1/1     Running     0          3h41m
    triliovault-wlm-workloads-555998ff8-77v6n           1/1     Running     0          3h41m
    triliovault-wlm-workloads-555998ff8-pcbt5           1/1     Running     0          3h41m
    [root@localhost ctlplane-scripts]#
    
    oc config set-context --current --namespace=openstack
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
    oc -n openstack apply -f ../ctlplane-scripts/trilio-openstack-secret.yaml
    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
    chmod +x set_data_plane_inputs.py
    ./set_data_plane_inputs.py

    rabbit_host, rabbit_port, rabbit_ssl

    User does not need to change these parameters

    Semi-automated

    database_host, database_port

    User does not need to change these parameters

    cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
    vi cm-trilio-datamover.yaml
    ## Create config map
    oc -n openstack apply -f cm-trilio-datamover.yaml
    vi trilio-datamover-service.yaml
    oc -n openstack apply -f trilio-datamover-service.yaml
    oc -n openstack get OpenStackDataPlaneNodeSet
    vi trilio-data-plane-deployment.yaml
    ## To check list of deployment names alreday used, please use following command
    oc -n openstack get OpenStackDataPlaneDeployment
    ## Trigger deployment
    oc -n openstack apply -f trilio-data-plane-deployment.yaml
    oc -n openstack get pod -l openstackdataplanedeployment=<OpenStackDataPlaneDeployment_NAME>
    oc -n openstack logs -f <trilio-datamover-pod-name>
    [root@edpm-compute-0 ~]# podman ps | grep trilio
    70674ae421c5  registry.connect.redhat.com/trilio/trilio-dms-rhoso:6.2.1-rhoso18.0                                                                          kolla_start           About a minute ago  Up About a minute                  triliovault-dms
    f2d4bc322d26  registry.connect.redhat.com/trilio/trilio-datamover-rhoso:6.2.1-rhoso18.0                                                                    kolla_start           About a minute ago  Up About a minute                  triliovault-datamover
    [kni@localhost ~]$ oc -n openstack get openstackversion
    NAME                     TARGET VERSION      AVAILABLE VERSION   DEPLOYED VERSION
    openstack-controlplane   18.0.2-20240923.2   18.0.2-20240923.2   18.0.2-20240923.2
    oc -n openstack edit openstackversion <OPENSTACKVERSION_RESOURCE_NAME> 
    oc -n openstack edit openstackversion openstack-controlplane
    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackVersion
    metadata:
      name: openstack-controlplane
    spec:
      customContainerImages:
        horizonImage: docker.io/trilio/trilio-horizon-plugin:<IMAGE_TAG>
    
    [...]
    oc -n openstack describe openstackversion <OPENSTACKVERSION_RESOURCE_NAME> 
    oc annotate route horizon -n openstack haproxy.router.openshift.io/timeout=180s --overwrite
    oc  -n openstack get route horizon -o yaml | grep timeout
    haproxy.router.openshift.io/timeout: 180s
      oc  -n openstack get network-attachment-definition storage -o yaml > storage-nad.yaml
      sed -i '/  namespace:/d' storage-nad.yaml
      sed -i '/  resourceVersion:/d' storage-nad.yaml
      sed -i '/  uid:/d' storage-nad.yaml
      sed -i '/  creationTimestamp:/d' storage-nad.yaml
      oc -n trilio-openstack apply -f storage-nad.yaml 
        pod:
          triliovault_wlm_api:
            networks: ""
            debug_mode: false
    
          triliovault_wlm_scheduler:
            networks: ""
            debug_mode: false
    
          triliovault_wlm_cron:
            networks: ""
            debug_mode: false
    
          triliovault_wlm_workloads:
            networks: ""
            debug_mode: false
    
          triliovault_object_store:
            networks: ""
            debug_mode: false
    
          triliovault_datamover_api:
            networks: ""
            debug_mode: false
        pod:
          triliovault_wlm_api:
            networks: "storage,tenant"

    1.2] Clone triliovault-cfg-scripts repository

    1.3] Create namespace for Trilio control plane services

    1.4] Create the trilio-openstack-secret in the trilio-openstack namespace.

    1.5] Create image pull secret

    2] Install Trilio Control Plane Services

    2.1] Install Operator - tvo-operator

    2.1.1] Method 1: Install Using local shell Script

    2.1.2] Method 2: Install Using Operator Hub (OpenShift Console)

    2.2] Edit tvo-operator-inputs.yaml file

    2.3] Set correct labels to Kubernetes nodes.

    2.4] Create TLS certificate secrets

    2.5] Run deploy command

    2.6] Check logs

    2.7] Check deployment status

    2.8] Verify successful deployment of T4O control plane services

    3] Install Trilio Data Plane Services

    3.1] Create the trilio-openstack-secret in the openstack namespace. This secret is needed for the Trilio data plane.

    3.2] User need to review below parameters fill all input parameters needed for Trilio data plane services in following cm-trilio-datamover.yaml file.

    3.3] Create cm-trilio-datamover config map

    3.4] Edit file ‘trilio-datamover-service.yaml' and set correct tag for container image 'openStackAnsibleEERunnerImage

    3.5] Following script creates CRD “OpenStackDataPlaneService“ resource for Trilio

    3.6] Trigger Deployment of Trilio data plane services

    3.7] Check deployment logs.

    3.8] Verify deployment completed well

    4] Install Trilio Horizon Plugin

    4.1] Get the openstackversion CR

    4.2] Edit the openstackversion CR and change horizonImage

    4.3] Save changes and exit

    4.4] Verify if changes are done correctly using below command

    4.5] Increase HAproxy route timeout

    4.5.1] Verify the HAproxy route timeout

    4.6] Access OpenStack Horizon

    5] Install a new Backup Target

    6] Advanced configurations (Optional)

    6.1] Attaching Additional Networks to Trilio Pods

    6.2] Copy NetworkAttachmentDefinition (NAD) to trilio-openstack

    6.3] Configure networks in tvo-operator-inputs.yaml in step 2.2

    6.4] Specify networks for each pod

    this release artifact documentation
    Add a new backup target
    Dynamic Mount Service (DMS)

    User needs to set this value as per their choice, but it must be Base64 encoded.

    Please refer to

    Automated

      oc -n trilio-openstack get network-attachment-definition  
    Resources
    step 6 of this documentation
    Resources

    Restores

    Definition

    A Restore is the workflow to bring back the backed up VMs from a Trilio Snapshot.

    List of Restores

    Using Horizon

    To reach the list of Restores for a Snapshot follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to show

    5. Click the workload name to enter the Workload overview

    6. Navigate to the Snapshots tab

    7. Identify the searched Snapshot in the Snapshot list

    8. Click the Snapshot Name

    9. Navigate to the Restores tab

    • --snapshot_id <snapshot_id> ➡️ ID of the Snapshot to show the restores of

    To reach the detailed Restore overview follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to show

    The Restore Details Tab shows the most important information about the Restore.

    • Name

    • Description

    • Restore Type

    • Status

    • List of VMs restored

      • restored VM Name

      • restored VM Status

      • restored VM ID

    The Misc tab provides additional Metadata information.

    • Creation Time

    • Restore ID

    • Snapshot ID containing the Restore

    • Workload

    • <restore_id> ➡️ ID of the restore to be shown

    • --output <output> ➡️ Option to get additional restore details, Specify --output metadata for restore metadata,--output networks --output subnets --output routers --output flavors

    Once a Restore is no longer needed, it can be safely deleted from a Workload.

    There are 2 possibilities to delete a Restore.

    To delete a single Restore through the submenu follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to delete

    To delete one or more Restores through the Restore list do the following:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to show

    • <restore_id> ➡️ ID of the restore to be deleted

    Ongoing Restores can be canceled.

    To cancel a Restore in Horizon follow these steps:

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to delete

    • <restore_id> ➡️ ID of the restore to be deleted

    The One Click Restore will bring back all VMs from the Snapshot in the same state as they were backed up. They will:

    • be located in the same cluster in the same datacenter

    • use the same storage domain

    • connect to the same network

    • have the same flavor

    The user can't change any Metadata.

    There are 2 possibilities to start a One Click Restore.

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to be restored

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to be restored

    • <snapshot_id> ➡️ ID of the snapshot to restore.

    • --display-name <display-name> ➡️ Optional name for the restore.

    • --display-description <display-description> ➡️ Optional description for restore.

    The Selective Restore is the most complex restore Trilio has to offer. It allows to adapt the restored VMs to the exact needs of the User.

    With the selective restore the following things can be changed:

    • Which VMs are getting restored

    • Name of the restored VMs

    • Which networks to connect with

    • Which Storage domain to use

    There are 2 possibilities to start a Selective Restore.

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to be restored

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to be restored

    • <snapshot_id> ➡️ ID of the snapshot to restore.

    • --display-name <display-name> ➡️ Optional name for the restore.

    • --display-description <display-description> ➡️ Optional description for restore.

    The Inplace Restore covers those use cases, where the VM and its Volumes are still available, but the data got corrupted or needs to a rollback for other reasons.

    It allows the user to restore only the data of a selected Volume, which is part of a backup.

    There are 2 possibilities to start an Inplace Restore.

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to be restored

    1. Login to Horizon

    2. Navigate to Backups

    3. Navigate to Workloads

    4. Identify the workload that contains the Snapshot to be restored

    • <snapshot_id> ➡️ ID of the snapshot to restore.

    • --display-name <display-name> ➡️ Optional name for the restore.

    • --display-description <display-description> ➡️ Optional description for restore.

    The workloadmgr client CLI is using a restore.json file to define the restore parameters for the selective and the inplace restore.

    An example for a selective restore of this restore.json is shown below. A detailed analysis and explanation is given afterwards.

    Before the exact details of the restore are to be provided it is necessary to provide the general metadata for the restore.

    • name➡️the name of the restore

    • description➡️the description of the restore

    • oneclickrestore <True/False>➡️If the restore is a oneclick restore. Setting this to True will override all other settings and a One Click Restore is started.

    The Selective Restore requires a lot of information to be able to execute the restore as desired.

    Those information are divided into 3 components:

    • instances

    • restore_topology

    • networks_mapping

    This part contains all information about all instances that are part of the Snapshot to restore and how they are to be restored.

    Each instance requires the following information

    • id ➡️ original id of the instance

    • include <True/False> ➡️ Set True when the instance shall be restored

    • name ➡️ new name of the instance

    • availability_zone ➡️ Nova Availability Zone the instance shall be restored into. Leave empty for "Any Availability Zone"

    • server_group ➡️ (optional, 6.2.1 and later) ID of an

    • Nics ➡️ list of openstack Neutron ports that shall be attached to the instance. Each Neutron Port consists of:

      • id ➡️ ID of the Neutron port to use

      • mac_address ➡️

    • vdisks ➡️ List of all Volumes that are part of the instance. Each Volume requires the following information:

      • id ➡️ Original ID of the Volume

      • new_volume_type ➡️

    The following example describes a single instance with all values.

    To activate a network topology restore set:

    To activate network mapping set:

    When the network mapping is activated it is used, it is necessary to provide the mapping details, which are part of the networks_mapping block:

    • networks ➡️ list of snapshot_network and target_network pairs

      • snapshot_network ➡️ the network backed up in the snapshot, contains the following:

        • id

    The Inplace Restore requires less information thana selective restore. It only requires the base file with some information about the Instances and Volumes to be restored.

    • id ➡️ ID of the instance inside the Snapshot

    • restore_boot_disk ➡️ Set to True if the boot disk of that VM shall be restored.

    • include ➡️ Set to True if at least one Volume from this instance shall be restored

    • vdisks ➡️ List of disks, that are connected to the instance. Each disk contains:

      • id ➡️

    There are no network information required, but the field have to exist as empty value for the restore to work.

    Workload Import and Migration

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/get_list/import_workloads

    DEPRECATED: use POST /workloads/get_list/import_reassign (see "Import and Reassign workload discovery" below). Response change: instead of the inline workload list, it now starts a discovery job listing the importable workloads by project_id/backup_targets and returns its jobid; fetch the results via the job details endpoint.

    Name
    Type
    Description
    Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshot in the Snapshot list

  • Click the Snapshot Name

  • Navigate to the Restores tab

  • Identify the restore to show

  • Click the restore name

  • Time taken
  • Size

  • Progress Message

  • Progress

  • Host

  • Warning Message (only shown when the Restore completed with a warning, e.g. a Nova server group that no longer exists on the target)

  • Restore Options

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshot in the Snapshot list

  • Click the Snapshot Name

  • Navigate to the Restore tab

  • Click "Delete Restore" in the line of the restore in question

  • Confirm by clicking "Delete Restore"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshots in the Snapshot list

  • Enter the Snapshot by clicking the Snapshot name

  • Navigate to the Restore tab

  • Check the checkbox for each Restore that shall be deleted

  • Click "Delete Restore" in the menu above

  • Confirm by clicking "Delete Restore"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the searched Snapshot in the Snapshot list

  • Click the Snapshot Name

  • Navigate to the Restore tab

  • Identify the ongoing Restore

  • Click "Cancel Restore" in the line of the restore in question

  • Confirm by clicking "Cancel Restore"

  • rejoin the same Nova server group they were a member of when the Snapshot was taken

    Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the Snapshot to be restored

  • Click "One Click Restore" in the same line as the identified Snapshot

  • (Optional) Provide a name / description

  • Click "Create"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the Snapshot to be restored

  • Click the Snapshot Name

  • Navigate to the "Restores" tab

  • Click "One Click Restore"

  • (Optional) Provide a name / description

  • Click "Create"

  • Which DataCenter / Cluster to restore into
  • Which flavor the restored VMs will use

  • Which Nova server group each restored VM joins (6.2.1 and later)

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the Snapshot to be restored

  • Click on the small arrow next to "One Click Restore" in the same line as the identified Snapshot

  • Click on "Selective Restore"

  • Configure the Selective Restore as desired

  • Click "Restore"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the Snapshot to be restored

  • Click the Snapshot Name

  • Navigate to the "Restores" tab

  • Click "Selective Restore"

  • Configure the Selective Restore as desired

  • Click "Restore"

  • --filename <filename> ➡️ Provide file path(relative or absolute) including file name , by default it will read file: /usr/lib/python2.7/site-packages/workloadmgrclient/input-files/restore.json .You can use this for reference or replace values into this file.

    Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the Snapshot to be restored

  • Click on the small arrow next to "One Click Restore" in the same line as the identified Snapshot

  • Click on "Inplace Restore"

  • Configure the Inplace Restore as desired

  • Click "Restore"

  • Click the workload name to enter the Workload overview
  • Navigate to the Snapshots tab

  • Identify the Snapshot to be restored

  • Click the Snapshot Name

  • Navigate to the "Restores" tab

  • Click "Inplace Restore"

  • Configure the Inplace Restore as desired

  • Click "Restore"

  • --filename <filename> ➡️ Provide file path(relative or absolute) including file name , by default it will read file: /usr/lib/python2.7/site-packages/workloadmgrclient/input-files/restore.json .You can use this for reference or replace values into this file.

    restore_type <oneclick/selective/inplace>➡️defines the restore that is intended

  • type openstack➡️defines that the restore is into an openstack cloud.

  • openstackstarts the exact definition of the restore

  • existing
    Nova server group in the project the restore runs in. The restored instance joins this server group at boot, preserving its affinity / anti-affinity placement policy. Leave empty (
    ''
    ) or omit the key for no server group assignment.
    Mac Address of the Neutron port
  • ip_address ➡️ IP Address of the Neutron port

  • network ➡️ network the port is assigned to. Contains the following information:

    • id ➡️ ID of the network the Neutron port is part of

    • subnet➡️subnet the port is assigned to. Contains the following information:

      • id ➡️ ID of the network the Neutron port is part of

  • The Volume Type to use for the restored Volume. Leave empty for Volume Type None
  • availability_zone ➡️ The Cinder Availability Zone to use for the Volume. The default Availability Zone of Cinder is Nova

  • flavor➡️Defines the Flavor to use for the restored instance. Contains the following information:

    • ram➡️How much RAM the restored instance will have (in MB)

    • ephemeral➡️How big the ephemeral disk of the instance will be (in GB)

    • vcpus➡️How many vcpus the restored instance will have available

    • swap➡️How big the Swap of the restored instance will be (in MB). Leave empty for none.

    • disk➡️Size of the root disk the instance will boot with

    • id➡️ID of the flavor that matches the provided information

  • ➡️
    Original ID of the network backed up
  • subnet ➡️ the subnet of the network backed up in the snapshot, contains the following:

    • id ➡️ Original ID of the subnet backed up

  • target_network ➡️ the existing network to map to, contains the following

    • id ➡️ ID of the network to map to

    • subnet ➡️ the subnet of the network backed up in the snapshot, contains the following:

      • id ➡️ ID of the subnet to map to

  • Original ID of the Volume
  • restore_cinder_volume ➡️ set to true if the Volume shall be restored

  • Using CLI

    Restores overview

    Using Horizon

    Details Tab

    The Restore Options are the restore.json provided to Trilio.

    Misc Tab

    Using CLI

    Delete a Restore

    Deleting a Restore will only delete the Trilio information about this Restore. No OpenStack resources are getting deleted.

    Using Horizon

    Possibility 1: Single Restore deletion through the submenu

    Possibility 2: Multiple Restore deletion through a checkbox in Snapshot overview

    Using CLI

    Cancel a Restore

    Using Horizon

    Using CLI

    One Click Restore

    Nova server groups (6.2.1 and later)

    If a VM was a member of a Nova server group at backup time, the One Click Restore automatically boots the restored VM back into that same server group, preserving its affinity / anti-affinity placement policy.

    If that server group no longer exists on the target cloud, the restore does not fail — it completes with the VM unassigned and records the reason under Warning Message in the Restore Details Tab. Re-create the server group before restoring if the placement policy must be preserved.

    The One Click Restore requires, that the original VM's that have been backed up are deleted or otherwise lost. If even one VM is still existing, will the One Click Restore fail.

    The One Click Restore will automatically update the Workload to protect the restored VMs.

    Using Horizon

    Possibility 1: From the Snapshot list

    Possibility 2: From the Snapshot overview

    Using CLI

    Selective Restore

    The Selective Restore is always available and doesn't have any prerequirements.

    The Selective Restore will automatically update the Workload to protect the created instance in the case that the original instance is no longer existing.

    Nova server groups (6.2.1 and later)

    The Selective Restore wizard provides a Server Group of '<instance name>' dropdown per instance, listing the Nova server groups that exist in the project the restore runs in, plus None.

    • The server group captured with the Snapshot is pre-selected when it still exists in the project. Otherwise the dropdown falls back to None.

    • Selecting None restores the instance without any server group assignment.

    • Trilio only assigns the restored instance to an existing server group - it does not create server groups on the target. Create the group in the target project first if it does not exist yet.

    A Nova instance can only join a server group at boot time, so the selection is applied when the restored instance is created and cannot be changed afterwards.

    Using Horizon

    Possibility 1: From the Snapshot list

    Possibility 2: From the Snapshot overview

    Using CLI

    Inplace Restore

    The Inplace Restore only works when the original VM and the original Volume are still available and connected. Trilio is checking this by the saved Object-ID.

    The Inplace Restore will not create any new RHV resources. Please use one of the other restore options if new Volumes or VMs are required.

    Using Horizon

    Possibility 1: From the Snapshot list

    Possibility 2: From the Snapshot overview

    Using CLI

    required restore.json for CLI

    The restore.json requires many information about the backed up resources. All required information can be gathered in the Snapshot overview.

    General required information

    Selective Restore required information

    Information required in instances

    Even when VMs are not to be restored are they required inside the restore.json to allow a clean execution of the restore.

    All further information are only required, when the instance is part of the restore.

    The server_group id must already exist in the target project - Trilio does not create server groups. A non-existent id fails the restore immediately, before any data is transferred, with all invalid ids reported in a single message.

    To use the next free IP available in the set Nics to an empty list [ ]

    Using an empty list for Nics combined with the Network Topology Restore, will the restore automatically restore the original IP address of the instance.

    The root disk needs to be at least as big as the root disk of the backed up instance was.

    Information required in network topology restore or network mapping

    Do not mix network topology restore together with network mapping.

    Full selective restore example

    Inplace Restore required information

    Information required in instances

    When the boot disk is at the same time a Cinder Disk, both values need to be set true.

    Network mapping information required

    Full Inplace restore example

    workloadmgr restore-list [--snapshot_id <snapshot_id>]
    workloadmgr restore-show [--output <output>] <restore_id>
    workloadmgr restore-delete <restores_id>
    workloadmgr restore-cancel <restore_id>
    workloadmgr snapshot-oneclick-restore [--display-name <display-name>]
                                          [--display-description <display-description>]
                                          <snapshot_id>
    workloadmgr snapshot-selective-restore [--display-name <display-name>]
                                           [--display-description <display-description>]
                                           [--filename <filename>]
                                           <snapshot_id>
    workloadmgr snapshot-inplace-restore [--display-name <display-name>]
                                         [--display-description <display-description>]
                                         [--filename <filename>]
                                         <snapshot_id>
    {
        oneclickrestore: False,
        restore_type: selective, 
        type: openstack, 
        openstack: 
            {
                instances: 
                    [
                        {
                            include: True, 
                            id: 890888bc-a001-4b62-a25b-484b34ac6e7e,                        
                            name: cdcentOS-1, 
                            availability_zone:, 
                            nics: [], 
                            vdisks: 
                                [
                                    {
                                        id: 4cc2b474-1f1b-4054-a922-497ef5564624, 
                                        new_volume_type:, 
                                        availability_zone: nova
                                    }
                                ], 
                            flavor: 
                                {
                                    ram: 512, 
                                    ephemeral: 0, 
                                    vcpus: 1,
                                    swap:,
                                    disk: 1, 
                                    id: 1
                                }                         
                        }
                    ], 
                restore_topology: True, 
                networks_mapping: 
                    {
                        networks: []
                    }
            }
    }
    'instances':[
      {
         'name':'cdcentOS-1-selective',
         'availability_zone':'US-East',
         'server_group':'9c2b5d6f-8f42-4f0e-b0a0-1c2e3d4a5b6c',
         'nics':[
           {
              'mac_address':'fa:16:3e:00:bd:60',
              'ip_address':'192.168.0.100',
              'id':'8b871820-f92e-41f6-80b4-00555a649b4c',
              'network':{
                 'subnet':{
                    'id':'2b1506f4-2a7a-4602-a8b9-b7e8a49f95b8'
                 },
                 'id':'d5047e84-077e-4b38-bc43-e3360b0ad174'
              }
           }
         ],
         'vdisks':[
           {
              'id':'4cc2b474-1f1b-4054-a922-497ef5564624',
              'new_volume_type':'ceph',
              'availability_zone':'nova'
           }
         ],
         'flavor':{
            'ram':2048,
            'ephemeral':0,
            'vcpus':1,
            'swap':'',
            'disk':20,
            'id':'2'
         },
         'include':True,
         'id':'890888bc-a001-4b62-a25b-484b34ac6e7e'
      }
    ]
    restore_topology:True
    restore_topology:False
    {
       'oneclickrestore':False,
       'openstack':{
          'instances':[
             {
                'name':'cdcentOS-1-selective',
                'availability_zone':'US-East',
                'server_group':'9c2b5d6f-8f42-4f0e-b0a0-1c2e3d4a5b6c',
                'nics':[
                   {
                      'mac_address':'fa:16:3e:00:bd:60',
                      'ip_address':'192.168.0.100',
                      'id':'8b871820-f92e-41f6-80b4-00555a649b4c',
                      'network':{
                         'subnet':{
                            'id':'2b1506f4-2a7a-4602-a8b9-b7e8a49f95b8'
                         },
                         'id':'d5047e84-077e-4b38-bc43-e3360b0ad174'
                      }
                   }
                ],
                'vdisks':[
                   {
                      'id':'4cc2b474-1f1b-4054-a922-497ef5564624',
                      'new_volume_type':'ceph',
                      'availability_zone':'nova'
                   }
                ],
                'flavor':{
                   'ram':2048,
                   'ephemeral':0,
                   'vcpus':1,
                   'swap':'',
                   'disk':20,
                   'id':'2'
                },
                'include':True,
                'id':'890888bc-a001-4b62-a25b-484b34ac6e7e'
             }
          ],
          'restore_topology':False,
          'networks_mapping':{
             'networks':[
                {
                   'snapshot_network':{
                      'subnet':{
                         'id':'8b609440-4abf-4acf-a36b-9a0fa70c383c'
                      },
                      'id':'8b871820-f92e-41f6-80b4-00555a649b4c'
                   },
                   'target_network':{
                      'subnet':{
                         'id':'2b1506f4-2a7a-4602-a8b9-b7e8a49f95b8'
                      },
                      'id':'d5047e84-077e-4b38-bc43-e3360b0ad174',
                      'name':'internal'
                   }
                }
             ]
          }
       },
       'restore_type':'selective',
       'type':'openstack'
    }
    {
       'oneclickrestore':False,
       'restore_type':'inplace',
       'type':'openstack',   
       'openstack':{
          'instances':[
             {
                'restore_boot_disk':True,
                'include':True,
                'id':'ba8c27ab-06ed-4451-9922-d919171078de',
                'vdisks':[
                   {
                      'restore_cinder_volume':True,
                      'id':'04d66b70-6d7c-4d1b-98e0-11059b89cba6',
                   }
                ]
             }
          ]
       }
    }

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    ID of the Tenant/Project to work in

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    Name
    Type
    Description

    project_id

    string

    restricts the discovery to the given project

    backup_targets

    array

    {
       "jobs":[
          {
             "jobid":104
          }
       ],
       "deprecation":"/workloads/get_list/import_workloads is deprecated; use /workloads/get_list/import_reassign."
    }

    GET https://$(tvm_address):8780/v1/$(tenant_id)/workloads/orphan_workloads/

    DEPRECATED: use POST /workloads/get_list/import_reassign with orphaned=true (see "Import and Reassign workload discovery" below). Response change: instead of the inline orphaned workload list, it now starts an orphaned-workload discovery job and returns its jobid; fetch the results via the job details endpoint.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    migrate_cloud

    boolean

    True also discovers workloads from different clouds

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    {
       "jobs":[
          {
             "jobid":105
          }
       ],
       "deprecation":"/workloads/orphan_workloads is deprecated; use /workloads/get_list/import_reassign with orphaned=True."
    }

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/import_workloads

    DEPRECATED: use POST /workloads/import_reassign_workloads (see "Import and Reassign workloads" below). Imports all or the provided workloads and returns the jobid of the import job. With inplace_upgrade=true it instead upgrades the existing workload and policy database records to the current release (the workload-inplace-db-upgrade CLI command).

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of the Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run authentication against

    X-Auth-Token

    string

    Name
    Type
    Description

    workload_ids

    array

    Workload ids to import. If omitted, all available workloads from the source Backup Target Type are imported.

    source_btt

    array

    {
       "jobs":[
          {
             "jobid":106
          }
       ]
    }

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/reasign_workloads

    DEPRECATED: use POST /workloads/import_reassign_workloads (see "Import and Reassign workloads" below). Accepts the same list-of-tenant-maps body as the unified endpoint and delegates to it. Response change: instead of only the reassigned workloads, the response now contains the immediately reassigned workloads, the failed workloads and the jobid_list of the asynchronous import operations, plus a deprecation notice.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    {
       "workloads":{
          "reassigned_workloads":[],
          "failed_workloads":[],
          "jobid_list":[
             107
          ]
       },
       "deprecation":"/workloads/reasign_workloads is deprecated; use /workloads/import_reassign_workloads."
    }

    The typical flow is:

    1. POST /workloads/get_list/import_reassign ➡️ discover importable/reassignable workloads, returns a jobid

    2. POST /workloads/job_details ➡️ fetch the discovery results for the jobid

    3. POST /workloads/import_reassign_workloads ➡️ run the import/reassign operation, returns jobids

    4. POST /workloads/job_details ➡️ track the operation progress

    5. GET /workloads/jobs/list and POST /workloads/jobs/delete ➡️ manage job records

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/get_list/import_reassign

    Starts a discovery job that lists all workloads on the Backup Target(s) that can be imported into the Trilio database and/or reassigned to a new owner. Returns a jobid; fetch the results with the job details endpoint.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    Name
    Type
    Description

    old_tenant_ids

    array

    List of old tenant ids whose workloads shall be listed. Mutually exclusive with orphaned.

    orphaned

    boolean

    {
       "jobs":[
          {
             "jobid":101
          }
       ]
    }

    At least one of old_tenant_ids, orphaned, source_btt or source_btt_all must be provided. Providing workload_ids is rejected — to act on a known set of workloads, run the import/reassign operation directly.

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/job_details

    Returns the details/results of a job by jobid. The response layout depends on the job's action; for the Import & Reassign workflow these are list_import_reassign (discovery jobs) and import_reassign (operation jobs).

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    Name
    Type
    Description

    jobid*

    integer

    ID of the job to fetch the details of

    {
       "action":"list_import_reassign",
       "id":101,
       "created_at":"2026-08-04T10:15:32.000000",
       "updated_at":"2026-08-04T10:16:10.000000",
       "status":"completed",
       "workload_list":[
          {
             "workload_to_import":[
                "18b809de-d7c8-41e2-867d-4a306407fb11"
             ],
             "workload_to_reassign":[
                "0ed39f25-5df2-4cc5-820f-2af2cde6aa67"
             ],
             "source_btt":[
                "c9a5c9b6-92c3-4e73-a2b3-1e0a29e6b8b1"
             ],
             "tenant_map":{},
             "status":"processed",
             "error_message":null,
             "current_cloud":true
          }
       ]
    }
    {
       "action":"import_reassign",
       "id":102,
       "created_at":"2026-08-04T10:20:01.000000",
       "updated_at":"2026-08-04T10:22:47.000000",
       "status":"completed",
       "workload_update_list":[
          {
             "workload_to_update":[
                "0ed39f25-5df2-4cc5-820f-2af2cde6aa67"
             ],
             "updated_workloads":[
                "0ed39f25-5df2-4cc5-820f-2af2cde6aa67"
             ],
             "source_btt":[
                "c9a5c9b6-92c3-4e73-a2b3-1e0a29e6b8b1"
             ],
             "error_message":null
          }
       ],
       "workload_import_list":[
          {
             "workload_to_import":[
                "18b809de-d7c8-41e2-867d-4a306407fb11"
             ],
             "source_btt":[
                "c9a5c9b6-92c3-4e73-a2b3-1e0a29e6b8b1"
             ],
             "error_message":null,
             "wl_import_job_id":103,
             "wl_import_job_details":{
                "...":"import job progress"
             }
          }
       ]
    }

    Workloads listed under workload_to_import are not yet known to this Trilio installation and will be imported; workloads under workload_to_reassign already exist in the database and will only be reassigned. A current_cloud value of false means the workload belongs to another cloud and migrate_cloud is required to import/reassign it.

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/import_reassign_workloads

    Unified import + reassign operation. Imports workloads from the Backup Target and, when a reassignment target (new_tenant_id/user_id) is provided, reassigns them to that tenant/user. When the target is omitted this performs a pure import and the workloads keep their original owner. The request body is a list of tenant maps, so multiple mappings can be executed in one call.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    Name
    Type
    Description

    workload_ids

    array

    Workload ids to import/reassign. Mutually exclusive with old_tenant_ids.

    old_tenant_ids

    array

    {
       "workloads":{
          "reassigned_workloads":[
             {
                "id":"0ed39f25-5df2-4cc5-820f-2af2cde6aa67",
                "name":"Workload_1",
                "project_id":"c76b3355a164498aa95ddbc960adc238",
                "user_id":"ccddc7e7a015487fa02920f4d4979779"
             }
          ],
          "failed_workloads":[],
          "jobid_list":[
             102
          ]
       }
    }

    The body is a list of tenant maps:

    GET https://$(tvm_address):8780/v1/$(tenant_id)/workloads/jobs/list

    Paginated list of jobs, newest first, across every job action the job details endpoint can render. Admin only.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    limit

    integer

    Maximum number of jobs to return

    marker

    integer

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    {
       "jobs":[
          {
             "id":102,
             "action":"import_reassign",
             "status":"completed",
             "created_at":"2026-08-04T10:20:01.000000",
             "updated_at":"2026-08-04T10:22:47.000000"
          },
          {
             "id":101,
             "action":"list_import_reassign",
             "status":"completed",
             "created_at":"2026-08-04T10:15:32.000000",
             "updated_at":"2026-08-04T10:16:10.000000"
          }
       ],
       "next_marker":101
    }

    POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/jobs/delete

    Deletes one or more job records by job id, including their detail records. Admin only.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio Service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    Name
    Type
    Description

    jobids*

    array

    Non-empty list of job ids to delete

    {
       "deleted":[
          101,
          102
       ],
       "not_found":[
          999
       ]
    }

    A single id can alternatively be passed as {"jobid": 101}.

    All Import & Reassign endpoints require an admin user.

    [DEPRECATED] Importable workload list

    Path Parameters

    {
       "old_tenant_ids":[
          "<old_tenant_id>"
       ],
       "orphaned":false,
       "source_btt":[
          "<backup_target_type_id>"
       ],
       "source_btt_all":false,
       "migrate_cloud":false
    }
    {
       "jobid":101
    }
    [
       {
          "workload_ids":[
             "<workload_id>"
          ],
          "old_tenant_ids":[],
          "new_tenant_id":"<new_tenant_id>",
          "user_id":"<user_id>",
          "migrate_cloud":false,
          "source_btt":[
             "<backup_target_type_id>"
          ],
          "source_btt_all":false,
          "target_btt":null,
          "upgrade":true
       }
    ]
    {
       "jobids":[
          101,
          102
       ]
    }

    Headers

    Request Body

    [DEPRECATED] Orphaned workload list

    Path Parameters

    Query Parameters

    Headers

    [DEPRECATED] Import workloads

    Path Parameters

    Headers

    Request Body

    [DEPRECATED] Reassign workloads

    Path Parameters

    Headers

    Unified Import and Reassign API

    Import and Reassign workload discovery

    Import/Reassign workload discovery

    Path Parameters

    Headers

    Request Body

    Body format

    Get job details

    Job details

    Path Parameters

    Headers

    Request Body

    Body format

    Import and Reassign workloads

    Import & Reassign workloads

    Path Parameters

    Headers

    Request Body

    Body format

    List jobs

    List jobs

    Path Parameters

    Query Parameters

    Headers

    Delete jobs

    Delete jobs

    Path Parameters

    Headers

    Request Body

    Body format

    Authentication token to use

    Accept

    string

    application/json

    restricts the discovery to the given backup targets

    ID of the Tenant/Project to work in

    Authentication token to use

    Accept

    string

    application/json

    ID of the Tenant/Project to work in

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    List of Backup Target Type ids to search in

    source_btt_all

    boolean

    True searches all Backup Target Types

    target_btt

    string

    Backup Target Type id to assign the imported workloads to

    upgrade

    boolean

    True upgrades the imported workload records to the current release schema. Default is True.

    inplace_upgrade

    boolean

    True runs the in-place database upgrade instead of an import. Default is False.

    ID of the Tenant/Project to work in

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    ID of the Tenant/Project to work in

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    True discovers orphaned workloads (whose tenant/user is not valid in the current cloud). Mutually exclusive with old_tenant_ids.

    source_btt

    array

    List of Backup Target Type ids to search in. Mutually exclusive with source_btt_all. If neither is provided the default Backup Target Type is considered.

    source_btt_all

    boolean

    True searches all Backup Target Types. Mutually exclusive with source_btt.

    migrate_cloud

    boolean

    True also includes workloads owned by other clouds. Default is False.

    ID of the Tenant/Project to work in

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    ID of the Tenant/Project to work in

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    Old tenant ids whose workloads shall be imported/reassigned. Mutually exclusive with workload_ids.

    new_tenant_id

    string

    Optional. New tenant id to reassign the workloads to. Must be provided together with user_id. When omitted this is a pure import.

    user_id

    string

    Optional. User id to reassign the workloads to. Required when new_tenant_id is provided; the user must exist in the new tenant and hold the trustee role.

    migrate_cloud

    boolean

    True also imports/reassigns workloads owned by other clouds. Default is False.

    source_btt

    array

    List of Backup Target Type ids to search in. Mutually exclusive with source_btt_all. If neither is provided the default Backup Target Type is considered. When a workload exists in more than one Backup Target Type the latest copy is imported.

    source_btt_all

    boolean

    True searches all Backup Target Types. Not allowed together with workload_ids. Mutually exclusive with source_btt.

    target_btt

    string

    Optional. Backup Target Type id to assign the imported workloads to. If not provided the workload's original Backup Target Type is used.

    upgrade

    boolean

    True upgrades the imported workload records to the current release schema. Default is True.

    ID of the Tenant/Project to work in

    Return jobs older than (with a job id less than) this job id. Use the next_marker of the previous page to fetch the next page.

    action

    string

    Comma-separated list of job actions to narrow to, e.g. import_reassign,list_import_reassign. Supported actions: import_workloads, list_importable_workloads, inplace_upgrade_db_records, tenants-chargeback-csv, list_import_reassign, list_reassign_workloads, import_reassign, workload_reassign.

    sort_dir

    string

    desc (default) walks newest first, asc walks oldest first

    Authentication token to use

    Accept

    string

    application/json

    ID of the Tenant/Project to work in

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    Example runbook for Disaster Recovery using NFS

    This runbook will demonstrate how to set up Disaster Recovery with Trilio for a given scenario.

    The chosen scenario is following an actively used Trilio customer environment.

    Scenario

    There are two OpenStack clouds available "OpenStack Cloud A" and OpenStack Cloud B". "OpenStack Cloud B" is the Disaster Recovery restore point of "OpenStack Cloud A" and vice versa. Both clouds have an independent Trilio installation integrated. These Trilio installations are writing their Backups to NFS targets. "Trilio A" is writing to "NFS A1" and "Trilio B" is writing to "NFS B1". The NFS Volumes used are getting synced against another NFS Volume on the other side. "NFS A1" is syncing with "NFS B2" and "NFS B1" is syncing with "NFS A2". The syncing process is set up independently from Trilio and will always favor the newer dataset.

    Disaster Recovery Scenario

    This scenario will cover the Disaster Recovery of a single Workload and a complete Cloud. All processes are done be the OpenStack administrator.

    Prerequisites for the Disaster Recovery process

    This runbook will assume that the following is true:

    • "OpenStack Cloud A" and "OpenStack Cloud B" both have an active Trilio installation with a valid license

    • "OpenStack Cloud A" and "OpenStack Cloud B" have free resources to host additional VMs

    • "OpenStack Cloud A" and "OpenStack Cloud B" have Tenants/Projects available that are the designated restore points for Tenant/Projects of the other side

    • Access to a user with the admin role permissions on domain level

    • One of the OpenStack clouds is down/lost

    A single Workload can do a Disaster Recovery in this Scenario, while both Clouds are still active. To do so the following high-level process needs to be followed:

    1. Copy the Workload directories to the configured NFS Volume

    2. Make the right Mount-Paths available

    3. Reassign the Workload

    4. Restore the Workload

    As only a single Workload is to be recovered it is more efficient to copy the data of that single Workload over to the "NFS B1" Volume, which is used by "Trilio B".

    It is recommended to use the Trilio VM as a connector between both NFS Volumes, as the nova user is available on the Trilio VM.

    Trilio Workloads are identified by their ID und which they are stored on the Backup Target. See below example:

    In the case that the Workload ID is not known can available Metadata inside the Workload directories be used to identify the correct Workload.

    The identified workload needs to be copied with all subdirectories and files. Afterward, it is necessary to adjust the ownership to nova:nova with the right permissions.

    Trilio backups are using qcow2 backing files, which make every incremental backup a full synthetic backup. These backing files can be made visible using the qemu-img tool.

    The MTAuMTAuMi4yMDovdXBzdHJlYW0= part of the backing file path is the base64 hash value, which will be calculated upon the configuration of a Trilio installation for each provided NFS-Share.

    This hash value is calculated based on the provided NFS-Share path: <NFS_IP>/<path> If even one character in the NFS-Share path is different between the provided NFS-Share paths a completely different hash value is generated.

    Workloads, that have been moved between NFS-Shares, require that their incremental backups can follow the same path as on their original Source Cloud. To achieve this it is necessary to create the mount path on all compute nodes of the Target Cloud.

    Afterwards a mount bind is used to make the workloads data accessible over the old and the new mount path. The following example shows the process of how to successfully identify the necessary mount points and create the mount bind.

    The used hash values can be calculated using the base64 tool in any Linux distribution.

    Based on the identified base64 hash values the following paths are required on each Compute node.

    /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl

    and

    /var/triliovault-mounts/MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0

    In the scenario of this runbook is the workload coming from the NFS_A1 NFS-Share, which means the mount path of that NFS-Share needs to be created and bound to the Target Cloud.

    To keep the desired mount past a reboot it is recommended to edit the fstab of all compute nodes accordingly.

    Trilio workloads have clear ownership. When a workload is moved to a different cloud it is necessary to change the ownership. The ownership can only be changed by OpenStack administrators.

    To fulfill the required tasks an admin role user is used. This user will be used until the workload has been restored. Therefore, it is necessary to provide this user access to the desired Target Project on the Target Cloud.

    Each Trilio installation maintains a database of workloads that are known to the Trilio installation. Workloads that are not maintained by a specific Trilio installation, are from the perspective of that installation, orphaned workloads. An orphaned workload is a workload accessible on the NFS-Share, that is not assigned to any existing project in the Cloud the Trilio installation is protecting.

    The identified orphaned workloads need to be assigned to their new projects. The following provides the list of all available projects viewable by the used admin-user in the target_domain.

    To allow project owners to work with the workloads as well will they get assigned to a user with the backup trustee role that is existing in the target project.

    Now that all informations have been gathered the workload can be reassigned to the target project.

    After the workload has been assigned to the new project it is recommended to verify the workload is managed by the Target Trilio and is assigned to the right project and user.

    The reassigned workload can be restored using Horizon following the procedure described .

    This runbook will continue on the CLI only path.

    To be able to do the necessary selective restore a few pieces of information about the snapshot to be restored are required. The following process will provide all necessary information.

    List all Snapshots of the workload to restore to identify the snapshot to restore

    Get Snapshot Details with network details for the desired snapshot

    Get Snapshot Details with disk details for the desired Snapshot

    The selective restore is using a restore.json file for the CLI command. This restore.json file needs to be adjusted according to the desired restore.

    To do the actual restore use the following command:

    To verify the success of the restore from a Trilio perspective the restore status is checked.

    After the Desaster Recovery Process has been successfully completed it is recommended to bring the TVM installation back into its original state to be ready for the next DR process.

    Delete the workload that got restored.

    The Trilio database is following the OpenStack standard of not deleting any database entries upon deletion of the cloud object. Any Workload, Snapshot or Restore, which gets deleted, is marked as deleted only.

    To allow the Trilio installation to be ready for another disaster recovery it is necessary to completely delete the entries of the Workloads, which have been restored.

    Trilio does provide and maintain a script to safely delete workload entries and all connected entities from the Trilio database.

    This script can be found here:

    After all restores for the target project have been achieved it is recommended to remove the used admin user from the project again.

    This Scenario will cover the Disaster Recovery of a full cloud. It is assumed that the source cloud is down or lost completly. To do the disaster recovery the following high-level process needs to be followed:

    1. Reconfigure the Target Trilio installation

    2. Make the right Mount-Paths available

    3. Reassign the Workload

    4. Restore the Workload

    Before the Desaster Recovery Process can start is it necessary to make the backups to be restored available for the Trilio installation. The following steps need to be done to completely reconfigure the Trilio installation.

    To add the NFS-Vol2 to the Trilio Appliance cluster the Trilio can either be to use both NFS Volumes or it is possible to edit the configuration file and then restart all services. This procedure describes how to edit the conf file and restart the services. This needs to be repeated on every Trilio Appliance.

    Edit the workloadmgr.conf

    Look for the line defining the NFS mounts

    Add NFS B2 to that as comma-seperated list. Space is not necessary, but can be set.

    Write and close the workloadmgr.conf

    Restart the wlm-workloads service

    To add the NFS B2 to the Trilio Datamovers manually the tvault-contego.conf file needs to be edited and the service restarted.

    Edit the tvault-contego.conf

    Look for the line defining the NFS mounts

    Add NFS B2 to that as comma-seperated list. Space is not necessary, but can be set.

    Write and close the tvault-contego.conf

    Restart the tvault-contego service

    Trilio backups are using qcow2 backing files, which make every incremental backup a full synthetic backup. These backing files can be made visible using the qemu-img tool.

    The MTAuMTAuMi4yMDovdXBzdHJlYW0= part of the backing file path is the base64 hash value, which will be calculated upon the configuration of a Trilio installation for each provided NFS-Share.

    This hash value is calculated based on the provided NFS-Share path: <NFS_IP>/<path> If even one character in the NFS-Share path is different between the provided NFS-Share paths a completely different hash value is generated.

    Workloads, that have been moved between NFS-Shares, require that their incremental backups can follow the same path as on their original Source Cloud. To achieve this it is necessary to create the mount path on all compute nodes of the Target Cloud.

    Afterwards a mount bind is used to make the workloads data accessible over the old and the new mount path. The following example shows the process of how to successfully identify the necessary mount points and create the mount bind.

    The used hash values can be calculated using the base64 tool in any Linux distribution.

    Based on the identified base64 hash values the following paths are required on each Compute node.

    /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl

    and

    /var/triliovault-mounts/MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0

    In the scenario of this runbook is the workload coming from the NFS_A1 NFS-Share, which means the mount path of that NFS-Share needs to be created and bound to the Target Cloud.

    To keep the desired mount past a reboot it is recommended to edit the fstab of all compute nodes accordingly.

    Trilio workloads have clear ownership. When a workload is moved to a different cloud it is necessary to change the ownership. The ownership can only be changed by OpenStack administrators.

    To fulfill the required tasks an admin role user is used. This user will be used until the workload has been restored. Therefore, it is necessary to provide this user access to the desired Target Project on the Target Cloud.

    Each Trilio installation maintains a database of workloads that are known to the Trilio installation. Workloads that are not maintained by a specific Trilio installation, are from the perspective of that installation, orphaned workloads. An orphaned workload is a workload accessible on the NFS-Share, that is not assigned to any existing project in the Cloud the Trilio installation is protecting.

    The identified orphaned workloads need to be assigned to their new projects. The following provides the list of all available projects viewable by the used admin-user in the target_domain.

    To allow project owners to work with the workloads as well will they get assigned to a user with the backup trustee role that is existing in the target project.

    Now that all informations have been gathered the workload can be reassigned to the target project.

    After the workload has been assigned to the new project it is recommended to verify the workload is managed by the Target Trilio and is assigned to the right project and user.

    The reassigned workload can be restored using Horizon following the procedure described .

    This runbook will continue on the CLI only path.

    To be able to do the necessary selective restore a few pieces of information about the snapshot to be restored are required. The following process will provide all necessary information.

    List all Snapshots of the workload to restore to identify the snapshot to restore

    Get Snapshot Details with network details for the desired snapshot

    Get Snapshot Details with disk details for the desired Snapshot

    The selective restore is using a restore.json file for the CLI command. This restore.json file needs to be adjusted according to the desired restore.

    To do the actual restore use the following command:

    To verify the success of the restore from a Trilio perspective the restore status is checked.

    After the Desaster Recovery Process has finished it is necessary to return the Trilio installation to its original configuration. The following steps need to be done to completely reconfigure the Trilio installation.

    To add the NFS-Vol2 to the Trilio Appliance cluster the Trilio can either be to use both NFS Volumes or it is possible to edit the configuration file and then restart all services. This procedure describes how to edit the conf file and restart the services. This needs to be repeated on every Trilio Appliance.

    Edit the workloadmgr.conf

    Look for the line defining the NFS mounts

    Delete NFS B2 from the comma-seperated list

    Write and close the workloadmgr.conf

    Restart the wlm-workloads service

    To add the NFS B2 to the Trilio Datamovers manually the tvault-contego.conf file needs to be edited and the service restarted.

    Edit the tvault-contego.conf

    Look for the line defining the NFS mounts

    Add NFS B2 to that as comma-seperated list. Space is not necessary, but can be set.

    Write and close the tvault-contego.conf

    Restart the tvault-contego service

    After the Desaster Recovery Process has been successfully completed and the Trilio installation reconfigured to its original state, it is recommended to do the following additional steps to be ready for the next Disaster Recovery process.

    The Trilio database is following the OpenStack standard of not deleting any database entries upon deletion of the cloud object. Any Workload, Snapshot or Restore, which gets deleted, is marked as deleted only.

    To allow the Trilio installation to be ready for another disaster recovery it is necessary to completely delete the entries of the Workloads, which have been restored.

    Trilio does provide and maintain a script to safely delete workload entries and all connected entities from the Trilio database.

    This script can be found here:

    After all restores for the target project have been achieved it is recommended to remove the used admin user from the project again.

    Restores

    GET https://$(tvm_address):8780/v1/$(tenant_id)/restores/detail

    Lists Restores with details

    Name
    Type
    Description
    Clean up
    Reconfigure the Target Trilio installation back to the original one
  • Clean up

  • For ease of writing will this runbook assume from here on, that "OpenStack Cloud A" is down and the Workloads are getting restored into "OpenStack Cloud B".

    In the case of the usage of shared Tenant networks, beyond the floating IP, the following additional requirement is needed: All Tenant Networks, Routers, Ports, Floating IPs, and DNS Zones are created

    Disaster Recovery of a single Workload

    Copy the Workload directories to the configured NFS Volume

    This process only shows how to get a Workload from "OpenStack Cloud A" to "OpenStack Cloud B". The vice versa process is similar.

    Mount "NFS B2" Volume to a Trilio VM

    Identify the Workload on the "NFS B2" Volume

    Copy the Workload

    Make the Mount-Paths available

    Identify the base64 hash values

    Create and bind the paths

    Reassign the workload

    Add admin-user to required domains and projects

    Discover orphaned Workloads from NFS-Storage of Target Cloud

    List available projects on Target Cloud in the Target Domain

    List available users on the Target Cloud in the Target Project that have the right backup trustee role

    Reassign the workload to the target project

    Verify the workload is available at the desired target_project

    Restore the workload

    Prepare the selective restore by getting the snapshot information

    Prepare the selective restore by creating the restore.json file

    Nova server groups (6.2.1 and later)

    server_group is optional. When set, it must be the ID of a Nova server group that already exists on the DR cloud, in the project the restore runs in - Trilio restores membership of an existing group but never creates the group itself. A non-existent ID fails the restore immediately, before any data is transferred.

    Because server group IDs are not preserved across clouds, create the server groups on the DR cloud first (with the same policy as the source), then use the new IDs here. Leave the field empty to restore without any server group assignment.

    For the same reason, a One Click Restore onto a different cloud cannot preserve server group membership — it reuses the group ID captured at backup time, which will not exist on the DR cloud, so the restore completes with the instance unassigned and a warning recorded. A selective restore with the DR cloud's own group IDs, as shown above, is the way to preserve affinity / anti-affinity placement in a DR scenario.

    Run the selective restore

    Verify the restore

    Clean up

    Delete the workload

    Remove the database entry

    Remove the admin user from the project

    Disaster Recovery of a complete cloud

    Reconfigure the Target Trilio installation

    During the reconfiguration process will all backups of the Target Region be on hold and it is not recommended to create new Backup Jobs until the Desaster Recovery Process has finished and the original Trilio configuration has been restored.

    Add NFS B2 to the Trilio Appliance Cluster

    Add NFS B2 to the Trilio Datamovers

    Trilio is integrating natively into the OpenStack deployment tools. When using the Red Hat director or JuJu charms it is recommended to adapt the environment files for these orchestrators and update the Datamovers through them.

    Make the Mount-Paths available

    Identify the base64 hash values

    Create and bind the paths

    Reassign the workload

    Add admin-user to required domains and projects

    Discover orphaned Workloads from NFS-Storage of Target Cloud

    List available projects on Target Cloud in the Target Domain

    List available users on the Target Cloud in the Target Project that have the right backup trustee role

    Reassign the workload to the target project

    Verify the workload is available at the desired target_project

    Restore the workload

    Prepare the selective restore by getting the snapshot information

    Prepare the selective restore by creating the restore.json file

    Nova server groups (6.2.1 and later)

    server_group is optional. When set, it must be the ID of a Nova server group that already exists on the DR cloud, in the project the restore runs in - Trilio restores membership of an existing group but never creates the group itself. A non-existent ID fails the restore immediately, before any data is transferred.

    Because server group IDs are not preserved across clouds, create the server groups on the DR cloud first (with the same policy as the source), then use the new IDs here. Leave the field empty to restore without any server group assignment.

    For the same reason, a One Click Restore onto a different cloud cannot preserve server group membership - it reuses the group ID captured at backup time, which will not exist on the DR cloud, so the restore completes with the instance unassigned and a warning recorded. A selective restore with the DR cloud's own group IDs, as shown above, is the way to preserve affinity / anti-affinity placement in a DR scenario.

    Run the selective restore

    Verify the restore

    Reconfigure the Target Trilio installation back to the original one

    During the reconfiguration process will all backups of the Target Region be on hold and it is not recommended to create new Backup Jobs until the Desaster Recovery Process has finished and the original Trilio configuration has been restored.

    Delete NFS B2 to the Trilio Appliance Cluster

    Delete NFS B2 to the Trilio Datamovers

    Trilio is integrating natively into the OpenStack deployment tools. When using the Red Hat director or JuJu charms it is recommended to adapt the environment files for these orchestrators and update the Datamovers through them.

    Clean up

    Remove the database entry

    Remove the admin user from the project

    here
    https://github.com/trilioData/solutions/tree/master/openstack/CleanWlmDatabase
    fully reconfigured
    here
    fully reconfigured
    https://github.com/trilioData/solutions/tree/master/openstack/CleanWlmDatabase
    # mount <NFS B2-IP/NFS B2-FQDN>:/<VOL-Path> /mnt
    workload_ac9cae9b-5e1b-4899-930c-6aa0600a2105
    /…/workload_<id>/workload_db <<< Contains User ID and Project ID of Workload owner
    /…/workload_<id>/workload_vms_db <<< Contains VM IDs and VM Names of all VMs actively protected be the Workload
    # cp /mnt/workload_ac9cae9b-5e1b-4899-930c-6aa0600a2105 /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW0=/workload_ac9cae9b-5e1b-4899-930c-6aa0600a2105
    # chown -R nova:nova /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW0=/workload_ac9cae9b-5e1b-4899-930c-6aa0600a2105
    # chmod -R 644 /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW0=/workload_ac9cae9b-5e1b-4899-930c-6aa0600a2105
    #qemu-img info bd57ec9b-c4ac-4a37-a4fd-5c9aa002c778
    image: bd57ec9b-c4ac-4a37-a4fd-5c9aa002c778
    file format: qcow2
    virtual size: 1.0G (1073741824 bytes)
    disk size: 516K
    cluster_size: 65536
    
    backing file: /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW0=/workload_ac9cae9b-5e1b-4899-930c-6aa0600a2105/snapshot_1415095d-c047-400b-8b05-c88e57011263/vm_id_38b620f1-24ae-41d7-b0ab-85ffc2d7958b/vm_res_id_d4ab3431-5ce3-4a8f-a90b-07606e2ffa33_vda/7c39eb6a-6e42-418e-8690-b6368ecaa7bb
    Format specific information:
        compat: 1.1
        lazy refcounts: false
        refcount bits: 16
        corrupt: false
    
    # echo -n 10.10.2.20:/NFS_A1 | base64
    MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl
    
    # echo -n 10.20.3.22:/NFS_B2 | base64
    MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0
    #mkdir /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl
    #mount --bind 
    /var/triliovault-mounts/MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0/ /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl
    #vi /etc/fstab
    /var/triliovault-mounts/MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0/ 		/ var/triliovault-mounts/ MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl	none		bind 		0 0
    # source {customer admin rc file}  
    # openstack role add Admin --user <my_admin_user> --user-domain <admin_domain> --domain <target_domain>  
    # openstack role add Admin --user <my_admin_user> --user-domain <admin_domain> --project <target_project> --project-domain <target_domain>  
    # openstack role add <Backup Trustee Role> --user <my_admin_user> --user-domain <admin_domain> --project <destination_project> --project-domain <target_domain>
    # workloadmgr workload-get-orphaned-workloads-list --migrate_cloud True    
    +------------+--------------------------------------+----------------------------------+----------------------------------+  
    |     Name   |                  ID                  |            Project ID            |  User ID                         |  
    +------------+--------------------------------------+----------------------------------+----------------------------------+  
    | Workload_1 | 6639525d-736a-40c5-8133-5caaddaaa8e9 | 4224d3acfd394cc08228cc8072861a35 |  329880dedb4cd357579a3279835f392 |  
    | Workload_2 | 904e72f7-27bb-4235-9b31-13a636eb9c95 | 637a9ce3fd0d404cabf1a776696c9c04 |  329880dedb4cd357579a3279835f392 |  
    +------------+--------------------------------------+----------------------------------+----------------------------------+
    # openstack project list --domain <target_domain>  
    +----------------------------------+----------+  
    | ID                               | Name     |  
    +----------------------------------+----------+  
    | 01fca51462a44bfa821130dce9baac1a | project1 |  
    | 33b4db1099ff4a65a4c1f69a14f932ee | project2 |  
    | 9139e694eb984a4a979b5ae8feb955af | project3 |  
    +----------------------------------+----------+ 
    # openstack role assignment list --project <target_project> --project-domain <target_domain> --role <backup_trustee_role>
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
    | Role                             | User                             | Group | Project                          | Domain | Inherited |
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
    | 9fe2ff9ee4384b1894a90878d3e92bab | 72e65c264a694272928f5d84b73fe9ce |       | 8e16700ae3614da4ba80a4e57d60cdb9 |        | False     |
    | 9fe2ff9ee4384b1894a90878d3e92bab | d5fbd79f4e834f51bfec08be6d3b2ff2 |       | 8e16700ae3614da4ba80a4e57d60cdb9 |        | False     |
    | 9fe2ff9ee4384b1894a90878d3e92bab | f5b1d071816742fba6287d2c8ffcd6c4 |       | 8e16700ae3614da4ba80a4e57d60cdb9 |        | False     |
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
    # workloadmgr workload-reassign-workloads --new_tenant_id {target_project_id} --user_id {target_user_id} --workload_ids {workload_id} --migrate_cloud True    
    +-----------+--------------------------------------+----------------------------------+----------------------------------+  
    |    Name   |                  ID                  |            Project ID            |  User ID                         |  
    +-----------+--------------------------------------+----------------------------------+----------------------------------+  
    | project1  | 904e72f7-27bb-4235-9b31-13a636eb9c95 | 4f2a91274ce9491481db795dcb10b04f | 3e05cac47338425d827193ba374749cc |  
    +-----------+--------------------------------------+----------------------------------+----------------------------------+ 
    # workloadmgr workload-show ac9cae9b-5e1b-4899-930c-6aa0600a2105
    +-------------------+------------------------------------------------------------------------------------------------------+
    | Property          | Value                                                                                                |
    +-------------------+------------------------------------------------------------------------------------------------------+
    | availability_zone | nova                                                                                                 |
    | created_at        | 2019-04-18T02:19:39.000000                                                                           |
    | description       | Test Linux VMs                                                                                       |
    | error_msg         | None                                                                                                 |
    | id                | ac9cae9b-5e1b-4899-930c-6aa0600a2105                                                                 |
    | instances         | [{"id": "38b620f1-24ae-41d7-b0ab-85ffc2d7958b", "name": "Test-Linux-1"}, {"id":                      |
    |                   | "3fd869b2-16bd-4423-b389-18d19d37c8e0", "name": "Test-Linux-2"}]                                     |
    | interval          | None                                                                                                 |
    | jobschedule       | True                                                                                                 |
    | name              | Test Linux                                                                                           |
    | project_id        | 2fc4e2180c2745629753305591aeb93b                                                                     |
    | scheduler_trust   | None                                                                                                 |
    | status            | available                                                                                            |
    | storage_usage     | {"usage": 60555264, "full": {"usage": 44695552, "snap_count": 1}, "incremental": {"usage": 15859712, |
    |                   | "snap_count": 13}}                                                                                   |
    | updated_at        | 2019-11-15T02:32:43.000000                                                                           |
    | user_id           | 72e65c264a694272928f5d84b73fe9ce                                                                     |
    | workload_type_id  | f82ce76f-17fe-438b-aa37-7a023058e50d                                                                 |
    +-------------------+------------------------------------------------------------------------------------------------------+
    # workloadmgr snapshot-list --workload_id ac9cae9b-5e1b-4899-930c-6aa0600a2105 --all True
    
    +----------------------------+--------------+--------------------------------------+--------------------------------------+---------------+-----------+-----------+
    |         Created At         |     Name     |                  ID                  |             Workload ID              | Snapshot Type |   Status  |    Host   |
    +----------------------------+--------------+--------------------------------------+--------------------------------------+---------------+-----------+-----------+
    | 2019-11-02T02:30:02.000000 | jobscheduler | f5b8c3fd-c289-487d-9d50-fe27a6561d78 | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |      full     | available | Upstream2 |
    | 2019-11-03T02:30:02.000000 | jobscheduler | 7e39e544-537d-4417-853d-11463e7396f9 | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |  incremental  | available | Upstream2 |
    | 2019-11-04T02:30:02.000000 | jobscheduler | 0c086f3f-fa5d-425f-b07e-a1adcdcafea9 | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |  incremental  | available | Upstream2 |
    +----------------------------+--------------+--------------------------------------+--------------------------------------+---------------+-----------+-----------+
    # workloadmgr snapshot-show --output networks 7e39e544-537d-4417-853d-11463e7396f9
    
    +-------------------+--------------------------------------+
    | Snapshot property | Value                                |
    +-------------------+--------------------------------------+
    | description       | None                                 |
    | host              | Upstream2                            |
    | id                | 7e39e544-537d-4417-853d-11463e7396f9 |
    | name              | jobscheduler                         |
    | progress_percent  | 100                                  |
    | restore_size      | 44040192 Bytes or Approx (42.0MB)    |
    | restores_info     |                                      |
    | size              | 1310720 Bytes or Approx (1.2MB)      |
    | snapshot_type     | incremental                          |
    | status            | available                            |
    | time_taken        | 154 Seconds                          |
    | uploaded_size     | 1310720                              |
    | workload_id       | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |
    +-------------------+--------------------------------------+
    
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |   Instances    |                                                        Value                                                        |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-1                                                    |
    |       ID       |                                         38b620f1-24ae-41d7-b0ab-85ffc2d7958b                                        |
    |                |                                                                                                                     |
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-2                                                    |
    |       ID       |                                         3fd869b2-16bd-4423-b389-18d19d37c8e0                                        |
    |                |                                                                                                                     |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    
    +-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
    |   Networks  | Value                                                                                                                                        |
    +-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
    |  ip_address | 172.20.20.20                                                                                                                                 |
    |    vm_id    | 38b620f1-24ae-41d7-b0ab-85ffc2d7958b                                                                                                         |
    |   network   | {u'subnet': {u'ip_version': 4, u'cidr': u'172.20.20.0/24', u'gateway_ip': u'172.20.20.1', u'id': u'3a756a89-d979-4cda-a7f3-dacad8594e44', 
    u'name': u'Trilio Test'}, u'cidr': None, u'id': u'5f0e5d34-569d-42c9-97c2-df944f3924b1', u'name': u'Trilio_Test_Internal', u'network_type': u'neutron'}      |
    | mac_address | fa:16:3e:74:58:bb                                                                                                                            |
    |             |                                                                                                                                              |
    |  ip_address | 172.20.20.13                                                                                                                                 |
    |    vm_id    | 3fd869b2-16bd-4423-b389-18d19d37c8e0                                                                                                         |
    |   network   | {u'subnet': {u'ip_version': 4, u'cidr': u'172.20.20.0/24', u'gateway_ip': u'172.20.20.1', u'id': u'3a756a89-d979-4cda-a7f3-dacad8594e44',
    u'name': u'Trilio Test'}, u'cidr': None, u'id': u'5f0e5d34-569d-42c9-97c2-df944f3924b1', u'name': u'Trilio_Test_Internal', u'network_type': u'neutron'}      |
    | mac_address | fa:16:3e:6b:46:ae                                                                                                                            |
    +-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
    [root@upstreamcontroller ~(keystone_admin)]# workloadmgr snapshot-show --output disks 7e39e544-537d-4417-853d-11463e7396f9
    
    +-------------------+--------------------------------------+
    | Snapshot property | Value                                |
    +-------------------+--------------------------------------+
    | description       | None                                 |
    | host              | Upstream2                            |
    | id                | 7e39e544-537d-4417-853d-11463e7396f9 |
    | name              | jobscheduler                         |
    | progress_percent  | 100                                  |
    | restore_size      | 44040192 Bytes or Approx (42.0MB)    |
    | restores_info     |                                      |
    | size              | 1310720 Bytes or Approx (1.2MB)      |
    | snapshot_type     | incremental                          |
    | status            | available                            |
    | time_taken        | 154 Seconds                          |
    | uploaded_size     | 1310720                              |
    | workload_id       | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |
    +-------------------+--------------------------------------+
    
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |   Instances    |                                                        Value                                                        |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-1                                                    |
    |       ID       |                                         38b620f1-24ae-41d7-b0ab-85ffc2d7958b                                        |
    |                |                                                                                                                     |
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-2                                                    |
    |       ID       |                                         3fd869b2-16bd-4423-b389-18d19d37c8e0                                        |
    |                |                                                                                                                     |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    
    +-------------------+--------------------------------------------------+
    |       Vdisks      |                      Value                       |
    +-------------------+--------------------------------------------------+
    | volume_mountpoint |                     /dev/vda                     |
    |    restore_size   |                     22020096                     |
    |    resource_id    |       ebc2fdd0-3c4d-4548-b92d-0e16734b5d9a       |
    |    volume_name    |       0027b140-a427-46cb-9ccf-7895c7624493       |
    |    volume_type    |                       None                       |
    |       label       |                       None                       |
    |    volume_size    |                        1                         |
    |     volume_id     |       0027b140-a427-46cb-9ccf-7895c7624493       |
    | availability_zone |                       nova                       |
    |       vm_id       |       38b620f1-24ae-41d7-b0ab-85ffc2d7958b       |
    |      metadata     | {u'readonly': u'False', u'attached_mode': u'rw'} |
    |                   |                                                  |
    | volume_mountpoint |                     /dev/vda                     |
    |    restore_size   |                     22020096                     |
    |    resource_id    |       8007ed89-6a86-447e-badb-e49f1e92f57a       |
    |    volume_name    |       2a7f9e78-7778-4452-af5b-8e2fa43853bd       |
    |    volume_type    |                       None                       |
    |       label       |                       None                       |
    |    volume_size    |                        1                         |
    |     volume_id     |       2a7f9e78-7778-4452-af5b-8e2fa43853bd       |
    | availability_zone |                       nova                       |
    |       vm_id       |       3fd869b2-16bd-4423-b389-18d19d37c8e0       |
    |      metadata     | {u'readonly': u'False', u'attached_mode': u'rw'} |
    |                   |                                                  |
    +-------------------+--------------------------------------------------+
    {
       u'description':u'<description of the restore>',
       u'oneclickrestore':False,
       u'restore_type':u'selective',
       u'type':u'openstack',
       u'name':u'<name of the restore>'
       u'openstack':{
          u'instances':[
             {
                u'name':u'<name instance 1>',
                u'availability_zone':u'<AZ instance 1>',
                u'server_group':u'<id of an existing server group on the DR cloud, or empty>',
                u'nics':[ #####Leave empty for network topology restore
                ],
                u'vdisks':[
                   {
                      u'id':u'<old disk id>',
                      u'new_volume_type':u'<new volume type name>',
                      u'availability_zone':u'<new cinder volume AZ>'
                   }
                ],
                u'flavor':{
                   u'ram':<RAM in MB>,
                   u'ephemeral':<GB of ephemeral disk>,
                   u'vcpus':<# vCPUs>,
                   u'swap':u'<GB of Swap disk>',
                   u'disk':<GB of boot disk>,
                   u'id':u'<id of the flavor to use>'
                },
                u'include':<True/False>,
                u'id':u'<old id of the instance>'
             } #####Repeat for each instance in the snapshot
          ],
          u'restore_topology':<True/False>,
          u'networks_mapping':{
             u'networks':[ #####Leave empty for network topology restore
                
             ]
          }
       }
    }
    
    # workloadmgr snapshot-selective-restore --filename restore.json {snapshot id}
    [root@upstreamcontroller ~(keystone_admin)]# workloadmgr restore-list --snapshot_id 5928554d-a882-4881-9a5c-90e834c071af
    
    +----------------------------+------------------+--------------------------------------+--------------------------------------+----------+-----------+
    |         Created At         |       Name       |                  ID                  |             Snapshot ID              |   Size   |   Status  |
    +----------------------------+------------------+--------------------------------------+--------------------------------------+----------+-----------+
    | 2019-09-24T12:44:38.000000 | OneClick Restore | 5b4216d0-4bed-460f-8501-1589e7b45e01 | 5928554d-a882-4881-9a5c-90e834c071af | 41126400 | available |
    +----------------------------+------------------+--------------------------------------+--------------------------------------+----------+-----------+
    
    [root@upstreamcontroller ~(keystone_admin)]# workloadmgr restore-show 5b4216d0-4bed-460f-8501-1589e7b45e01
    +------------------+------------------------------------------------------------------------------------------------------+
    | Property         | Value                                                                                                |
    +------------------+------------------------------------------------------------------------------------------------------+
    | created_at       | 2019-09-24T12:44:38.000000                                                                           |
    | description      | -                                                                                                    |
    | error_msg        | None                                                                                                 |
    | finished_at      | 2019-09-24T12:46:07.000000                                                                           |
    | host             | Upstream2                                                                                            |
    | id               | 5b4216d0-4bed-460f-8501-1589e7b45e01                                                                 |
    | instances        | [{"status": "available", "id": "b8506f04-1b99-4ca8-839b-6f5d2c20d9aa", "name": "temp", "metadata":   |
    |                  | {"instance_id": "c014a938-903d-43db-bfbb-ea4998ff1a0f", "production": "1", "config_drive": ""}}]     |
    | name             | OneClick Restore                                                                                     |
    | progress_msg     | Restore from snapshot is complete                                                                    |
    | progress_percent | 100                                                                                                  |
    | project_id       | 8e16700ae3614da4ba80a4e57d60cdb9                                                                     |
    | restore_options  | {"description": "-", "oneclickrestore": true, "restore_type": "oneclick", "openstack": {"instances": |
    |                  | [{"availability_zone": "US-West", "id": "c014a938-903d-43db-bfbb-ea4998ff1a0f", "name": "temp"}]},   |
    |                  | "type": "openstack", "name": "OneClick Restore"}                                                     |
    | restore_type     | restore                                                                                              |
    | size             | 41126400                                                                                             |
    | snapshot_id      | 5928554d-a882-4881-9a5c-90e834c071af                                                                 |
    | status           | available                                                                                            |
    | time_taken       | 89                                                                                                   |
    | updated_at       | 2019-09-24T12:44:38.000000                                                                           |
    | uploaded_size    | 41126400                                                                                             |
    | user_id          | d5fbd79f4e834f51bfec08be6d3b2ff2                                                                     |
    | warning_msg      | None                                                                                                 |
    | workload_id      | 02b1aca2-c51a-454b-8c0f-99966314165e                                                                 |
    +------------------+------------------------------------------------------------------------------------------------------+
    # workloadmgr workload-delete <workload_id>
    # source {customer admin rc file}  
    # openstack role remove Admin --user <my_admin_user> --user-domain <admin_domain> --domain <target_domain>  
    # openstack role remove Admin --user <my_admin_user> --user-domain <admin_domain> --project <target_project> --project-domain <target_domain>  
    # openstack role remove <Backup Trustee Role> --user <my_admin_user> --user-domain <admin_domain> --project <destination_project> --project-domain <target_domain>
    
    # vi /etc/workloadmgr/workloadmgr.conf
    vault_storage_nfs_export = <NFS_B1/NFS_B1-FQDN>:/<VOL-B1-Path>
    vault_storage_nfs_export = <NFS-IP/NFS-FQDN>:/<VOL-1-Path>,<NFS-IP/NFS-FQDN>:/<VOL—2-Path>
    # systemctl restart wlm-workloads
    # vi /etc/tvault-contego/tvault-contego.conf
    vault_storage_nfs_export = <NFS_B1-IP/NFS_B1-FQDN>:/<VOL-B1-Path>
    vault_storage_nfs_export = <NFS_B1-IP/NFS-FQDN>:/<VOL-B1-Path>,<NFS_B2-IP/NFS-FQDN>:/<VOL—B2-Path>
    # systemctl restart tvault-contego
    #qemu-img info bd57ec9b-c4ac-4a37-a4fd-5c9aa002c778
    image: bd57ec9b-c4ac-4a37-a4fd-5c9aa002c778
    file format: qcow2
    virtual size: 1.0G (1073741824 bytes)
    disk size: 516K
    cluster_size: 65536
    
    backing file: /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW0=/workload_ac9cae9b-5e1b-4899-930c-6aa0600a2105/snapshot_1415095d-c047-400b-8b05-c88e57011263/vm_id_38b620f1-24ae-41d7-b0ab-85ffc2d7958b/vm_res_id_d4ab3431-5ce3-4a8f-a90b-07606e2ffa33_vda/7c39eb6a-6e42-418e-8690-b6368ecaa7bb
    Format specific information:
        compat: 1.1
        lazy refcounts: false
        refcount bits: 16
        corrupt: false
    
    # echo -n 10.10.2.20:/NFS_A1 | base64
    MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl
    
    # echo -n 10.20.3.22:/NFS_B2 | base64
    MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0
    #mkdir /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl
    #mount --bind 
    /var/triliovault-mounts/MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0/ /var/triliovault-mounts/MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl
    #vi /etc/fstab
    /var/triliovault-mounts/MTAuMjAuMy4yMjovdXBzdHJlYW1fdGFyZ2V0/ 		/ var/triliovault-mounts/ MTAuMTAuMi4yMDovdXBzdHJlYW1fc291cmNl	none		bind 		0 0
    # source {customer admin rc file}  
    # openstack role add Admin --user <my_admin_user> --user-domain <admin_domain> --domain <target_domain>  
    # openstack role add Admin --user <my_admin_user> --user-domain <admin_domain> --project <target_project> --project-domain <target_domain>  
    # openstack role add <Backup Trustee Role> --user <my_admin_user> --user-domain <admin_domain> --project <destination_project> --project-domain <target_domain>
    # workloadmgr workload-get-orphaned-workloads-list --migrate_cloud True    
    +------------+--------------------------------------+----------------------------------+----------------------------------+  
    |     Name   |                  ID                  |            Project ID            |  User ID                         |  
    +------------+--------------------------------------+----------------------------------+----------------------------------+  
    | Workload_1 | 6639525d-736a-40c5-8133-5caaddaaa8e9 | 4224d3acfd394cc08228cc8072861a35 |  329880dedb4cd357579a3279835f392 |  
    | Workload_2 | 904e72f7-27bb-4235-9b31-13a636eb9c95 | 637a9ce3fd0d404cabf1a776696c9c04 |  329880dedb4cd357579a3279835f392 |  
    +------------+--------------------------------------+----------------------------------+----------------------------------+
    # openstack project list --domain <target_domain>  
    +----------------------------------+----------+  
    | ID                               | Name     |  
    +----------------------------------+----------+  
    | 01fca51462a44bfa821130dce9baac1a | project1 |  
    | 33b4db1099ff4a65a4c1f69a14f932ee | project2 |  
    | 9139e694eb984a4a979b5ae8feb955af | project3 |  
    +----------------------------------+----------+ 
    # openstack role assignment list --project <target_project> --project-domain <target_domain> --role <backup_trustee_role>
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
    | Role                             | User                             | Group | Project                          | Domain | Inherited |
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
    | 9fe2ff9ee4384b1894a90878d3e92bab | 72e65c264a694272928f5d84b73fe9ce |       | 8e16700ae3614da4ba80a4e57d60cdb9 |        | False     |
    | 9fe2ff9ee4384b1894a90878d3e92bab | d5fbd79f4e834f51bfec08be6d3b2ff2 |       | 8e16700ae3614da4ba80a4e57d60cdb9 |        | False     |
    | 9fe2ff9ee4384b1894a90878d3e92bab | f5b1d071816742fba6287d2c8ffcd6c4 |       | 8e16700ae3614da4ba80a4e57d60cdb9 |        | False     |
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
    # workloadmgr workload-reassign-workloads --new_tenant_id {target_project_id} --user_id {target_user_id} --workload_ids {workload_id} --migrate_cloud True    
    +-----------+--------------------------------------+----------------------------------+----------------------------------+  
    |    Name   |                  ID                  |            Project ID            |  User ID                         |  
    +-----------+--------------------------------------+----------------------------------+----------------------------------+  
    | project1  | 904e72f7-27bb-4235-9b31-13a636eb9c95 | 4f2a91274ce9491481db795dcb10b04f | 3e05cac47338425d827193ba374749cc |  
    +-----------+--------------------------------------+----------------------------------+----------------------------------+ 
    # workloadmgr workload-show ac9cae9b-5e1b-4899-930c-6aa0600a2105
    +-------------------+------------------------------------------------------------------------------------------------------+
    | Property          | Value                                                                                                |
    +-------------------+------------------------------------------------------------------------------------------------------+
    | availability_zone | nova                                                                                                 |
    | created_at        | 2019-04-18T02:19:39.000000                                                                           |
    | description       | Test Linux VMs                                                                                       |
    | error_msg         | None                                                                                                 |
    | id                | ac9cae9b-5e1b-4899-930c-6aa0600a2105                                                                 |
    | instances         | [{"id": "38b620f1-24ae-41d7-b0ab-85ffc2d7958b", "name": "Test-Linux-1"}, {"id":                      |
    |                   | "3fd869b2-16bd-4423-b389-18d19d37c8e0", "name": "Test-Linux-2"}]                                     |
    | interval          | None                                                                                                 |
    | jobschedule       | True                                                                                                 |
    | name              | Test Linux                                                                                           |
    | project_id        | 2fc4e2180c2745629753305591aeb93b                                                                     |
    | scheduler_trust   | None                                                                                                 |
    | status            | available                                                                                            |
    | storage_usage     | {"usage": 60555264, "full": {"usage": 44695552, "snap_count": 1}, "incremental": {"usage": 15859712, |
    |                   | "snap_count": 13}}                                                                                   |
    | updated_at        | 2019-11-15T02:32:43.000000                                                                           |
    | user_id           | 72e65c264a694272928f5d84b73fe9ce                                                                     |
    | workload_type_id  | f82ce76f-17fe-438b-aa37-7a023058e50d                                                                 |
    +-------------------+------------------------------------------------------------------------------------------------------+
    # workloadmgr snapshot-list --workload_id ac9cae9b-5e1b-4899-930c-6aa0600a2105 --all True
    
    +----------------------------+--------------+--------------------------------------+--------------------------------------+---------------+-----------+-----------+
    |         Created At         |     Name     |                  ID                  |             Workload ID              | Snapshot Type |   Status  |    Host   |
    +----------------------------+--------------+--------------------------------------+--------------------------------------+---------------+-----------+-----------+
    | 2019-11-02T02:30:02.000000 | jobscheduler | f5b8c3fd-c289-487d-9d50-fe27a6561d78 | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |      full     | available | Upstream2 |
    | 2019-11-03T02:30:02.000000 | jobscheduler | 7e39e544-537d-4417-853d-11463e7396f9 | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |  incremental  | available | Upstream2 |
    | 2019-11-04T02:30:02.000000 | jobscheduler | 0c086f3f-fa5d-425f-b07e-a1adcdcafea9 | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |  incremental  | available | Upstream2 |
    +----------------------------+--------------+--------------------------------------+--------------------------------------+---------------+-----------+-----------+
    # workloadmgr snapshot-show --output networks 7e39e544-537d-4417-853d-11463e7396f9
    
    +-------------------+--------------------------------------+
    | Snapshot property | Value                                |
    +-------------------+--------------------------------------+
    | description       | None                                 |
    | host              | Upstream2                            |
    | id                | 7e39e544-537d-4417-853d-11463e7396f9 |
    | name              | jobscheduler                         |
    | progress_percent  | 100                                  |
    | restore_size      | 44040192 Bytes or Approx (42.0MB)    |
    | restores_info     |                                      |
    | size              | 1310720 Bytes or Approx (1.2MB)      |
    | snapshot_type     | incremental                          |
    | status            | available                            |
    | time_taken        | 154 Seconds                          |
    | uploaded_size     | 1310720                              |
    | workload_id       | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |
    +-------------------+--------------------------------------+
    
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |   Instances    |                                                        Value                                                        |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-1                                                    |
    |       ID       |                                         38b620f1-24ae-41d7-b0ab-85ffc2d7958b                                        |
    |                |                                                                                                                     |
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-2                                                    |
    |       ID       |                                         3fd869b2-16bd-4423-b389-18d19d37c8e0                                        |
    |                |                                                                                                                     |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    
    +-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
    |   Networks  | Value                                                                                                                                        |
    +-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
    |  ip_address | 172.20.20.20                                                                                                                                 |
    |    vm_id    | 38b620f1-24ae-41d7-b0ab-85ffc2d7958b                                                                                                         |
    |   network   | {u'subnet': {u'ip_version': 4, u'cidr': u'172.20.20.0/24', u'gateway_ip': u'172.20.20.1', u'id': u'3a756a89-d979-4cda-a7f3-dacad8594e44', 
    u'name': u'Trilio Test'}, u'cidr': None, u'id': u'5f0e5d34-569d-42c9-97c2-df944f3924b1', u'name': u'Trilio_Test_Internal', u'network_type': u'neutron'}      |
    | mac_address | fa:16:3e:74:58:bb                                                                                                                            |
    |             |                                                                                                                                              |
    |  ip_address | 172.20.20.13                                                                                                                                 |
    |    vm_id    | 3fd869b2-16bd-4423-b389-18d19d37c8e0                                                                                                         |
    |   network   | {u'subnet': {u'ip_version': 4, u'cidr': u'172.20.20.0/24', u'gateway_ip': u'172.20.20.1', u'id': u'3a756a89-d979-4cda-a7f3-dacad8594e44',
    u'name': u'Trilio Test'}, u'cidr': None, u'id': u'5f0e5d34-569d-42c9-97c2-df944f3924b1', u'name': u'Trilio_Test_Internal', u'network_type': u'neutron'}      |
    | mac_address | fa:16:3e:6b:46:ae                                                                                                                            |
    +-------------+----------------------------------------------------------------------------------------------------------------------------------------------+
    [root@upstreamcontroller ~(keystone_admin)]# workloadmgr snapshot-show --output disks 7e39e544-537d-4417-853d-11463e7396f9
    
    +-------------------+--------------------------------------+
    | Snapshot property | Value                                |
    +-------------------+--------------------------------------+
    | description       | None                                 |
    | host              | Upstream2                            |
    | id                | 7e39e544-537d-4417-853d-11463e7396f9 |
    | name              | jobscheduler                         |
    | progress_percent  | 100                                  |
    | restore_size      | 44040192 Bytes or Approx (42.0MB)    |
    | restores_info     |                                      |
    | size              | 1310720 Bytes or Approx (1.2MB)      |
    | snapshot_type     | incremental                          |
    | status            | available                            |
    | time_taken        | 154 Seconds                          |
    | uploaded_size     | 1310720                              |
    | workload_id       | ac9cae9b-5e1b-4899-930c-6aa0600a2105 |
    +-------------------+--------------------------------------+
    
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |   Instances    |                                                        Value                                                        |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-1                                                    |
    |       ID       |                                         38b620f1-24ae-41d7-b0ab-85ffc2d7958b                                        |
    |                |                                                                                                                     |
    |     Status     |                                                      available                                                      |
    | Security Group | [{u'name': u'Test', u'security_group_type': u'neutron'}, {u'name': u'default', u'security_group_type': u'neutron'}] |
    |     Flavor     |                         {u'ephemeral': u'0', u'vcpus': u'1', u'disk': u'1', u'ram': u'512'}                         |
    |      Name      |                                                     Test-Linux-2                                                    |
    |       ID       |                                         3fd869b2-16bd-4423-b389-18d19d37c8e0                                        |
    |                |                                                                                                                     |
    +----------------+---------------------------------------------------------------------------------------------------------------------+
    
    +-------------------+--------------------------------------------------+
    |       Vdisks      |                      Value                       |
    +-------------------+--------------------------------------------------+
    | volume_mountpoint |                     /dev/vda                     |
    |    restore_size   |                     22020096                     |
    |    resource_id    |       ebc2fdd0-3c4d-4548-b92d-0e16734b5d9a       |
    |    volume_name    |       0027b140-a427-46cb-9ccf-7895c7624493       |
    |    volume_type    |                       None                       |
    |       label       |                       None                       |
    |    volume_size    |                        1                         |
    |     volume_id     |       0027b140-a427-46cb-9ccf-7895c7624493       |
    | availability_zone |                       nova                       |
    |       vm_id       |       38b620f1-24ae-41d7-b0ab-85ffc2d7958b       |
    |      metadata     | {u'readonly': u'False', u'attached_mode': u'rw'} |
    |                   |                                                  |
    | volume_mountpoint |                     /dev/vda                     |
    |    restore_size   |                     22020096                     |
    |    resource_id    |       8007ed89-6a86-447e-badb-e49f1e92f57a       |
    |    volume_name    |       2a7f9e78-7778-4452-af5b-8e2fa43853bd       |
    |    volume_type    |                       None                       |
    |       label       |                       None                       |
    |    volume_size    |                        1                         |
    |     volume_id     |       2a7f9e78-7778-4452-af5b-8e2fa43853bd       |
    | availability_zone |                       nova                       |
    |       vm_id       |       3fd869b2-16bd-4423-b389-18d19d37c8e0       |
    |      metadata     | {u'readonly': u'False', u'attached_mode': u'rw'} |
    |                   |                                                  |
    +-------------------+--------------------------------------------------+
    {
       u'description':u'<description of the restore>',
       u'oneclickrestore':False,
       u'restore_type':u'selective',
       u'type':u'openstack',
       u'name':u'<name of the restore>'
       u'openstack':{
          u'instances':[
             {
                u'name':u'<name instance 1>',
                u'availability_zone':u'<AZ instance 1>',
                u'server_group':u'<id of an existing server group on the DR cloud, or empty>',
                u'nics':[ #####Leave empty for network topology restore
                ],
                u'vdisks':[
                   {
                      u'id':u'<old disk id>',
                      u'new_volume_type':u'<new volume type name>',
                      u'availability_zone':u'<new cinder volume AZ>'
                   }
                ],
                u'flavor':{
                   u'ram':<RAM in MB>,
                   u'ephemeral':<GB of ephemeral disk>,
                   u'vcpus':<# vCPUs>,
                   u'swap':u'<GB of Swap disk>',
                   u'disk':<GB of boot disk>,
                   u'id':u'<id of the flavor to use>'
                },
                u'include':<True/False>,
                u'id':u'<old id of the instance>'
             } #####Repeat for each instance in the snapshot
          ],
          u'restore_topology':<True/False>,
          u'networks_mapping':{
             u'networks':[ #####Leave empty for network topology restore
                
             ]
          }
       }
    }
    
    # workloadmgr snapshot-selective-restore --filename restore.json {snapshot id}
    [root@upstreamcontroller ~(keystone_admin)]# workloadmgr restore-list --snapshot_id 5928554d-a882-4881-9a5c-90e834c071af
    
    +----------------------------+------------------+--------------------------------------+--------------------------------------+----------+-----------+
    |         Created At         |       Name       |                  ID                  |             Snapshot ID              |   Size   |   Status  |
    +----------------------------+------------------+--------------------------------------+--------------------------------------+----------+-----------+
    | 2019-09-24T12:44:38.000000 | OneClick Restore | 5b4216d0-4bed-460f-8501-1589e7b45e01 | 5928554d-a882-4881-9a5c-90e834c071af | 41126400 | available |
    +----------------------------+------------------+--------------------------------------+--------------------------------------+----------+-----------+
    
    [root@upstreamcontroller ~(keystone_admin)]# workloadmgr restore-show 5b4216d0-4bed-460f-8501-1589e7b45e01
    +------------------+------------------------------------------------------------------------------------------------------+
    | Property         | Value                                                                                                |
    +------------------+------------------------------------------------------------------------------------------------------+
    | created_at       | 2019-09-24T12:44:38.000000                                                                           |
    | description      | -                                                                                                    |
    | error_msg        | None                                                                                                 |
    | finished_at      | 2019-09-24T12:46:07.000000                                                                           |
    | host             | Upstream2                                                                                            |
    | id               | 5b4216d0-4bed-460f-8501-1589e7b45e01                                                                 |
    | instances        | [{"status": "available", "id": "b8506f04-1b99-4ca8-839b-6f5d2c20d9aa", "name": "temp", "metadata":   |
    |                  | {"instance_id": "c014a938-903d-43db-bfbb-ea4998ff1a0f", "production": "1", "config_drive": ""}}]     |
    | name             | OneClick Restore                                                                                     |
    | progress_msg     | Restore from snapshot is complete                                                                    |
    | progress_percent | 100                                                                                                  |
    | project_id       | 8e16700ae3614da4ba80a4e57d60cdb9                                                                     |
    | restore_options  | {"description": "-", "oneclickrestore": true, "restore_type": "oneclick", "openstack": {"instances": |
    |                  | [{"availability_zone": "US-West", "id": "c014a938-903d-43db-bfbb-ea4998ff1a0f", "name": "temp"}]},   |
    |                  | "type": "openstack", "name": "OneClick Restore"}                                                     |
    | restore_type     | restore                                                                                              |
    | size             | 41126400                                                                                             |
    | snapshot_id      | 5928554d-a882-4881-9a5c-90e834c071af                                                                 |
    | status           | available                                                                                            |
    | time_taken       | 89                                                                                                   |
    | updated_at       | 2019-09-24T12:44:38.000000                                                                           |
    | uploaded_size    | 41126400                                                                                             |
    | user_id          | d5fbd79f4e834f51bfec08be6d3b2ff2                                                                     |
    | warning_msg      | None                                                                                                 |
    | workload_id      | 02b1aca2-c51a-454b-8c0f-99966314165e                                                                 |
    +------------------+------------------------------------------------------------------------------------------------------+
    # vi /etc/workloadmgr/workloadmgr.conf
    vault_storage_nfs_export = <NFS_B1-IP/NFS-FQDN>:/<VOL-B1-Path>,<NFS_B2-IP/NFS-FQDN>:/<VOL—B2-Path>
    vault_storage_nfs_export = <NFS_B1-IP/NFS_B1-FQDN>:/<VOL-B1-Path>
    # systemctl restart wlm-workloads
    # vi /etc/tvault-contego/tvault-contego.conf
    vault_storage_nfs_export = <NFS_B1-IP/NFS-FQDN>:/<VOL-B1-Path>,<NFS_B2-IP/NFS-FQDN>:/<VOL—B2-Path>
    vault_storage_nfs_export = <NFS-IP/NFS-FQDN>:/<VOL-1-Path>
    # systemctl restart tvault-contego
    # source {customer admin rc file}  
    # openstack role remove Admin --user <my_admin_user> --user-domain <admin_domain> --domain <target_domain>  
    # openstack role remove Admin --user <my_admin_user> --user-domain <admin_domain> --project <target_project> --project-domain <target_domain>  
    # openstack role remove <Backup Trustee Role> --user <my_admin_user> --user-domain <admin_domain> --project <destination_project> --project-domain <target_domain>
    

    IP or FQDN of Trilio service

    tenant_id

    string

    ID of the Tenant/Project to fetch the Restores from

    Name
    Type
    Description

    snapshot_id

    string

    ID of the Snapshot to fetch the Restores from

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 05 Nov 2020 11:28:43 GMT
    Content-Type: application/json
    Content-Length: 4308
    Connection: keep-alive
    X-Compute-Request-Id: req-0bc531b6-be6e-43b4-90bd-39ef26ef1463
    
    {
       "restores":[
          {
    
    

    GET https://$(tvm_address):8780/v1/$(tenant_id)/restores/<restore_id>

    Provides all details about the specified Restore

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run authentication against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 05 Nov 2020 14:04:45 GMT
    Content-Type: application/json
    Content-Length: 2639
    Connection: keep-alive
    X-Compute-Request-Id: req-30640219-e94e-4651-9b9e-49f5574e2a7f
    
    {
       "restore":{
          "id":"29fdc1f8-1d53-4a10-bb45-e539a64cdbfc",
          "created_at":"2020-11-05T10:17:40.000000",
          "updated_at":"2020-11-05T10:17:40.000000",
          "finished_at":"2020-11-05T10:27:20.000000",
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "status":"available",
          "restore_type":"restore",
          "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
          "snapshot_details":{
             "created_at":"2020-11-04T13:58:37.000000",
             "updated_at":"2020-11-05T10:27:22.000000",
             "deleted_at":null,
             "deleted":false,
             "version":"4.0.115",
             "id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
             "user_id":"ccddc7e7a015487fa02920f4d4979779",
             "project_id":"c76b3355a164498aa95ddbc960adc238",
             "workload_id":"18b809de-d7c8-41e2-867d-4a306407fb11",
             "snapshot_type":"full",
             "display_name":"API taken 2",
             "display_description":"API taken description 2",
             "size":44171264,
             "restore_size":2147483648,
             "uploaded_size":44171264,
             "progress_percent":100,
             "progress_msg":"Creating Instance: cirros-2",
             "warning_msg":null,
             "error_msg":null,
             "host":"TVM1",
             "finished_at":"2020-11-04T14:06:03.000000",
             "data_deleted":false,
             "pinned":false,
             "time_taken":428,
             "vault_storage_id":null,
             "status":"available"
          },
          "workload_id":"18b809de-d7c8-41e2-867d-4a306407fb11",
          "instances":[
             {
                "id":"1fb104bf-7e2b-4cb6-84f6-96aabc8f1dd2",
                "name":"cirros-2",
                "status":"available",
                "metadata":{
                   "config_drive":"",
                   "instance_id":"67d6a100-fee6-4aa5-83a1-66b070d2eabe",
                   "production":"1"
                }
             },
             {
                "id":"b083bb70-e384-4107-b951-8e9e7bbac380",
                "name":"cirros-1",
                "status":"available",
                "metadata":{
                   "config_drive":"",
                   "instance_id":"e33c1eea-c533-4945-864d-0da1fc002070",
                   "production":"1"
                }
             }
          ],
          "networks":[
             
          ],
          "subnets":[
             
          ],
          "routers":[
             
          ],
          "links":[
             {
                "rel":"self",
                "href":"http://wlm_backend/v1/c76b3355a164498aa95ddbc960adc238/restores/29fdc1f8-1d53-4a10-bb45-e539a64cdbfc"
             },
             {
                "rel":"bookmark",
                "href":"http://wlm_backend/c76b3355a164498aa95ddbc960adc238/restores/29fdc1f8-1d53-4a10-bb45-e539a64cdbfc"
             }
          ],
          "name":"OneClick Restore",
          "description":"-",
          "host":"TVM2",
          "size":2147483648,
          "uploaded_size":2147483648,
          "progress_percent":100,
          "progress_msg":"Restore from snapshot is complete",
          "warning_msg":null,
          "error_msg":null,
          "time_taken":580,
          "restore_options":{
             "name":"OneClick Restore",
             "oneclickrestore":true,
             "restore_type":"oneclick",
             "openstack":{
                "instances":[
                   {
                      "name":"cirros-2",
                      "id":"67d6a100-fee6-4aa5-83a1-66b070d2eabe",
                      "availability_zone":"nova"
                   },
                   {
                      "name":"cirros-1",
                      "id":"e33c1eea-c533-4945-864d-0da1fc002070",
                      "availability_zone":"nova"
                   }
                ]
             },
             "type":"openstack",
             "description":"-"
          },
          "metadata":[
             
          ]
       }
    }

    DELETE https://$(tvm_address):8780/v1/$(tenant_id)/restores/<restore_id>

    Deletes the specified Restore

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run authentication against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 05 Nov 2020 14:21:07 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-0e155b21-8931-480a-a749-6d8764666e4d

    GET https://$(tvm_address):8780/v1/$(tenant_id)/restores/<restore_id>/cancel

    Cancels an ongoing Restore

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of the Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 05 Nov 2020 15:13:30 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-98d4853c-314c-4f27-bd3f-f81bda1a2840

    POST https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>

    Starts a restore according to the provided information

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Thu, 05 Nov 2020 14:30:56 GMT
    Content-Type: application/json
    Content-Length: 992
    Connection: keep-alive
    X-Compute-Request-Id: req-7e18c309-19e5-49cb-a07e-90dd368fddae
    
    {
       "restore":{
          "id":"3df1d432-2f76-4ebd-8f89-1275428842ff",
          "created_at":"2020-11-05T14:30:56.048656",
          "updated_at":"2020-11-05T14:30:56.048656",
          "finished_at":null,
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "status":"restoring",
          "restore_type":"restore",
          "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
          "links":[
             {
                "rel":"self",
                "href":"http://wlm_backend/v1/c76b3355a164498aa95ddbc960adc238/restores/3df1d432-2f76-4ebd-8f89-1275428842ff"
             },
             {
                "rel":"bookmark",
                "href":"http://wlm_backend/c76b3355a164498aa95ddbc960adc238/restores/3df1d432-2f76-4ebd-8f89-1275428842ff"
             }
          ],
          "name":"One Click Restore",
          "description":"One Click Restore",
          "host":"",
          "size":0,
          "uploaded_size":0,
          "progress_percent":0,
          "progress_msg":null,
          "warning_msg":null,
          "error_msg":null,
          "time_taken":0,
          "restore_options":{
             "openstack":{
                
             },
             "type":"openstack",
             "oneclickrestore":true,
             "vmware":{
                
             },
             "restore_type":"oneclick"
          },
          "metadata":[
             
          ]
       }
    }

    The One-Click restore requires a body to provide all necessary information in json format.

    POST https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>

    Starts a restore according to the provided information.

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Mon, 09 Nov 2020 09:53:31 GMT
    Content-Type: application/json
    Content-Length: 1713
    Connection: keep-alive
    X-Compute-Request-Id: req-84f00d6f-1b12-47ec-b556-7b3ed4c2f1d7
    
    {
       "restore":{
          "id":"778baae0-6c64-4eb1-8fa3-29324215c43c",
          "created_at":"2020-11-09T09:53:31.037588",
          "updated_at":"2020-11-09T09:53:31.037588",
          "finished_at":null,
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "status":"restoring",
          "restore_type":"restore",
          "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
          "links":[
             {
                "rel":"self",
                "href":"http://wlm_backend/v1/c76b3355a164498aa95ddbc960adc238/restores/778baae0-6c64-4eb1-8fa3-29324215c43c"
             },
             {
                "rel":"bookmark",
                "href":"http://wlm_backend/c76b3355a164498aa95ddbc960adc238/restores/778baae0-6c64-4eb1-8fa3-29324215c43c"
             }
          ],
          "name":"API",
          "description":"API Created",
          "host":"",
          "size":0,
          "uploaded_size":0,
          "progress_percent":0,
          "progress_msg":null,
          "warning_msg":null,
          "error_msg":null,
          "time_taken":0,
          "restore_options":{
             "openstack":{
                "instances":[
                   {
                      "vdisks":[
                         {
                            "new_volume_type":"iscsi",
                            "id":"365ad75b-ca76-46cb-8eea-435535fd2e22",
                            "availability_zone":"nova"
                         }
                      ],
                      "name":"cirros-1-selective",
                      "availability_zone":"nova",
                      "server_group":"9c2b5d6f-8f42-4f0e-b0a0-1c2e3d4a5b6c",
                      "nics":[
                         
                      ],
                      "flavor":{
                         "vcpus":1,
                         "disk":1,
                         "swap":"",
                         "ram":512,
                         "ephemeral":0,
                         "id":"1"
                      },
                      "include":true,
                      "id":"e33c1eea-c533-4945-864d-0da1fc002070"
                   },
                   {
                      "include":false,
                      "id":"67d6a100-fee6-4aa5-83a1-66b070d2eabe"
                   }
                ],
                "restore_topology":false,
                "networks_mapping":{
                   "networks":[
                      {
                         "snapshot_network":{
                            "subnet":{
                               "id":"b7b54304-aa82-4d50-91e6-66445ab56db4"
                            },
                            "id":"5fb7027d-a2ac-4a21-9ee1-438c281d2b26"
                         },
                         "target_network":{
                            "subnet":{
                               "id":"b7b54304-aa82-4d50-91e6-66445ab56db4"
                            },
                            "id":"5fb7027d-a2ac-4a21-9ee1-438c281d2b26",
                            "name":"internal"
                         }
                      }
                   ]
                }
             },
             "restore_type":"selective",
             "type":"openstack",
             "oneclickrestore":false
          },
          "metadata":[
             
          ]
       }
    }

    The Selective restore requires a body to provide all necessary information in json format.

    POST https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>

    Starts a restore according to the provided information

    Name
    Type
    Description

    tvm_address

    string

    IP or FQDN of Trilio service

    tenant_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Mon, 09 Nov 2020 12:53:03 GMT
    Content-Type: application/json
    Content-Length: 1341
    Connection: keep-alive
    X-Compute-Request-Id: req-311fa97e-0fd7-41ed-873b-482c149ee743
    
    {
       "restore":{
          "id":"0bf96f46-b27b-425c-a10f-a861cc18b82a",
          "created_at":"2020-11-09T12:53:02.726757",
          "updated_at":"2020-11-09T12:53:02.726757",
          "finished_at":null,
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "status":"restoring",
          "restore_type":"restore",
          "snapshot_id":"ed4f29e8-7544-4e1c-af8a-a76031211926",
          "links":[
             {
                "rel":"self",
                "href":"http://wlm_backend/v1/c76b3355a164498aa95ddbc960adc238/restores/0bf96f46-b27b-425c-a10f-a861cc18b82a"
             },
             {
                "rel":"bookmark",
                "href":"http://wlm_backend/c76b3355a164498aa95ddbc960adc238/restores/0bf96f46-b27b-425c-a10f-a861cc18b82a"
             }
          ],
          "name":"API",
          "description":"API description",
          "host":"",
          "size":0,
          "uploaded_size":0,
          "progress_percent":0,
          "progress_msg":null,
          "warning_msg":null,
          "error_msg":null,
          "time_taken":0,
          "restore_options":{
             "restore_type":"inplace",
             "type":"openstack",
             "oneclickrestore":false,
             "openstack":{
                "instances":[
                   {
                      "restore_boot_disk":true,
                      "include":true,
                      "id":"7c1bb5d2-aa5a-44f7-abcd-2d76b819b4c8",
                      "vdisks":[
                         {
                            "restore_cinder_volume":true,
                            "id":"f6b3fef6-4b0e-487e-84b5-47a14da716ca"
                         }
                      ]
                   },
                   {
                      "restore_boot_disk":true,
                      "include":true,
                      "id":"08dab61c-6efd-44d3-a9ed-8e789d338c1b",
                      "vdisks":[
                         {
                            "restore_cinder_volume":true,
                            "id":"53204f34-019d-4ba8-ada1-e6ab7b8e5b43"
                         }
                      ]
                   }
                ]
             }
          },
          "metadata":[
             
          ]
       }
    }

    The Inplace restore requires a body to provide all necessary information in json format.

    tvm_address

    List Restores

    Path Parameters

    string

    {
       "restore":{
          "options":{
             "openstack":{
                
             },
             "type":"openstack",
             "oneclickrestore":true,
             "vmware":{},
             "restore_type":"oneclick"
          },
          "name":"One Click Restore",
          "description":"One Click Restore"
       }
    }
    {
       "restore":{
        "name":"<restore name>",
        "description":"<restore description>",
    	  "options":{
             "openstack":{
                "instances":[
                   {
                      "name":"<new name of instance>",
                      "include":<true/false>,
                      "id":"<original id of instance to be restored>"
    				  "availability_zone":"<availability zone>",
    				  "server_group":"<ID of an existing server group on the target, empty for none>",
    				  "vdisks":[
                         {
                            "id":"<original ID of Volume>",
                            "new_volume_type":"<new volume type>",
                            "availability_zone":"<Volume availability zone>"
                         }
                      ],
                      "nics":[
                         {
                            "id":"<ID of the network of the pre-created port>",
                            "port_id":"<ID of the pre-created Neutron port>",
                            "mac_address":"<MAC address of the snapshot port>",
                            "ip_address":"<IP of the pre-created port>",
                            "network":{
                               "id":"<ID of the network of the pre-created port>",
                               "subnet":{
                                  "id":"<ID of the subnet of the pre-created port>"
                               }
                            }
                         }
                      ],
                      "flavor":{
                         "vcpus":<Integer>,
                         "disk":<Integer>,
                         "swap":<Integer>,
                         "ram":<Integer>,
                         "ephemeral":<Integer>,
                         "id":<Integer>
                      }
                   }
                ],
                "restore_topology":<true/false>,
                "networks_mapping":{
                   "networks":[
                      {
                         "snapshot_network":{
                            "subnet":{
                               "id":"<ID of the original Subnet ID>"
                            },
                            "id":"<ID of the original Network ID>"
                         },
                         "target_network":{
                            "subnet":{
                               "id":"<ID of the target Subnet ID>"
                            },
                            "id":"<ID of the target Network ID>",
                            "name":"<name of the target network>"
                         }
                      }
                   ]
                }
             },
             "restore_type":"selective",
             "type":"openstack",
             "oneclickrestore":false
          }
       }
    }
    {
       "restore":{
          "name":"<restore-name>",
          "description":"<restore-description>",
          "options":{
             "restore_type":"inplace",
             "type":"openstack",
             "oneclickrestore":false,
             "openstack":{
                "instances":[
                   {
                      "restore_boot_disk":<Boolean>,
                      "include":<Boolean>,
                      "id":"<ID of the instance the volumes are attached to>",
                      "vdisks":[
                         {
                            "restore_cinder_volume":<boolean>,
                            "id":"<ID of the Volume to restore>"
                         }
                      ]
                   }
                ]
             }
          }
       }
    }

    Query Parameters

    Headers

    Get Restore

    Path Parameters

    Headers

    Delete Restore

    Path Parameters

    Headers

    Cancel Restore

    Path Parameters

    Headers

    One Click Restore

    Path Parameters

    Headers

    Body Format

    Selective Restore

    Path Parameters

    Headers

    Body Format

    Inside each nics entry:

    • id is the ID of the network the pre-created Neutron port belongs to (same value as network.id).

    server_group (6.2.1 and later)

    server_group is an optional per-instance string holding the ID of an existing Nova server group in the project the restore runs in. The restored instance joins that server group at boot, preserving its affinity / anti-affinity placement policy. An empty string or an omitted key means no server group is assigned.

    The value must be an existing server group ID - Trilio does not create server groups on the target. Server group IDs are validated before the restore workflow starts, so an invalid ID fails the request fast, before any data is transferred:

    All invalid IDs are reported in one message. Only instances with "include":true

    Inplace Restore

    Path Parameters

    Headers

    Body Format

    Backup Targets

    This document explains the concepts of Backup Targets and Backup Target Types in Trilio, their purpose, and how they provide additional flexibility and control for backup storage management.


    Backup Targets are storage backends where backups are stored. These can be any of the supported storage systems such as NFS (Network File System) or S3 (Simple Storage Service). Backup Targets act as the foundational layer for storing backup data.

    • They are storage systems connected to Trilio.

    • Supported storage types include:

    "id":"29fdc1f8-1d53-4a10-bb45-e539a64cdbfc",
    "created_at":"2020-11-05T10:17:40.000000",
    "updated_at":"2020-11-05T10:17:40.000000",
    "finished_at":"2020-11-05T10:27:20.000000",
    "user_id":"ccddc7e7a015487fa02920f4d4979779",
    "project_id":"c76b3355a164498aa95ddbc960adc238",
    "status":"available",
    "restore_type":"restore",
    "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
    "links":[
    {
    "rel":"self",
    "href":"http://wlm_backend/v1/c76b3355a164498aa95ddbc960adc238/restores/29fdc1f8-1d53-4a10-bb45-e539a64cdbfc"
    },
    {
    "rel":"bookmark",
    "href":"http://wlm_backend/c76b3355a164498aa95ddbc960adc238/restores/29fdc1f8-1d53-4a10-bb45-e539a64cdbfc"
    }
    ],
    "name":"OneClick Restore",
    "description":"-",
    "host":"TVM2",
    "size":2147483648,
    "uploaded_size":2147483648,
    "progress_percent":100,
    "progress_msg":"Restore from snapshot is complete",
    "warning_msg":null,
    "error_msg":null,
    "time_taken":580,
    "restore_options":{
    "name":"OneClick Restore",
    "oneclickrestore":true,
    "restore_type":"oneclick",
    "openstack":{
    "instances":[
    {
    "name":"cirros-2",
    "id":"67d6a100-fee6-4aa5-83a1-66b070d2eabe",
    "availability_zone":"nova"
    },
    {
    "name":"cirros-1",
    "id":"e33c1eea-c533-4945-864d-0da1fc002070",
    "availability_zone":"nova"
    }
    ]
    },
    "type":"openstack",
    "description":"-"
    },
    "metadata":[
    {
    "created_at":"2020-11-05T10:27:20.000000",
    "updated_at":null,
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"91ab2495-1903-4d75-982b-08a4e480835b",
    "restore_id":"29fdc1f8-1d53-4a10-bb45-e539a64cdbfc",
    "key":"data_transfer_time",
    "value":"0"
    },
    {
    "created_at":"2020-11-05T10:27:20.000000",
    "updated_at":null,
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"e0e01eec-24e0-4abd-9b8c-19993a320e9f",
    "restore_id":"29fdc1f8-1d53-4a10-bb45-e539a64cdbfc",
    "key":"object_store_transfer_time",
    "value":"0"
    },
    {
    "created_at":"2020-11-05T10:27:20.000000",
    "updated_at":null,
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"eb909267-ba9b-41d1-8861-a9ec22d6fd84",
    "restore_id":"29fdc1f8-1d53-4a10-bb45-e539a64cdbfc",
    "key":"restore_user_selected_value",
    "value":"Oneclick Restore"
    }
    ]
    },
    {
    "id":"4673d962-f6a5-4209-8d3e-b9f2e9115f07",
    "created_at":"2020-11-04T14:37:31.000000",
    "updated_at":"2020-11-04T14:37:31.000000",
    "finished_at":"2020-11-04T14:45:27.000000",
    "user_id":"ccddc7e7a015487fa02920f4d4979779",
    "project_id":"c76b3355a164498aa95ddbc960adc238",
    "status":"error",
    "restore_type":"restore",
    "snapshot_id":"2e56d167-bad7-43c7-8ede-a613c3fe7844",
    "links":[
    {
    "rel":"self",
    "href":"http://wlm_backend/v1/c76b3355a164498aa95ddbc960adc238/restores/4673d962-f6a5-4209-8d3e-b9f2e9115f07"
    },
    {
    "rel":"bookmark",
    "href":"http://wlm_backend/c76b3355a164498aa95ddbc960adc238/restores/4673d962-f6a5-4209-8d3e-b9f2e9115f07"
    }
    ],
    "name":"OneClick Restore",
    "description":"-",
    "host":"TVM2",
    "size":2147483648,
    "uploaded_size":2147483648,
    "progress_percent":100,
    "progress_msg":"",
    "warning_msg":null,
    "error_msg":"Failed restoring snapshot: Error creating instance e271bd6e-f53e-4ebc-875a-5787cc4dddf7",
    "time_taken":476,
    "restore_options":{
    "name":"OneClick Restore",
    "oneclickrestore":true,
    "restore_type":"oneclick",
    "openstack":{
    "instances":[
    {
    "name":"cirros-2",
    "id":"67d6a100-fee6-4aa5-83a1-66b070d2eabe",
    "availability_zone":"nova"
    },
    {
    "name":"cirros-1",
    "id":"e33c1eea-c533-4945-864d-0da1fc002070",
    "availability_zone":"nova"
    }
    ]
    },
    "type":"openstack",
    "description":"-"
    },
    "metadata":[
    {
    "created_at":"2020-11-04T14:45:27.000000",
    "updated_at":null,
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"be6dc7e2-1be2-476b-9338-aed986be3b55",
    "restore_id":"4673d962-f6a5-4209-8d3e-b9f2e9115f07",
    "key":"data_transfer_time",
    "value":"0"
    },
    {
    "created_at":"2020-11-04T14:45:27.000000",
    "updated_at":null,
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"2e4330b7-6389-4e21-b31b-2503b5441c3e",
    "restore_id":"4673d962-f6a5-4209-8d3e-b9f2e9115f07",
    "key":"object_store_transfer_time",
    "value":"0"
    },
    {
    "created_at":"2020-11-04T14:45:27.000000",
    "updated_at":null,
    "deleted_at":null,
    "deleted":false,
    "version":"4.0.115",
    "id":"561c806b-e38a-496c-a8de-dfe96cb3e956",
    "restore_id":"4673d962-f6a5-4209-8d3e-b9f2e9115f07",
    "key":"restore_user_selected_value",
    "value":"Oneclick Restore"
    }
    ]
    }
    ]
    }
    port_id is the ID of the pre-created Neutron port to attach to the restored instance. When port_id is omitted, an available IP on the network is used.
  • mac_address is the MAC address recorded for the port in the snapshot.

  • ip_address is the IP address of the pre-created Neutron port.

  • are validated.

    This field applies to Selective Restore only. A One Click Restore automatically reuses the server group captured in the Snapshot (and continues with the instance unassigned, setting warning_msg, if that group no longer exists). Inplace Restore does not boot new instances and therefore ignores server groups entirely.

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to fetch the restore from

    restore_id

    string

    ID of the restore to show

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to fetch the Restore from

    restore_id

    string

    ID of the Restore to be deleted

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to fetch the Restore from

    restore_id

    string

    ID of the Restore to cancel

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to do the restore in

    snapshot_id

    string

    ID of the snapshot to restore

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to do the restore in

    snapshot_id

    string

    ID of the snapshot to restore

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    ID of the Tenant/Project to do the restore in

    snapshot_id

    string

    ID of the snapshot to restore

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Failed restoring snapshot: Invalid restore options: Server group(s) in restore options not found: '<id>'

    NFS: A shared file system accessible over a network.

  • S3: An object storage service typically offered by cloud providers.

  • Multiple Backup Targets can be defined within a single environment to provide storage flexibility.

  • Only a default backup target is required while uploading the Trilio license. Additional backup targets can be added any time after a successful deployment — through the Horizon dashboard, the workloadmgr CLI, or the WLM REST API. Backup targets do not need to be planned exhaustively before deployment.


    Starting in 6.2, S3 access credentials and connection options are no longer stored in the WorkloadManager configuration. They are stored as an OpenStack Barbican secret and the backup target carries a secret_ref field that points at that secret. DMS fetches the payload at mount time using the requesting job's Keystone token, so credentials are never persisted on disk on Trilio nodes.

    Pre-requisites (hard requirements)

    1. One Barbican secret per S3 backup target. Each S3 backup target must have its own Barbican secret containing a valid payload. The Barbican secret URL becomes the secret_ref value of the backup target.

    2. The cloud admin user must be able to read the secret payload. DMS retrieves the payload using the requesting job's Keystone token, so the user/role triggering snapshots and restores must have secret:get permission on the secret. In default RHOSO deployments this is the admin user in the admin project; if you assign DMS use to a different user, mirror that user's ACL onto each Barbican secret.

    3. Required keys in the payload: VAULT_S3_ACCESS_KEY_ID, VAULT_S3_SECRET_ACCESS_KEY, VAULT_S3_BUCKET, VAULT_STORAGE_S3_EXPORT. The DMS server applies built-in defaults for any optional keys not present.

    Generating the secret payload

    You can either hand-write the JSON payload or generate it with trilio-dms-cli secret-payload create. The four examples below cover the most common S3 deployment shapes.

    Example 1 — AWS S3 (no custom endpoint, publicly-trusted CA, SSL verification on):

    The resulting secret.json contains:

    Example 2 — S3-compatible store with a publicly-trusted CA (e.g. a Ceph RGW or MinIO endpoint whose certificate chains to a CA already in the system trust store):

    The payload includes VAULT_S3_ENDPOINT_URL and keeps VAULT_S3_SSL / VAULT_S3_SSL_VERIFY set to True.

    Example 3 — S3-compatible store with a self-signed certificate. Pass the CA cert as a file; --ssl-cert auto-enables --ssl and --ssl-verify and embeds the PEM content in the payload as VAULT_S3_SSL_CERT:

    Example 4 — S3 endpoint with SSL verification disabled (lab / non-production only):

    The payload sets VAULT_S3_SSL_VERIFY to False. Use this only in test environments — DMS will not validate the endpoint certificate.

    Storing the payload in Barbican

    Use the returned Secret href as the secret_ref on the backup target — either via the workloadmgr backup-target-create CLI or the API request body.


    NFS backup targets do not require a Barbican secret. They are defined by the NFS export path and any mount options (e.g. nolock,soft,timeo=600,intr,lookupcache=none,retrans=10); these are passed through the filesystem_export and nfs_mount_opts fields when creating the target.


    In 6.1 and earlier, backup targets had to be planned and made available before deploying Trilio. The deployment scripts populated the following entries in the workloadmgr services configuration file:

    • All enabled backup target names were defined as a comma-separated list under the DEFAULT section using the enabled_backends parameter:

    where NFS_BT1, S3_BT1, S3_BT2, and S3_BT3 were unique backup target names with their own matching config sections.

    • Each backup target section was populated according to the storage type:

      • For NFS storage:

        • vault_storage_type = nfs

        • vault_storage_filesystem_export = <NFS_SHARE>

        • vault_storage_nfs_options = nolock,soft,timeo=600,intr,lookupcache=none,retrans=10

      • For S3 storage:

        • vault_storage_type = s3

        • vault_s3_endpoint_url = <S3_ENDPOINT_URL> (blank for AWS S3)

    • is_default = 1 was set on exactly one section to mark it as the default backup target.

    Example 6.1 configuration:

    1. Log in to the OpenStack Horizon Dashboard as an Admin user.

    2. Navigate to the Admin-> Backups-Admin -> Backup Targets

    3. On the page, click the Backup Targets tab to see the list of Backup Target Types.

    Create Backup Target:

    • Command:

    • Alias:

    • Options:

    • Example:

    Modify Backup Target:

    Use this command to update the credentials or mount options of an existing backup target without recreating it. Typical uses:

    • S3 — rotate credentials by storing a new Barbican secret payload and pointing the backup target at it with --secret-ref <new Barbican href>. The S3 access key, secret key, endpoint URL, bucket, and filesystem_export all live in the Barbican secret payload, so updating the secret_ref is enough to change any of them.

    • NFS — adjust mount options with --nfs-mount-opts <opts>.

    • Command:

    • Alias:

    • Options:

    Delete Backup Target:

    • Command:

    • Alias:

    • Options:

    • Example:

    List the available Backup Targets:

    • Command:

    • Alias:

    • Options:

    • Example:

    Show Details of a Backup Target:

    • Command:

    • Alias:

    • Options:

    • Example:

    Backup Target Set Default:

    • Command:

    • Alias:

    • Options:

    • Example:


    Backup Target Types are an abstraction layer over Backup Targets. They provide additional administrative controls and can be categorized based on their scope and access permissions.

    1. Public:

      • Accessible by all users and projects in the system.

      • Suitable for shared storage scenarios where multiple teams or tenants use the same backup infrastructure.

    2. Private:

      • Restricted to specific projects.

      • Private Backup Target Types can be assigned to one or multiple projects, allowing project-specific control over backup storage.

    • A many-to-one relationship exists between Backup Target Types and Backup Targets.

      • Multiple Backup Target Types can map to a single Backup Target.

      • This allows administrators to define different policies or access levels for a shared storage backend.

    • Trilio creates the BTTs of all the Backup Targets that are configured during deployment with the same name as the Backup Targets.

    • It inherits the provided configuration options for each Backup Target and creates the Public Backup Target Types by default.

    1. Log in to the OpenStack Horizon Dashboard as an Admin user.

    2. Navigate to the Admin-> Backups-Admin -> Backup Targets

    3. On the page, click the Backup Target Types tab to see the list of Backup Target Types.

    • Command:

    • Alias:

    • Options:

    • Example:

    • Most of the relevant information about the BTT can be seen while Listing the BTTs.

    • Trilio does not provide a separate GUI for showing the additional details of the BTTs.

    • But, Trilio does provide a CLI command to get the additional details.

    • Command:

    • Alias:

    • Options:

    • Example:

    1. Log in to the OpenStack Horizon Dashboard as an Admin user.

    2. Navigate to the Admin-> Backups-Admin -> Backup Targets

    3. On the page, click the Backup Target Types tab to see the list of Backup Target Types.

    4. Click on the button to open the Backup Target Type Create wizard, and follow the instructions to create the BTT.

    • Command:

    • Alias:

    • Options:

    • Example:

    1. Log in to the OpenStack Horizon Dashboard as an Admin user.

    2. Navigate to the Admin-> Backups-Admin -> Backup Targets

    3. On the page, click the Backup Target Types tab to see the list of Backup Target Types.

    4. Click on the button under the Actions column of the BTT List table of the desired BTT to open the Edit Backup Target Type wizard.

    5. Once the required changes are done, click on the Edit button on the wizard to save the changes.

    • Command:

    • Alias:

    • Options:

    • Example:

    • Log in to the OpenStack Horizon Dashboard as an Admin user.

    • Navigate to the Admin-> Backups-Admin -> Backup Targets

    • On the page, click the Backup Target Types tab to see the list of Backup Target Types.

    • Click the dropdown button under the Actions column of the BTT List table of the desired Private BTT and click on the button to open the Edit Backup Target Type Access wizard.

    • Select the Projects to be assigned, unselect the projects to be unassigned, and click on the Save button on the wizard to save the changes.

    Assigning Projects:

    • Command:

    • Alias:

    Options:

    Example:

    Unassigning Projects:

    • Command:

    • Alias:

    Options:

    Example:

    Adding Metadata:

    • Command:

    • Alias:

    Options:

    • Example:

    Removing Metadata:

    • Command:

    • Alias:

    • Options:

    Example:

    • Log in to the OpenStack Horizon Dashboard as an Admin user.

    • Navigate to the Admin-> Backups-Admin -> Backup Targets

    • On the page, click the Backup Target Types tab to see the list of Backup Target Types.

    • Click the dropdown button under the Actions column of the BTT List table of the desired Private BTT, click on the button, and confirm the deletion once prompted.

    • Deletion of multiple BTTs can be done by selecting the check boxes of the desired BTTs and then clicking the button at the top-right corner.

    • Command:

    • Alias:

    • Options:

    • Example:


    • Any user can select a Public Backup Target Type for storing backups, as these are universally accessible.

    • For Private Backup Target Types, users can only select them if the Backup Target Type is explicitly assigned to their project.

    • The user will have the option to select these Backup Target Types while creating a workload.

    • Please note that once the workload is created with the chosen Backup Target Type, it can not be modified. The user has to recreate the workload if the Backup Target Type needs to be changed.


    1. Backup Targets (BTs)

    Definition:

    Key Characteristics of Backup Targets:

    trilio-dms-cli secret-payload create \
        --access-key <AWS_ACCESS_KEY_ID> \
        --secret-key <AWS_SECRET_ACCESS_KEY> \
        --bucket <bucket-name> \
        --filesystem-export <bucket-name> \
        --region us-east-1 \
        -o secret.json
    {
      "VAULT_S3_ACCESS_KEY_ID": "<AWS_ACCESS_KEY_ID>",
      "VAULT_S3_SECRET_ACCESS_KEY": "<AWS_SECRET_ACCESS_KEY>",
      "VAULT_S3_BUCKET": "<bucket-name>",
      "VAULT_STORAGE_S3_EXPORT": "<bucket-name>",
      "VAULT_S3_REGION_NAME": "us-east-1",
      "VAULT_S3_SSL": "True",
      "VAULT_S3_SSL_VERIFY": "True"
    }
    trilio-dms-cli secret-payload create \
        --access-key <S3_ACCESS_KEY_ID> \
        --secret-key <S3_SECRET_ACCESS_KEY> \
        --bucket <bucket-name> \
        --endpoint-url https://<s3-endpoint-host>/ \
        --filesystem-export <s3-endpoint-host>/<bucket-name> \
        -o secret.json
    trilio-dms-cli secret-payload create \
        --access-key <S3_ACCESS_KEY_ID> \
        --secret-key <S3_SECRET_ACCESS_KEY> \
        --bucket <bucket-name> \
        --endpoint-url https://<s3-endpoint-host>/ \
        --filesystem-export <s3-endpoint-host>/<bucket-name> \
        --ssl-cert /path/to/ca-cert.pem \
        -o secret.json
    trilio-dms-cli secret-payload create \
        --access-key <S3_ACCESS_KEY_ID> \
        --secret-key <S3_SECRET_ACCESS_KEY> \
        --bucket <bucket-name> \
        --endpoint-url https://<s3-endpoint-host>/ \
        --filesystem-export <s3-endpoint-host>/<bucket-name> \
        --no-ssl-verify \
        -o secret.json
    source /root/openrc
    openstack secret store --name <secret-name> --payload "$(cat secret.json)"
    # Returns: Secret href: http://barbican:9311/v1/secrets/<uuid>
    [DEFAULT]
    .
    .
    enabled_backends = NFS_BT1, S3_BT1, S3_BT2, S3_BT3
    .
    .
    # NFS Backup Target-1 as a default backup target
    [NFS_BT1]
    vault_storage_type = nfs
    vault_storage_filesystem_export = 192.168.1.35:/mnt/trilio/share1
    vault_storage_nfs_options = nolock,soft,timeo=600,intr,lookupcache=none,retrans=10
    is_default = 1
    
    # Ceph S3 Backup Target-2
    [S3_BT2]
    vault_storage_type = s3
    vault_s3_endpoint_url = https://cephs3.triliodata.demo
    vault_s3_bucket = trilio-test-bucket
    vault_storage_filesystem_export = cephs3.triliodata.demo/trilio-test-bucket
    immutable = 0
    is_default = 0
    
    # Ceph S3 Backup Target-3 with Object-lock enabled bucket
    [S3_BT3]
    vault_storage_type = s3
    vault_s3_endpoint_url = https://cephs3.triliodata.demo
    vault_s3_bucket = object-locked-cephs3-bucket
    immutable = 1
    vault_storage_filesystem_export = cephs3.triliodata.demo/object-locked-cephs3-bucket
    
    # AWS S3 Backup Target-4 with Object-lock enabled bucket
    [S3_BT4]
    vault_storage_type = s3
    vault_s3_endpoint_url =
    vault_s3_bucket = object-locked-aws-s3-01
    immutable = 1
    vault_storage_filesystem_export = object-locked-aws-s3-01
    
    workloadmgr backup-target-create
    openstack workloadmgr backup target create
    # workloadmgr help backup-target-create
    usage: workloadmgr backup-target-create [-h] [-f {json,shell,table,value,yaml}] [-c COLUMN] [--noindent]
                                            [--prefix PREFIX] [--max-width <integer>] [--fit-width] [--print-empty]
                                            [--s3-endpoint-url <s3_endpoint_url>] [--s3-bucket <s3_bucket>]
                                            [--filesystem-export <filesystem_export>] [--type <type>]
                                            [--nfs-mount-opts <nfs_mount_opts>] [--secret-ref <secret_ref>]
                                            [--btt-name <btt_name>] [--default] [--immutable]
                                            [--metadata metadata [metadata ...]]
    
    Create backup target
    
    optional arguments:
      -h, --help            show this help message and exit
      --s3-endpoint-url <s3_endpoint_url>
                            S3 endpoint URL.
      --s3-bucket <s3_bucket>
                            S3 bucket. Required for s3 backup target type
      --filesystem-export <filesystem_export>
                            BT filesystem export path. Required for nfs backup target only. For s3 it's handled internally
      --type <type>
                            Required BT type. Eg. nfs, s3
      --nfs-mount-opts <nfs_mount_opts>
                            NFS mount options (default: nolock,soft,timeo=600,lookupcache=none,nfsvers=3,retrans=10)
      --secret-ref <secret_ref>
                            Secrete Ref. E.g. https://<url>/v1/secrets/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
      --btt-name <btt_name>
                            optional Backup Target Type name. If not provided, then we use the filesystem export path (for nfs) or the S3 bucket name (for s3) as BTT name
      --default             denotes whether Backup Target is default
      --immutable           denotes whether Backup Target is immutable
      --metadata metadata [metadata ...]
                            Specify a key value pairs to include in the BT metadata Eg. --metadata key1=value1 key2=value2 keyN=valueN
    
    workloadmgr backup-target-modify
    openstack workloadmgr backup target modify
    # workloadmgr help backup-target-modify
    usage: workloadmgr backup-target-modify [-h] [-f {json,shell,table,value,yaml}] [-c COLUMN] [--noindent]
                                            [--prefix PREFIX] [--max-width <integer>] [--fit-width] [--print-empty]
                                            [--nfs-mount-opts <nfs_mount_opts>] [--secret-ref <secret_ref>]
                                            <backup_target_id>
    
    Modify backup target
    
    positional arguments:
      <backup_target_id>
                            ID of the backup target which needs to be modified
    
    optional arguments:
      -h, --help            show this help message and exit
      --nfs-mount-opts <nfs_mount_opts>
                            NFS mount options (default: nolock,soft,timeo=600,lookupcache=none,nfsvers=3,retrans=10)
      --secret-ref <secret_ref>
                            Secrete Ref. E.g. https://<url>/v1/secrets/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
    
    workloadmgr backup-target-delete
    openstack workloadmgr backup target delete
    # workloadmgr help backup-target-delete
    usage: workloadmgr backup-target-delete [-h] <backup_target_id>
    Delete existing backup target
    positional arguments:
      <backup_target_id>
                            ID of the backup target to delete.
    
    workloadmgr backup-target-list
    openstack workloadmgr backup target list
    # workloadmgr help backup-target-list
    usage: workloadmgr backup-target-list [-h]
                                          [-f {csv,json,table,value,yaml}]
                                          [-c COLUMN]
                                          [--quote {all,minimal,none,nonnumeric}]
                                          [--noindent]
                                          [--max-width <integer>]
                                          [--fit-width] [--print-empty]
                                          [--sort-column SORT_COLUMN]
                                          [--sort-ascending | --sort-descending]
    
    List all the backup targets.
    
    options:
      -h, --help            show this help message and exit
    
    output formatters:
      output formatter options
    
      -f {csv,json,table,value,yaml}, --format {csv,json,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
      --sort-column SORT_COLUMN
                            specify the column(s) to sort the data (columns
                            specified first have a priority, non-existing columns
                            are ignored), can be repeated
      --sort-ascending      sort the column(s) in ascending order
      --sort-descending     sort the column(s) in descending order
    
    CSV Formatter:
      --quote {all,minimal,none,nonnumeric}
                            when to include quotes, defaults to nonnumeric
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable
      --print-empty         Print empty table if there is no data to show.
      
    workloadmgr backup-target-show
    openstack workloadmgr backup target show
    # workloadmgr help backup-target-show
    usage: workloadmgr backup-target-show [-h]
                                          [-f {json,shell,table,value,yaml}]
                                          [-c COLUMN] [--noindent]
                                          [--prefix PREFIX]
                                          [--max-width <integer>]
                                          [--fit-width] [--print-empty]
                                          <backup_target_id>
    
    Show details about backup targets
    
    positional arguments:
      <backup_target_id>
                            ID of the backup target.
    
    options:
      -h, --help            show this help message and exit
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX
                            add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable
      --print-empty         Print empty table if there is no data to show.
    workloadmgr backup-target-set-default
    openstack workloadmgr backup target set default
    # workloadmgr help backup-target-set-default
    usage: workloadmgr backup-target-set-default [-h] [-f {json,shell,table,value,yaml}] [-c COLUMN] [--noindent]
                                                 [--prefix PREFIX] [--max-width <integer>] [--fit-width] [--print-empty]
                                                 <backup_target_id>
    
    Set existing backup target as default, it's respective one of BTT will be set as default, If BTT doesn't exists then it will be created and
    set as default BTT
    
    positional arguments:
      <backup_target_id>
                            ID of the backup target which needs to be set as default
    
    workloadmgr backup-target-type-list
    openstack workloadmgr backup target type list
    # workloadmgr help backup-target-type-list
    usage: workloadmgr backup-target-type-list [-h]
                                               [-f {csv,json,table,value,yaml}]
                                               [-c COLUMN]
                                               [--quote {all,minimal,none,nonnumeric}]
                                               [--noindent]
                                               [--max-width <integer>]
                                               [--fit-width] [--print-empty]
                                               [--sort-column SORT_COLUMN]
                                               [--sort-ascending | --sort-descending]
                                               [--detail {True,False}]
                                               [--project-id <project_id>]
    
    List all the backup target types.
    
    options:
      -h, --help            show this help message and exit
      --detail {True,False}
                            List detail backup target types
      --project-id <project_id>
                            ID of the project.
    
    output formatters:
      output formatter options
    
      -f {csv,json,table,value,yaml}, --format {csv,json,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
      --sort-column SORT_COLUMN
                            specify the column(s) to sort the data (columns
                            specified first have a priority, non-existing columns
                            are ignored), can be repeated
      --sort-ascending      sort the column(s) in ascending order
      --sort-descending     sort the column(s) in descending order
    
    CSV Formatter:
      --quote {all,minimal,none,nonnumeric}
                            when to include quotes, defaults to nonnumeric
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable
      --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-show
    openstack workloadmgr backup target type show
    # workloadmgr help  backup-target-type-show
    usage: workloadmgr backup-target-type-show [-h] [-f {json,shell,table,value,yaml}]
                                               [--print-empty]
                                               <backup_target_id>
    
    Show details about backup target types
    
    positional arguments:
      <backup_target_id>
                            ID of the backup target.
    
    options:
      -h, --help            show this help message and exit
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to show
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX
                            add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use the
      --fit-width           Fit the table to the display width. Implied if --max-width
      --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-create
    openstack workloadmgr backup target type create
    # workloadmgr help  backup-target-type-create
    usage: workloadmgr backup-target-type-create [-h]
                                                 [-f {json,shell,table,value,yaml}]
                                                 [-c COLUMN] [--noindent]
                                                 [--prefix PREFIX]
                                                 [--max-width <integer>]
                                                 [--fit-width] [--print-empty]
                                                 [--default]
                                                 [--description <description>]
                                                 (--public | --project-ids <project-ids> [<project-ids> ...])
                                                 [--metadata <key=key-name>]
                                                 [--backup-targets-id <backup_targets_id>]
                                                 <name>
    
    Create backup target type
    
    positional arguments:
      <name>        required BTT name.
    
    options:
      -h, --help            show this help message and exit
      --default             denotes whether BTT is default
      --description <description>
                            Optional BTT description. (Default=None)
      --public              denotes whether BTT is of public type
      --project-ids <project-ids> [<project-ids> ...]
                            Required to assign BTT to projects
      --metadata <key=key-name>
                            Specify a key value pairs to include in the BTT metadata
                            Specify option multiple times to include multiple keys.
                            key=value
      --backup-targets-id <backup_targets_id>
                            ID of the backup target for which BTT would be created
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX
                            add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable
      --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-modify
    openstack workloadmgr backup target type modify
    # workloadmgr help  backup-target-type-modif
    usage: workloadmgr backup-target-type-modify [-h] [-f {json,shell,table,value,yaml
                                                 [--print-empty] [--name <name>] [--de
                                                 (--public | --project-ids <project-id
                                                 [--backup-target-type-id <backup_targ
    
    Modify existing backup target type
    
    options:
      -h, --help            show this help message and exit
      --name <name>
                            Optional BTT name. (Default=None)
      --default             denotes whether BTT is default
      --description <description>
                            Optional BTT description. (Default=None)
      --public              denotes whether BTT is of public type
      --project-ids <project-ids> [<project-ids> ...]
                            Required to assign BTT to projects
      --metadata <key=key-name>
                            Specify a key value pairs to include in the BTT metadata S
      --backup-target-type-id <backup_target_type_id>
                            ID of the backup target type for which given projects will
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to show
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX
                            add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use the
      --fit-width           Fit the table to the display width. Implied if --max-width
      --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-add-projects
    openstack workloadmgr backup target type add projects
    # workloadmgr help  backup-target-type-add-projects
    usage: workloadmgr backup-target-type-add-projects [-h]
                                                       [-f {json,shell,table,value,yaml}]
                                                       [-c COLUMN]
                                                       [--noindent]
                                                       [--prefix PREFIX]
                                                       [--max-width <integer>]
                                                       [--fit-width] [--print-empty]
                                                       [--backup-target-type-id <backup_target_type_id>]
                                                       [--project-ids <project-ids> [<project-ids> ...]]
    
    Assign projects to existing backup target type
    
    options:
      -h, --help            show this help message and exit
      --backup-target-type-id <backup_target_type_id>
                            ID of the backup target type for which given projects
                            will be assigned
      --project-ids <project-ids> [<project-ids> ...]
                            Required to assign BTT to projects
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX
                            add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable
      --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-remove-projects
    openstack workloadmgr backup target type remove projects
    # workloadmgr help  backup-target-type-remove-projects
    usage: workloadmgr backup-target-type-remove-projects [-h]
                                                          [-f {json,shell,table,value,yaml}]
                                                          [-c COLUMN]
                                                          [--noindent]
                                                          [--prefix PREFIX]
                                                          [--max-width <integer>]
                                                          [--fit-width]
                                                          [--print-empty]
                                                          [--backup-target-type-id <backup_target_type_id>]
                                                          [--project-ids <project-ids> [<project-ids> ...]]
    
    Remove already assigned projects from backup target types
    
    options:
      -h, --help            show this help message and exit
      --backup-target-type-id <backup_target_type_id>
                            ID of the backup target type for which given projects
                            will be assigned
      --project-ids <project-ids> [<project-ids> ...]
                            Required to assign BTT to projects
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX
                            add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable  --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-add-metadata
    openstack workloadmgr backup target type add metadata
    # workloadmgr help backup-target-type-add-metadata
    usage: workloadmgr backup-target-type-add-metadata [-h]
                                                       [-f {json,shell,table,value,yaml}]
                                                       [-c COLUMN] [--noindent]
                                                       [--prefix PREFIX]
                                                       [--max-width <integer>]
                                                       [--fit-width]
                                                       [--print-empty]
                                                       [--backup-target-type-id <backup_target_type_id>]
                                                       [--metadata <key=key-name>]
    
    Add metadata to existing backup target type
    
    optional arguments:
      -h, --help            show this help message and exit
      --backup-target-type-id <backup_target_type_id>
                            ID of the backup target type for which given metadata
                            will be created
      --metadata <key=key-name>
                            Specify a key value pairs to include in the BTT
                            metadata Specify option multiple times to include
                            multiple keys. key=value
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX       add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable
      --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-remove-metadata
    openstack workloadmgr backup target type remove metadata
    # workloadmgr help backup-target-type-remove-metadata
    usage: workloadmgr backup-target-type-remove-metadata [-h]
                                                          [-f {json,shell,table,value,yaml}]
                                                          [-c COLUMN] [--noindent]
                                                          [--prefix PREFIX]
                                                          [--max-width <integer>]
                                                          [--fit-width]
                                                          [--print-empty]
                                                          [--backup-target-type-id <backup_target_type_id>]
                                                          [--metadata-keys <metadata-keys> [<metadata-keys> ...]]
    
    Remove metadata from existing backup target type
    
    optional arguments:
      -h, --help            show this help message and exit
      --backup-target-type-id <backup_target_type_id>
                            ID of the backup target type for which given projects
                            will be assigned
      --metadata-keys <metadata-keys> [<metadata-keys> ...]
                            Required to remove metadata of BTT
    
    output formatters:
      output formatter options
    
      -f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
                            the output format, defaults to table
      -c COLUMN, --column COLUMN
                            specify the column(s) to include, can be repeated to
                            show multiple columns
    
    json formatter:
      --noindent            whether to disable indenting the JSON
    
    shell formatter:
      a format a UNIX shell can parse (variable="value")
    
      --prefix PREFIX       add a prefix to all variable names
    
    table formatter:
      --max-width <integer>
                            Maximum display width, <1 to disable. You can also use
                            the CLIFF_MAX_TERM_WIDTH environment variable, but the
                            parameter takes precedence.
      --fit-width           Fit the table to the display width. Implied if --max-
                            width greater than 0. Set the environment variable
                            CLIFF_FIT_WIDTH=1 to always enable
      --print-empty         Print empty table if there is no data to show.
    
    workloadmgr backup-target-type-delete
    openstack workloadmgr backup target type delete
    # workloadmgr help backup-target-type-delete
    usage: workloadmgr backup-target-type-delete [-h] <backup_target_type_id>
    
    Delete existing backup target type
    
    positional arguments:
      <backup_target_type_id>
                            ID of the backup target type to delete.
    
    optional arguments:
      -h, --help            show this help message and exit
    

    How to configure Backup Target(s):

    How mounting works in 6.2 and later. Starting in Trilio for OpenStack 6.2, backup targets are no longer mounted statically at service startup. The actual mount/umount is performed on demand by the — on the controller for metadata operations, and on a specific compute node for snapshot/restore data transfer. Targets are unmounted automatically when no job is using them.

    6.2 — Configuring an S3 Backup Target

    --endpoint-url and --filesystem-export rules.

    • --endpoint-url is optional for AWS S3 — omit it to use the default AWS endpoint. It is required for any non-AWS S3-compatible endpoint (Ceph RGW, MinIO, Wasabi, etc.).

    6.2 — Configuring an NFS Backup Target

    Deprecated (6.1) — Static Backend Configuration

    The configuration shape described in this section applies to Trilio for OpenStack 6.1 and earlier. It is preserved here for reference for environments still running 6.1; it does not apply to 6.2+ deployments, which use Barbican-stored credentials and the Dynamic Mount Service.

    List & Show Configured BTs

    Using Horizon Dashboard

    Using CLI

    2. Backup Target Types (BTTs)

    Definition:

    Types of Backup Target Types:

    Relationship Between Backup Targets and Backup Target Types:

    Pre-created Backup Target Types

    List Available BTTs

    Using Horizon Dashboard

    Using CLI

    Show Details of a BTT

    Using Horizon Dashboard

    Using CLI

    Create a BTT

    Using Horizon Dashboard

    Using CLI

    Modify a BTT

    Modification of the Default Backup Target Type is not allowed.

    Using Horizon Dashboard

    Using CLI

    Assign/Unassign Project(s) to/from a BTT

    Project assignment is allowed only to the Private Backup Target Types.

    Using Horizon Dashboard

    Using CLI

    Add/Remove BTT Metadata

    Using Horizon Dashboard

    Using CLI

    Delete a BTT

    Removing Backup Target Types from an active Workload can lead to inconsistent behavior and potential backup operation failures.

    Using Horizon Dashboard

    Using CLI

    3. User Interaction with Backup Target Types

    How Users Choose Backup Storage:

    vault_s3_access_key_id = <S3_ACCESS_KEY_ID>
  • vault_s3_secret_access_key = <S3_SECRET_ACCESS_KEY>

  • vault_s3_bucket = <S3_BUCKET_NAME>

  • vault_storage_filesystem_export = <S3_ENDPOINT_HOSTNAME>/<S3_BUCKET_NAME> (bucket name only for AWS S3)

  • immutable = 1 if Object-Lock is enabled on the S3 bucket, otherwise 0

  • --filesystem-export takes a different form per target type:

    • AWS S3 — <bucket_name> only (e.g. my-bucket).

    • Other S3 — <s3_domain_name>/<bucket_name> (e.g. s3.example.com/my-bucket).

    • NFS — <nfs_server_ip>:<export_path> (e.g. 192.168.1.10:/export/backups).

    Metadata updates are only possible through CLI

    Dynamic Mount Service (DMS)

    Workload Policies

    Field Descriptions

    Below are some of the most common fields you will find in the request and response bodies while working with these APIs.

    Schedule Type
    Field
    Type
    Description
    Dependencies

    Hourly

    In addition to the schedule fields above, the following top-level fields apply to the policy itself:

    Field
    Type
    Description

    GET https://<wlm_api_endpoint>/workload_policy/

    Requests the list of available Workload Policies

    Parameter Name
    Description
    Name
    Type
    Description

    GET https://<wlm_api_endpoint>/workload_policy/<policy_id>

    Requests the details of a given policy

    Parameter Name
    Description
    Name
    Type
    Description

    GET https://<wlm_api_endpoint>/workload_policy/assigned/<project_id>

    Requests the lists of Policies assigned to a Project.

    Parameter Name
    Description
    Name
    Type
    Description

    POST https://<wlm_api_endpoint>/workload_policy/

    Creates a Policy with the given parameters

    Parameter Name
    Description
    Name
    Type
    Description

    PUT https://<wlm_api_endpoint>/workload_policy/<policy-id>

    Updates a Policy with the given information

    Parameter Name
    Description
    Name
    Type
    Description

    POST https://<wlm_api_endpoint>/workload_policy/<policy_id>/assign

    Updates a Policy with the given information

    Parameter Name
    Description
    Name
    Type
    Description

    DELETE https://<wlm_api_endpoint>/workload_policy/<policy_id>

    Deletes a given Policy

    Parameter Name
    Description
    Name
    Type
    Description

    interval

    Integer

    Backup interval in hours (1, 2, 3, 4, 6, 12, 24).

    if schedule enabledis set to true, you must provide Hourly field.

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Snapshot type (incremental or full).

    Daily

    backup_time

    List of String

    List of specific times (HH:MM, 24-hour format).

    Requires hourly

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Snapshot type (incremental or full).

    Weekly

    backup_day

    List of String

    Days of the week (mon, tue, wed, thu, fri, sat, sun).

    Requires daily

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Monthly

    month_backup_day

    List of Integer

    Days of the month (1-31).

    Requires daily

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Yearly

    backup_month

    List of String

    List of months (jan, feb, mar, ... dec).

    Requires monthly

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Manual

    retention

    Integer

    Retention period in backups.

    retentionmanual

    retentionmanual

    Integer

    Number of days to keep backups manually triggered.

    display_name

    String

    Name of the policy. Required on create.

    display_description

    String

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    policy_id

    ID of the Policy

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    project_id

    ID of the Project to fetch assigned policies from

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    {
       "workload_policy":{
          "field_values":{
            "start_time": "<Time format: HH:MM AM/PM>",
            "hourly": {
              "interval": "<1, 2, 3, 4, 6, 12, 24 hours>",
              "retention": "<Integer>",
              "snapshot_type": "incremental/full"
            },
            "daily": {
              "backup_time": [
                "<HH:MM 24-hour format>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "incremental/full"
            },
            "weekly": {
              "backup_day": [
                "<mon, tue, wed, thu, fri, sat, sun>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "full"
            },
            "monthly": {
              "month_backup_day": [
                "<Integer: day of the month (1-31)>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "full"
            },
            "yearly": {
              "backup_month": [
                "<jan, feb, mar, ... dec>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "full"
            },
            "manual": {
              "retention": "<Integer>"
            },
            "retentionmanual": {
              "retentionmanual": "<Integer>"
            },
            }
          },
          "display_name":"<String>",
          "display_description":"<String>",
          "email":"<String>",
          "metadata":{
             <key>:<value>
          }
       }
    }

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    policy_id

    ID of the Policy

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    {
       "workload_policy":{
          "field_values":{
            "start_time": "<Time format: HH:MM AM/PM>",
            "hourly": {
              "interval": "<1, 2, 3, 4, 6, 12, 24 hours>",
              "retention": "<Integer>",
              "snapshot_type": "incremental/full"
            },
            "daily": {
              "backup_time": [
                "<HH:MM 24-hour format>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "incremental/full"
            },
            "weekly": {
              "backup_day": [
                "<mon, tue, wed, thu, fri, sat, sun>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "full"
            },
            "monthly": {
              "month_backup_day": [
                "<Integer: day of the month (1-31)>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "full"
            },
            "yearly": {
              "backup_month": [
                "<jan, feb, mar, ... dec>"
              ],
              "retention": "<Integer>",
              "snapshot_type": "full"
            },
            "manual": {
              "retention": "<Integer>",
            },
            "retentionmanual": {
              "retentionmanual": "<Integer>"
            },
          },
          "display_name":"<String>",
          "display_description":"<String>",
          "email":"<String>",
          "metadata":{
             <key>:<value>
          }
       }
    }

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    policy_id

    ID of the Policy

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    {
       "policy":{
          "remove_projects":[
             "<project_id>"
          ],
          "add_projects":[
             "<project_id>",
          ]
       }
    }

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    policy_id

    ID of the Policy

    X-Auth-Project-Id

    string

    Project to authenticate against

    X-Auth-Token

    string

    List Policies

    Path Parameters

    Headers

    Sample Response

    Show Policy

    Path Parameters

    Headers

    Sample Response

    List Assigned Policies

    Path Parameters

    Headers

    Sample Response

    Create Policy

    Path Parameters

    Headers

    Body Format

    email is optional. When provided, snapshot and restore notification emails for workloads assigned to this policy are also sent to this address. This requires E-Mail notifications to be enabled in the Backups-Admin settings.

    Sample Request
    Sample Response

    Update Policy

    Path Parameters

    Headers

    Body Format

    Sample Response

    Assign Policy

    Path Parameters

    Headers

    Body Format

    Sample Response

    Delete Policy

    Path Parameters

    Headers

    Sample Response

    Description of the policy.

    email

    String

    Optional email address associated with the policy. When set, snapshot and restore notification emails for workloads assigned to this policy are also sent to this address. Requires E-Mail notifications to be enabled.

    metadata

    Object

    Key-value pairs attached to the policy.

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    HTTP/1.1 200 OK
    x-compute-request-id: req-199f171f-b6fe-4172-8408-b069da3cfe19
    content-type: application/json
    content-length: 7615
    date: Wed, 29 Jan 2025 09:39:36 GMT
    {
      "policy_list": [
        {
          "id": "d29cb349-1953-405d-8f16-301da9c7bc84",
          "created_at": "2025-01-29T09:45:47.000000",
          "updated_at": "2025-01-29T09:45:47.000000",
          "status": "available",
          "name": "policy_api",
          "description": "",
          "email": null,
          "metadata": [
            
          ],
          "field_values": [
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "134a9886-1621-4c51-9951-456b8ed578af",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "start_time",
              "value": "12:00 AM"
            },
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "3de049cf-cb50-4c7f-82ff-88b5c256251f",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "daily",
              "value": {
                "backup_time": "['01:00']",
                "retention": 7,
                "snapshot_type": "incremental"
              }
            },
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "5e7146cc-4bdf-4b69-8c0d-77146b9b432c",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "yearly",
              "value": {
                "backup_month": "['mar']",
                "retention": 1,
                "snapshot_type": "full"
              }
            },
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "6ecaea3d-206d-4083-8d00-8fdea340d198",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "manual",
              "value": {
                "retention": 30
              }
            },
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "7f85955b-2079-4408-95a4-339e235526a9",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "retentionmanual",
              "value": {
                "retentionmanual": 30
              }
            },
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "b87eb463-2ed1-4869-92bc-256d09767d4d",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "monthly",
              "value": {
                "month_backup_day": "['3']",
                "retention": 12,
                "snapshot_type": "full"
              }
            },
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "ce970c60-b38d-4b6a-82d6-a2d1b9948947",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "hourly",
              "value": {
                "interval": "1",
                "retention": 3,
                "snapshot_type": "incremental"
              }
            },
            {
              "created_at": "2025-01-29T09:45:47.000000",
              "updated_at": null,
              "deleted_at": null,
              "deleted": false,
              "version": "6.0.20",
              "id": "fadef33d-9565-47f2-8180-37fadd967203",
              "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
              "policy_field_name": "weekly",
              "value": {
                "backup_day": "['mon']",
                "retention": 7,
                "snapshot_type": "full"
              }
            }
          ]
        }
      ]
    }
    HTTP/1.1 200 OK
    x-compute-request-id: req-d4ffd8c4-5f20-4b74-bba9-9243964b0a61
    content-type: application/json
    content-length: 3237
    date: Wed, 29 Jan 2025 09:54:09 GMT
    
    {
      "policy": {
        "id": "d29cb349-1953-405d-8f16-301da9c7bc84",
        "created_at": "2025-01-29T09:45:47.000000",
        "updated_at": "2025-01-29T09:45:47.000000",
        "user_id": "6bbb210a29a043af86b7b0c667747187",
        "project_id": "dee550d3df5b497ca2e05044616bc8b1",
        "status": "available",
        "name": "policy_api",
        "description": "",
        "email": null,
        "field_values": [
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "134a9886-1621-4c51-9951-456b8ed578af",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "start_time",
            "value": "12:00 AM"
          },
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "3de049cf-cb50-4c7f-82ff-88b5c256251f",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "daily",
            "value": {
              "backup_time": "['01:00']",
              "retention": 7,
              "snapshot_type": "incremental"
            }
          },
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "5e7146cc-4bdf-4b69-8c0d-77146b9b432c",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "yearly",
            "value": {
              "backup_month": "['mar']",
              "retention": 1,
              "snapshot_type": "full"
            }
          },
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "6ecaea3d-206d-4083-8d00-8fdea340d198",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "manual",
            "value": {
              "retention": 30
            }
          },
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "7f85955b-2079-4408-95a4-339e235526a9",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "retentionmanual",
            "value": {
              "retentionmanual": 30
            }
          },
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "b87eb463-2ed1-4869-92bc-256d09767d4d",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "monthly",
            "value": {
              "month_backup_day": "['3']",
              "retention": 12,
              "snapshot_type": "full"
            }
          },
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "ce970c60-b38d-4b6a-82d6-a2d1b9948947",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "hourly",
            "value": {
              "interval": "1",
              "retention": 3,
              "snapshot_type": "incremental"
            }
          },
          {
            "created_at": "2025-01-29T09:45:47.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "fadef33d-9565-47f2-8180-37fadd967203",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "policy_field_name": "weekly",
            "value": {
              "backup_day": "['mon']",
              "retention": 7,
              "snapshot_type": "full"
            }
          }
        ],
        "metadata": [
          
        ],
        "policy_assignments": [
          {
            "created_at": "2025-01-29T09:49:41.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "0d3f0678-4cce-4e6c-9b47-9a4a475a9b1d",
            "policy_id": "d29cb349-1953-405d-8f16-301da9c7bc84",
            "project_id": "dee550d3df5b497ca2e05044616bc8b1",
            "policy_name": "policy_api",
            "project_name": "cloudproject"
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Tue, 17 Nov 2020 09:14:01 GMT
    Content-Type: application/json
    Content-Length: 338
    Connection: keep-alive
    X-Compute-Request-Id: req-57175488-d267-4dcb-90b5-f239d8b02fe2
    
    {
       "policies":[
          {
             "created_at":"2020-10-29T15:39:13.000000",
             "updated_at":null,
             "deleted_at":null,
             "deleted":false,
             "version":"4.0.115",
             "id":"8b4a6236-63f1-4e2d-b8d1-23b37f4b4346",
             "policy_id":"b79aa5f3-405b-4da4-96e2-893abf7cb5fd",
             "project_id":"c76b3355a164498aa95ddbc960adc238",
             "policy_name":"Gold",
             "project_name":"robert"
          }
       ]
    }
    {
      "workload_policy": {
        "display_name": "Api_policy_test",
        "display_description": "No description",
        "email": "backup-admin@example.com",
        "field_values": {
          "start_time": "10:00 AM",
          "hourly": {
            "interval": "1",
            "retention": "2",
            "snapshot_type": "incremental"
          },
          "daily": {
            "backup_time": [
              "11:40"
            ],
            "retention": "2",
            "snapshot_type": "incremental"
          },
          "weekly": {
            "backup_day": [
              "fri"
            ],
            "retention": "2",
            "snapshot_type": "incremental"
          },
          "monthly": {
            "month_backup_day": [
              "1"
            ],
            "snapshot_type": "full"
          },
          "yearly": {
            "backup_month": [
              "mar"
            ],
            "retention": "1",
            "snapshot_type": "full"
          },
          "manual": {
              "retention": "4",
            },
            "retentionmanual": {
              "retentionmanual": "5", 
            },
        },
        "metadata": {
          
        }
      }
    }
    HTTP/1.1 200 OK
    x-compute-request-id: req-538517fb-aca0-4abc-9dc7-ef1ee2af1cd7
    content-type: application/json
    content-length: 2943
    date: Wed, 29 Jan 2025 10:23:38 GMT
    
    {
      "policy": {
        "id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
        "created_at": "2025-01-29T10:23:38.000000",
        "updated_at": "2025-01-29T10:23:38.000000",
        "status": "available",
        "name": "Api_policy_test",
        "description": "No description",
        "email": "backup-admin@example.com",
        "metadata": [
          
        ],
        "field_values": [
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "0492f64e-175b-4f8f-91da-e5986d3b9118",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "retentionmanual",
            "value": "V4\np0\n."
          },
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "273f07f1-fa68-4883-aec9-8873095d9e0e",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "daily",
            "value": "(dp0\nVbackup_time\np1\n(lp2\nV11:40\np3\nasVretention\np4\nV2\np5\nsVsnapshot_type\np6\nVincremental\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "31432273-d82c-4ea7-802b-353f818b6926",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "yearly",
            "value": "(dp0\nVbackup_month\np1\n(lp2\nVmar\np3\nasVretention\np4\nV1\np5\nsVsnapshot_type\np6\nVfull\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "4ef22bcd-4b7a-4dac-9c02-1b41ec443778",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "start_time",
            "value": "V10:00 AM\np0\n."
          },
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "58a13a57-08c3-457a-a912-0217c58ac351",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "hourly",
            "value": "(dp0\nVinterval\np1\nV1\np2\nsVretention\np3\nV2\np4\nsVsnapshot_type\np5\nVincremental\np6\ns."
          },
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "979fc748-9434-46a8-8613-24524954ba6e",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "weekly",
            "value": "(dp0\nVbackup_day\np1\n(lp2\nVfri\np3\nasVretention\np4\nV2\np5\nsVsnapshot_type\np6\nVincremental\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "cad874e6-9960-47a8-a904-25161c7704ee",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "monthly",
            "value": "(dp0\nVmonth_backup_day\np1\n(lp2\nV1\np3\nasVsnapshot_type\np4\nVfull\np5\ns."
          },
          {
            "created_at": "2025-01-29T10:23:38.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "f1670b32-0a3b-4876-a51c-14c24f999eab",
            "policy_id": "43885a4d-f9c6-42fd-a8c4-2d1816dbd88d",
            "policy_field_name": "manual",
            "value": "V4\np0\n."
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    x-compute-request-id: req-9c7473ce-468c-4688-b061-a761258f7c5e
    content-type: application/json
    content-length: 3013
    date: Wed, 29 Jan 2025 10:37:40 GMT
    
    {
      "policy": {
        "id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
        "created_at": "2025-01-29T10:21:11.000000",
        "updated_at": "2025-01-29T10:21:11.000000",
        "status": "available",
        "name": "Api_update_policy",
        "description": "No description",
        "email": "backup-admin@example.com",
        "metadata": [
          
        ],
        "field_values": [
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": "2025-01-29T10:36:59.000000",
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "36c76a9b-3599-409c-b226-c59a981d5693",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "hourly",
            "value": "(dp0\nVinterval\np1\nV2\np2\nsVretention\np3\ng2\nsVsnapshot_type\np4\nVincremental\np5\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "44633679-9fdf-4fe0-84e9-0e364cee8d02",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "monthly",
            "value": "(dp0\nVmonth_backup_day\np1\n(lp2\nV1\np3\nasVsnapshot_type\np4\nVfull\np5\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": "2025-01-29T10:36:59.000000",
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "8ddfa5a3-ae39-4430-a474-9074ea3fefbc",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "daily",
            "value": "(dp0\nVbackup_time\np1\n(lp2\nV13:00\np3\nasVretention\np4\nV2\np5\nsVsnapshot_type\np6\nVincremental\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "a0944765-93bd-487a-9dd2-6a756fab1d2f",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "weekly",
            "value": "(dp0\nVbackup_day\np1\n(lp2\nVfri\np3\nasVretention\np4\nV2\np5\nsVsnapshot_type\np6\nVincremental\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": "2025-01-29T10:36:59.000000",
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "ac6267c5-1923-4d24-b911-61427acfdc8b",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "start_time",
            "value": "V11:00 AM\np0\n."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "b945acdd-3780-4494-b63c-42474ea65c24",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "manual",
            "value": "V4\np0\n."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "bad15c15-5eb2-4b4b-8597-639a8c27b947",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "yearly",
            "value": "(dp0\nVbackup_month\np1\n(lp2\nVmar\np3\nasVretention\np4\nV1\np5\nsVsnapshot_type\np6\nVfull\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "cf900224-2b21-4b29-9118-99ec3151d891",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "retentionmanual",
            "value": "V4\np0\n."
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    x-compute-request-id: req-a8569cd2-05a2-45ce-bae5-41a214759ff8
    content-type: application/json
    content-length: 3831
    date: Wed, 29 Jan 2025 10:44:56 GMT
    
    {
      "policy": {
        "id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
        "created_at": "2025-01-29T10:21:11.000000",
        "updated_at": "2025-01-29T10:21:11.000000",
        "user_id": "6bbb210a29a043af86b7b0c667747187",
        "project_id": "dee550d3df5b497ca2e05044616bc8b1",
        "status": "available",
        "name": "Api_update_policy",
        "description": "No description",
        "email": "backup-admin@example.com",
        "field_values": [
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": "2025-01-29T10:36:59.000000",
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "36c76a9b-3599-409c-b226-c59a981d5693",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "hourly",
            "value": "(dp0\nVinterval\np1\nV2\np2\nsVretention\np3\ng2\nsVsnapshot_type\np4\nVincremental\np5\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "44633679-9fdf-4fe0-84e9-0e364cee8d02",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "monthly",
            "value": "(dp0\nVmonth_backup_day\np1\n(lp2\nV1\np3\nasVsnapshot_type\np4\nVfull\np5\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": "2025-01-29T10:36:59.000000",
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "8ddfa5a3-ae39-4430-a474-9074ea3fefbc",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "daily",
            "value": "(dp0\nVbackup_time\np1\n(lp2\nV13:00\np3\nasVretention\np4\nV2\np5\nsVsnapshot_type\np6\nVincremental\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "a0944765-93bd-487a-9dd2-6a756fab1d2f",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "weekly",
            "value": "(dp0\nVbackup_day\np1\n(lp2\nVfri\np3\nasVretention\np4\nV2\np5\nsVsnapshot_type\np6\nVincremental\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": "2025-01-29T10:36:59.000000",
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "ac6267c5-1923-4d24-b911-61427acfdc8b",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "start_time",
            "value": "V11:00 AM\np0\n."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "b945acdd-3780-4494-b63c-42474ea65c24",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "manual",
            "value": "V4\np0\n."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "bad15c15-5eb2-4b4b-8597-639a8c27b947",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "yearly",
            "value": "(dp0\nVbackup_month\np1\n(lp2\nVmar\np3\nasVretention\np4\nV1\np5\nsVsnapshot_type\np6\nVfull\np7\ns."
          },
          {
            "created_at": "2025-01-29T10:21:11.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "cf900224-2b21-4b29-9118-99ec3151d891",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "policy_field_name": "retentionmanual",
            "value": "V4\np0\n."
          }
        ],
        "metadata": [
          
        ],
        "policy_assignments": [
          {
            "created_at": "2025-01-29T10:44:56.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "2177bf6e-116f-45fc-986b-3d20f7084fc7",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "project_id": "c532c5b669304d20bbe9e2157986757c",
            "policy_name": "Api_update_policy",
            "project_name": "AP_test"
          },
          {
            "created_at": "2025-01-29T10:43:28.000000",
            "updated_at": null,
            "deleted_at": null,
            "deleted": false,
            "version": "6.0.20",
            "id": "5b3b445b-e4dd-4381-84cd-c90bdda0b7e7",
            "policy_id": "d3b638c6-d26e-4949-8493-18a4df3123bf",
            "project_id": "dee550d3df5b497ca2e05044616bc8b1",
            "policy_name": "Api_update_policy",
            "project_name": "cloudproject"
          }
        ]
      },
      "failed_ids": [
        
      ]
    }
    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Tue, 17 Nov 2020 09:56:03 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 0
    Connection: keep-alive

    Backup Targets

    This page contains the API guide for various operations on Backup Targets and Backup Target Types.


    Backup Targets

    Create Backup Target

    Creates the backup target

    POST https://<wlm_api_endpoint>/backup_targets

    Input Parameters:

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Updates an existing backup target. Only the credential / mount-option fields can be modified; type, endpoint, and bucket are immutable after create.

    • For S3 targets, pass a new secret_ref to rotate the Barbican-stored credentials. The new secret_ref is normalized against the Barbican endpoint in the service catalog and validated before being stored.

    • For NFS targets, pass nfs_mount_opts to change the mount options used at mount time.

    PUT https://<wlm_api_endpoint>/backup_targets/<backup_target_id>

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Deleting an existing backup target

    DELETE https://<wlm_api_endpoint>/backup_targets/<backup_target_id>

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Provides the list of all backup targets

    GET https://<wlm_api_endpoint>/backup_targets

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Provides a detailed list of all backup targets

    GET https://<wlm_api_endpoint>/backup_targets/detail

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Show Details of a Backup Target

    Provides all details of a specific backup target

    GET https://<wlm_api_endpoint>/backup_targets/<backup_target_id>

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Sets the given Backup target as default

    GET https://<wlm_api_endpoint>/backup_targets/<backup_target_id>/set_default

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Provides a detailed list of all backup target types

    GET https://<wlm_api_endpoint>/backup_target_types/detail

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Provides all details of a specific backup target type

    GET https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Creates the backup target type

    POST https://<wlm_api_endpoint>/backup_target_types

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Update an existing backup target type

    PUT https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Add projects to an existing backup target type

    POST https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>/add_projects

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Add projects to an existing backup target type

    PUT https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>/remove_projects

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Adds metadata to an existing backup target type

    POST https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>/add_metadata

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Removes metadata from an existing backup target type

    PUT https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>/remove_metadata

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Body Format:

    Deleting an existing backup target type

    DELETE https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>

    Path:

    Parameter Name
    Description

    Headers:

    Header Name
    Value/Description

    Workloads

    Below are some of the most common fields you will find in the request and response bodies while working with these APIs.

    Field
    Type
    Description

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    User-Agent

    python-workloadmgrclient

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    backup_target_id

    Id of the Backup Target to be modified

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgrservice

    backup_target_id

    Id of the required Backup Target

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    backup_target_id

    ID of the Backup Target to be fetched

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgrservice

    backup_target_id

    Id of the required Backup Target

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    backup_target_type_id

    ID of the Backup Target Type to be fetched

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    backup_target_type_id

    Id of the Backup Target Type to be modified

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgrservice

    backup_target_type_id

    Id of the required Backup Target Type

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgrservice

    backup_target_type_id

    Id of the required Backup Target Type

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgrservice

    backup_target_type_id

    Id of the required Backup Target Type

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgrservice

    backup_target_type_id

    Id of the required Backup Target Type

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    wlm_api_endpoint

    The endpoint URL of the Workloadmgrservice

    backup_target_type_id

    Id of the required Backup Target Type

    X-Auth-Project-Id

    Project ID to run the authentication against

    X-Auth-Token

    Authentication token to use

    Accept

    6.2 and later: S3 credentials are not sent in the request body. Instead, store the access key, secret key, bucket, and endpoint in an OpenStack Barbican secret and pass the secret's URL as secret_ref. See Backup Targets — admin guide for the required Barbican payload shape and worked examples. The Dynamic Mount Service (DMS) retrieves the credentials from Barbican at mount time.

    Status field. Starting in 6.2, mount state on a backup target is owned by the Dynamic Mount Service rather than by node-local startup logic. Treat the status field as read-only from the client side. The status reflects backend reachability only and takes one of two values: online (the backup-target endpoint is reachable — NFS server responds to rpcinfo or the S3 endpoint accepts a TCP connection) or offline (the endpoint cannot be reached). Local mount state does not affect status; mounts are performed on demand by DMS at backup/restore time, so a reachable target that is not currently mounted is still reported as online.

    Deprecated (6.1) — Request body without secret_ref

    In Trilio for OpenStack 6.1 and earlier, S3 access credentials were submitted directly in the create-backup-target request body and the secret_ref/nfs_mount_opts fields did not exist. The 6.1 request body shape was:

    This shape is deprecated in 6.2. New deployments must use secret_ref (S3) and nfs_mount_opts (NFS) as documented above. 6.1-shape requests are not accepted by 6.2 wlm-api.

    Sample Response

    Update a Backup Target

    Input Parameters:

    6.2 and later: Updating a backup target is the supported way to rotate S3 credentials — store the new access key, secret key, bucket, and endpoint in a fresh OpenStack Barbican secret and PUT its URL as secret_ref. The old Barbican secret is not touched by this call and should be deleted separately once no in-flight job references it. The next mount issued by the Dynamic Mount Service (DMS) will pick up the new credentials.

    Sample Response

    Delete a Backup Target

    Removing Backup Target from an active Workload can lead to inconsistent behavior and potential backup operation failures.

    Input Parameters:

    Sample Response

    List Backup Targets

    Input Parameters:

    Sample Response

    Detailed List of all Backup Targets

    Parameters:

    Sample Response

    Parameters:

    Sample Response

    Backup Target Set Default

    Input Parameters:

    Sample Response

    Detailed List of all Backup Target Types

    Parameters:

    Sample Response

    Show Details of a Backup Target Type

    Parameters:

    Sample Response

    Create a Backup Target Type

    Input Parameters:

    Sample Response

    Update the backup target type

    Input Parameters:

    Sample Response

    Assign Projects to a Backup Target Type

    Input Parameters:

    Sample Response

    Remove Assigned Projects from a Backup Target Type

    Input Parameters:

    Sample Response

    Add Metadata to Backup Target Type

    Input Parameters:

    Sample Response

    Remove Metadata from a Backup Target Type

    Input Parameters:

    Sample Response

    Delete a Backup Target Type

    Removing Backup Target Types from an active Workload can lead to inconsistent behavior and potential backup operation failures.

    Input Parameters:

    Sample Response

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    application/json

    {
        "backup_target" :
        {
            "s3_endpoint_url": <s3 endpint url>,
            "s3_bucket": <s3 bucket name>,
            "filesystem_export": <filesystem export required for NFS type>,
            "type": <Backup Target type Eg. nfs, s3>,
            "is_default": <integer value 0|1 to specify if default or non-default>,
            "btt_name": <Backup Target Type name, using filesystem_export if not provided>,
            "immutable": <integer value 0|1 to specify if s3 Backup Target has object locked enabled>,
            "secret_ref": <Barbican secret URL holding the S3 access credentials, required for type=s3>,
            "nfs_mount_opts": <NFS mount options string, required for type=nfs>,
            "metadata": <dictionary of key-value pair denotes metadata of backup target>
        }
    }
    {
        "backup_target" :
        {
            "secret_ref": <Barbican secret URL holding the S3 access credentials, applies to type=s3>,
            "nfs_mount_opts": <NFS mount options string, applies to type=nfs>
        }
    }
    {
        "backup_target_type" :
        {
            "name": <name of the backup target type>,
            "description": <description of backup target type>,
            "backup_targets_id": <ID of the backup target>,
            "is_default": <integer value 0|1 to specify if default or non-default>,
            "is_public": <integer value 0|1 to specify if public or non-public>,
            "project_list": [
                <list of project IDs on which backup target type will be assigned>
            ],
            "metadata": [
                <list of dictionaries of key-value pair >
                {
                    "key":<meta-key>,
                    "value":<meta-value>
                },
            ]
        }
    }
    {
        "backup_target_type" :
        {
            "name": <name of the backup target type>,
            "description": <description of backup target type>,
            "is_default": <integer value 0|1 to specify if default or non-default>,
            "is_public": <integer value 0|1 to specify if public or non-public>,
            "project_list": [
                <list of project IDs on which backup target type will be assigned>
            ],
            "purge_projects": True <if All the assigned projects need to be purged>,
            "metadata": [
                <list of dictionaries of key-value pair >
                {
                    "key":<meta-key>,
                    "value":<meta-value>
                },
            ],
            "purge_metadata": True <if All the metadata needs to be purged>
        }
    }
    {
        "backup_target_type" :
        {
            "backup_target_type_id": <ID of the backup target type>,
            "project_list": [
                <list of project IDs on which backup target type will be assigned>
                ]
            }
    }
    {
        "backup_target_type" :
        {
            "backup_target_type_id": <ID of the backup target type>,
            "project_list": [
                <list of assigned project IDs that needs to be unassigned>
                ]
            }
    }
    {
        "backup_target_type" :
        {
            "backup_target_type_id": <ID of the backup target type>,
            "metadata": [
                <list of dictionaries of key-value pair to be added >
                {
                    "key":<meta-key>,
                    "value":<meta-value>
                },
            ],
            }
    }
    {
        "backup_target_type" :
        {
            "backup_target_type_id": <ID of the backup target type>,
            "metadata": [
                <list of dictionaries of key-value pair to be removed >
                {
                    "key":<meta-key>,
                    "value":<meta-value>
                },
            ],
            }
    }
    {
        "backup_target" :
        {
            "s3_endpoint_url": <s3 endpoint url>,
            "s3_bucket": <s3 bucket name>,
            "s3_access_key_id": <s3 access key id>,
            "s3_secret_access_key": <s3 secret access key>,
            "filesystem_export": <filesystem export required for NFS type>,
            "type": <Backup Target type Eg. nfs, s3>,
            "is_default": <integer value 0|1 to specify if default or non-default>,
            "btt_name": <Backup Target Type name, using filesystem_export if not provided>,
            "immutable": <integer value 0|1 to specify if s3 Backup Target has object locked enabled>,
            "metadata": <dictionary of key-value pair denotes metadata of backup target>
        }
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:25:14 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '430'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-5730cced-949b-4567-827e-8349a023e716'
    
    {"backup_targets": {"id": "4720baae-5422-466d-a4b2-a4a2c94400f3", "type": "s3", "created_at": "2025-01-30T12:32:27.000000", "updated_at": "2025-01-30T12:32:27.000000", "version": "5.2.8.15", "filesystem_export": "cephs3.triliodata.demo/object-locked-cephs3-2", "filesystem_export_mount_path": "/var/trilio/triliovault-mounts/Y2VwaHMzLnRyaWxpb2RhdGEuZGVtby9vYmplY3QtbG9ja2VkLWNlcGhzMy0y", "is_default": false, "capacity": null, "used": null, "status": "offline", "backup_target_types": [{"created_at": "2025-01-30T12:32:27.000000", "updated_at": null, "version": "5.2.8.15", "user_id": "a62bf1546cdf4b02a3fc08b7aad79acb", "name": "cephs3.triliodata.demo/object-locked-cephs3-2", "description": null, "is_public": true, "is_default": false}], "backup_target_metadata": []}}
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:27:49 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '432'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-14b39336-bc84-414a-a128-1d71e7dfb3cf'
    
    {"backup_targets": {"id": "4720baae-5422-466d-a4b2-a4a2c94400f3", "type": "s3", "created_at": "2025-01-30T12:32:27.000000", "updated_at": "2025-01-30T12:35:02.000000", "version": "6.2.0", "filesystem_export": "cephs3.triliodata.demo/object-locked-cephs3-2", "filesystem_export_mount_path": "/var/trilio/triliovault-mounts/Y2VwaHMzLnRyaWxpb2RhdGEuZGVtby9vYmplY3QtbG9ja2VkLWNlcGhzMy0y", "is_default": false, "capacity": null, "used": null, "status": "online", "secret_ref": "https://barbican.example.com/v1/secrets/abcd1234-5678-90ab-cdef-1234567890ab", "backup_target_types": [{"created_at": "2025-01-30T12:32:27.000000", "updated_at": null, "version": "6.2.0", "user_id": "a62bf1546cdf4b02a3fc08b7aad79acb", "name": "cephs3.triliodata.demo/object-locked-cephs3-2", "description": null, "is_public": true, "is_default": false}], "backup_target_metadata": []}}
    HTTP/1.1 202 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Thu, 30 Jan 2025 13:04:32 GMT'
    'Content-Type': 'text/html; charset=UTF-8'
    'Content-Length': '0'
    'Connection': 'keep-alive'
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:15:16 GMT',
    'Content-Type': 'application/json',
    'Content-Length': '1808',
    'Connection': 'keep-alive',
    'X-Compute-Request-Id': 'req-739464e0-3b84-4e94-866a-f34476915a38'
    {
      "backup_targets": [
        {
          "id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
          "type": "nfs",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "nfs_export": "192.168.1.34:/mnt/tvault/162",
          "nfs_export_mount_path": "/var/triliovault-mounts/L21udC90dmF1bHQvMTYy",
          "is_default": true,
          "capacity": "2.4 TB",
          "used": "1.2 TB",
          "status": "available",
          "backup_target_types": [
            {
              "created_at": "2024-03-04T10:59:51.000000",
              "updated_at": null,
              "version": "5.0.204",
              "user_id": null,
              "name": "nfs_1",
              "description": null,
              "is_public": true,
              "is_default": true
            }
          ]
        },
        {
          "id": "2af5f2db-3267-453f-bc57-19884837e274",
          "type": "s3",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "nfs_export": "https://cephs3.triliodata.demo/trilio-qamanual",
          "nfs_export_mount_path": "/var/triliovault-mounts/Y2VwaHMzLnRyaWxpb2RhdGEuZGVtby90cmlsaW8tcWFtYW51YWw=",
          "is_default": false,
          "capacity": null,
          "used": null,
          "status": "offline",
          "backup_target_types": [
            {
              "created_at": "2024-03-04T10:59:51.000000",
              "updated_at": null,
              "version": "5.0.204",
              "user_id": null,
              "name": "s3_2",
              "description": null,
              "is_public": true,
              "is_default": false
            }
          ]
        },
        {
          "id": "1fd7af34-d723-428d-90f5-35d31bf24884",
          "type": "nfs",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "nfs_export": "192.168.1.34:/mnt/tvault/tvm",
          "nfs_export_mount_path": "/var/triliovault-mounts/L21udC90dmF1bHQvdHZt",
          "is_default": false,
          "capacity": "2.4 TB",
          "used": "1.2 TB",
          "status": "available",
          "backup_target_types": [
            {
              "created_at": "2024-03-04T10:59:51.000000",
              "updated_at": null,
              "version": "5.0.204",
              "user_id": null,
              "name": "nfs_2",
              "description": null,
              "is_public": true,
              "is_default": false
            }
          ]
        }
      ]
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:15:16 GMT',
    'Content-Type': 'application/json',
    'Content-Length': '1808',
    'Connection': 'keep-alive',
    'X-Compute-Request-Id': 'req-739464e0-3b84-4e94-866a-f34476915a38'
    {
      "backup_targets": [
        {
          "id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
          "type": "nfs",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "nfs_export": "192.168.1.34:/mnt/tvault/162",
          "nfs_export_mount_path": "/var/triliovault-mounts/L21udC90dmF1bHQvMTYy",
          "is_default": true,
          "capacity": "2.4 TB",
          "used": "1.2 TB",
          "status": "available",
          "backup_target_types": [
            {
              "created_at": "2024-03-04T10:59:51.000000",
              "updated_at": null,
              "version": "5.0.204",
              "user_id": null,
              "name": "nfs_1",
              "description": null,
              "is_public": true,
              "is_default": true
            }
          ]
        },
        {
          "id": "2af5f2db-3267-453f-bc57-19884837e274",
          "type": "s3",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "nfs_export": "https://cephs3.triliodata.demo/trilio-qamanual",
          "nfs_export_mount_path": "/var/triliovault-mounts/Y2VwaHMzLnRyaWxpb2RhdGEuZGVtby90cmlsaW8tcWFtYW51YWw=",
          "is_default": false,
          "capacity": null,
          "used": null,
          "status": "offline",
          "backup_target_types": [
            {
              "created_at": "2024-03-04T10:59:51.000000",
              "updated_at": null,
              "version": "5.0.204",
              "user_id": null,
              "name": "s3_2",
              "description": null,
              "is_public": true,
              "is_default": false
            }
          ]
        },
        {
          "id": "1fd7af34-d723-428d-90f5-35d31bf24884",
          "type": "nfs",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "nfs_export": "192.168.1.34:/mnt/tvault/tvm",
          "nfs_export_mount_path": "/var/triliovault-mounts/L21udC90dmF1bHQvdHZt",
          "is_default": false,
          "capacity": "2.4 TB",
          "used": "1.2 TB",
          "status": "available",
          "backup_target_types": [
            {
              "created_at": "2024-03-04T10:59:51.000000",
              "updated_at": null,
              "version": "5.0.204",
              "user_id": null,
              "name": "nfs_2",
              "description": null,
              "is_public": true,
              "is_default": false
            }
          ]
        }
      ]
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:21:14 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '600'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-0b298919-f2e8-4c50-aa55-ce88b4569f2a'
    {
      "backup_targets": {
        "id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
        "type": "nfs",
        "created_at": "2024-03-04T10:59:51.000000",
        "updated_at": "2024-03-04T10:59:51.000000",
        "version": "5.0.204",
        "nfs_export": "192.168.1.34:/mnt/tvault/162",
        "nfs_export_mount_path": "/var/triliovault-mounts/L21udC90dmF1bHQvMTYy",
        "is_default": true,
        "capacity": "2.4 TB",
        "used": "1.2 TB",
        "status": "available",
        "backup_target_types": [
          {
            "created_at": "2024-03-04T10:59:51.000000",
            "updated_at": null,
            "version": "5.0.204",
            "user_id": null,
            "name": "nfs_1",
            "description": null,
            "is_public": true,
            "is_default": true
          }
        ]
      }
    }
    'x-compute-request-id': 'req-295c03f7-8dfb-4b72-a654-9f06a51d9b0c'
    'content-type': 'application/json'
    'content-length': '911'
    'date': 'Tue, 04 Feb 2025 14:19:05 GMT'
    
    {"backup_targets": {"id": "0dcc632a-aed7-45ab-a40e-7cc2deae3994", "type": "s3", "created_at": "2025-02-04T10:43:37.000000", "updated_at": "2025-02-04T10:43:37.000000", "version": "5.2.8.15", "filesystem_export": "cephs3.triliodata.demo/object-locked-cephs3-2", "filesystem_export_mount_path": "/var/trilio/triliovault-mounts/Y2VwaHMzLnRyaWxpb2RhdGEuZGVtby9vYmplY3QtbG9ja2VkLWNlcGhzMy0y", "is_default": true, "capacity": null, "used": null, "status": "offline", "backup_target_types": [{"created_at": "2025-02-04T10:43:37.000000", "updated_at": "2025-02-04T14:19:05.000000", "version": "5.2.8.15", "user_id": "a62bf1546cdf4b02a3fc08b7aad79acb", "name": "cephs3.triliodata.demo/object-locked-cephs3-2", "description": null, "is_public": true, "is_default": true}], "backup_target_metadata": [{"key": "bucket", "value": "s3-object-lock"}, {"key": "immutable", "value": "1"}, {"key": "object_lock", "value": "1"}]}}```
    
    </details>
    
    ***
    
    ## Backup Target Types: <a href="#backup-target-types" id="backup-target-types"></a>
    
    ### **List Backup Target Types**&#x20;
    
    Provides the list of all backup target types
    
    &#x20;<mark style="color:green;">`GET`</mark> `https://<wlm_api_endpoint>/backup_target_types`&#x20;
    
    #### Input Parameters:
    
    Path:
    
    <table><thead><tr><th width="219">Parameter Name</th><th>Description</th></tr></thead><tbody><tr><td>wlm_api_endpoint</td><td>The endpoint URL of the <code>Workloadmgr</code> service</td></tr></tbody></table>
    
    Headers:
    
    | Header Name       | Value/Description                             |
    | ----------------- | --------------------------------------------- |
    | X-Auth-Project-Id |  Project ID to run the authentication against |
    | X-Auth-Token      | Authentication token to use                   |
    | Accept            | `application/json`                            |
    | User-Agent        | `python-workloadmgrclient`                    |
    
    <details>
    
    <summary>Sample Response</summary>
    
    ```json5
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:29:09 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '1628'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-dd23df0a-37a6-4769-882a-40e67431d997'
    {
      "backup_target_types": [
        {
          "id": "13dd2bf2-12c5-4eb8-98a3-0f1dd9f8579f",
          "backup_targets_id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "user_id": null,
          "name": "nfs_1",
          "is_default": true,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": []
        },
        {
          "id": "51f11fc5-854b-4cb7-9b64-0a0ace33b0d5",
          "backup_targets_id": "1fd7af34-d723-428d-90f5-35d31bf24884",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "user_id": null,
          "name": "nfs_2",
          "is_default": false,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": []
        },
        {
          "id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
          "backup_targets_id": "2af5f2db-3267-453f-bc57-19884837e274",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "user_id": null,
          "name": "s3_2",
          "is_default": false,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": []
        },
        {
          "id": "fdae1b10-9852-4c68-8879-64ead0aed31b",
          "backup_targets_id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
          "created_at": "2024-03-13T10:25:14.000000",
          "updated_at": "2024-03-13T10:25:14.000000",
          "version": "5.0.204",
          "user_id": "2b1189be3add4806bcb7e0c259b03597",
          "name": "BTT-name",
          "is_default": false,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": [
            {
              "key": "nfs",
              "value": "secondary"
            }
          ]
        }
      ]
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:29:09 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '1628'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-dd23df0a-37a6-4769-882a-40e67431d997'
    {
      "backup_target_types": [
        {
          "id": "13dd2bf2-12c5-4eb8-98a3-0f1dd9f8579f",
          "backup_targets_id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "user_id": null,
          "name": "nfs_1",
          "is_default": true,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": []
        },
        {
          "id": "51f11fc5-854b-4cb7-9b64-0a0ace33b0d5",
          "backup_targets_id": "1fd7af34-d723-428d-90f5-35d31bf24884",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "user_id": null,
          "name": "nfs_2",
          "is_default": false,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": []
        },
        {
          "id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
          "backup_targets_id": "2af5f2db-3267-453f-bc57-19884837e274",
          "created_at": "2024-03-04T10:59:51.000000",
          "updated_at": "2024-03-04T10:59:51.000000",
          "version": "5.0.204",
          "user_id": null,
          "name": "s3_2",
          "is_default": false,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": []
        },
        {
          "id": "fdae1b10-9852-4c68-8879-64ead0aed31b",
          "backup_targets_id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
          "created_at": "2024-03-13T10:25:14.000000",
          "updated_at": "2024-03-13T10:25:14.000000",
          "version": "5.0.204",
          "user_id": "2b1189be3add4806bcb7e0c259b03597",
          "name": "BTT-name",
          "is_default": false,
          "description": null,
          "is_public": true,
          "backup_target_type_projects": [],
          "backup_target_type_metadata": [
            {
              "key": "nfs",
              "value": "secondary"
            }
          ]
        }
      ]
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:30:31 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '406'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-f20d2e28-a083-47fe-8eda-a702ac484865'
    {
      "backup_target_types": {
        "id": "13dd2bf2-12c5-4eb8-98a3-0f1dd9f8579f",
        "backup_targets_id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
        "created_at": "2024-03-04T10:59:51.000000",
        "updated_at": "2024-03-04T10:59:51.000000",
        "version": "5.0.204",
        "user_id": null,
        "name": "nfs_1",
        "is_default": true,
        "description": null,
        "is_public": true,
        "backup_target_type_projects": [],
        "backup_target_type_metadata": []
      }
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:25:14 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '430'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-5730cced-949b-4567-827e-8349a023e716'
    {
      "backup_target_types": {
        "id": "fdae1b10-9852-4c68-8879-64ead0aed31b",
        "backup_targets_id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
        "created_at": "2024-03-13T10:25:14.000000",
        "version": "5.0.204",
        "user_id": "2b1189be3add4806bcb7e0c259b03597",
        "name": "BTT-name",
        "is_default": false,
        "description": null,
        "is_public": true,
        "backup_target_type_projects": [],
        "backup_target_type_metadata": [
          {
            "key": "nfs",
            "value": "primary"
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:27:49 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '432'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-14b39336-bc84-414a-a128-1d71e7dfb3cf'
    {
      "backup_target_types": {
        "id": "fdae1b10-9852-4c68-8879-64ead0aed31b",
        "backup_targets_id": "b39847c8-bf65-4cec-9af6-dd65303ca485",
        "created_at": "2024-03-13T10:25:14.000000",
        "version": "5.0.204",
        "user_id": "2b1189be3add4806bcb7e0c259b03597",
        "name": "BTT-name",
        "is_default": false,
        "description": null,
        "is_public": true,
        "backup_target_type_projects": [],
        "backup_target_type_metadata": [
          {
            "key": "nfs",
            "value": "secondary"
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:40:05 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '921'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-3dd1a577-ef35-4997-83bc-b2e50afaea73'
    {
      "backup_target_types": {
        "id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
        "backup_targets_id": "2af5f2db-3267-453f-bc57-19884837e274",
        "created_at": "2024-03-04T10:59:51.000000",
        "version": "5.0.204",
        "user_id": "2b1189be3add4806bcb7e0c259b03597",
        "name": "s3_2",
        "is_default": false,
        "description": null,
        "is_public": false,
        "backup_target_type_projects": [
          {
            "created_at": "2024-03-13T10:39:14.000000",
            "updated_at": null,
            "version": "5.0.204",
            "id": "5a14a688-e16f-45f9-91c2-6906fb200825",
            "backup_target_types_id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
            "project_id": "fc439373e340459fb28202b2412e26c0"
          },
          {
            "created_at": "2024-03-13T10:40:05.000000",
            "updated_at": null,
            "version": "5.0.204",
            "id": "c0fe123e-e566-465a-acf2-56e2b27ae9b2",
            "backup_target_types_id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
            "project_id": "0920f871077c4c079057ce940d8105a8"
          }
        ],
        "backup_target_type_metadata": [
          {
            "key": "dg1",
            "value": "dg2"
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:41:18 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '671'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-9dfe92c3-5b82-4062-98b0-b00294147b02'
    {
      "backup_target_types": {
        "id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
        "backup_targets_id": "2af5f2db-3267-453f-bc57-19884837e274",
        "created_at": "2024-03-04T10:59:51.000000",
        "version": "5.0.204",
        "user_id": "2b1189be3add4806bcb7e0c259b03597",
        "name": "s3_2",
        "is_default": false,
        "description": null,
        "is_public": false,
        "backup_target_type_projects": [
          {
            "created_at": "2024-03-13T10:39:14.000000",
            "updated_at": null,
            "version": "5.0.204",
            "id": "5a14a688-e16f-45f9-91c2-6906fb200825",
            "backup_target_types_id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
            "project_id": "fc439373e340459fb28202b2412e26c0"
          }
        ],
        "backup_target_type_metadata": [
          {
            "key": "dg1",
            "value": "dg2"
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:44:02 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '671'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-870c776b-a160-41c0-82a9-d9e7131d77aa'
    {
      "backup_target_types": {
        "id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
        "backup_targets_id": "2af5f2db-3267-453f-bc57-19884837e274",
        "created_at": "2024-03-04T10:59:51.000000",
        "version": "5.0.204",
        "user_id": "2b1189be3add4806bcb7e0c259b03597",
        "name": "s3_2",
        "is_default": false,
        "description": null,
        "is_public": false,
        "backup_target_type_projects": [
          {
            "created_at": "2024-03-13T10:39:14.000000",
            "updated_at": null,
            "version": "5.0.204",
            "id": "5a14a688-e16f-45f9-91c2-6906fb200825",
            "backup_target_types_id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
            "project_id": "fc439373e340459fb28202b2412e26c0"
          }
        ],
        "backup_target_type_metadata": [
          {
            "key": "dg1",
            "value": "dg2"
          }
        ]
      }
    }
    HTTP/1.1 200 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:45:12 GMT'
    'Content-Type': 'application/json'
    'Content-Length': '671'
    'Connection': 'keep-alive'
    'X-Compute-Request-Id': 'req-7eee91f0-d02f-41e1-afe2-ebcbe39aaa85'
    {
      "backup_target_types": {
        "id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
        "backup_targets_id": "2af5f2db-3267-453f-bc57-19884837e274",
        "created_at": "2024-03-04T10:59:51.000000",
        "version": "5.0.204",
        "user_id": "2b1189be3add4806bcb7e0c259b03597",
        "name": "s3_2",
        "is_default": false,
        "description": null,
        "is_public": false,
        "backup_target_type_projects": [
          {
            "created_at": "2024-03-13T10:39:14.000000",
            "updated_at": null,
            "version": "5.0.204",
            "id": "5a14a688-e16f-45f9-91c2-6906fb200825",
            "backup_target_types_id": "c65625c1-50bf-4ab7-aa26-f625001e60f1",
            "project_id": "fc439373e340459fb28202b2412e26c0"
          }
        ],
        "backup_target_type_metadata": [
          {
            "key": "dg1",
            "value": "dg2"
          }
        ]
      }
    }
    HTTP/1.1 202 OK
    'Server': 'nginx/1.20.1'
    'Date': 'Wed, 13 Mar 2024 10:33:02 GMT'
    'Content-Type': 'text/html; charset=UTF-8'
    'Content-Length': '0'
    'Connection': 'keep-alive'

    description

    String

    Description of the workload.

    workload_type_id

    String

    Unique identifier for the selected workload type.

    source_platform

    String

    Specifies the source platform (e.g., openstack).

    Field
    Type
    Description

    instance-id

    String

    Unique identifier of the instance to be included in the workload.

    Field
    Type
    Description

    timezone

    String

    Time zone for the job schedule.

    start_date

    String

    Schedule Type
    Field
    Type
    Description
    Dependencies

    Hourly

    interval

    Integer

    Field
    Type
    Description

    <key>

    String

    Custom metadata key-value pairs.

    policy_id

    String

    Field
    Type
    Description

    backup_target_types

    String

    Backup target type ID specifying where the backups will be stored.

    GET https://<wlm_api_endpoint>/workloads

    Provides the list of all workloads for the given tenant/project ID

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    Name
    Type
    Description

    nfs_share

    string

    lists workloads located on a specific nfs-share

    all_workloads

    boolean

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    project to run the authentication against

    X-Auth-Token

    string

    POST https://<wlm_api_endpoint>/workloads

    Creates a workload in the provided Tenant/Project with the given details.

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    Workload Create requires a Body in json format, to provide the requested information.

    GET https://<wlm_api_endpoint>/workloads/<workload_id>

    Shows all details of a specified workload

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    workload_id

    ID of the Workload to show

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    PUT https://<wlm_api_endpoint>/workloads/<workload_id>

    Modifies a workload in the provided Tenant/Project with the given details.

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    workload_id

    ID of the Workload

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    Workload modify requires a Body in json format, to provide the information about the values to modify.

    Field
    Type
    Description

    name

    String

    Name of the workload.

    description

    String

    Field
    Type
    Description

    instance-id

    String

    Unique identifier of the instance to be included in the workload.

    Field
    Type
    Description

    timezone

    String

    Time zone for the job schedule.

    start_date

    String

    Schedule Type
    Field
    Type
    Description
    Dependencies

    Hourly

    interval

    Integer

    Field
    Type
    Description

    <key>

    String

    Custom metadata key-value pairs.

    policy_id

    String

    DELETE https://<wlm_api_endpoint>/workloads/<workload_id>

    Deletes the specified Workload.

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    workload_id

    ID of the Workload

    Name
    Type
    Description

    database_only

    boolean

    True leaves the Workload data on the Backup Target

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    POST https://<wlm_api_endpoint>/workloads/<workload_id>/unlock

    Unlocks the specified Workload

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    workload_id

    ID of the Workload

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    POST https://<wlm_api_endpoint>/workloads/<workload_id>/reset

    Resets the defined workload

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    workload_id

    ID of the Workload

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    GET https://<wlm_api_endpoint>/workloads/metrics/tenants_chargeback?download=1

    Requests asynchronous generation of a tenant storage usage CSV dump. When the download=1 query parameter is set on the existing tenants_chargeback endpoint, wlm-api creates a dms_job (action tenants-chargeback-csv) and dispatches the heavy tenant storage usage aggregation to wlm-workloads via the scheduler. The request returns a jobid immediately instead of timing out on large deployments. The CSV is later retrieved via the Get Job Details endpoint, which renders the JSON result (stored in job_details.data) as a CSV document on demand, reusing the Tenant Storage Usage column layout and storage formatting used by the Horizon dashboard.

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    Name
    Type
    Description

    download

    integer

    Required. Set to 1 to switch the endpoint into async CSV-generation mode and receive a jobid instead of an inline JSON response.

    project_id

    string

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    POST https://<wlm_api_endpoint>/workloads/job_details

    Returns the details of a previously created asynchronous dms_job, identified by its jobid. The same endpoint is used to retrieve the result of any async job. For a tenants-chargeback-csv job, the response carries the rendered CSV body in csv_content once the job has completed successfully; the document follows the Tenant Storage Usage column layout and storage formatting from the Horizon dashboard download.

    Parameter Name
    Description

    wlm_api_endpoint

    The endpoint URL of the Workloadmgr service

    Name
    Type
    Description

    X-Auth-Project-Id

    string

    Project to run the authentication against

    X-Auth-Token

    string

    name

    String

    Name of the workload.

    Field Descriptions

    Workload Fields

    {
      "workload": {
        "name": "<name of the Workload>",
        "description": "<description of workload>",
        "workload_type_id": "<ID of the chosen Workload Type>",
        "source_platform": "openstack",
        "instances": [
          {
            "instance-id": "<Instance ID>"
          },
          {
            "instance-id": "<Instance ID>"
          }
        ],
        "jobschedule": {
          "timezone": "<timezone>",
          "start_date": "<Date format: MM/DD/YYYY>",
          "end_date": "<Date format: MM/DD/YYYY>",
          "start_time": "<Time format: HH:MM AM/PM>",
          "enabled": "<True/False>",
          "hourly": {
            "interval": "<1, 2, 3, 4, 6, 12, 24 hours>",
            "retention": "<Integer>",
            "snapshot_type": "incremental/full"
          },
          "daily": {
            "backup_time": [
              "<HH:MM 24-hour format>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "incremental/full"
          },
          "weekly": {
            "backup_day": [
              "<mon, tue, wed, thu, fri, sat, sun>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "full"
          },
          "monthly": {
            "month_backup_day": [
              "<Integer: day of the month (1-31)>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "full"
          },
          "yearly": {
            "backup_month": [
              "<jan, feb, mar, ... dec>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "full"
          },
          "manual": {
              "retention": "<Integer>"
            },
          "retentionmanual": {
              "retentionmanual": "<Integer>"
            },
        },
        "metadata": {
          "<key>": "<value>",
          "policy_id": "<policy_id>"
        },
        "backup_target_types": "<backup_target_type_id>"
      }
    }
    
    
    {
      "workload": {
        "name": "<name of the Workload>",
        "description": "<description of workload>",
        "instances": [
          {
            "instance-id": "<Instance ID>"
          },
          {
            "instance-id": "<Instance ID>"
          }
        ],
        "jobschedule": {
          "timezone": "<timezone>",
          "start_date": "<Date format: MM/DD/YYYY>",
          "end_date": "<Date format: MM/DD/YYYY>",
          "start_time": "<Time format: HH:MM AM/PM>",
          "enabled": "<True/False>",
          "hourly": {
            "interval": "<1, 2, 3, 4, 6, 12, 24 hours>",
            "retention": "<Integer>",
            "snapshot_type": "incremental/full"
          },
          "daily": {
            "backup_time": [
              "<HH:MM 24-hour format>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "incremental/full"
          },
          "weekly": {
            "backup_day": [
              "<mon, tue, wed, thu, fri, sat, sun>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "full"
          },
          "monthly": {
            "month_backup_day": [
              "<Integer: day of the month (1-31)>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "full"
          },
          "yearly": {
            "backup_month": [
              "<jan, feb, mar, ... dec>"
            ],
            "retention": "<Integer>",
            "snapshot_type": "full"
          },
          "manual": {
              "retention": "<Integer>"
            },
          "retentionmanual": {
              "retentionmanual": "<Integer>"
            },
        },
        "metadata": {
          "<key>": "<value>",
          "policy_id": "<policy_id>"
        },
        
      }
    }
    {
      "jobid": "<jobid>"
    }

    Instance List

    Job Schedule

    Scheduling Types

    Metadata

    Backup Target Types

    List Workloads

    Path Parameters

    Query Parameters

    Headers

    Sample Response

    Create Workload

    Path Parameters

    Headers

    Body format

    Using a policy-id will pull the following information from the policy. Values provided in the Body will be overwritten with the values from the Policy.

    Sample Request Body
    Sample Response

    Show Workload

    Path Parameters

    Headers

    Sample Response

    Modify Workload

    Path Parameters

    Headers

    Body format

    All values in the body are optional.

    Using a policy-id will pull the following information from the policy. Values provided in the Body will be overwritten with the values from the Policy.

    Field Descriptions

    Workload Fields

    Instance List

    Job Schedule

    Scheduling Types

    Metadata

    Sample Response

    Delete Workload

    Path Parameters

    Query Parameters

    Headers

    Sample Response

    Unlock Workload

    Path Parameters

    Headers

    Sample Response

    Reset Workload

    Path Parameters

    Headers

    Sample Response

    Generate Tenant Storage Usage CSV

    Path Parameters

    Query Parameters

    Headers

    Sample Response

    Get Job Details

    Path Parameters

    Headers

    Body format

    Sample Response (tenants-chargeback-csv)

    While the job is still in progress, csv_content is empty and status is in-progress or running. Poll the endpoint until status becomes completed (or error) before extracting the CSV.

    Start date of the schedule (Format: MM/DD/YYYY).

    end_date

    String

    End date of the schedule (Format: MM/DD/YYYY).

    start_time

    String

    Time when the schedule begins (Format: HH:MM AM/PM).

    enabled

    Boolean

    True if scheduling is enabled, False otherwise.

    Backup interval in hours (1, 2, 3, 4, 6, 12, 24).

    if schedule enabledis set to true, you must provide Hourly field.

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Snapshot type (incremental or full).

    Daily

    backup_time

    List of String

    List of specific times (HH:MM, 24-hour format).

    Requires hourly

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Snapshot type (incremental or full).

    Weekly

    backup_day

    List of String

    Days of the week (mon, tue, wed, thu, fri, sat, sun).

    Requires daily

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Monthly

    month_backup_day

    List of Integer

    Days of the month (1-31).

    Requires daily

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Yearly

    backup_month

    List of String

    List of months (jan, feb, mar, ... dec).

    Requires monthly

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Manual

    retention

    Integer

    Retention period in backups.

    retentionmanual

    retentionmanual

    Integer

    Number of days to keep backups manually triggered.

    ID of the backup policy associated with the workload.

    admin role required - True lists workloads of all tenants/projects

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Description of the workload.

    workload_type_id

    String

    Unique identifier for the selected workload type.

    source_platform

    String

    Specifies the source platform (e.g., openstack).

    Start date of the schedule (Format: MM/DD/YYYY).

    end_date

    String

    End date of the schedule (Format: MM/DD/YYYY).

    start_time

    String

    Time when the schedule begins (Format: HH:MM AM/PM).

    enabled

    Boolean

    True if scheduling is enabled, False otherwise.

    Backup interval in hours (1, 2, 3, 4, 6, 12, 24).

    if schedule enabledis set to true, you must provide Hourly field.

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Snapshot type (incremental or full).

    Daily

    backup_time

    List of String

    List of specific times (HH:MM, 24-hour format).

    Requires hourly

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Snapshot type (incremental or full).

    Weekly

    backup_day

    List of String

    Days of the week (mon, tue, wed, thu, fri, sat, sun).

    Requires daily

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Monthly

    month_backup_day

    List of Integer

    Days of the month (1-31).

    Requires daily

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Yearly

    backup_month

    List of String

    List of months (jan, feb, mar, ... dec).

    Requires monthly

    retention

    Integer

    Retention period in backups.

    snapshot_type

    String

    Only supports full backups.

    Manual

    retention

    Integer

    Retention period in backups.

    retentionmanual

    retentionmanual

    Integer

    Number of days to keep backups manually triggered.

    ID of the backup policy associated with the workload.

    Authentication Token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication Token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication Token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Optional. Restrict the report to a single project.

    project_list

    string

    Optional. Comma-separated list of project IDs to restrict the report to (for example project_list=p1,p2).

    Authentication Token to use

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    Authentication Token to use

    Content-Type

    string

    application/json

    Accept

    string

    application/json

    User-Agent

    string

    python-workloadmgrclient

    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Date: Thu, 29 Oct 2020 14:55:40 GMT
    Content-Type: application/json
    Content-Length: 3480
    Connection: keep-alive
    X-Compute-Request-Id: req-a2e49b7e-ce0f-4dcb-9e61-c5a4756d9948
    
    {
       "workloads":[
          {
             "project_id":"4dfe98a43bfa404785a812020066b4d6",
             "user_id":"adfa32d7746a4341b27377d6f7c61adb",
             "id":"8ee7a61d-a051-44a7-b633-b495e6f8fc1d",
             "name":"worklaod1",
             "snapshots_info":"",
             "description":"no-description",
             "workload_type_id":"f82ce76f-17fe-438b-aa37-7a023058e50d",
             "status":"available",
             "created_at":"2020-10-26T12:07:01.000000",
             "updated_at":"2020-10-29T12:22:26.000000",
             "scheduler_trust":null,
             "links":[
                {
                   "rel":"self",
                   "href":"http://wlm_backend/v1/4dfe98a43bfa404785a812020066b4d6/workloads/8ee7a61d-a051-44a7-b633-b495e6f8fc1d"
                },
                {
                   "rel":"bookmark",
                   "href":"http://wlm_backend/4dfe98a43bfa404785a812020066b4d6/workloads/8ee7a61d-a051-44a7-b633-b495e6f8fc1d"
                }
             ]
          },
          {
             "project_id":"4dfe98a43bfa404785a812020066b4d6",
             "user_id":"adfa32d7746a4341b27377d6f7c61adb",
             "id":"a90d002a-85e4-44d1-96ac-7ffc5d0a5a84",
             "name":"workload2",
             "snapshots_info":"",
             "description":"no-description",
             "workload_type_id":"f82ce76f-17fe-438b-aa37-7a023058e50d",
             "status":"available",
             "created_at":"2020-10-20T09:51:15.000000",
             "updated_at":"2020-10-29T10:03:33.000000",
             "scheduler_trust":null,
             "links":[
                {
                   "rel":"self",
                   "href":"http://wlm_backend/v1/4dfe98a43bfa404785a812020066b4d6/workloads/a90d002a-85e4-44d1-96ac-7ffc5d0a5a84"
                },
                {
                   "rel":"bookmark",
                   "href":"http://wlm_backend/4dfe98a43bfa404785a812020066b4d6/workloads/a90d002a-85e4-44d1-96ac-7ffc5d0a5a84"
                }
             ]
          }
       ]
    }
    hourly
    daily
    weekly
    monthly
    yearly
    {
      "workload": {
        "name": "workload_cli",
        "description": null,
        "source_platform": null,
        "instances": [
          {
            "instance-id": "14309d25-23dd-47da-bf60-febc8c25b636"
          }
        ],
        "jobschedule": {
          "start_date": "01/28/2025",
          "enabled": true,
          "start_time": "02:15 PM",
          "timezone": "Etc/UTC",
          "hourly": {
            "interval": 1,
            "retention": 2,
            "snapshot_type": "incremental"
          },
          "daily": {
            "backup_time": [
              "14:15"
            ],
            "retention": 2,
            "snapshot_type": "incremental"
          },
          "weekly": {
            "backup_day": [
              "wed"
            ],
            "retention": 2,
            "snapshot_type": "full"
          },
          "monthly": {
            "month_backup_day": [
              20
            ],
            "retention": 2,
            "snapshot_type": "full"
          },
          "yearly": {
            "backup_month": [
              "mar"
            ],
            "retention": 1,
            "snapshot_type": "full"
          },
          "manual": {
            "retention": 21
          }
        },
        "metadata": {},
        "encryption": false,
        "secret_uuid": null,
        "backup_target_types": "6ba9fd82-151b-4f5a-bdbf-44504c2e210e"
      }
    }
    
    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Thu, 29 Oct 2020 15:42:02 GMT
    Content-Type: application/json
    Content-Length: 703
    Connection: keep-alive
    X-Compute-Request-Id: req-443b9dea-36e6-4721-a11b-4dce3c651ede
    
    {
       "workload":{
          "project_id":"c76b3355a164498aa95ddbc960adc238",
          "user_id":"ccddc7e7a015487fa02920f4d4979779",
          "id":"c4e3aeeb-7d87-4c49-99ed-677e51ba715e",
          "name":"API created",
          "snapshots_info":"",
          "description":"API description",
          "workload_type_id":"f82ce76f-17fe-438b-aa37-7a023058e50d",
          "status":"creating",
          "created_at":"2020-10-29T15:42:01.000000",
          "updated_at":"2020-10-29T15:42:01.000000",
          "scheduler_trust":null,
          "links":[
             {
                "rel":"self",
                "href":"http://wlm_backend/v1/c76b3355a164498aa95ddbc960adc238/workloads/c4e3aeeb-7d87-4c49-99ed-677e51ba715e"
             },
             {
                "rel":"bookmark",
                "href":"http://wlm_backend/c76b3355a164498aa95ddbc960adc238/workloads/c4e3aeeb-7d87-4c49-99ed-677e51ba715e"
             }
          ]
       }
    }
    HTTP/1.1 200 OK
    x-compute-request-id: req-3bd5dd1e-3064-4859-a530-7a5bf9f4278f
    content-type: application/json
    content-length: 1941
    date: Wed, 29 Jan 2025 06:28:36 GMT
    
    {
      "workload": {
        "created_at": "2025-01-28T12:23:49.000000",
        "updated_at": "2025-01-28T14:15:06.000000",
        "id": "4ddf0e47-618d-47d1-9f2f-48f342e1d9af",
        "encryption": false,
        "secret_uuid": null,
        "user_id": "6bbb210a29a043af86b7b0c667747187",
        "project_id": "dee550d3df5b497ca2e05044616bc8b1",
        "availability_zone": "nova",
        "workload_type_id": "f82ce76f-17fe-438b-aa37-7a023058e50d",
        "name": "workload_API",
        "description": "no-description",
        "interval": null,
        "storage_usage": {
          "usage": 0,
          "full": {
            "snap_count": 0,
            "usage": 0
          },
          "incremental": {
            "snap_count": 1,
            "usage": 0
          }
        },
        "instances": [
          {
            "id": "14309d25-23dd-47da-bf60-febc8c25b636",
            "name": "PM",
            "metadata": {}
          }
        ],
        "metadata": {
          "hostnames": "[]",
          "preferredgroup": "[]",
          "workload_approx_backup_size": "2.1",
          "backup_media_target": "192.168.1.34:/mnt/tvault/42436",
          "backup_target_types": "nfs_1",
          "backup_target_type": "nfs_1"
        },
        "jobschedule": {
          "start_date": "01/28/2025",
          "enabled": true,
          "start_time": "02:15 PM",
          "hourly": {
            "interval": "1",
            "retention": "2",
            "snapshot_type": "incremental"
          },
          "daily": {
            "backup_time": ["14:15"],
            "retention": "2",
            "snapshot_type": "incremental"
          },
          "weekly": {
            "backup_day": ["wed"],
            "retention": "2",
            "snapshot_type": "full"
          },
          "monthly": {
            "month_backup_day": ["20"],
            "retention": "2",
            "snapshot_type": "full"
          },
          "yearly": {
            "backup_month": ["mar"],
            "retention": "1",
            "snapshot_type": "full"
          },
          "manual": {
              "retention": "21"
            },
          "retentionmanual": {
              "retentionmanual": "5"
            },
          "timezone": "UTC",
          "global_jobscheduler": true,
          "nextrun": 2783.561769
        },
        "status": "locked",
        "error_msg": null,
        "links": [
          {
            "rel": "self",
            "href": "http://kolla-external-wallaby-dev4.triliodata.demo:8781/v1/dee550d3df5b497ca2e05044616bc8b1/workloads/4ddf0e47-618d-47d1-9f2f-48f342e1d9af"
          },
          {
            "rel": "bookmark",
            "href": "http://kolla-external-wallaby-dev4.triliodata.demo:8781/dee550d3df5b497ca2e05044616bc8b1/workloads/4ddf0e47-618d-47d1-9f2f-48f342e1d9af"
          }
        ],
        "scheduler_trust": null,
        "policy_id": null
      }
    }
    
    
    hourly
    daily
    weekly
    monthly
    yearly
    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Mon, 02 Nov 2020 12:31:42 GMT
    Content-Type: application/json
    Content-Length: 0
    Connection: keep-alive
    X-Compute-Request-Id: req-674a5d71-4aeb-4f99-90ce-7e8d3158d137
    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Mon, 02 Nov 2020 13:31:00 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 0
    Connection: keep-alive
    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Mon, 02 Nov 2020 13:41:55 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 0
    Connection: keep-alive
    HTTP/1.1 202 Accepted
    Server: nginx/1.16.1
    Date: Mon, 02 Nov 2020 13:52:30 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 0
    Connection: keep-alive
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Content-Type: application/json
    
    {
       "jobid": 1662
    }
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    Content-Type: application/json
    
    {
       "id": 1662,
       "action": "tenants-chargeback-csv",
       "created_at": "2026-04-24T13:30:01.000000",
       "updated_at": "2026-04-24T13:30:18.000000",
       "generated_at": "2026-04-24 13:30:18.000000",
       "status": "completed",
       "detail_status": "completed",
       "csv_content": "\"TVault Chargeback\"\r\n\r\n\"Tenant\",\"Workload\",\"Snapshot\",\"VMs\",\"Storage\"\r\n\"ProjectA\",\"wl-daily\",\"2026-04-24T10:00:00.000000-snap-1\",\"2\",\"15.4 GB\"\r\n\r\n\"Summary\"\r\n\"Storage\",\"15.4 GB\"\r\n\"VMs\",\"2\"\r\n",
       "tenants_chargeback": { "...": "raw JSON chargeback data for programmatic consumers" },
       "message": ""
    }