in lib/ansible/modules/cloud/alicloud/_alicloud_disk.py [0:0]
def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
group_id=dict(),
alicloud_zone=dict(aliases=['zone_id', 'zone']),
state=dict(default='present', choices=['present', 'absent']),
disk_id=dict(aliases=['vol_id', 'id']),
disk_name=dict(aliases=['name']),
disk_category=dict(aliases=['disk_type', 'volume_type']),
size=dict(aliases=['disk_size', 'volume_size']),
disk_tags=dict(type='list', aliases=['tags']),
snapshot_id=dict(aliases=['snapshot']),
description=dict(aliases=['disk_description']),
instance_id=dict(aliases=['instance']),
delete_with_instance=dict(aliases=['delete_on_termination'], default=None)
)
)
module = AnsibleModule(argument_spec=argument_spec)
if not HAS_FOOTMARK:
module.fail_json(msg="footmark required for the module alicloud_disk.")
ecs = ecs_connect(module)
state = module.params['state']
instance_id = module.params['instance_id']
disk_id = module.params['disk_id']
zone_id = module.params['alicloud_zone']
disk_name = module.params['disk_name']
delete_with_instance = module.params['delete_with_instance']
description = module.params['description']
changed = False
current_disk = None
try:
if disk_id:
disks = ecs.get_all_volumes(zone_id=zone_id, volume_ids=[disk_id])
if disks and len(disks) == 1:
current_disk = disks[0]
elif disk_name:
disks = ecs.get_all_volumes(zone_id=zone_id, volume_name=disk_name)
if disks:
if len(disks) == 1:
current_disk = disks[0]
else:
disk_ids = []
for d in disks:
disk_ids.append(d.id)
module.fail_json(msg="There is too many disks match name '{0}', "
"please use disk_id or a new disk_name to specify a unique disk."
"Matched disk ids are: {1}".format(disk_name, disk_ids))
except ECSResponseError as e:
module.fail_json(msg='Error in get_all_volumes: %s' % str(e))
if state == 'absent':
if not current_disk:
module.fail_json(msg="Please use disk_id or disk_name to specify one disk for detaching or deleting.")
if instance_id:
try:
changed = current_disk.detach(instance_id)
module.exit_json(changed=changed, disk_id=current_disk.id, disk_category=current_disk.category,
disk_status=current_disk.status, instance_id=instance_id,
disk=get_disk_detail(current_disk))
except Exception as e:
module.fail_json(msg='Detaching disk {0} is failed, error: {1}'.format(current_disk.id, e))
try:
changed = current_disk.delete()
module.exit_json(changed=changed)
except Exception as e:
module.fail_json(msg='Deleting disk {0} is failed, error: {1}'.format(current_disk.id, e))
# state == present
if not current_disk:
disk_category = module.params['disk_category']
size = module.params['size']
disk_tags = module.params['disk_tags']
snapshot_id = module.params['snapshot_id']
client_token = "Ansible-Alicloud-%s-%s" % (hash(str(module.params)), str(time.time()))
try:
current_disk = ecs.create_disk(zone_id=zone_id, disk_name=disk_name,
description=description, disk_category=disk_category, size=size,
disk_tags=disk_tags, snapshot_id=snapshot_id, client_token=client_token)
changed = True
except Exception as e:
module.fail_json(msg='Creating a new disk is failed, error: {0}'.format(e))
else:
try:
if current_disk.name != disk_name \
or current_disk.description != description \
or current_disk.delete_with_instance != delete_with_instance:
changed = current_disk.modify(disk_name=disk_name, description=description,
delete_with_instance=delete_with_instance)
except Exception as e:
module.fail_json(msg='Updating disk {0} attribute is failed, error: {1}'.format(current_disk.id, e))
if instance_id and current_disk and str(current_disk.status).lower() == "available":
try:
changed = current_disk.attach(instance_id=instance_id, delete_with_instance=delete_with_instance)
except Exception as e:
module.fail_json(
msg='Attaching disk {0} to instance {1} is failed, error: {2}'.format(current_disk.id, instance_id, e))
module.exit_json(changed=changed, disk_id=current_disk.id, disk_category=current_disk.category,
disk_status=current_disk.status, instance_id=instance_id, disk=get_disk_detail(current_disk))