Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
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.
A quick overview on the Architecture of T4O
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.
Trilio has four main software components which are again segregated into multiple services.
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.
workloadmgr-api
workloadmgr-scheduler
workloadmgr-workloads
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
datamover-api
datamover
For ease of access and better user experience, T4O provides an integrated UI with the OpenStack dashboard service Horizon,
Trilio API is a Python module that is installed on all OpenStack controller nodes where the nova-api service is running.
Trilio Datamover is a Python module that is installed on every OpenStack compute nodes
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.
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.
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.


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.
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:
Read-after-write
Read-after-update
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.
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.
The high-level process is the same for all Distributions.
Uninstall the Horizon Plugin or the Trilio Horizon container
Uninstall the datamover-api container
Uninstall the datamover container
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.
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.
Run following commands to uninstall trilio services from MOSK cloud.
If you have installed multiple backup targets other than the default one, you can uninstall them using:
Verify if the trilio-openstack chart and other components got uninstalled. No objects should be listed in following command output:
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.shhelm uninstall <dynamic-backup-target-name> -n trilio-openstackkubectl 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>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.
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.
Valid Trilio License & Acceptance of the EULA
When deploying the Control Plane to OpenShift, ensure sufficient resources are available on Worker Nodes.
Sufficient storage capacity and connectivity on Cinder for snapshotting operations
Sufficient network capabilities for efficient data transfer of workloads
User and Role permissions for access to required cluster objects
Optional features may have specific requirements such as encryption, file search, snapshot mount, FRM instance, etc
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.
For the VMware to OpenStack migration feature, please refer to the and pages.
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.
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:
Metadata
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
The following versions can be upgraded to each other:
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:
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.
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.
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
To apply for the license through Horizon follow these steps:
Login to Horizon using admin user.
Click on the Admin Tab.
Navigate to Backups-Admin
Navigate to Trilio
Navigate to License
Click "Update License"
Read the license agreement
Click on "I accept the terms in the License Agreement"
Click on "Next"
Click "Choose File"
Choose license file on the client system
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:
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.
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.
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.
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.
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.
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.
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 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.
E-Mail notifications are activated tenant wide. To activate the E-Mail notification feature for a tenant follow these steps:
Login to Horizon
Navigate to the Backups
Navigate to Settings
Check/Uncheck the box for "Enable Email Alerts"
The following screenshots show example E-mails send by Trilio.
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.
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.
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.
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.
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:
Deploy Trilio as per the documented steps.
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/
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.
Restart triliovault_datamover container on all compute nodes.
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:
Create a secret for Project A in Domain A via User A.
Create encrypted workload in Project A in Domain A via User A. Take snapshot.
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
It is recommended to configure connectivity through the admin endpoints if available.
rootwrap.d/dms.filtersA 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




The shell script has to run as nova user, otherwise the owner will get changed and the backup can not be used by Trilio.
...
[ceph]
keyring_ext = .keyring
...
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:
Create a secret for Project A in Domain A via User A.
Create an encrypted workload in Project A in Domain A via User A. Trigger snapshot.
Reassign workload to Cloud B - Domain B — Project B — User B
Load RC file of User B.
Create a secret for Project B in Domain B via User B with the same payload used in Cloud A.
Create token via “openstack token issue --insecure”
Add migrated workload's metadata to the new secret (provide issued token to Auth-Token & workload id to matadata as below)
--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.
workloadmgr license-create <license_file>./backing_file_update.sh /var/trilio/triliovault-mounts/<base64>/workload_<workload_id>/tmp/backing_file_update.logcurl -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-listworkloadmgr trust-show <trust_id>workloadmgr trust-create [--is_cloud_trust {True,False}] <role_name>workloadmgr trust-delete <trust_id>6.2.1
RHOSO18 <= FR6(18.0.21)
RHEL-9
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
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.serviceDisable 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.
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.
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.
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.
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.
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 about Trilio for OpenStack
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.
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):
In this example, we have taken a Trilio backup of a VM called prod-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:
Trilio then restores the VM with the original MAC address:
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.
New Qualifcation
Qualification support for RHOSO18.0-FR6 (18.0.21).
Qualification support for Canonical Jammy.
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
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:
Login to Horizon
Navigate to Backups
Navigate to Workloads
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.
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
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.
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.
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.




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
Snapshot mount fails on Kolla Ubuntu Flamingo.
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.
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.
Retention failing intermittently with NFS V4.
Support for Kolla Epoxy (2025.1) & Kolla Flamingo (2025.2) [For Rocky 9 & Ubuntu 24.04].
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.
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.
Snapshot mount fails on Kolla Ubuntu Flamingo.
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.
Workload Reset operation fails to cleanup the volume snapshots.
Workload Import getting stuck.
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.
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.
Retention failing intermittently with NFS V4.
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.
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
✔️ ✔️ ✔️
6.2.X
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
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:
All Snapshots - Lists all Snapshots that contain the chosen VM from all available Snapshots
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.
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
The File Path has to start with a '/'
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.
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:
Add required repositories
epel-release
yum -y install epel-release
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:
Add required repositories
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
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
<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-mountscd /home/stack
mv triliovault-cfg-scripts/ triliovault-cfg-scripts-5.xgit clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.gitcp /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-0sudo podman exec -it triliovault_wlm_api bash
source /etc/triliovault-wlm/cloud_admin_rc
workloadmgr backup-target-type-listsudo podman exec -it triliovault_wlm_api bash
source /etc/triliovault-wlm/cloud_admin_rcworkloadmgr workload-importworkloads --inplace-upgradeworkloadmgr 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 horizonqemu-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 0cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
./uninstall_tvo_control_plane.shcd 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.shssh 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 triliovaultoc 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=0deb [trusted=yes] https://apt.fury.io/trilio-6-0/ /mysql_trilio_snapshots_info{status="error"} 3count(mysql_trilio_restore_info{status="error"})openstack_protected_vm{ProjectID="proj1"} 25mysql_trilio_backup_size_info{ProjectID="proj1"} 450.75mysql_trilio_snapshots_status{ProjectID="p1",WorkloadID="w1",SnapshotID="123",SnapshotName="daily-backup",status="successful"} 1trilio_allowed_quota_value{ProjectID="p1",QuotaName="Snapshots"} 100trilio_quota_high_watermark{ProjectID="p1",QuotaName="Snapshots"} 80trilio_workload_info{ID="123",ProjectID="p1",DisplayName="TestWorkload",Status="available"} 1trilio_workload_vm_info{VMID="vm-123",WorkloadID="456",Status="protected"} 1The 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.yml192.168.1.33:/var/share1
192.168.1.34:/var/share1
192.168.1.35:/var/share1prod-compute-1.trilio.demo
prod-compute-2.trilio.demo
prod-compute-3.trilio.demo
.
.
.
prod-compute-30.trilio.democompute_bare.trilio.demo
compute_virtualmulti_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 |
+--------------------------------------+-------------------------------+--------+----------------------+----------------+---------+Hrs between 2 snapshots
To disable the scheduler of a single Workload in Horizon do the following steps:
Login to the Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload to be modified
Click the small arrow next to "Create Snapshot" to open the sub-menu
Click "Edit Workload"
Navigate to the tab "Schedule"
Uncheck "Enabled"
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:
Login to the Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload to be modified
Click the small arrow next to "Create Snapshot" to open the sub-menu
Click "Edit Workload"
Navigate to the tab "Schedule"
check "Enabled"
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.
<workload_id> ➡️ ID of the workload to validate
workloadmgr disable-scheduler --workloadids <workloadid>workloadmgr enable-scheduler --workloadids <workloadid>workloadmgr scheduler-trust-validate <workload_id>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.
https://api.slack.com/appscurl -X POST -H 'Content-type: application/json' \
--data '{"text":"Hello, World!"}' \
<YOUR_WEBHOOK_URL>mysql_trilio_snapshots_info{status="failed"} > 0Trilio Snapshot Failure Detected
One or more snapshot operations have failed.mysql_trilio_restore_info{status="failed"} > 0Trilio 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.The following command provides the URL for the Grafana dashboard:
oc -n openshift-user-workload-monitoring get routes -n openshift-user-workload-monitoringThe 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 --decodeDownload 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.jsonAfter successful login to Grafana, follow these steps.
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:
Project level
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.
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















