The python-openstackclient library has an example that provides the basic structure for a new command (the auth_url problem workaround may be needed). To create a virtual machine with 1GB RAM, 1CPU, ubuntu-14.04, using the teuthology keypair on the fsf-lan network, the matching flavor, image, keypair and network objects can be found with:
for flavor in client_manager.compute.flavors.list():
if flavor.ram == 1024 and flavor.vcpus == 1:
break
for network in client_manager.compute.networks.list():
if network.label == 'fsf-lan':
break
for image in client_manager.compute.images.list():
if 'ubuntu' in image.name and '14.04' in image.name:
break
for keypair in client_manager.compute.keypairs.list():
if keypair.name == 'teuthology':
break
The test instance can then be created
server = client_manager.compute.servers.create('test',
image, flavor,
key_name=keypair.name,
nics=[{'net-id': network.id}])
but it won’t be immediately active and the wait_for_status can be used to block until it is:
from openstackclient.common import utils
...
utils.wait_for_status(
client_manager.compute.servers.get,
server.id)
Deleting the instance is simpler:
client_manager.compute.servers.delete(server.id)
utils.wait_for_delete(client_manager.compute.servers.get, server.id)
See create-delete.py for a standalone script including the above lines that can be run as:
$ python create-server.py --help usage: create-server.py [-h] [--os-compute-api-version] ... $ python create-server.py FLAVOR: {'name': u'm1.small', ... NETWORK: {'cidr_v6': None, 'dns2': None, 'dns1': None, 'netmask': None, 'label': u'fsf-lan',... IMAGE: {'status': u'ACTIVE', 'updated': u'2014-05-19T11:43:00Z', 'name': u'ubuntu-trusty-14.04',... KEYPAIR: {'public_key': u'ssh-rsa AAAAB3...
As of python-openstackclient version 1.3.0 the utils.wait_for_delete helper does not exist yet and can be replaced with
def wait_for_delete(get_f,
res_id,
status_field='status',
sleep_time=5,
timeout=300,
callback=None):
total_time = 0
while total_time < timeout:
try:
# might not be a bad idea to re-use find_resource here if it was
# a bit more friendly in the exceptions it raised so we could just
# handle a NotFound exception here without parsing the message
res = get_f(res_id)
except Exception as ex:
if type(ex).__name__ == 'NotFound':
return True
raise
status = getattr(res, status_field, '').lower()
if status == 'error':
return False
if callback:
progress = getattr(res, 'progress', None) or 0
callback(progress)
time.sleep(sleep_time)
total_time += sleep_time
# if we got this far we've timed out
return False
It may be necessary to work around
$ openstack image list ERROR: openstack No module named cryptography.hazmat.bindings.openssl.binding
with the following
apt-get install libssl-dev pip install 'pyOpenSSL<=0.13' pip install python-openstackclient
on Ubuntu 14.04.
Many thanks to Mehdi Abaakouk for his guidance.


2 Replies to “create / delete an OpenStack instance with python-openstackclient”
Comments are closed.