Use Swift signal resources with Cloud Orchestration user data scripts
Introduction
Cloud Orchestration users can implement Swift signal resources that help determine the status of user data scripts. For example, implementing the following Swift signal resources adds functionality that indicates whether a user data script completed, and if so, whether it has succeeded or failed.
Use the OS::Heat::SwiftSignal
resource to coordinate resource creation with signals coming from sources that are external or internal to the stack. This resource is often used in conjunction with the OS::Heat::SwiftSignalHandle
resource.
Use the SwiftSignalHandle
resource to create a temporary URL that applications and scripts use to send signals. The SwiftSignal
resource waits for this URL to receive a specified number of SUCCESS
signals within a specified amount of time. The temporary URL is created by using Rackspace Cloud
Files.
The following tutorial walks you through the process of setting up a single-node Linux server that signals the success or failure of user_data
script execution at a given URL.
Add the top-level template sections
At the top of the template, add the following information:
heat_template_version: 2014-10-16
description: |
A single-node linux server with swift signaling.
resources:
outputs:
Add a SwiftSignalHandle
resource
SwiftSignalHandle
resourceIn the resources section, add a SwiftSignalHandle
resource. The following code example shows how to add this resource:
signal_handle:
type: "OS::Heat::SwiftSignalHandle"
Add a SwiftSignal
resource
SwiftSignal
resourceIn the resources section, add a SwiftSignal
resource.
Provide the URL in the handle
property and the number of signals in the count
property.
The following example shows how to add a SwiftSignal
resource that waits for 600
seconds to receive one signal on the handle
.
wait_on_server:
type: OS::Heat::SwiftSignal
properties:
handle: {get_resource: signal_handle}
count: 1
timeout: 600
The stack is marked as a failure if the specified number of signals is not received within the amount of time specified in the timeout
property, or if a signal other than SUCCESS
is received. A data string and a reason string might be attached to the success or failure notification. The data string is an attribute that can be displayed as template output.
Add a server resource
Add a Linux server. In the user_data
property, include a Bash script. At the end of the script execution, send a SUCCESS
or FAILURE
message to the temporary URL that is created by the SwiftSignalHandle
resource that you
added earlier.
linux_server:
type: OS::Nova::Server
properties:
image: 4b14a92e-84c8-4770-9245-91ecb8501cc2
flavor: 1 GB Performance
user_data:
str_replace:
template: |
#!/bin/bash -x
# assume you are doing a long-running operation here
sleep 300
# Assuming the long-running operation completed successfully,
# notify success signal
wc_notify --data-binary '{"status": "SUCCESS", "data": "Script execution succeeded"}'
# Alternatively, if operation fails, a FAILURE with reason and data may be sent,
# notify failure signal example below
# wc_notify --data-binary '{"status": "FAILURE", "reason":"Operation failed due to xyz error", "data":"Script execution failed"}'
params:
# Replace all occurrences of "wc_notify" in the script with an
# appropriate curl PUT request using the "curl_cli" attribute
# of the SwiftSignalHandle resource
wc_notify: { get_attr: ['signal_handle', 'curl_cli']
Add the Swift signal URL to the outputs
section
outputs
sectionThe following example shows how to add the Swift signal URL to the outputs
section:
# Get the signal URL which contains all information passed to the signal handle
signal_url:
value: { get_attr: ['wait_handle', 'curl_cli'] }
description: Swift signal URL
# Obtain data describing script results. If nothing is passed, this value will be NULL
signal_data:
value: { get_attr: ['wait_on_server', 'data'] }
description: Data describing script results
# Obtain IPv4 address of server
server_public_ip:
value:{ get_attr: [ linux_server, accessIPv4 ] }
description: Linux server public IP
View the full template
The following code shows what the complete template looks like:
heat_template_version: 2014-10-16
description: |
Single node linux server with swift signaling.
resources:
signal_handle:
type: "OS::Heat::SwiftSignalHandle"
wait_on_server:
type: OS::Heat::SwiftSignal
properties:
handle: {get_resource: signal_handle}
count: 1
timeout: 600
linux_server:
type: OS::Nova::Server
properties:
image: 4b14a92e-84c8-4770-9245-91ecb8501cc2
flavor: 1 GB Performance
user_data:
str_replace:
template: |
#!/bin/bash -x
# assume you are doing a long-running operation here
sleep 300
# Assuming long-running operation completed successfully, notify success signal
wc_notify --data-binary '{"status": "SUCCESS", "data": "Script execution succeeded"}'
# Alternatively, if operation fails, a FAILURE with reason and data may be sent,
# notify failure signal example below
# wc_notify --data-binary '{"status": "FAILURE", "reason":"Operation failed due to xyz error", "data":"Script execution failed"}'
params:
wc_notify: { get_attr: ['signal_handle', 'curl_cli'] }
outputs:
# Get the signal URL which contains all information passed to the signal handle
signal_url:
value: { get_attr: ['signal_handle', 'curl_cli'] }
description: Swift signal URL
# Obtain data describing script results. If nothing is passed, this value will be NULL
signal_data:
value: { get_attr: ['wait_on_server', 'data'] }
description: Data describing script results
# Obtain IPv4 address of server
server_public_ip:
value: { get_attr: [ linux_server, accessIPv4 ] }
description: Linux server public IP
Updated about 1 year ago