Amount of Storage a Project is allowed to use on the Backup Target
Workload Quotas are managed like any other Project Quotas.
Login into Horizon as user with admin role
Navigate to Identity
Navigate to Projects
Identify the Project to modify or show the quotas on
Use the small arrow next to "Manage Members" to open the submenu
Choose "Modify Quotas"
Navigate to "Workload Manager"
Edit Quotas as desired
Click "Save"
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-listworkloadmgr 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_idworkloadmgr 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>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.
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.
Learn about artifacts related to Trilio for OpenStack 6.2.0
Branch of the repository to be used for DevOps scripts.
trilio_branch : 6.2.0Branch of the repository to enable grafana monitoring on RHOSO18.0.
trilio_grafana_branch : 6.2.0git 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/ansibleRHOSP Version
CONTAINER-TAG-VERSION
All packages are Python 3 (py3.6 - py3.10) compatible only.
Repo URL:
Log in to Grafana.
Navigate to Alerting → Contact Points.
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.
Save the above Python code in a file (e.g., server1.py).
Test the webhook:
A file named test.json will be created.
It will contain the received webhook payload.
Run the following command on your host machine:
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.
Follow the steps below to remove a backup target.
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
Identify the WLM API pod in the trilio-openstack namespace:
Exec into the pod and source the admin RC file:
Exec into the wlm-api container and source the admin RC file:
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.
Delete the backup target:
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:
Learn about encrypting Trilio workloads with Barbican
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.
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
Source the rc file of the user who is going to create the encrypted workload.
Create any supported type of secret and fetch the secret UUID using OpenStack secret cli.
Refer to this guide for more information about
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.
Login to openstack horizon dashboard with user who has created the secret & go to Project->Backup->workloads
click on create workload.
select the checkbox for Enable Encryption
Provide the UUID noted in above steps in Secret UUID text box
Follow the usual procedure for further tabs (Workload member, Schedule, policy & Option) & click on create.
Workload will be created and value for Encryption field will be True.
For migration of encrypted workload please follow:
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.
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.
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
POST https://$(tvm_address):8780/v1/$(tenant_id)/search
Starts a File Search with the given parameters

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


