# Creating a new OpenStack CLI command in python-tripleoclient (openstack undercloud backup)¶

The first action needed is to be able to create a new CLI command for the OpenStack client. In this case, we are going to implement the openstack undercloud backup command.

cd dev-docs
cd python-tripleoclient


Let’s list the files inside this folder:

[stack@undercloud python-tripleoclient]\$ ls
AUTHORS           doc                            setup.py
bindep.txt        zuul.d                         tools
ChangeLog         releasenotes                   tripleoclient
config-generator  requirements.txt
CONTRIBUTING.rst  setup.cfg


Once inside the python-tripleoclient folder we need to check the setup.cfg file. This file defines all the CLI commands for the Python TripleO client. Specifically, we will need at the end of this file our new command definition:

undercloud_backup = tripleoclient.v1.undercloud_backup:BackupUndercloud


This means that we have a new command defined as undercloud backup that will instantiate the BackupUndercloud class defined in the file tripleoclient/v1/undercloud_backup.py

For further details related to this class definition please go to the gerrit review.

Now, having our class defined we can call other methods to invoke Mistral in this way:

clients = self.app.client_manager

workflow_input = {
"sources_path": files_to_backup
}
output = undercloud_backup.prepare(clients, workflow_input)


So forth, we will call the undercloud_backup.prepare method defined in the file tripleoclient/workflows/undercloud_backup.py which will call the tripleo.undercloud_backup.v1.prepare_environment Mistral workflow we are about to create:

def prepare(clients, workflow_input):
workflow_client = clients.workflow_engine
tripleoclients = clients.tripleoclient
with tripleoclients.messaging_websocket() as ws:
execution = base.start_workflow(
workflow_client,
'tripleo.undercloud_backup.v1.prepare_environment',
workflow_input=workflow_input
)
for payload in base.wait_for_messages(workflow_client, ws, execution):
if 'message' in payload: