summaryrefslogtreecommitdiff
path: root/openstack/usr/share/openstack/modules/glance
diff options
context:
space:
mode:
Diffstat (limited to 'openstack/usr/share/openstack/modules/glance')
-rw-r--r--openstack/usr/share/openstack/modules/glance176
1 files changed, 176 insertions, 0 deletions
diff --git a/openstack/usr/share/openstack/modules/glance b/openstack/usr/share/openstack/modules/glance
new file mode 100644
index 00000000..f62942f9
--- /dev/null
+++ b/openstack/usr/share/openstack/modules/glance
@@ -0,0 +1,176 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+DOCUMENTATION = '''
+---
+module: glance
+short_description: Manage OpenStack virtual machine images
+description:
+ - Upload virtual machine images to OpenStack Image Service (glance)
+requirements: [ python-glanceclient ]
+options:
+ name:
+ description:
+ - name of the image
+ required: true
+ format:
+ description:
+ - disk format
+ choices: [ami, ari, aki, vhd, vmdk, raw, qcow2, vdi, iso]
+ required: true
+ is_public:
+ description:
+ - if true, image is public
+ choices: [true, false]
+ aliases: [public]
+ required: false
+ default: false
+ file:
+ description:
+ - path to the file that contains the image
+ required: true
+ aliases: [path]
+ auth_url:
+ description:
+ - URL to Identity service (keystone) catalog endpoint
+ required: true
+ region:
+ description:
+ - OpenStack region name
+ required: false
+ aliases: [region_name]
+ username:
+ description:
+ - user name to authenticate against Identity service
+ aliases: [user, user_name, login_user]
+ password:
+ description:
+ - password to authenticate against Identity service
+ aliases: [pass, login_password]
+ tenant_name:
+ description:
+ - name of the tenant
+ endpoint_type:
+ description:
+ - endpoint URL type
+ choices: [publicURL, internalURL]
+ required: false
+ default: publicURL
+
+examples:
+ - code: 'glance: name=cirros file=/tmp/cirros.img format=qcow2 is_public=true auth_url=http://192.168.206.130:5000/v2.0/ username=admin tenant_name=demo password=secrete region=RegionOne endpoint_type=publicURL '
+'''
+
+
+try:
+ from glanceclient import Client
+ from keystoneclient.v2_0 import client as ksclient
+except ImportError:
+ glanceclient_found = False
+else:
+ glanceclient_found = True
+
+
+def get_token_and_endpoint(auth_url, username, password, tenant_name,
+ region_name, endpoint_type):
+
+ keystone = ksclient.Client(username=username,
+ password=password,
+ tenant_name=tenant_name,
+ auth_url=auth_url,
+ region_name=region_name)
+ glance_endpoint = keystone.service_catalog.url_for(
+ service_type="image",
+ endpoint_type=endpoint_type)
+ return (keystone.auth_token, glance_endpoint)
+
+
+def authenticate(auth_url, username, password, tenant_name, region,
+ endpoint_type, version='1'):
+ """Return a keystone client object"""
+
+ (token, endpoint) = get_token_and_endpoint(auth_url, username, password,
+ tenant_name, region,
+ endpoint_type)
+
+ return Client(version, endpoint=endpoint, token=token)
+
+
+def get_images(glance, name):
+ """ Retrieve all images with a certain name """
+ images = [x for x in glance.images.list() if x.name == name]
+ return images
+
+
+def create_image(glance, name, path, disk_format, is_public, check_mode):
+ """ Create a new image from a file on the path.
+
+ Return a pair. First element indicates whether a change occurred,
+ second one is the ID of the iamge """
+
+ # If the image(s) already exists, we're done
+ images = get_images(glance, name)
+ if len(images) > 0:
+ return (False, images[0].id)
+
+ if check_mode:
+ return (True, None)
+
+ image = glance.images.create(name=name, disk_format=disk_format,
+ container_format='bare',
+ is_public=is_public)
+ image.update(data=open(path, 'rb'))
+ return (True, image.id)
+
+
+def main():
+
+ module = AnsibleModule(
+ argument_spec=dict(
+ name=dict(required=True),
+ file=dict(required=True, aliases=['path']),
+ auth_url=dict(required=True),
+ region=dict(required=False, aliases=['region_name']),
+ username=dict(required=True, aliases=['user',
+ 'user_name',
+ 'login_user']),
+ password=dict(required=True, aliases=['pass', 'login_password']),
+ tenant_name=dict(required=True, aliases=['tenant']),
+ disk_format=dict(required=True,
+ choices=['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw',
+ 'qcow2', 'vdi', 'iso'],
+ aliases=['disk-format', 'format']),
+ is_public=dict(required=False,
+ default=False,
+ aliases=['public']),
+ endpoint_type=dict(required=False,
+ choices=['publicURL', 'internalURL'],
+ default='publicURL')
+ ),
+ supports_check_mode=True
+ )
+
+ name = module.params['name']
+ path = module.params['file']
+ auth_url = module.params['auth_url']
+ region = module.params['region']
+ username = module.params['username']
+ password = module.params['password']
+ tenant_name = module.params['tenant_name']
+ disk_format = module.params['disk_format']
+ is_public = module.params['is_public']
+ endpoint_type = module.params['endpoint_type']
+ check_mode = module.check_mode
+
+ glance = authenticate(auth_url, username, password, tenant_name, region,
+ endpoint_type)
+
+ (changed, id) = create_image(glance, name, path, disk_format, is_public,
+ check_mode)
+
+ module.exit_json(changed=changed, name=name, id=id)
+
+# this is magic, see lib/ansible/module_common.py
+#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
+if __name__ == '__main__':
+ main()