ctr, cbc, xts
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.
Remove trilio_env.yaml entry
Remove trilio endpoint map file Replace with original map file if existing
Run the cleaned overcloud deploy command.
Run all commands as root or user with sudo permissions.
Run all commands as root or user with sudo permissions.
Run all commands as root or user with sudo permissions.
http://your-server:50100/webhookContent-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.pyhttp://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::TrilioWlmCronpodman rm -f triliovault_datamover_api
podman rm -f triliovault_datamover_api_db_sync
podman rm -f triliovault_datamover_api_init_logrm -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_logrm -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_logrm -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_logrm -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_logrm -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-mountsrm -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-cronlisten 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.localpodman restart haproxy-bundle-podman-0openstack service delete dmapi
openstack user delete dmapi
openstack service delete TrilioVaultWLM
openstack user delete triliovaultpodman 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 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/ /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=0python3-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.0Kolla 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
Kolla Flamingo (2025.2)
workloadmgr
oc get pods -n trilio-openstack | grep wlm-apioc 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-serveroc -n trilio-openstack get pods | grep object-storedocker ps | grep triliovault_dmsThe 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-licensejuju 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-licenseNote: 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
log into each nova compute node
add uxsock_timeout with value as 60000 (i.e. 60 sec) in /etc/multipath.conf
restart tvault-contego service
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.
juju export-bundle --filename openstack_base_file.yamlgit clone https://github.com/trilioData/triliovault-cfg-scripts.git
cd triliovault-cfg-scripts
git checkout {{ trilio_branch }}
cd juju-charms/sample_overlay_bundlescp 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 environmentjuju deploy --dry-run ./openstack_base_file.yaml --overlay tvo-overlay-bundle-6.2.yamljuju deploy ./openstack_base_file.yaml --overlay tvo-overlay-bundle-6.2.yamlwatch -n 5 juju status trilio-wlm trilio-data-mover trilio-dm-api trilio-horizon-pluginAgent Status Message
idle active Unit is readyjuju status | grep -i triliojuju ssh nova-compute/0
sudo systemctl status tvault-contego trilio-dms-server
# Verify the DMS server config was rendered:
cat /etc/triliovault-dms/server.confjuju 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.confjuju 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)
EOFTrilio 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.
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.
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.
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.
For example, the Kolla OpenStack cloud has three regions.
RegionOne
RegionTwo
RegionThree
To deploy Multi-Region Trilio on this cloud, we need to install Trilio in each region.
Please follow the below steps:
Identify the kolla ansible inventory file for each region.
Identify the kolla-ansible deploy command that was used for OpenStack deployment for each region(Most probably, this is the same for all regions)
The customer might have used a separate “/etc/kolla/globals.yml“ file for each region deployment. Please check those details.
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.
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?
Append the appropriate Trilio globals yml file to the/etc/kolla/globals.yml file; refer to section 3.1 from the Trilio install .
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.
Append Trilio inventory to the RegionTwo inventory file. Please take a look at section 3.4 of the Trilio install document.
Repeat (Pull Trilio container images) from the Trilio install document for RegionTwo.
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.
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.
Run the Kolla-ansible deploy command, which will deploy Trilio on RegionTwo.
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 |
| | | |
+-------------+--------------+--------------------------------------------------------------------------+IP or FQDN of Trilio service
tenant_id
string
ID of the Tenant/Project to run the search in
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
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
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
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>"
}
}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.
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/activateClone 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/ansibleRun 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.
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'.
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.
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:
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to mount
To mount a Snapshot through the File Search results follow these steps:
Login to Horizon
Navigate to Backups
Navigate to Workloads
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.
Login to Horizon
Navigate to Compute
Navigate to Instances
Identify the File Recovery Manager Instance
The mounted_snapshot_url contains the Snapshot ID of the Snapshot that has been mounted last.
Login to Horizon
Navigate to Backups
Navigate to Workloads
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.
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to mount
<snapshot_id> ➡️ ID of the snapshot to unmount.
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.
Login to Horizon
Navigate to the Backups
Navigate to Workloads
Identify the workload to show the details on
Click the workload name to enter the Workload overview
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.
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that shall create a Snapshot
Login to Horizon
Navigate to Backups
Navigate to Workloads
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:
Login to Horizon
Navigate to Backups
Navigate to Workloads
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:
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to delete
To delete one or more Snapshots through the Snapshot overview do the following:
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to show
<snapshot_id>➡️ID of the snapshot to be deleted
Ongoing Snapshots can be canceled.
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to cancel
<snapshot_id>➡️ID of the snapshot to be canceled
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.
To see all available Workload policies in Horizon follow these steps:
Login to Horizon using admin user.
Click on Admin Tab.
Navigate to Backups-Admin
Navigate to Trilio
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:
Login to Horizon using admin user.
Click on Admin Tab.
Navigate to Backups-Admin
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:
Login to Horizon using admin user.
Click on Admin Tab.
Navigate to Backups-Admin
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:
Login to Horizon using admin user.
Click on Admin Tab.
Navigate to Backups-Admin
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:
Login to Horizon using admin user.
Click on Admin Tab.
Navigate to Backups-Admin
Navigate to Trilio
<policy_id> ➡️ID of the policy to be deleted
Follow the steps below to add a new backup target.
Identify the Trilio WLM API container or unit and connect to it. All commands below run in that shell.
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>juju ssh trilio-wlm/leader
source <openrc file># 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>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-nfsIn 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.
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
POST https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>/mount
Mounts a Snapshot to the provided File Recovery Manager
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
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


