@ -138,6 +138,15 @@ options:
- " Name of the openstack volume type. This is valid when working
- " Name of the openstack volume type. This is valid when working
with cinder . "
with cinder . "
version_added : " 2.4 "
version_added : " 2.4 "
image_provider :
description :
- " When C(state) is I(exported) disk is exported to given Glance image provider. "
- " C(**IMPORTANT**) "
- " There is no reliable way to achieve idempotency, so every time
you specify this parameter the disk is exported , so please handle
your playbook accordingly to not export the disk all the time .
This option is valid only for template disks . "
version_added : " 2.4 "
extends_documentation_fragment : ovirt
extends_documentation_fragment : ovirt
'''
'''
@ -189,6 +198,13 @@ EXAMPLES = '''
- ovirt_disk :
- ovirt_disk :
id : 7 de90f31 - 222 c - 436 c - a1ca - 7e655 bd5b60c
id : 7 de90f31 - 222 c - 436 c - a1ca - 7e655 bd5b60c
download_image_path : / home / user / mydisk . qcow2
download_image_path : / home / user / mydisk . qcow2
# Export disk as image to Glance domain
# Since Ansible 2.4
- ovirt_disks :
id : 7 de90f31 - 222 c - 436 c - a1ca - 7e655 bd5b60c
image_provider : myglance
state : exported
'''
'''
@ -516,7 +532,7 @@ class DiskAttachmentsModule(DisksModule):
def main ( ) :
def main ( ) :
argument_spec = ovirt_full_argument_spec (
argument_spec = ovirt_full_argument_spec (
state = dict (
state = dict (
choices = [ ' present ' , ' absent ' , ' attached ' , ' detached ' ],
choices = [ ' present ' , ' absent ' , ' attached ' , ' detached ' , ' exported ' ],
default = ' present '
default = ' present '
) ,
) ,
id = dict ( default = None ) ,
id = dict ( default = None ) ,
@ -537,6 +553,7 @@ def main():
force = dict ( default = False , type = ' bool ' ) ,
force = dict ( default = False , type = ' bool ' ) ,
sparsify = dict ( default = None , type = ' bool ' ) ,
sparsify = dict ( default = None , type = ' bool ' ) ,
openstack_volume_type = dict ( default = None ) ,
openstack_volume_type = dict ( default = None ) ,
image_provider = dict ( default = None ) ,
)
)
module = AnsibleModule (
module = AnsibleModule (
argument_spec = argument_spec ,
argument_spec = argument_spec ,
@ -567,7 +584,7 @@ def main():
ret = None
ret = None
# First take care of creating the VM, if needed:
# First take care of creating the VM, if needed:
if state == ' present ' or state == ' detached ' or state == ' attached ' :
if state in ( ' present ' , ' detached ' , ' attached ' ) :
ret = disks_module . create (
ret = disks_module . create (
entity = disk ,
entity = disk ,
result_state = otypes . DiskStatus . OK if lun is None else None ,
result_state = otypes . DiskStatus . OK if lun is None else None ,
@ -597,6 +614,22 @@ def main():
action_condition = lambda d : module . params [ ' sparsify ' ] ,
action_condition = lambda d : module . params [ ' sparsify ' ] ,
wait_condition = lambda d : d . status == otypes . DiskStatus . OK ,
wait_condition = lambda d : d . status == otypes . DiskStatus . OK ,
)
)
# Export disk as image to glance domain
elif state == ' exported ' :
disk = disks_module . search_entity ( )
if disk is None :
module . fail_json (
msg = " Can not export given disk ' %s ' , it doesn ' t exist " %
module . params . get ( ' name ' ) or module . params . get ( ' id ' )
)
if disk . storage_type == otypes . DiskStorageType . IMAGE :
ret = disks_module . action (
action = ' export ' ,
action_condition = lambda d : module . params [ ' image_provider ' ] ,
wait_condition = lambda d : d . status == otypes . DiskStatus . OK ,
storage_domain = otypes . StorageDomain ( name = module . params [ ' image_provider ' ] ) ,
)
elif state == ' absent ' :
elif state == ' absent ' :
ret = disks_module . remove ( )
ret = disks_module . remove ( )