heat_template_version: 2013-05-23 parameters: key_name: type: string description: keypair to enable SSH access to the instance. instance_type: type: string description: Type of the instance to be created. default: m1.small image_id: type: string description: ID of the image to use for the instance to be created. timeout: type: number description: Stack creation timeout dev_name: type: string description: Expected device name for volume default: vdb test_string: type: string description: Test string which is written to volume default: ateststring rescan_timeout: type: number description: Max number of seconds to wait for volume after rescan default: 120 network: type: string volume_description: type: string description: Description of volume default: A volume description volume_size: type: number description: Size of volume default: 1 resources: volume: deletion_policy: 'Snapshot' type: OS::Cinder::Volume properties: size: {get_param: volume_size} description: {get_param: volume_description} volume_attachment: type: OS::Cinder::VolumeAttachment properties: volume_id: { get_resource: volume } instance_uuid: { get_resource: instance } instance: type: OS::Nova::Server properties: image: { get_param: image_id } flavor: { get_param: instance_type } key_name: { get_param: key_name } networks: - uuid: {get_param: network} user_data_format: RAW user_data: str_replace: template: | #!/bin/sh # Trigger rescan to ensure we see the attached volume for i in /sys/class/scsi_host/*; do echo "- - -" > $i/scan; done # Wait for the rescan as the volume doesn't appear immediately for i in $(seq 1 rescan_timeout) do grep -q dev_name /proc/partitions && break sleep 1 done if grep -q dev_name /proc/partitions then mkfs.ext4 /dev/dev_name mount /dev/dev_name /mnt echo "test_string" > /mnt/testfile umount /mnt curl -X PUT -H 'Content-Type:' --data-binary '{"Status": "SUCCESS", "Reason": "Test Complete", "Data": "Completed volume configuration.", "UniqueId": "instance1"}' "wc_url" else curl -X PUT -H 'Content-Type:' --data-binary '{"Status": "FAILURE", "Reason": "Test Failed", "Data": "Expected device dev_name not found.", "UniqueId": "instance1"}' "wc_url" fi params: wc_url: { get_resource: wait_handle } dev_name: { get_param: dev_name } rescan_timeout: { get_param: rescan_timeout } test_string: { get_param: test_string } wait_handle: type: OS::Heat::UpdateWaitConditionHandle wait_condition: type: AWS::CloudFormation::WaitCondition properties: Count: 1 Handle: { get_resource: wait_handle } Timeout: { get_param: timeout } outputs: status: description: status value: { get_attr: ['volume', 'status'] } size: description: size value: { get_attr: ['volume', 'size'] } display_description: description: display_description value: { get_attr: ['volume', 'display_description'] } volume_id: value: { get_resource: volume }