Tail the runner pod logs:
--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
<cloud_admin_password >
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"
Navigate to the File Search tab
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"
On the Overview tab look for Metadata
Identify the value for mounted_snapshot_url
Navigate to the Snapshots tab
Search for the Snapshot that has the option "Unmount Snapshot"
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
✔️
It is recommended to do these steps once to the chosen cloud-Image and then upload the modified cloud image to Glance.
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.
Unmount any mounted Snapshot once there is no further need to keep it mounted. Mounted Snapshots will not be purged by the Retention policy.
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
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
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.
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)
Provide a name and description for the Snapshot
Decide between Full and Incremental Snapshot
Click "Create"
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)
Navigate to the Snapshots tab
Identify the searched Snapshot in the Snapshot list
Click the Snapshot Name
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
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"
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"
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"
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
--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
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
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"
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"
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 openstackoc -n openstack delete osdpd <DEPLOYMENT_NAME>oc -n openstack get osdps | grep triliooc -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.yamloc -n openstack apply -f trilio-delete-backup-target-deployment.yamloc -n trilio-openstack get tvobackuptargetoc 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-storepython3 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.ymlansible -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 triliovaultkolla-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_trustdocker ps -a | grep triliodocker 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_trustdocker 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.logopenstack 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-manageropenstack 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-closeSELINUX=disabledyum install python3 lvm2apt-get update
apt-get install qemu-guest-agent
systemctl enable qemu-guest-agentLoaded: 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-hooksystemctl restart qemu-guest-agentapt-get install python3workloadmgr 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-listworkloadmgr 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.1docker.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.1docker.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.2docker.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.2my-bucketOther 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>.jsonopenstack secret store \
--name secret-key-<btt-name> \
--payload "$(cat /tmp/secret-<btt-name>.json)" \
-f jsonworkloadmgr 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=1workloadmgr 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=1workloadmgr backup-target-listoc -n trilio-openstack get pods | grep triliovault-dmsdocker ps | grep triliovault_dmsjuju 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-dmsupgrade--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# 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.ymlvi /etc/kolla/globals.ymlansible -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 triliovaultkolla-ansible deploy -i <kolla inventory file> --tags triliovaultdocker ps | grep trilio
docker inspect triliovault_wlm_api | grep -i image
workloadmgr backup-target-listmv 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.yamlexport venv_path="/opt/kolla-venv"
source $venv_path/bin/activatepython3 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.ymlvi /etc/kolla/globals.ymlansible -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 triliovaultkolla-ansible deploy -i <kolla inventory file> --tags triliovaultansible-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.ymlansible-playbook -i <kolla inventory file> create_backup_target_62.ymldocker cp /etc/kolla/triliovault-cloudrc triliovault_wlm_api:/opt/
docker exec -it triliovault_wlm_api bash
source /opt/triliovault-cloudrc
workloadmgr workload-inplace-db-upgradetarget_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_refdocker 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-829debc1c228docker ps | grep trilio
docker inspect triliovault_wlm_api | grep -i image
workloadmgr backup-target-listansible-playbook -i {{ kolla inventory file }} $venv_path/share/kolla-ansible/ansible/roles/triliovault/tasks/wlm_cloud_trust.yml -e "@/etc/kolla/globals.yml"existing_backup_targets.yaml contains the S3 secret key in plain text. Treat it as sensitive, and delete it once step 10 completes successfully.
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.
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
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-39cdffcba82eGET https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/mounted/list
Provides the list of all Snapshots mounted in a Tenant
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
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
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
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
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
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-caa56bb611e4tvm_address
{
"mount":{
"mount_vm_id":"15185195-cd8d-4f6f-95ca-25983a34ed92",
"options":{
}
}
}{
"mount":
{
"options": null
}
}trueconfig.yamlfalseCheck 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.
Go to Administrator View → Operators → OperatorHub.
Search for Grafana Operator and select it.
Click Install to open the operator installation page.
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).
Click Install to confirm the installation.
Note: It is recommended to install the Grafana Operator in the
openshift-user-workload-monitoringnamespace, 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-configoc get -n openshift-monitoring cm cluster-monitoring-config -o yamlapiVersion: v1
data:
config.yaml: |
enableUserWorkload: true
kind: ConfigMap
metadata:
name: cluster-monitoring-config
namespace: openshift-monitoringcd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/
oc apply -f cm-cluster-monitoring-config.yaml -n openshift-monitoringconfig.yaml: |
enableUserWorkload: trueoc edit cm cluster-monitoring-config -n openshift-monitoringcd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/sql_exporters/
vi sql-exporter-config.yamloc -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.yamloc -n openshift-user-workload-monitoring apply -f sql-exporter-deployment.yamloc -n openshift-user-workload-monitoring get pods | grep sqloc -n openshift-user-workload-monitoring apply -f sql-exporter-service.yamloc get svc -n openshift-user-workload-monitoring | grep sqloc -n openshift-user-workload-monitoring apply -f sql-exporter-servicemonitor.yamlcd 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.yamlcd triliovault-cfg-scripts/redhat-director-scripts/monitoring-openshift/openstack_exporter/
./create_keystone_cacert_secret.shoc -n openshift-user-workload-monitoring apply -f openstack-exporter-deployment.yamloc -n openshift-user-workload-monitoring get pods | grep openstack-exporteroc -n openshift-user-workload-monitoring logs <openstack-exporter-pod-name>oc -n openshift-user-workload-monitoring apply -f openstack-exporter-service.yamloc -n openshift-user-workload-monitoring apply -f openstack-exporter-servicemonitor.yamloc -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-saBEARER_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.yamloc -n openshift-user-workload-monitoring apply -f grafana-instance.yamloc 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.iooc -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.yamloc -n openshift-user-workload-monitoring get GRAFANADATASOURCEA list of impactful features in Trilio for OpenStack.
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.
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
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:
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.
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.
Remove components in the order given below, verifying each step before continuing to the next.
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.
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
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
2nMonthly: 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.
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.
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.
server_group object per instance, and the Selective Restore body accepts an optional server_group string per instance.triliovault-datamover and triliovault-dms are inactive on every compute nodepython3-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
TrilioVaultWLMno svc_trilio_wlm_k8s, svc_trilio_dm_api_k8s, or datamover users remain in Keystone's service_domain
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.
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.
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:
openshift-user-workload-monitoringvi 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>.yamlvi 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.yamlcd /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.yamlworkloadmgr 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-promptjuju 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-promptjuju 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-reloadjuju ssh openstack-hypervisor/<N> -- sudo rm -rf /var/log/triliovaultjuju 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 -qqjuju 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_edgefor 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-credentialsjuju 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 dmapijuju 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 endpointsopenstack --insecure user list --domain service_domainsvc_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 accountopenstack --insecure user delete svc_trilio_dm_api_k8s-<suffix>
openstack --insecure user delete datamoverkubectl 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 entriesjuju status -m openstack-machines --relationsopenstack --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.
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
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.
git clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
cd triliovault-cfg-scripts/sunbeam-canonicalapplications:
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 ctlplanejuju 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 triliojuju offers -m openstack | grep -E 'rabbitmq|keystone-credentials|cert-distributor'./deploy_trilio.py dataplanejuju 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-moverjuju 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}
EOFjuju attach-resource horizon \
horizon-image=docker.io/trilio/trilio-horizon-plugin-canonical:<triliovault_tag> \
-m openstackjuju 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__)'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>
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.
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
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-computeRun this command on the respective nodes:
apt-get install nfs-common -yRun the following command on the installation node:
sudo apt update -y && sudo apt install make jq -ygit clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/
helm dep up
cd ../../../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.yamltrilio-openstack NamespaceTo isolate trilio-openstack services, create a dedicated Kubernetes namespace:
kubectl create namespace trilio-openstack
kubectl config set-context --current --namespace=trilio-openstackTrilio 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
<TRILIO_DOCKER_REGISTRY_USERNAME>, <TRILIO_DOCKER_REGISTRY_PASSWORD>
<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.
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:
Login to Horizon using admin user.
Click on Admin Tab.
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.
ssh to all nodes using IP addresses/hostname fetched in previous step and pull TrilioVault horizon image
kubectl get nodes --show-labels | grep openstack-control-planekubectl 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=enabledkubectl get nodes --show-labels | grep triliovault-control-plane```
cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
./create_rabbitmq.sh
```kubectl get osdpl -n openstackroot@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.democd 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.democd ../../../../
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.tplvi 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-lcmvi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values.yamllibvirt:
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 trafficcd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
./get_ceph_mosk.shcat ../values_overrides/ceph.yaml
cat ../templates/bin/_triliovault-ceph.conf.tplvi ../values_overrides/ceph.yamlvi ../templates/bin/_triliovault-ceph.conf.tplcd 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-openstackcd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
vi install.shcd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
./install.shkubectl -n trilio-openstack get ingressroot@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)"
donehelm status trilio-openstackkubectl get pods -n trilio-openstackNAME 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 21hkubectl get jobs -n trilio-openstackNAME 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 21hkubectl get pvc -n trilio-openstacktriliovault-nfs-pvc-172-25-0-10-mnt-tvault-42424 Bound triliovault-nfs-pv-172-25-0-10-mnt-tvault-42424 20Gi RWX nfs 6dkubectl 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.yamlkubectl -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 APPLIEDkubectl 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 4d19hNavigate 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:
Email settings
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
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:
Login to Horizon using admin user.
Click on Admin Tab.
Navigate to Backups-Admin Tab.
Navigate to Trilio page.
Navigate to the Settings tab
Click "Disable/Enable Job Scheduler"
Check or Uncheck the box for "Job Scheduler Enabled"
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:
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-schedulerworkloadmgr disable-global-job-schedulerworkloadmgr enable-global-job-schedulerTrilio will stop all activities once a license is no longer valid or expired.
Configuring the Email settings is a must-have to provide Email notification to OpenStack users.
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
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-computeRun this command on the respective nodes:
sudo apt-get install nfs-common -yRun the following command on the installation node:
sudo apt update -y && sudo apt install make jq -ygit clone -b {{ trilio_branch }} https://github.com/trilioData/triliovault-cfg-scripts.git
cd triliovault-cfg-scripts/openstack-helm/trilio-openstack/
helm dep up
cd ../../../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.yamlIf your OS Helm cloud version is 2023.1 then images yaml file name is 2023.1.yaml
trilio-openstack NamespaceTo 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:
Separate RabbitMQ Installation:
Fetch Internal and Public Domain Names of the Kubernetes Cluster
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:
Ensure the Horizon pods are restarted and running with the new image:
Access the Horizon dashboard and verify the TrilioVault section appears in the UI.
Learn about artifacts related to Trilio for OpenStack 6.2.1
Branch of the repository to be used for DevOps scripts.
trilio_branch : 6.2.1Branch of the repository to enable grafana monitoring on RHOSO18.0.
trilio_grafana_branch : 6.2.1git 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/ansiblegit clone -b 6.2.1 https://github.com/trilioData/triliovault-cfg-scripts.git
cd triliovault-cfg-scripts/openstack-helmgit 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-canonicalNote: Use the standard operator image for FR5 and the FR6-specific operator image for RHOSO18 FR6 deployments.
Important: Use the RabbitMQ and MariaDB image tags that match your RHOSO Feature Release.
All packages are Python 3 (py3.6 - py3.10) compatible only.
Repo URL:
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
For unencrypted WL : 62 min
To view all available workloads of a project inside Horizon do:
Login to Horizon
Navigate to Backups
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:
Login to Horizon
Navigate to the Backups
Navigate to Workloads
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:
Login to Horizon
Navigate to the Backups
Navigate to Workloads
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:
Login to the Horizon
Navigate to Backups
Navigate to Workloads
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:
Login to Horizon
Navigate to the Backups
Navigate to Workloads
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.
Login to the Horizon
Navigate to Backups
Navigate to Workloads
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:
Login to the Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload to reset
<workload_id> ➡️ ID/name of the workload to reset
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.
GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts
Provides the lists of trusts for the given Tenant.
POST https://$(tvm_address):8780/v1/$(tenant_id)/trusts
Creates a workload in the provided Tenant/Project with the given details.
GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts/<trust_id>
Shows all details of a specified trust
DELETE https://$(tvm_address):8780/v1/$(tenant_id)/trusts/<trust_id>
Deletes the specified trust.
GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts/validate/<workload_id>
Validates the Trust of a given Workload.
E-Mail Notification Settings are done through the settings API. Use the values from the following table to set Email Notifications up through API.
smtp_default___recipient
email_settings
POST https://$(tvm_address):8780/v1/$(tenant_id)/settings
Creates a Trilio setting.
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
PUT https://$(tvm_address):8780/v1/$(tenant_id)/settings
Modifies the provided setting with the given details.
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.
POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/<workload_id>/pause
Disables the scheduler of a given Workload
POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/<workload_id>/resume
Enables the scheduler of a given Workload
GET https://$(tvm_address):8780/v1/$(tenant_id)/trusts/validate/<workload_id>
Validates the Scheduler trust for a given Workload
GET https://$(tvm_address):8780/v1/$(tenant_id)/global_job_scheduler
Requests the status of the Global Job Scheduler
POST https://$(tvm_address):8780/v1/$(tenant_id)/global_job_scheduler/disable
Requests disabling the Global Job Scheduler
POST https://$(tvm_address):8780/v1/$(tenant_id)/global_job_scheduler/enable
Requests enabling the Global Job Scheduler
Note: Run following steps on node from where you have install openstack cloud helm charts. (Master Node)
ssh to 'installation client node'
## 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 ../../../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.yamlReplace 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]:
If Separate RabbitMQ is not present, install it using following script:
Fetch Internal and Public Domain Names of the Kubernetes Cluster
Generate the admin credentials file using the previously retrieved domain names
[For MOSK]:
Copy following files from old repository to current one as it is. [No changes from triliovault install side]
If you do not have these old files, then you need to perform the same step from 'TrilioVault install document on Openstack MOSK'
Fetch Internal and Public Domain Names of the Kubernetes Cluster
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
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
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
Retention Policy and Value
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 "Delete Workload"
Confirm by clicking "Delete Workload" yet again
Click "Unlock Workload"
Confirm by clicking "Unlock Workload" yet again
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
For unencrypted WL : 10 min
For encrypted WL : 18 min5
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.
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
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"
}
]
}
]
}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
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
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-8f8141157fc7All following API commands require an Authentication token against a user with admin-role in the authentication project.
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
kubectl create namespace trilio-openstack
kubectl config set-context --current --namespace=trilio-openstackkubectl get nodes --show-labels | grep openstack-control-planekubectl 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=enabledkubectl get nodes --show-labels | grep triliovault-control-planevi triliovault-cfg-scripts/openstack-helm/trilio-openstack/values_overrides/keystone.yamlcd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
./create_rabbitmq.shcd 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.democat ../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.tplcd 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.tplvi ../templates/bin/_triliovault-ceph.conf.tplcd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils
./get_ceph.shcat ../values_overrides/ceph.yaml
cat ../templates/bin/_triliovault-ceph.conf.tplcd 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-openstackcd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
vi install.shcd triliovault-cfg-scripts/openstack-helm/trilio-openstack/utils/
./install.shkubectl get service -n openstack | grep LoadBalancerpublic-openstack LoadBalancer 10.105.43.185 192.168.2.50 80:30162/TCP,443:30829/TCPkubectl -n trilio-openstack get ingressroot@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-namespacekubectl edit deployment ingress-nginx-controller -n ingress-nginx--watch-namespace=trilio-openstack,openstackkubectl rollout restart deployment ingress-nginx-controller -n openstackhelm status trilio-openstackkubectl get pods -n trilio-openstackNAME 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-openstackNAME 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 13hkubectl get pvc -n trilio-openstacktriliovault-nfs-pvc-172-25-0-10-mnt-tvault-42424 Bound triliovault-nfs-pv-172-25-0-10-mnt-tvault-42424 20Gi RWX nfs 6dkubectl 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-dq2sdkubectl 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-2krmjkubectl 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-mxvhpkubectl describe secret triliovault-image-registry -n openstackkubectl create secret docker-registry triliovault-image-registry \
--docker-server="docker.io" \
--docker-username=<TRILIO_REGISTRY_USERNAME> \
--docker-password=<TRILIO_REGISTRY_PASSWORD> \
-n openstackkubectl -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-8c200f9c2473HTTP/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-91a41fe37f78HTTP/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.yamlcp triliovault-cfg-scripts-old/openstack-helm/trilio-openstack/files/s3-cert.pem triliovault-cfg-scripts/openstack-helm/trilio-openstack/files/s3-cert.pemvi 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.democp 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.tplcd 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.democp 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 89dvi 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-openstackcd 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 6d6.2.1-2025.2
6.2.1-2025.2
ubuntu rocky
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)
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/ /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=0python3-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.0tvo-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.18FR6
registry.redhat.io/rhoso/openstack-rabbitmq-rhel9:18.0.21
registry.redhat.io/rhoso/openstack-mariadb-rhel9:18.0.21Kolla 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.2OpenStack 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.1OpenStack 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
registry.connect.redhat.com/trilio/trilio-openstack-operator-rhoso:6.2.1-fr6-rhoso18.0
Kolla Flamingo (2025.2)
workloadmgr
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
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:
Discover the workloads available for import and/or reassignment using workloadmgr workload-get-import-reassign-list. The command returns a JOB-ID.
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:-
Download the immutable workload directory from its mount path and upload/copy it to the non-immutable backup target mount path.
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.
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.
Find & replace the backup_target_types property of the workload and it’s all respective snapshots
Find & replace the backup_media_target property of the workload and it’s all respective snapshots
Verify the changes
Now try reassigning the workload.
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.
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.
--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.
workloadmgr workload-import-reassign --map-fileworkload-get-orphaned-workloads-list --generate_yaml--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_workloadslist_importable_workloadsinplace_upgrade_db_recordstenants-chargeback-csvlist_import_reassignlist_reassign_workloadsimport_reassignworkload_reassignThe 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.
DEPRECATED: use workload-get-import-reassign-list instead.
DEPRECATED: use workload-import-reassign instead.
DEPRECATED: use workload-get-import-reassign-list with --orphaned instead. The former --generate_yaml option has been replaced by job-detail-show --generate-yaml.
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.
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.
Kolla Ubuntu Epoxy (2025.1)
Jammy (Ubuntu 22.04)
98
Jammy (Ubuntu 22.04)
29
11
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
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: Falseworkloadmgr 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.1docker.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.1docker.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.2docker.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.2docker.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.1docker.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.2docker.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.1Object-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.
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.
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).
# 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-pluginapplications:
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.yamljuju-charms/sample_overlay_bundles/tvo-overlay-bundle.yamlcp 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 numbersjuju 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-pluginPKG_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-pluginjuju 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-sourcefor 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
donefor 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-servicejuju add-relation trilio-data-mover:identity-service keystone:identity-servicejuju 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-apiAgent Status Message
idle active Unit is readybash juju-charms/unmount-backup-targets.shfor unit in $(trilio_units trilio-wlm trilio-data-mover); do
echo "=== $unit ==="
juju run "$unit" unmount-old-backup-targets --wait=300s
donefor 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/openrcjuju-charms/sample_overlay_bundles/tvo-overlay-bundle.yaml # 6.2 — use as base for new deployments and upgradesTrilio 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:
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.
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.
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.
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.
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-trustpod 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 theCompletedstate once the migration script finishes updating the required S3 secret references.
No orphaned object store or NFS DaemonSets remain:
Expected: No output
No orphaned object store Kubernetes resources remain:
Expected: "Not found" error for each command.
No hung mounts on control plane nodes (repeat for each node labeled trilio-control-plane=enabled):
Expected: No output
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.
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:
Check the OpenStackDataPlaneDeployment completed successfully:
Expected: Ready = True (Confirms the cleanup job has successfully completed on data plane nodes)
Check Ansible runner job logs for success:
Expected: failed=0, unreachable=0 (Ensures all tasks executed successfully without errors on any host)
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)
No hung mounts on compute nodes (SSH into a compute node and run):
Expected: no output (Ensures no stale backup target mounts remain)
No stale empty directories under vault_data_dir (SSH into a compute node and run):
Expected: empty (Verifies cleanup of leftover mount directories)
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)
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.
List backup targets via CLI:
Expected: All previously configured backup targets are listed with an online status.
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 .
GET https://$(tvm_address):8780/v1/$(tenant_id)/project_quota_types
Lists all available Quota Types
juju integrate
Run an action
juju run-action
juju run
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
openstack-secret6.1.7+
6.2.0
cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts
./deploy_tvo_control_plane.shmv 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 jqcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
bash collect_backup_targets.sh -i /path/to/old/tvo-operator-inputs.yamlvi existing_list_of_backup_targets.yamlcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
chmod +x patch_helm_ownership_metadata.sh
./patch_helm_ownership_metadata.shcd 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.shoc -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-storeoc debug node/<node-name> -- chroot /host findmnt -r | grep triliovault-mountsoc 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 OpenStackDataPlaneNodeSetcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
vi trilio-backup-target-cleanup-deployment.yamloc -n openstack apply -f trilio-backup-target-cleanup-deployment.yamloc -n openstack get openstackdataplanedeployment edpm-trilio-upgrade-cleanup-1oc -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-mountsls /var/lib/trilio/triliovault-mounts/sudo systemctl status edpm_triliovault-datamover.servicepodman ps -a | grep trilio-cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
bash update_backup_targets_62.shoc -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-listopenstack secret list | grep secret-key-cd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
rm -f existing_list_of_backup_targets.yamlcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
chmod +x patch_helm_ownership_metadata.sh
./patch_helm_ownership_metadata.shcd 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
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
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
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
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
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.
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
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
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
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
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
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
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
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-alivetvm_address
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"
}
}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
GET https://$(tvm_address):8780/v1/$(tenant_id)/snapshots
Lists all Snapshots.
tvm_address
POST https://$(tvm_address):8780/v1/$(tenant_id)/workloads/<workload_id>
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
DELETE https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>
Deletes a specified Snapshot
GET https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>/cancel
Cancels the Snapshot process of a given Snapshot
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
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-d40aed0dd68dThe 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.
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:
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.
Remote Registry
Local Registry
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.
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.
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.
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.
Following table provides the details of parameters to be set in trilio_env.yaml file against all the NFS target backends.
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.
trilio_env.yaml
roles_data.yaml
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'.
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.
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:
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
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).
Please get value of parameter TVO_OPERATOR_CONTAINER_IMAGE_URL from . This is Trilio for OpenStack Operator container image tag.
Run the following commands:
Log in to the OpenShift Console using the admin user.
Create a namespace named tvo-operator-system.
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.pyscript automatically selects the appropriate template (tvo-operator-inputs-till-fr5.yamlortvo-operator-inputs-fr6-onwards.yaml) and updates thetvo-operator-inputs.yamlfile. 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:
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.
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.
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.
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.yamlUse 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.
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
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
Instead of tls-everywhere-endpoints-dns.yaml file, usetriliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env_tls_everywhere_dns.yaml
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
All commands need to be run as a stack user on the undercloud node
All commands need to be run as a 'stack' user
All commands need to be run as a 'stack' user
For only this section user needs to source the cloudrc file of overcloud node
All commands need to be run as a 'stack' user on undercloud node
trilio_defaults.yaml in overcloud deploy command with `-e` option as shown below.triliovault_nfs_map_input.yml in the current directory and provide compute host and NFS share/IP map.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
If pip isn't available please install pip on the undercloud.
triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_nfs_map.yamltrilio_nfs_map.yaml) in overcloud deploy command with '-e' option as shown below.MultiIPNfsEnabled is set to true in the trilio_env.yaml file and that NFS is used as a backup target.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
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::TrilioObjectStoreparameter_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.1cd /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.1cd redhat-director-scripts/rhosp17/scripts/
dnf install python3-ruamel-yaml
python3 update_object_store_yaml.pycd /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.yamlsource <OVERCLOUD_RC_FILE>vi /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/environments/trilio_env.yamlopenstack role add --user <cloud-Admin-UserName> --domain <Cloud-Admin-DomainName> admin
# Example
openstack role add --user admin --domain default admincd /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/scripts
./create_wlm_ids_conf.shcat /home/stack/triliovault-cfg-scripts/redhat-director-scripts/<RHOSP_RELEASE_DIRECTORY>/puppet/trilio/files/triliovault_wlm_ids.confmodprobe nbd nbds_max=128
lsmod | grep nbdmodprobe fuse
lsmod | grep fusesource stackrccd /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.yamlopenstack stack failures list overcloud
heat stack-list --show-nested -f "status=FAILED"
heat resource-list --nested-depth 5 overcloud | grep FAILEDpodman logs <trilio-container-name>
tailf /var/log/containers/<trilio-container-name>/<trilio-container-name>.logcd 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:/rhospnfssudo pip3 install PyYAML==5.1 3python3 ./generate_nfs_map.pygrep ':.*:' 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.cfglisten 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.localretries 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.yamlTrilioDatamoverOptVolumes:
- <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-containerDmapiRabbitPassword
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.
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
Example output:
NAME AGE
storage 2m5sgit 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-openstackecho -n "<password_string>" | base64DbRootPassword
- 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.yamlcd 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.comcd 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.0oc get pods -A | grep tvo-operatoroc get crds | grep tvocd 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: 3306images
Please refer to Resources
Automated
rabbitmq and galera images
oc get nodesoc 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=enabledoc get nodes -l trilio-control-plane=enabledcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
vi certificate.yamlcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
./create_cert_secrets.shoc -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-clustercd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/ctlplane-scripts/
./deploy_tvo_control_plane.shoc 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=openstackcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
oc -n openstack apply -f ../ctlplane-scripts/trilio-openstack-secret.yamlcd triliovault-cfg-scripts/redhat-director-scripts/rhosp18/dataplane-scripts/
chmod +x set_data_plane_inputs.py
./set_data_plane_inputs.pyrabbit_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.yamlvi trilio-datamover-service.yamloc -n openstack apply -f trilio-datamover-service.yamloc -n openstack get OpenStackDataPlaneNodeSetvi 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.yamloc -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.2oc -n openstack edit openstackversion <OPENSTACKVERSION_RESOURCE_NAME> oc -n openstack edit openstackversion openstack-controlplaneapiVersion: 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 --overwriteoc -n openstack get route horizon -o yaml | grep timeouthaproxy.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"tvo-operator-inputs.yaml in step 2.2User 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 A Restore is the workflow to bring back the backed up VMs from a Trilio Snapshot.
To reach the list of Restores for a Snapshot follow these steps:
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to show
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
--snapshot_id <snapshot_id> ➡️ ID of the Snapshot to show the restores of
To reach the detailed Restore overview follow these steps:
Login to Horizon
Navigate to Backups
Navigate to Workloads
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:
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to delete
To delete one or more Restores through the Restore list do the following:
Login to Horizon
Navigate to Backups
Navigate to Workloads
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:
Login to Horizon
Navigate to Backups
Navigate to Workloads
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.
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to be restored
Login to Horizon
Navigate to Backups
Navigate to Workloads
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.
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to be restored
Login to Horizon
Navigate to Backups
Navigate to Workloads
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.
Login to Horizon
Navigate to Backups
Navigate to Workloads
Identify the workload that contains the Snapshot to be restored
Login to Horizon
Navigate to Backups
Navigate to Workloads
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.
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.
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
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
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"
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"
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
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"
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 flavor the restored VMs will use
Which Nova server group each restored VM joins (6.2.1 and later)
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"
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.
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"
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
''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
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
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
restore_cinder_volume ➡️ set to true if the Volume shall be restored
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.
The root disk needs to be at least as big as the root disk of the backed up instance was.
Do not mix network topology restore together with network mapping.
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:Truerestore_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
X-Auth-Project-Id
string
project to run the authentication against
X-Auth-Token
string
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.
tvm_address
string
IP or FQDN of Trilio Service
tenant_id
string
migrate_cloud
boolean
True also discovers workloads from different clouds
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).
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
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.
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
{
"workloads":{
"reassigned_workloads":[],
"failed_workloads":[],
"jobid_list":[
107
]
},
"deprecation":"/workloads/reasign_workloads is deprecated; use /workloads/import_reassign_workloads."
}The typical flow is:
POST /workloads/get_list/import_reassign ➡️ discover importable/reassignable workloads, returns a jobid
POST /workloads/job_details ➡️ fetch the discovery results for the jobid
POST /workloads/import_reassign_workloads ➡️ run the import/reassign operation, returns jobids
POST /workloads/job_details ➡️ track the operation progress
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.
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
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).
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
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.
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
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.
tvm_address
string
IP or FQDN of Trilio Service
tenant_id
string
limit
integer
Maximum number of jobs to return
marker
integer
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.
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
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}.
{
"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
]
}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
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.
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.
This scenario will cover the Disaster Recovery of a single Workload and a complete Cloud. All processes are done be the OpenStack administrator.
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:
Copy the Workload directories to the configured NFS Volume
Make the right Mount-Paths available
Reassign the Workload
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:
Reconfigure the Target Trilio installation
Make the right Mount-Paths available
Reassign the Workload
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.
GET https://$(tvm_address):8780/v1/$(tenant_id)/restores/detail
Lists Restores with details
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
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.
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.
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.
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.
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.
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.

