diff options
Diffstat (limited to 'openstack/usr/share/openstack/modules/glance')
-rw-r--r-- | openstack/usr/share/openstack/modules/glance | 176 |
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() |