-
-
Save YesThatAllen/3c6d01158220ca80a4c0ae9e0d4ce359 to your computer and use it in GitHub Desktop.
Commonly used functions in RightScale CATs In order to create a URL link to a server, you need to grab what is called the `legacy_id`. This property is currently only available in API 1.6: http://reference.rightscale.com/api1.6/index.html#/1.6/controller/V1_6-Definitions-Instances Check out the `get_server_access_link` definition in the followin…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Required prolog | |
name 'LIB - Common functions' | |
rs_ca_ver 20160622 | |
short_description "Common functions" | |
package "common/functions" | |
# Checks if the account supports the selected cloud | |
define checkCloudSupport($cloud_name, $param_location) do | |
# Gather up the list of clouds supported in this account. | |
@clouds = rs_cm.clouds.get() | |
$supportedClouds = @clouds.name[] # an array of the names of the supported clouds | |
# Check if the selected/mapped cloud is in the list and yell if not | |
if logic_not(contains?($supportedClouds, [$cloud_name])) | |
raise "Your trial account does not support the "+$param_location+" cloud. Contact RightScale for more information on how to enable access to that cloud." | |
end | |
end | |
# Imports the server templates found in the given map. | |
# It assumes a "name" and "rev" mapping | |
define importServerTemplate($stmap) do | |
foreach $st in keys($stmap) do | |
$server_template_name = map($stmap, $st, "name") | |
$server_template_rev = map($stmap, $st, "rev") | |
@pub_st=rs_cm.publications.index(filter: ["name=="+$server_template_name, "revision=="+$server_template_rev]) | |
@pub_st.import() | |
end | |
end | |
# Creates CREDENTIAL objects in Cloud Management for each of the named items in the given array. | |
define createCreds($credname_array) do | |
foreach $cred_name in $credname_array do | |
@cred = rs_cm.credentials.get(filter: join(["name==",$cred_name])) | |
if empty?(@cred) | |
$cred_value = join(split(uuid(), "-"))[0..14] # max of 16 characters for mysql username and we're adding a letter next. | |
$cred_value = "a" + $cred_value # add an alpha to the beginning of the value - just in case. | |
@task=rs_cm.credentials.create({"name":$cred_name, "value": $cred_value}) | |
end | |
end | |
end | |
# Returns either an RDP or SSH link for the given server. | |
# This link can be provided as an output for a CAT and the user can select it to to get the | |
# RDP or SSH file just like in Cloud Management. | |
# | |
# INPUTS: | |
# @server - server resource for which you want the link | |
# $link_type - "SSH" or "RDP" to indicate which type of access link you want back. | |
# $shard - the API shard to use. This can be found using the "find_shard.rb" definition. | |
# $account_number - the account number. This can be found using the "find_account_number.rb" definition. | |
# | |
define get_server_access_link(@server, $link_type, $shard, $account_number) return $server_access_link do | |
$rs_endpoint = "https://us-"+$shard+".rightscale.com" | |
$instance_href = @server.current_instance().href | |
$response = http_get( | |
url: $rs_endpoint+"/api/instances", | |
headers: { | |
"X-Api-Version": "1.6", | |
"X-Account": $account_number | |
} | |
) | |
$instances = $response["body"] | |
$instance_of_interest = select($instances, { "href" : $instance_href })[0] | |
# rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @server, summary: join(["instance of interest"]), detail: to_s($instance_of_interest)}) | |
$legacy_id = $instance_of_interest["legacy_id"] | |
$cloud_id = $instance_of_interest["links"]["cloud"]["id"] | |
$instance_public_ips = $instance_of_interest["public_ip_addresses"] | |
$instance_private_ips = $instance_of_interest["private_ip_addresses"] | |
$instance_ip = switch(empty?($instance_public_ips), to_s($instance_private_ips[0]), to_s($instance_public_ips[0])) | |
# rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @server, summary: join(["instance_ip: ", $instance_ip]), detail: ""}) | |
$server_access_link_root = "https://my.rightscale.com/acct/"+$account_number+"/clouds/"+$cloud_id+"/instances/"+$legacy_id | |
if $link_type == "RDP" | |
$server_access_link = $server_access_link_root +"/rdp?host=" + $instance_ip | |
elsif $link_type == "SSH" | |
$server_access_link = "ssh://rightscale@" + $instance_ip | |
else | |
raise "Incorrect link_type, " + $link_type + ", passed to get_server_access_link()." | |
end | |
# rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @server, summary: "access link", detail: $server_access_link}) | |
end | |
# Returns the RightScale account number in which the CAT was launched. | |
define find_account_number() return $rs_account_number do | |
$cloud_accounts = to_object(first(rs_cm.cloud_accounts.get())) | |
@info = first(rs_cm.cloud_accounts.get()) | |
$info_links = @info.links | |
$rs_account_info = select($info_links, { "rel": "account" })[0] | |
$rs_account_href = $rs_account_info["href"] | |
$rs_account_number = last(split($rs_account_href, "/")) | |
#rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @deployment, summary: "rs_account_number" , detail: to_s($rs_account_number)}) | |
end | |
# Returns the RightScale shard for the account the given CAT is launched in. | |
# It relies on the fact that when a CAT is launched, the resultant deployment description includes a link | |
# back to Self-Service. | |
# This link is exploited to identify the shard. | |
# Of course, this is somewhat dangerous because if the deployment description is changed to remove that link, | |
# this code will not work. | |
# Similarly, since the deployment description is also based on the CAT description, if the CAT author or publisher | |
# puts something like "selfservice-8" in it for some reason, this code will likely get confused. | |
# However, for the time being it's fine. | |
define find_shard(@deployment) return $shard_number do | |
$deployment_description = @deployment.description | |
#rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @deployment, summary: "deployment description" , detail: $deployment_description}) | |
# initialize a value | |
$shard_number = "UNKNOWN" | |
foreach $word in split($deployment_description, "/") do | |
if $word =~ "selfservice-" | |
#rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @deployment, summary: join(["found word:",$word]) , detail: ""}) | |
foreach $character in split($word, "") do | |
if $character =~ /[0-9]/ | |
$shard_number = $character | |
#rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @deployment, summary: join(["found shard:",$character]) , detail: ""}) | |
end | |
end | |
end | |
end | |
end | |
# Used to get a credential | |
# Requires admin permission | |
define get_cred($cred_name) return $cred_value do | |
@cred = rs_cm.credentials.get(filter: "name=="+$cred_name, view: "sensitive") | |
$cred_hash = to_object(@cred) | |
$cred_value = "" | |
foreach $detail in $cred_hash["details"] do | |
if $detail["name"] == $cred_name | |
$cred_value = $detail["value"] | |
end | |
end | |
end | |
# replaces spaces and things with url encoding characters | |
define url_encode($string) return $encoded_string do | |
$encoded_string = gsub($string, " ", "%20") | |
end | |
# Puts url encoded quote around the string | |
define wrap_encoded_quote($string) return $wrapped_string do | |
$wrapped_string = join(["%27",$string,"%27"]) | |
end | |
# create an audit entry | |
define log($summary, $details) do | |
rs_cm.audit_entries.create(notify: "None", audit_entry: { auditee_href: @@deployment, summary: $summary , detail: $details}) | |
end | |
# Used for retry mechanism | |
define handle_retries($attempts) do | |
if $attempts < 3 | |
$_error_behavior = "retry" | |
sleep(60) | |
end # If it fails 3 times just let it raise the error | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment