Introduction

This blog entry demonstrates the XenAPINFS – Glance integration. The feature’s blueprint can be found on launchpad. At the time of writing this document, the driver only supports XenServer type ovf images (these images are specially named vhd files compressed to a .tgz archive). The cinder driver is using the nova xenapi plugins to upload/download the images. I am also working on a general case, to be able to create volumes from images with arbitrary format (such as qcow or raw). Should you wish to try out XenAPINFS, make sure that the fix for this bug already hit trunk, or cherry-pick the patch.

In this demo, I will:

  • create a volume from a glance image
  • boot an instance from the created volume
  • make changes to the filesystem
  • upload the volume to glance as a new image
  • create instances based on the newly created image

Requirements

NFS Server

For the demo, a single Ubuntu VM is serving the NFS. The following options were specified for the export:

ubuntu@copper:~$ grep demo /etc/exports
/demo *(rw,no_subtree_check,no_root_squash)

XenServer with OpenStack

For the demo Devstack was used to install a development OpenStack on XenServer 6.1. For the demo, only one XenServer was used, however, it is possible to use a totally different XenServer for cinder operations. The only requirement is, that Nova plugins must be installed on the XenServer used for volume operations (the one specified in cinder.conf).

Step 1. – Configure Cinder

Cinder needs to be configured to use the XenAPINFS driver. I will show two ways to do it.

Edit the Configuration File Directly

To configure cinder, go to the openstack box, and edit the configuration file /etc/cinder/cinder.conf, and make sure the following settings are there:

volume_driver = cinder.volume.drivers.xenapi.sm.XenAPINFSDriver
xenapi_connection_url = http://epun.eng.hq.xensource.com
xenapi_connection_username = root
xenapi_connection_password = password
xenapi_nfs_server = copper.eng.hq.xensource.com
xenapi_nfs_serverpath = /demo

After making changes to cinder’s configuration, make sure the service is restarted.

Use Devstack to Configure Cinder

You can also use devstack, to configure cinder with XenAPINFS. The variables required for the localrc file are:

CINDER_DRIVER=XenAPINFS
CINDER_XENAPI_CONNECTION_URL="epun.eng.hq.xensource.com"
CINDER_XENAPI_CONNECTION_USERNAME=root
CINDER_XENAPI_CONNECTION_PASSWORD="password"
CINDER_XENAPI_NFS_SERVER="copper.eng.hq.xensource.com"
CINDER_XENAPI_NFS_SERVERPATH="/demo"

After adding these lines to your localrc file, re-stack your environment:

stack@DevStackOSDomU:~/devstack$ ./unstack.sh
stack@DevStackOSDomU:~/devstack$ ./stack.sh

Please note, that by doing that, you are wiping, and re-building your OpenStack installation.

Step 2. – Upload an Image

A cirros image is provided via our github account. This image is already in XenServer format. To upload it:

stack@DevStackOSDomU:~$ cd devstack/
stack@DevStackOSDomU:~/devstack$ . openrc admin
stack@DevStackOSDomU:~/devstack$ glance image-create --name demoimage \
--copy-from=https://github.com/downloads/citrix-openstack/warehouse/cirros-0.3.0-x86_64-disk.vhd.tgz \
--container-format=ovf --disk-format=vhd

Make sure you give enough time for glance to store the image. Wait, until

stack@DevStackOSDomU:~/devstack$ glance image-list

shows, that demoimage is active:

... demoimage | vhd | ovf | 9220018  | active |

Step 3. – Create a volume from an Image

First, get the id of the new image:

stack@DevStackOSDomU:~/devstack$ glance image-show demoimage | grep id

And use that, to create a 1G volume based on that image, called demovolume_a:

stack@DevStackOSDomU:~$ cinder create --display_name="demovolume_a" --image-id=<put imageid here> 1

Initially, the volume’s status will be downloading, and as that operation is finished, it becomes available. Check its status with:

stack@DevStackOSDomU:~$ cinder list

Step 4. – Boot an Instance from the Volume

To boot an instance, first we need the id of the volume:

cinder show demovolume_a | grep  " id "

And create a new instance with that volume as its primary hard disk:

stack@DevStackOSDomU:~$ nova boot --flavor=m1.small --block_device_mapping vda=<volume id>:::0 demo_vm

Use horizon to access the console of the new VM, and log in using the usual cirros credentials, and touch a file in the home directory. We expect to see these changes in the created image later.

$ touch HEREIAM
$ sync

And use nova to shut down the instance.

stack@DevStackOSDomU:~$ nova delete <instance id>

Step 5. – Create an Image from the Volume

stack@DevStackOSDomU:~$ cinder upload-to-image --container-format=ovf --disk-format=vhd <volume id> demoimage_b

Check the status of the image, by:

stack@DevStackOSDomU:~$ glance image-show demoimage_b

And wait until it is active.

Step 6. – Launch an Instance from the Uploaded Image

First, get the id of the newly created image:

stack@DevStackOSDomU:~$ glance image-show demoimage_b | grep id

And boot an instance with that image:

stack@DevStackOSDomU:~$ nova boot --flavor=m1.small --image=demoimage_b demo_vm_2

And use horizon to log in, and check the contents of the home directory:

$ ls | grep HEREIAM
HEREIAM