# mount <NFS B2-IP/NFS B2-FQDN>:/<VOL-Path> /mntworkload_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.confvault_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.confvault_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.confvault_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.confvault_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
snapshot_id
string
ID of the Snapshot to fetch the Restores from
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
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
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
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
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-6d8764666e4dGET https://$(tvm_address):8780/v1/$(tenant_id)/restores/<restore_id>/cancel
Cancels an ongoing Restore
tvm_address
string
IP or FQDN of the Trilio service
tenant_id
string
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-f81bda1a2840POST https://$(tvm_address):8780/v1/$(tenant_id)/snapshots/<snapshot_id>
Starts a restore according to the provided information
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
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.
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
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
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
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
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>"
}
]
}
]
}
}
}
}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:
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.
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)
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.
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.
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:
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 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.
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.
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.
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.
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:
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 on the button to open the Backup Target Type Create wizard, and follow the instructions to create the BTT.
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 on the button under the Actions column of the BTT List table of the desired BTT to open the Edit Backup Target Type wizard.
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.
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.jsontrilio-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.jsontrilio-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.jsonsource /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-createopenstack 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-modifyopenstack 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-deleteopenstack 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-listopenstack 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-showopenstack 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-defaultopenstack 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-listopenstack 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-showopenstack 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-createopenstack 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-modifyopenstack 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-projectsopenstack 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-projectsopenstack 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-metadataopenstack 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-metadataopenstack 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-deleteopenstack 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
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.
Removing Backup Target Types from an active Workload can lead to inconsistent behavior and potential backup operation failures.
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).
















