in src/ansible_collections/alibaba/apsarastack/plugins/modules/ali_disk.py [0:0]
def main():
argument_spec = common_argument_spec()
argument_spec.update(dict(
resource_group_id=dict(type='str', aliases=['group_id']),
zone_id=dict(type='str', aliases=['availability_zone', 'apsarastack_zone'],
fallback=(env_fallback, ['APSARASTACK_ZONE', 'APSARASTACK_ZONE_ID'])),
state=dict(type='str', default='present', choices=['present', 'absent']),
disk_id=dict(type='str', aliases=['vol_id', 'id']),
disk_name=dict(type='str', aliases=['name']),
disk_category=dict(type='str', aliases=['disk_type', 'volume_type'], choices=['cloud', 'cloud_efficiency', 'cloud_ssd', 'cloud_essd'], default='cloud'),
size=dict(type='int', aliases=['disk_size', 'volume_size']),
disk_tags=dict(type='list', aliases=['tags'], elements='str'),
snapshot_id=dict(type='str', aliases=['snapshot']),
description=dict(type='str', aliases=['disk_description']),
instance_id=dict(type='str', aliases=['instance']),
delete_with_instance=dict(type='bool', aliases=['delete_on_termination'], default=False)
)
)
module = AnsibleModule(argument_spec=argument_spec)
if not HAS_FOOTMARK:
module.fail_json(msg="footmark required for the module ali_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['zone_id']
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-Apsarastack-%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))