# How To Use OpenStack Cinder Persistent Volumes
The purpose of this guide is to create Persistent Volumes using [OpenStack Cinder](https://wiki.openstack.org/wiki/Cinder). It is part of [OpenShift persistent storage guide](../README.md), which explains how to use these Persistent Volumes as data storage for applications.
This guide assumes knowledge of OpenShift fundamentals and that you have a cluster up and running on OpenStack.
## Cinder Provisioning
We'll be creating Cinder volumes in our OpenStack installation and pre-formatting them with ext3 filesystem. This requires Cinder and Nova client tools installed on a OpenStack virtual machine (=instance in OpenStack terminology) and configured OpenStack environment variables there. Consult your OpenStack site admins for values of these environment variables.
```console
[root@vm1 ~] $ yum install python-cinderclient python-keystoneclient python-novaclient
[root@vm1 ~] $ export OS_AUTH_URL=<auth. url>
[root@vm1 ~] $ export OS_TENANT_ID=<tenant id>
[root@vm1 ~] $ export OS_USERNAME=<username>
[root@vm1 ~] $ export OS_PASSWORD=<password>
[root@vm1 ~] $ export OS_REGION_NAME=<region>
```
Create 1GB and 5GB Cinder volumes and remember their IDs.
```console
[root@vm1 ~] $ cinder create --display-name test1 1
+---------------------+--------------------------------------+
| Property | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| created_at | 2015-08-27T12:53:54.016972 |
| display_description | None |
| display_name | test1 |
| encrypted | False |
| id | f37a03aa-6212-4c62-a805-9ce139fab180 |
| metadata | {} |
| size | 1 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| volume_type | None |
+---------------------+--------------------------------------+
[root@vm1 ~] $ cinder create --display-name test2 5
+---------------------+--------------------------------------+
| Property | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| created_at | 2015-08-27T12:53:57.415840 |
| display_description | None |
| display_name | test2 |
| encrypted | False |
| id | 51a3b34d-6f33-4e79-95f6-ebc804c96a1e |
| metadata | {} |
| size | 5 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| volume_type | None |
+---------------------+--------------------------------------+
```
Temporarily attach the volumes, format them with ext3 filesystem and change permissions of their root directory to allow anyone to write there. Both MySQL and WordPress will use non-root users to write to the volumes. Of course, use real VM instance ID instead of `<instance ID>` and real IDs of your volumes.
```console
[root@vm1 ~] $ nova volume-attach <instance ID> f37a03aa-6212-4c62-a805-9ce139fab180
+----------+--------------------------------------+
| Property | Value |
+----------+--------------------------------------+
| device | /dev/vdd |
| id | f37a03aa-6212-4c62-a805-9ce139fab180 |
| serverId | 338db252-2bc6-4de2-8941-b22faca3f3dd |
| volumeId | f37a03aa-6212-4c62-a805-9ce139fab180 |
+----------+--------------------------------------+
[root@vm1 ~] $ mkfs.ext3 /dev/vdd
mke2fs 1.42.11 (09-Jul-2014)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: 76a0669a-36e3-40e3-a4f7-ac5e207620c5
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
[root@vm1 ~] $ mount /dev/vdd /mnt
[root@vm1 ~] $ chmod 777 /mnt
[root@vm1 ~] $ umount /mnt
[root@vm1 ~] $ nova volume-detach <instance ID> f37a03aa-6212-4c62-a805-9ce139fab180
[root@vm1 ~] $ nova volume-attach <instance ID> 51a3b34d-6f33-4e79-95f6-ebc804c96a1e
+----------+--------------------------------------+
| Property | Value |
+----------+--------------------------------------+
| device | /dev/vde |
| id | 51a3b34d-6f33-4e79-95f6-ebc804c96a1e |
| serverId | 338db252-2bc6-4de2-8941-b22faca3f3dd |
| volumeId | 51a3b34d-6f33-4e79-95f6-ebc804c96a1e |
+----------+--------------------------------------+
[root@vm1 ~] $ mkfs.ext3 /dev/vde
mke2fs 1.42.11 (09-Jul-2014)
Creating filesystem with 1310720 4k blocks and 327680 inodes
Filesystem UUID: 47d983e7-17a6-4189-8a08-2edbad057555
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: ^[[A^[[Adone
[root@vm1 ~] $ mount /dev/vde /mnt
[root@vm1 ~] $ chmod 777 /mnt
[root@vm1 ~] $ umount /mnt
[root@vm1 ~] $ nova volume-detach <instance ID> 51a3b34d-6f33-4e79-95f6-ebc804c96a1e
```
These steps can be easily automated. Scripting is left as an exercise for the reader.
## Cinder Persistent Volumes
Each Cinder volume becomes its own Persistent Volume in the cluster.
```console
# Edit Cinder persistent volume definitions and substitute <volume ID> with real ID of the volumes
[root@vm1 ~] $ vi examples/volumes//cinder/pv-cinder-1.yaml
volumeID: f37a03aa-6212-4c62-a805-9ce139fab180
[root@vm1 ~] $ vi examples/volumes//cinder/pv-cinder-2.yaml
volumeID: 51a3b34d-6f33-4e79-95f6-ebc804c96a1e
[root@vm1 ~] $ oc create -f examples/volumes/cinder/pv-1.yaml
[root@vm1 ~] $ oc create -f examples/volumes/cinder/pv-2.yaml
[root@vm1 ~] $ oc get pv
NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON
pv0001 <none> 1073741824 RWO,RWX Available
pv0002 <none> 5368709120 RWO Available
```
Now the volumes are ready to be used by applications in the cluster.