Below are some of the most common fields you will find in the request and response bodies while working with these APIs.
Hourly
In addition to the schedule fields above, the following top-level fields apply to the policy itself:
GET https://<wlm_api_endpoint>/workload_policy/
Requests the list of available Workload Policies
GET https://<wlm_api_endpoint>/workload_policy/<policy_id>
Requests the details of a given policy
GET https://<wlm_api_endpoint>/workload_policy/assigned/<project_id>
Requests the lists of Policies assigned to a Project.
POST https://<wlm_api_endpoint>/workload_policy/
Creates a Policy with the given parameters
PUT https://<wlm_api_endpoint>/workload_policy/<policy-id>
Updates a Policy with the given information
POST https://<wlm_api_endpoint>/workload_policy/<policy_id>/assign
Updates a Policy with the given information
DELETE https://<wlm_api_endpoint>/workload_policy/<policy_id>
Deletes a given Policy
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
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-aliveThis page contains the API guide for various operations on Backup Targets and Backup Target Types.
Creates the backup target
POST https://<wlm_api_endpoint>/backup_targets
Path:
Headers:
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:
Headers:
Body Format:
Deleting an existing backup target
DELETE https://<wlm_api_endpoint>/backup_targets/<backup_target_id>
Path:
Headers:
Provides the list of all backup targets
GET https://<wlm_api_endpoint>/backup_targets
Path:
Headers:
Provides a detailed list of all backup targets
GET https://<wlm_api_endpoint>/backup_targets/detail
Path:
Headers:
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:
Headers:
Sets the given Backup target as default
GET https://<wlm_api_endpoint>/backup_targets/<backup_target_id>/set_default
Path:
Headers:
Provides a detailed list of all backup target types
GET https://<wlm_api_endpoint>/backup_target_types/detail
Path:
Headers:
Provides all details of a specific backup target type
GET https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>
Path:
Headers:
Creates the backup target type
POST https://<wlm_api_endpoint>/backup_target_types
Path:
Headers:
Body Format:
Update an existing backup target type
PUT https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>
Path:
Headers:
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:
Headers:
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:
Headers:
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:
Headers:
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:
Headers:
Body Format:
Deleting an existing backup target type
DELETE https://<wlm_api_endpoint>/backup_target_types/<backup_target_type_id>
Path:
Headers:
Below are some of the most common fields you will find in the request and response bodies while working with these APIs.
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
Removing Backup Target from an active Workload can lead to inconsistent behavior and potential backup operation failures.
Removing Backup Target Types from an active Workload can lead to inconsistent behavior and potential backup operation failures.
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** 
Provides the list of all backup target types
 <mark style="color:green;">`GET`</mark> `https://<wlm_api_endpoint>/backup_target_types` 
#### 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).
instance-id
String
Unique identifier of the instance to be included in the workload.
timezone
String
Time zone for the job schedule.
start_date
String
Hourly
interval
Integer
<key>
String
Custom metadata key-value pairs.
policy_id
String
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
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
nfs_share
string
lists workloads located on a specific nfs-share
all_workloads
boolean
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.
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
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
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
workload_id
ID of the Workload to show
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.
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
workload_id
ID of the Workload
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.
name
String
Name of the workload.
description
String
instance-id
String
Unique identifier of the instance to be included in the workload.
timezone
String
Time zone for the job schedule.
start_date
String
Hourly
interval
Integer
<key>
String
Custom metadata key-value pairs.
policy_id
String
DELETE https://<wlm_api_endpoint>/workloads/<workload_id>
Deletes the specified Workload.
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
workload_id
ID of the Workload
database_only
boolean
True leaves the Workload data on the Backup Target
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
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
workload_id
ID of the Workload
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
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
workload_id
ID of the Workload
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.
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
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
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.
wlm_api_endpoint
The endpoint URL of the Workloadmgr service
X-Auth-Project-Id
string
Project to run the authentication against
X-Auth-Token
string
name
String
Name of the workload.
{
"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>"
}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.
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.
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
yearlyHTTP/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-7e8d3158d137HTTP/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-aliveHTTP/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-aliveHTTP/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-aliveHTTP/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": ""
}