rest_connection 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/examples/README.txt +1 -0
- data/examples/cucumber/2mysql_5.x_v2_beta_from_scratch.feature +61 -0
- data/examples/cucumber/step_definitions/deployment_steps.rb +140 -0
- data/examples/cucumber/step_definitions/mysql_steps.rb +147 -0
- data/examples/cucumber/step_definitions/recipe_steps.rb +54 -0
- data/examples/cucumber/step_definitions/spot_check_steps.rb +35 -0
- data/examples/relaunch_deployment.rb +6 -24
- data/lib/rest_connection.rb +1 -1
- data/lib/rest_connection/rightscale/ec2_server_array.rb +14 -2
- data/lib/rest_connection/rightscale/rightscale_api_base.rb +17 -2
- data/lib/rest_connection/rightscale/rightscale_api_resources.rb +1 -0
- data/lib/rest_connection/rightscale/server_template.rb +15 -3
- data/lib/rest_connection/rightscale/tag.rb +13 -1
- data/rest_connection.gemspec +19 -19
- data/spec/ec2_server_array_spec.rb +67 -0
- data/spec/tag_spec.rb +19 -0
- metadata +18 -18
- data/examples/dev_setup.rb +0 -26
- data/examples/restart_instance_agent.rb +0 -29
- data/examples/run_ebs_sequence.rb +0 -95
- data/examples/run_ebs_terminate.rb +0 -40
- data/examples/run_mysql_chef_sequence.rb +0 -43
- data/examples/run_php_chef_sequence.rb +0 -109
- data/examples/set_deployment_template_href.rb +0 -14
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
data/examples/README.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
For an example of how rest_connection is used for acceptance testing with cucumber take a look at the cucumber directory. The step-definitions files are where we turn this stuff into human readable tests.
|
@@ -0,0 +1,61 @@
|
|
1
|
+
@mysql_5.x
|
2
|
+
Feature: mysql 5.x v2 (beta) promote operations test image
|
3
|
+
Tests the RightScale premium ServerTemplate Mysql v2 (beta)
|
4
|
+
|
5
|
+
Scenario: Setup 2 server deployment and run basic cluster failover operations
|
6
|
+
#
|
7
|
+
# PHASE 1) Bootstrap a backup lineage from scratch
|
8
|
+
#
|
9
|
+
Given A deployment.
|
10
|
+
And A set of RightScripts for MySQL promote operations.
|
11
|
+
Then I should stop the mysql servers.
|
12
|
+
Then I should set an oldschool variation lineage.
|
13
|
+
Then I should set a variation stripe count of "1".
|
14
|
+
Then I should set a variation MySQL DNS.
|
15
|
+
Then all servers should go operational.
|
16
|
+
Then I should create a MySQL EBS stripe on server "1".
|
17
|
+
Then the rightscript should complete successfully.
|
18
|
+
Then I should run a mysql query "create database mynewtest" on server "1".
|
19
|
+
Then I should setup master dns to point at server "1".
|
20
|
+
# This sleep is to wait for DNS to settle
|
21
|
+
Then I should sleep 120 seconds.
|
22
|
+
When I run a rightscript named "backup" on server "1".
|
23
|
+
Then the rightscript should complete successfully.
|
24
|
+
|
25
|
+
#
|
26
|
+
# PHASE 2) Relaunch and run restore operations
|
27
|
+
#
|
28
|
+
Then I should stop the mysql servers.
|
29
|
+
Then all servers should go operational.
|
30
|
+
And A set of RightScripts for MySQL promote operations.
|
31
|
+
|
32
|
+
# This sleep is required for the EBS snapshot to settle from prior backup.
|
33
|
+
# Assuming 5 minutes already passed while booting.
|
34
|
+
Then I should sleep 500 seconds.
|
35
|
+
When I run a rightscript named "restore" on server "1".
|
36
|
+
Then the rightscript should complete successfully.
|
37
|
+
Then the servers should have monitoring enabled.
|
38
|
+
|
39
|
+
# This sleep is required for the EBS volume snapshot to settle.
|
40
|
+
# The sleep time can vary so if slave init fails with no snapshot, this is a likely culprit.
|
41
|
+
Then I should sleep 900 seconds.
|
42
|
+
When I run a rightscript named "slave_init" on server "2".
|
43
|
+
Then the rightscript should complete successfully.
|
44
|
+
When I run a rightscript named "promote" on server "2".
|
45
|
+
Then the rightscript should complete successfully.
|
46
|
+
|
47
|
+
#
|
48
|
+
# PHASE 3)
|
49
|
+
#
|
50
|
+
|
51
|
+
Then I should reboot the servers.
|
52
|
+
Then I should wait for the servers to be operational with dns.
|
53
|
+
|
54
|
+
When I run a rightscript named "backup" on server "1".
|
55
|
+
Then the rightscript should complete successfully.
|
56
|
+
#
|
57
|
+
# PHASE 4) cleanup
|
58
|
+
#
|
59
|
+
Then I should release the dns records for use with other deployments.
|
60
|
+
|
61
|
+
#TODO: spot check for operational mysql
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rest_connection"
|
3
|
+
require "net/ssh"
|
4
|
+
|
5
|
+
Given /A deployment./ do
|
6
|
+
raise "FATAL: Please set the environment variable $DEPLOYMENT" unless ENV['DEPLOYMENT']
|
7
|
+
@all_servers = Array.new
|
8
|
+
@all_servers_os = Array.new
|
9
|
+
@all_responses = Array.new
|
10
|
+
@deployment = Deployment.find_by_nickname_speed(ENV['DEPLOYMENT']).first
|
11
|
+
@servers = @deployment.servers
|
12
|
+
|
13
|
+
if ENV['SERVER_TAG']
|
14
|
+
puts "found SERVER_TAG environment variable. Scoping server list with tag: #{ENV['SERVER_TAG']}"
|
15
|
+
@servers = @servers.select { |s| s.nickname =~ /#{ENV['SERVER_TAG']}/ }
|
16
|
+
end
|
17
|
+
|
18
|
+
raise "FATAL: Couldn't find a deployment with the name #{ENV['DEPLOYMENT']}!" unless @deployment
|
19
|
+
puts "found deployment to use: #{@deployment.nickname}, #{@deployment.href}"
|
20
|
+
end
|
21
|
+
|
22
|
+
Given /^with ssh private key$/ do
|
23
|
+
raise "FATAL: Please set the environment $SSH_KEY_PATH to the private ssh key of the server that you want to test!" unless ENV['SSH_KEY_PATH']
|
24
|
+
@deployment.connection.settings[:ssh_key] = ENV['SSH_KEY_PATH']
|
25
|
+
end
|
26
|
+
|
27
|
+
Given /^with a known OS$/ do
|
28
|
+
@all_servers.each do |server|
|
29
|
+
puts "server.spot_check_command?(\"lsb_release -is | grep Ubuntu\") = #{server.spot_check_command?("lsb_release -is | grep Ubuntu")}"
|
30
|
+
if server.spot_check_command?("lsb_release -is | grep Ubuntu")
|
31
|
+
puts "setting server to ubuntu"
|
32
|
+
@all_servers_os << "ubuntu"
|
33
|
+
else
|
34
|
+
puts "setting server to centos"
|
35
|
+
@all_servers_os << "centos"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Given /^"([^\"]*)" operational servers./ do |num|
|
41
|
+
servers = @deployment.servers_no_reload
|
42
|
+
@servers = servers.select { |s| s.nickname =~ /#{ENV['SERVER_TAG']}/ }
|
43
|
+
# only want 2 even if we matched more than that.
|
44
|
+
@servers = @servers.slice(0,2)
|
45
|
+
raise "need at least #{num} servers to start, only have: #{@servers.size}" if @servers.size < num.to_i
|
46
|
+
@servers.each { |s| s.start }
|
47
|
+
@servers.each { |s| s.wait_for_operational_with_dns }
|
48
|
+
end
|
49
|
+
|
50
|
+
Given /A deployment named "(.*)"/ do | deployment |
|
51
|
+
@all_servers = Array.new
|
52
|
+
@all_responses = Array.new
|
53
|
+
@deployment = Deployment.find_by_nickname_speed(deployment).first
|
54
|
+
raise "FATAL: Couldn't find a deployment with the name #{deployment}!" unless deployment
|
55
|
+
end
|
56
|
+
|
57
|
+
Given /A server named "(.*)"/ do |server|
|
58
|
+
servers = @deployment.servers_no_reload
|
59
|
+
@server = servers.detect { |s| s.nickname =~ /#{server}/ }
|
60
|
+
@server.start
|
61
|
+
@server.wait_for_state("operational")
|
62
|
+
raise "FATAL: couldn't find a server named #{server}" unless server
|
63
|
+
end
|
64
|
+
|
65
|
+
Given /^"([^\"]*)" operational servers named "([^\"]*)"$/ do |num, server_name|
|
66
|
+
servers = @deployment.servers_no_reload
|
67
|
+
@servers = servers.select { |s| s.nickname =~ /#{server_name}/ }
|
68
|
+
@servers.each do |s|
|
69
|
+
@all_servers.push s
|
70
|
+
end
|
71
|
+
#@all_servers.push { |s| s.nickname =~ /#{server_name}/ }
|
72
|
+
raise "need at least #{num} servers to start, only have: #{@servers.size}" if @servers.size < num.to_i
|
73
|
+
@servers.each { |s| s.start }
|
74
|
+
@servers.each { |s| s.wait_for_operational_with_dns }
|
75
|
+
end
|
76
|
+
|
77
|
+
Then /^I should sleep (\d+) seconds\.$/ do |seconds|
|
78
|
+
sleep seconds.to_i
|
79
|
+
end
|
80
|
+
|
81
|
+
Then /^I should set rs_agent_dev:package to "(.*)"\.$/ do |package|
|
82
|
+
@deployment.servers_no_reload.each do |s|
|
83
|
+
s.tags << {"name"=>"rs_agent_dev:package=#{package}"}
|
84
|
+
s.save
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
Then /^I should set un-set all tags on all servers in the deployment\.$/ do
|
89
|
+
@deployment.servers_no_reload.each do |s|
|
90
|
+
# can't unset ALL tags, so we must set a bogus one
|
91
|
+
s.tags = [{"name"=>"removeme:now=1"}]
|
92
|
+
s.save
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
Then /^the servers should have monitoring enabled\.$/ do
|
97
|
+
@servers.each do |server|
|
98
|
+
server.monitoring
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
Then /I should set a variation bucket./ do
|
103
|
+
bucket = "text:testingcandelete#{@deployment.href.split(/\//).last}"
|
104
|
+
@deployment.set_input('remote_storage/default/container', bucket)
|
105
|
+
# unset all server level inputs in the deployment to ensure use of
|
106
|
+
# the setting from the deployment level
|
107
|
+
@deployment.servers_no_reload.each do |s|
|
108
|
+
s.set_input('remote_storage/default/container', "text:")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
Then /I should wait for the servers to be operational with dns\.$/ do
|
112
|
+
@servers.each { |s| s.wait_for_operational_with_dns }
|
113
|
+
end
|
114
|
+
Then /all servers should go operational./ do
|
115
|
+
raise "ERROR: no servers found in deployment '#{ENV['DEPLOYMENT']}'" if @servers.size == 0
|
116
|
+
|
117
|
+
@servers.each { |s| s.start }
|
118
|
+
@servers.each { |s| s.wait_for_operational_with_dns }
|
119
|
+
end
|
120
|
+
|
121
|
+
Then /all servers should shutdown./ do
|
122
|
+
servers = @deployment.servers_no_reload
|
123
|
+
server_tag = ENV['SERVER_TAG']
|
124
|
+
@servers = servers.select { |s| s.nickname =~ /#{server_tag}/ }
|
125
|
+
raise "ERROR: no servers with tag '#{server_tag}' found in deployment '#{ENV['DEPLOYMENT']}'" if @servers.size == 0
|
126
|
+
@servers.each { |s| s.stop }
|
127
|
+
@servers.each { |s| s.wait_for_state("terminated") }
|
128
|
+
end
|
129
|
+
|
130
|
+
Then /I should reboot the servers\.$/ do
|
131
|
+
@servers.each { |s| s.reboot }
|
132
|
+
@servers.each { |s| s.wait_for_state_change }
|
133
|
+
end
|
134
|
+
|
135
|
+
Then /I should stop the servers\.$/ do
|
136
|
+
@servers.each { |s| s.stop }
|
137
|
+
@servers.each { |s| s.wait_for_state("stopped") }
|
138
|
+
# need to unset dns ?
|
139
|
+
@servers.each { |s| s.dns_name = "" }
|
140
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sqlite3'
|
3
|
+
|
4
|
+
Given /A set of RightScripts for MySQL promote operations\.$/ do
|
5
|
+
st = ServerTemplate.find(@servers[1].server_template_href)
|
6
|
+
@scripts_to_run = {}
|
7
|
+
@scripts_to_run['restore'] = st.executables.detect { |ex| ex.name =~ /restore and become/i }
|
8
|
+
@scripts_to_run['slave_init'] = st.executables.detect { |ex| ex.name =~ /slave init v2/ }
|
9
|
+
@scripts_to_run['promote'] = st.executables.detect { |ex| ex.name =~ /promote to master/ }
|
10
|
+
@scripts_to_run['backup'] = st.executables.detect { |ex| ex.name =~ /EBS backup/ }
|
11
|
+
@scripts_to_run['terminate'] = st.executables.detect { |ex| ex.name =~ /TERMINATE/ }
|
12
|
+
# hardwired script! hax! (this is an 'anyscript' that users typically use to setup the master dns)
|
13
|
+
@scripts_to_run['master_init'] = RightScript.new('href' => "/api/acct/2901/right_scripts/195053")
|
14
|
+
@scripts_to_run['create_stripe'] = RightScript.new('href' => "/api/acct/2901/right_scripts/198381")
|
15
|
+
@scripts_to_run['create_mysql_ebs_stripe'] = RightScript.new('href' => "/api/acct/2901/right_scripts/212492")
|
16
|
+
end
|
17
|
+
|
18
|
+
Then /^I should run a mysql query "([^\"]*)" on server "([^\"]*)"\.$/ do |query, server_index|
|
19
|
+
human_index = server_index.to_i - 1
|
20
|
+
query_command = "echo -e \"#{query}\"| mysql"
|
21
|
+
@servers[human_index].spot_check(query_command) { |result| puts result }
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /^I should setup admin and replication privileges on server "([^\"]*)"\.$/ do |server_index|
|
25
|
+
human_index = server_index.to_i - 1
|
26
|
+
admin_grant = "grant all privileges on *.* to admin_user@\'%\' identified by \'admin_passwd\'"
|
27
|
+
rep_grant = "grant replication slave on *.* to replication_user@\'%\' identified by \'replication_passwd\'"
|
28
|
+
admin_grant2 = "grant all privileges on *.* to admin_user@\'localhost\' identified by \'admin_passwd\'"
|
29
|
+
rep_grant2 = "grant replication slave on *.* to replication_user@\'localhost\' identified by \'replication_passwd\'"
|
30
|
+
[admin_grant, rep_grant, admin_grant2, rep_grant2].each do |query|
|
31
|
+
query_command = "echo -e \"#{query}\"| mysql"
|
32
|
+
puts @servers[human_index].spot_check_command(query_command)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
Then /I should set a variation lineage./ do
|
37
|
+
@lineage = "text:testlineage#{rand(1000000)}"
|
38
|
+
@deployment.set_input('db/backup/lineage', @lineage)
|
39
|
+
# unset all server level inputs in the deployment to ensure use of
|
40
|
+
# the setting from the deployment level
|
41
|
+
@deployment.servers_no_reload.each do |s|
|
42
|
+
s.set_input('db/backup/lineage', "text:")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Then /I should set a variation backup prefix./ do
|
47
|
+
@lineage = "text:testlineage#{rand(1000000)}"
|
48
|
+
@deployment.set_input('DB_EBS_PREFIX', @lineage)
|
49
|
+
# unset all server level inputs in the deployment to ensure use of
|
50
|
+
# the setting from the deployment level
|
51
|
+
@deployment.servers_no_reload.each do |s|
|
52
|
+
s.set_input('DB_EBS_PREFIX', "text:")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
Then /I should set an oldschool variation lineage./ do
|
57
|
+
@lineage = "text:testlineage#{rand(1000000)}"
|
58
|
+
@deployment.set_input('DB_LINEAGE_NAME', @lineage)
|
59
|
+
# unset all server level inputs in the deployment to ensure use of
|
60
|
+
# the setting from the deployment level
|
61
|
+
@deployment.servers_no_reload.each do |s|
|
62
|
+
s.set_input('DB_LINEAGE_NAME', "text:")
|
63
|
+
end
|
64
|
+
puts "Using Lineage: #{@lineage}"
|
65
|
+
end
|
66
|
+
|
67
|
+
Then /^I should create a MySQL EBS stripe on server "([^\"]*)"\.$/ do |server_index|
|
68
|
+
human_index = server_index.to_i - 1
|
69
|
+
# this needs to match the deployments inputs for lineage and stripe count.
|
70
|
+
options = { "EBS_MOUNT_POINT" => "text:/mnt/mysql",
|
71
|
+
"EBS_STRIPE_COUNT" => "text:#{@stripe_count}",
|
72
|
+
"EBS_VOLUME_SIZE_GB" => "text:1",
|
73
|
+
"DBAPPLICATION_USER" => "text:someuser",
|
74
|
+
"DBAPPLICATION_PASSWORD" => "text:somepass",
|
75
|
+
"EBS_VOLUME_SIZE_GB" => "text:1",
|
76
|
+
"EBS_LINEAGE" => @lineage }
|
77
|
+
@status = @servers[human_index].run_executable(@scripts_to_run['create_mysql_ebs_stripe'], options)
|
78
|
+
end
|
79
|
+
|
80
|
+
Then /^I should create an EBS stripe on server "([^\"]*)"\.$/ do |server_index|
|
81
|
+
human_index = server_index.to_i - 1
|
82
|
+
# this needs to match the deployments inputs for lineage and stripe count.
|
83
|
+
options = { "EBS_MOUNT_POINT" => "text:/mnt/mysql",
|
84
|
+
"EBS_STRIPE_COUNT" => "text:#{@stripe_count}",
|
85
|
+
"EBS_VOLUME_SIZE_GB" => "text:1",
|
86
|
+
"EBS_LINEAGE" => @lineage }
|
87
|
+
@status = @servers[human_index].run_executable(@scripts_to_run['create_stripe'], options)
|
88
|
+
end
|
89
|
+
|
90
|
+
Then /^I should set a variation stripe count of "([^\"]*)"\.$/ do |stripe|
|
91
|
+
@stripe_count = stripe
|
92
|
+
@deployment.set_input("EBS_STRIPE_COUNT", "text:#{@stripe_count}")
|
93
|
+
end
|
94
|
+
|
95
|
+
Then /^I should set a variation MySQL DNS\./ do
|
96
|
+
mydb = File.join(File.dirname(__FILE__),"..","shared.db")
|
97
|
+
@dns_result = nil
|
98
|
+
rowid = nil
|
99
|
+
success = nil
|
100
|
+
SQLite3::Database.new(mydb) do |db|
|
101
|
+
while(1)
|
102
|
+
db.query("SELECT rowid FROM mysql_dns WHERE owner IS NULL") do |result|
|
103
|
+
rowid = result.entries.first
|
104
|
+
end
|
105
|
+
raise "FATAL: unable to find available DNS_IDs to use!" unless rowid
|
106
|
+
handle = db.query("UPDATE OR IGNORE mysql_dns SET owner='#{@deployment.nickname}' WHERE rowid = '#{rowid}'")
|
107
|
+
handle.close
|
108
|
+
success = db.get_first_row("SELECT owner FROM mysql_dns WHERE rowid = '#{rowid}'").first == @deployment.nickname
|
109
|
+
break if success
|
110
|
+
puts "retrying for lock on DNSIDs"
|
111
|
+
end
|
112
|
+
db.query("SELECT MASTER_DB_DNSNAME,MASTER_DB_DNSID,SLAVE_DB_DNSNAME,SLAVE_DB_DNSID FROM mysql_dns WHERE owner = '#{@deployment.nickname}'") do |result|
|
113
|
+
@dns_result = result.entries.first
|
114
|
+
end
|
115
|
+
end
|
116
|
+
@deployment.set_input("MASTER_DB_DNSNAME", @dns_result[0])
|
117
|
+
@deployment.set_input("MASTER_DB_DNSID", @dns_result[1])
|
118
|
+
@deployment.set_input("SLAVE_DB_DNSNAME", @dns_result[2])
|
119
|
+
@deployment.set_input("SLAVE_DB_DNSID", @dns_result[3])
|
120
|
+
end
|
121
|
+
|
122
|
+
Then /^I should release the dns records for use with other deployments\.$/ do
|
123
|
+
require 'sqlite3'
|
124
|
+
SQLite3::Database.new(File.join(File.dirname(__FILE__), "..", "shared.db")) do |db|
|
125
|
+
q = db.query("UPDATE mysql_dns SET owner=NULL where owner LIKE '#{@deployment.nickname}%'")
|
126
|
+
q.close
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
Then /^I should setup master dns to point at server "([^\"]*)"\.$/ do |server_index|
|
131
|
+
human_index = server_index.to_i - 1
|
132
|
+
audit = @servers[human_index].run_executable(@scripts_to_run['master_init']) #, {'DB_TEST_MASTER_DNSID' => @dns_result[1]})
|
133
|
+
audit.wait_for_completed
|
134
|
+
#@servers[human_index].run_script(@scripts_to_run['master_init']) #, {'DB_TEST_MASTER_DNSID' => @dns_result[1]})
|
135
|
+
end
|
136
|
+
|
137
|
+
Then /I should stop the mysql servers\.$/ do
|
138
|
+
if @scripts_to_run['terminate']
|
139
|
+
@servers.each { |s| s.run_executable(@scripts_to_run['terminate']) unless s.state == 'stopped' }
|
140
|
+
else
|
141
|
+
@servers.each { |s| s.stop }
|
142
|
+
end
|
143
|
+
|
144
|
+
@servers.each { |s| s.wait_for_state("stopped") }
|
145
|
+
# unset dns in our local cached copy..
|
146
|
+
@servers.each { |s| s.dns_name = "" }
|
147
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
When /^I run a recipe named "([^\"]*)" on server "([^\"]*)"\.$/ do |recipe, server_index|
|
2
|
+
human_index = server_index.to_i - 1
|
3
|
+
STDOUT.puts "#{recipe} -> root@#{@servers[human_index].dns_name}"
|
4
|
+
@response = @servers[human_index].run_recipe(recipe)
|
5
|
+
end
|
6
|
+
|
7
|
+
Then /I should successfully run a recipe named "(.*)"/ do |recipe|
|
8
|
+
@server.run_recipe(recipe)
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /^I should run a recipe named "([^\"]*)" on server "([^\"]*)"\.$/ do |recipe, server_index|
|
12
|
+
human_index = server_index.to_i - 1
|
13
|
+
@servers[human_index].run_recipe(recipe)
|
14
|
+
end
|
15
|
+
|
16
|
+
Then /^it should converge successfully\.$/ do
|
17
|
+
@response[:status].should == true
|
18
|
+
end
|
19
|
+
|
20
|
+
When /^I clear the log on server "(.*)".$/ do |server_index|
|
21
|
+
human_index = server_index.to_i - 1
|
22
|
+
cmd = "rm -f /var/log/messages; touch /var/log/messages ; chown root:root /var/log/messages ; chmod 600 /var/log/messages"
|
23
|
+
@response = @servers[human_index].spot_check(cmd) do |result|
|
24
|
+
puts result
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Then /^I should see "(.*)" in the log on server "(.*)"\.$/ do |message, server_index|
|
29
|
+
human_index = server_index.to_i - 1
|
30
|
+
@servers[human_index].spot_check("grep '#{message}' /var/log/messages") do |result|
|
31
|
+
result.should_not == nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
Then /^the audit entry should NOT contain "([^\"]*)"\.$/ do |st_match|
|
36
|
+
@response[:output].should_not include(st_match)
|
37
|
+
end
|
38
|
+
|
39
|
+
Then /^all servers should successfully run a recipe named "(.*)"\.$/ do |recipe|
|
40
|
+
@servers.each do |s|
|
41
|
+
response = s.run_recipe(recipe)
|
42
|
+
response[:status].should == true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
When /^I run a rightscript named "([^\"]*)" on server "([^\"]*)"\.$/ do |script, server_index|
|
47
|
+
human_index = server_index.to_i - 1
|
48
|
+
@status = @servers[human_index].run_executable(@scripts_to_run[script])
|
49
|
+
@audit_link = @servers[human_index].audit_link
|
50
|
+
end
|
51
|
+
|
52
|
+
Then /^the rightscript should complete successfully\.$/ do
|
53
|
+
@status.wait_for_completed(@audit_link)
|
54
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
Then /^I should run a command "([^\"]*)" on server "([^\"]*)"\.$/ do |command, server_index|
|
2
|
+
human_index = server_index.to_i - 1
|
3
|
+
@servers[human_index].spot_check(command) { |result| puts result }
|
4
|
+
end
|
5
|
+
|
6
|
+
When /^I run "([^\"]*)"$/ do |command|
|
7
|
+
@response = @server.spot_check_command?(command)
|
8
|
+
end
|
9
|
+
|
10
|
+
When /^I run "([^\"]*)" on all servers$/ do |command|
|
11
|
+
@all_servers.each_with_index do |s,i|
|
12
|
+
@all_responses[i] = s.spot_check_command?(command)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
#
|
18
|
+
# Checking for request sucess/error
|
19
|
+
#
|
20
|
+
Then /^it should exit successfully$/ do
|
21
|
+
@response.should be true
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /^it should exit successfully on all servers$/ do
|
25
|
+
@all_responses.each do |response|
|
26
|
+
response.should be true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Then /^it should not exit successfully on any server$/ do
|
31
|
+
@all_responses.each do |response|
|
32
|
+
response.should_not be true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -6,40 +6,22 @@ require 'rest_connection'
|
|
6
6
|
opts = Trollop::options do
|
7
7
|
opt :deployment, "deployment nickname", :type => :string, :required => false
|
8
8
|
opt :only, "regex string matching the nickname of the servers you want to relaunch. This excludes servers that do not match\nExample --only ubuntu", :type => :string, :required => false
|
9
|
-
opt :growl, "use growl notification (string) when servers are all operational, requires ruby-growl gem", :type => :string, :required => false
|
10
9
|
opt :id, "deployment id", :type => :string, :required => false
|
11
10
|
end
|
12
11
|
|
13
12
|
# find all servers in the deployment (the fast way)
|
14
13
|
if opts[:id]
|
15
|
-
deployment = Deployment.
|
14
|
+
deployment = Deployment.find(opts[:id])
|
16
15
|
else
|
17
16
|
deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
18
17
|
end
|
19
18
|
servers = deployment.servers_no_reload
|
20
19
|
servers = servers.select { |s| s.nickname =~ /#{opts[:only]}/ } if opts[:only]
|
21
20
|
servers.each do |s|
|
22
|
-
|
23
|
-
|
21
|
+
s.stop
|
22
|
+
end
|
23
|
+
servers.each do |s|
|
24
|
+
s.wait_for_state("stopped")
|
25
|
+
s.start
|
24
26
|
end
|
25
27
|
|
26
|
-
# wait for termination
|
27
|
-
#servers.each do |s|
|
28
|
-
# s.wait_for_state('stopped')
|
29
|
-
#end
|
30
|
-
|
31
|
-
# relaunch
|
32
|
-
#servers.each do |s|
|
33
|
-
# s.start
|
34
|
-
#end
|
35
|
-
|
36
|
-
#if opts[:growl]
|
37
|
-
# require 'ruby-growl'
|
38
|
-
# servers.each do |s|
|
39
|
-
# s.wait_for_state('booting')
|
40
|
-
# end
|
41
|
-
# g = Growl.new "localhost", "ruby-growl",
|
42
|
-
# ["ruby-growl Notification"]
|
43
|
-
#g.notify "ruby-growl Notification", "It Came From Ruby-Growl",
|
44
|
-
# "Greetings!"
|
45
|
-
#end
|
data/lib/rest_connection.rb
CHANGED
@@ -22,14 +22,26 @@
|
|
22
22
|
class Ec2ServerArray
|
23
23
|
include RightScale::Api::Base
|
24
24
|
extend RightScale::Api::BaseExtend
|
25
|
+
|
25
26
|
def run_script_on_all(script, server_template_hrefs, inputs=nil)
|
26
27
|
serv_href = URI.parse(self.href)
|
27
28
|
options = Hash.new
|
28
29
|
options[:ec2_server_array] = Hash.new
|
29
|
-
options[:ec2_server_array][:right_script_href] =
|
30
|
+
options[:ec2_server_array][:right_script_href] = script.href
|
30
31
|
options[:ec2_server_array][:parameters] = inputs unless inputs.nil?
|
31
32
|
options[:ec2_server_array][:server_template_hrefs] = server_template_hrefs
|
32
|
-
|
33
|
+
# bug, this only returns work units if using xml, for json all we get is nil. scripts still run though ..
|
34
|
+
connection.post("#{serv_href.path}/run_script_on_all", options)
|
35
|
+
end
|
36
|
+
|
37
|
+
def instances
|
38
|
+
serv_href = URI.parse(self.href)
|
39
|
+
connection.get("#{serv_href.path}/instances")
|
40
|
+
end
|
41
|
+
|
42
|
+
def terminate_all
|
43
|
+
serv_href = URI.parse(self.href)
|
44
|
+
connection.post("#{serv_href.path}/terminate_all")
|
33
45
|
end
|
34
46
|
end
|
35
47
|
|
@@ -45,6 +45,14 @@ module RightScale
|
|
45
45
|
return a
|
46
46
|
end
|
47
47
|
|
48
|
+
def self.find_by_cloud_id(cloud_id)
|
49
|
+
a = Array.new
|
50
|
+
connection.get(self.resource_plural_name, "cloud_id" => cloud_id).each do |object|
|
51
|
+
a << self.new(object)
|
52
|
+
end
|
53
|
+
return a
|
54
|
+
end
|
55
|
+
|
48
56
|
def find_by_nickname(nickname)
|
49
57
|
connection.logger("DEPRICATION WARNING: use of find_by_nickname is depricated, please use find_by(:nickname) { |n| n == '#{nickname}' } ")
|
50
58
|
self.find_by(:nickname) { |n| n == nickname }
|
@@ -144,15 +152,22 @@ module RightScale
|
|
144
152
|
assignment = mn.gsub!(/=/,"")
|
145
153
|
mn_dash = mn.gsub(/_/,"-")
|
146
154
|
if @params[mn]
|
147
|
-
|
155
|
+
if assignment
|
156
|
+
@params[mn] = args[0]
|
157
|
+
@params[mn_dash] = args[0]
|
158
|
+
end
|
148
159
|
return @params[mn]
|
149
160
|
elsif @params[mn_dash]
|
150
|
-
|
161
|
+
if assignment
|
162
|
+
@params[mn_dash] = args[0]
|
163
|
+
@params[mn] = args[0]
|
164
|
+
end
|
151
165
|
return @params[mn_dash]
|
152
166
|
elsif @params[mn.to_sym]
|
153
167
|
return @params[mn.to_sym]
|
154
168
|
elsif assignment
|
155
169
|
@params[mn] = args[0]
|
170
|
+
@params[mn_dash] = args[0]
|
156
171
|
return @params[mn]
|
157
172
|
else
|
158
173
|
return nil
|
@@ -36,3 +36,4 @@ require 'rest_connection/rightscale/ec2_ssh_key_internal'
|
|
36
36
|
require 'rest_connection/rightscale/server_template_internal'
|
37
37
|
require 'rest_connection/rightscale/multi_cloud_image_internal'
|
38
38
|
require 'rest_connection/rightscale/multi_cloud_image_cloud_setting_internal'
|
39
|
+
require 'rest_connection/rightscale/ec2_server_array'
|
@@ -18,12 +18,24 @@ class ServerTemplate
|
|
18
18
|
extend RightScale::Api::BaseExtend
|
19
19
|
def initialize(params)
|
20
20
|
@params = params
|
21
|
-
fetch_executables
|
22
21
|
end
|
23
|
-
|
22
|
+
|
23
|
+
def executables
|
24
|
+
unless @params["executables"]
|
25
|
+
fetch_executables
|
26
|
+
end
|
27
|
+
@params["executables"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def multi_cloud_images
|
31
|
+
unless @params["multi_cloud_images"]
|
32
|
+
fetch_multi_cloud_images
|
33
|
+
end
|
34
|
+
@params["multi_cloud_images"]
|
35
|
+
end
|
36
|
+
|
24
37
|
def fetch_executables
|
25
38
|
my_href = URI.parse(self.href)
|
26
|
-
#@params.merge! :executables =? connection.get(my_href.path + "/executables")
|
27
39
|
ex = []
|
28
40
|
connection.get(my_href.path + "/executables").each do |e|
|
29
41
|
ex << Executable.new(e)
|
@@ -18,6 +18,18 @@ class Tag
|
|
18
18
|
extend RightScale::Api::BaseExtend
|
19
19
|
|
20
20
|
def self.search(resource_name, tags)
|
21
|
-
result = connection.get("
|
21
|
+
result = connection.get("tags/search", :resource_type => resource_name.to_s, :tags => tags )
|
22
|
+
end
|
23
|
+
|
24
|
+
#TAGGABLE_RESOURCES = [ 'Server', 'Ec2EbsSnapshot', 'Ec2EbsVolume', 'Ec2Image', 'Image', 'ServerArray', 'Ec2Instance',
|
25
|
+
# 'Instance', 'Deployment', 'ServerTemplate', 'Ec2ServerTemplate' ]
|
26
|
+
#
|
27
|
+
# Tag.set( resource_href, tags ) where tags is an array of tags to set on the resource.
|
28
|
+
def self.set(resource_href, tags)
|
29
|
+
connection.put("tags/set", :resource_href => resource_href, :tags => tags)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.unset(resource_href, tags)
|
33
|
+
connection.put("tags/unset", :resource_href => resource_href, :tags => tags)
|
22
34
|
end
|
23
35
|
end
|
data/rest_connection.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rest_connection}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jeremy Deininger"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-06-22}
|
13
13
|
s.description = %q{provides rest_connection}
|
14
14
|
s.email = %q{jeremy@rubyonlinux.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -21,16 +21,15 @@ Gem::Specification.new do |s|
|
|
21
21
|
"Rakefile",
|
22
22
|
"VERSION",
|
23
23
|
"config/rest_api_config.yaml.sample",
|
24
|
+
"examples/README.txt",
|
24
25
|
"examples/console.rb",
|
25
|
-
"examples/
|
26
|
+
"examples/cucumber/2mysql_5.x_v2_beta_from_scratch.feature",
|
27
|
+
"examples/cucumber/step_definitions/deployment_steps.rb",
|
28
|
+
"examples/cucumber/step_definitions/mysql_steps.rb",
|
29
|
+
"examples/cucumber/step_definitions/recipe_steps.rb",
|
30
|
+
"examples/cucumber/step_definitions/spot_check_steps.rb",
|
26
31
|
"examples/relaunch_deployment.rb",
|
27
|
-
"examples/restart_instance_agent.rb",
|
28
32
|
"examples/right_scale_ec2_instances_api_test.rb",
|
29
|
-
"examples/run_ebs_sequence.rb",
|
30
|
-
"examples/run_ebs_terminate.rb",
|
31
|
-
"examples/run_mysql_chef_sequence.rb",
|
32
|
-
"examples/run_php_chef_sequence.rb",
|
33
|
-
"examples/set_deployment_template_href.rb",
|
34
33
|
"lib/rest_connection.rb",
|
35
34
|
"lib/rest_connection/rightscale/audit_entry.rb",
|
36
35
|
"lib/rest_connection/rightscale/deployment.rb",
|
@@ -58,12 +57,14 @@ Gem::Specification.new do |s|
|
|
58
57
|
"lib/rest_connection/rightscale/tag.rb",
|
59
58
|
"lib/rest_connection/ssh_hax.rb",
|
60
59
|
"rest_connection.gemspec",
|
60
|
+
"spec/ec2_server_array_spec.rb",
|
61
61
|
"spec/ec2_ssh_key_internal_spec.rb",
|
62
62
|
"spec/image_jockey.rb",
|
63
63
|
"spec/method_missing_spec.rb",
|
64
64
|
"spec/rs_internal_spec.rb",
|
65
65
|
"spec/server_internal_spec.rb",
|
66
|
-
"spec/server_spec.rb"
|
66
|
+
"spec/server_spec.rb",
|
67
|
+
"spec/tag_spec.rb"
|
67
68
|
]
|
68
69
|
s.homepage = %q{http://github.com/jeremyd/rest_connection}
|
69
70
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -71,22 +72,21 @@ Gem::Specification.new do |s|
|
|
71
72
|
s.rubygems_version = %q{1.3.7}
|
72
73
|
s.summary = %q{lib for restful connections to the rightscale api}
|
73
74
|
s.test_files = [
|
74
|
-
"spec/
|
75
|
+
"spec/ec2_server_array_spec.rb",
|
76
|
+
"spec/ec2_ssh_key_internal_spec.rb",
|
75
77
|
"spec/image_jockey.rb",
|
76
78
|
"spec/method_missing_spec.rb",
|
77
79
|
"spec/rs_internal_spec.rb",
|
78
80
|
"spec/server_internal_spec.rb",
|
79
81
|
"spec/server_spec.rb",
|
82
|
+
"spec/tag_spec.rb",
|
80
83
|
"examples/console.rb",
|
81
|
-
"examples/
|
84
|
+
"examples/cucumber/step_definitions/deployment_steps.rb",
|
85
|
+
"examples/cucumber/step_definitions/mysql_steps.rb",
|
86
|
+
"examples/cucumber/step_definitions/recipe_steps.rb",
|
87
|
+
"examples/cucumber/step_definitions/spot_check_steps.rb",
|
82
88
|
"examples/relaunch_deployment.rb",
|
83
|
-
"examples/
|
84
|
-
"examples/right_scale_ec2_instances_api_test.rb",
|
85
|
-
"examples/run_ebs_sequence.rb",
|
86
|
-
"examples/run_ebs_terminate.rb",
|
87
|
-
"examples/run_mysql_chef_sequence.rb",
|
88
|
-
"examples/run_php_chef_sequence.rb",
|
89
|
-
"examples/set_deployment_template_href.rb"
|
89
|
+
"examples/right_scale_ec2_instances_api_test.rb"
|
90
90
|
]
|
91
91
|
|
92
92
|
if s.respond_to? :specification_version then
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rest_connection'
|
3
|
+
require 'spec'
|
4
|
+
require 'ruby-debug'
|
5
|
+
|
6
|
+
describe Ec2ServerArray, "takes over the world with some server arrays" do
|
7
|
+
before(:all) do
|
8
|
+
# store temporary resources in @t_resources so we can tear down afterwards
|
9
|
+
@t_resources = Hash.new
|
10
|
+
@t_resources[:deployment] = Deployment.create(:nickname => "testdeploymentcandelete123")
|
11
|
+
@default_sec_group = Ec2SecurityGroup.find(:first) { |g| g.aws_group_name == 'default' }
|
12
|
+
@mci = MultiCloudImage.find(:first)
|
13
|
+
# Need to hardcode a server template with a script with no inputs, for the test of run on all
|
14
|
+
@server_template = ServerTemplate.find(63400)
|
15
|
+
#@t_resources[:server_template] = ServerTemplate.create( :nickname => "Nickname of the ServerTemplate",
|
16
|
+
# :description => "Description of the ServerTemplate",
|
17
|
+
# :multi_cloud_image_href => @mci.href
|
18
|
+
# )
|
19
|
+
|
20
|
+
# SSH Keys index call is 403 forbidden so lookup is not possible.
|
21
|
+
# Hardcoded for a default key.
|
22
|
+
@ssh_key = Ec2SshKey.find(7053)
|
23
|
+
@t_resources[:ec2_server_array] = Ec2ServerArray.create(:nickname => "testarraycandelete123",
|
24
|
+
:description => "created by specs run, you can delete this if you want",
|
25
|
+
:array_type => "alert",
|
26
|
+
#:elasticity_params => ,
|
27
|
+
:active => 'true',
|
28
|
+
:deployment_href => @t_resources[:deployment].href,
|
29
|
+
:server_template_href => @server_template.href,
|
30
|
+
#:indicator_href,
|
31
|
+
#:audit_queue_href,
|
32
|
+
:ec2_ssh_key_href => @ssh_key.href,
|
33
|
+
:ec2_security_group_href => @default_sec_group.href,
|
34
|
+
#:ec2_security_groups_href => ,
|
35
|
+
#:elasticity_function,
|
36
|
+
:elasticity => { :min_count => "1", :max_count => "2" },
|
37
|
+
#:parameters,
|
38
|
+
#:tags,
|
39
|
+
:collect_audit_entries => "1"
|
40
|
+
)
|
41
|
+
@my_array = @t_resources[:ec2_server_array]
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should get all the instances in the array" do
|
45
|
+
my_instances = @my_array.instances
|
46
|
+
my_instances.class.should == Array
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should run a script on all the servers in the array" do
|
50
|
+
right_script = @server_template.executables.first
|
51
|
+
result = @my_array.run_script_on_all(right_script, [@server_template.href])
|
52
|
+
puts "hello"
|
53
|
+
puts "blah"
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should terminate all instances in the array" do
|
57
|
+
@my_array.active = "false"
|
58
|
+
@my_array.save
|
59
|
+
@my_array.terminate_all
|
60
|
+
end
|
61
|
+
|
62
|
+
after(:all) do
|
63
|
+
@t_resources.each do |key,val|
|
64
|
+
val.destroy
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/tag_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rest_connection'
|
3
|
+
require 'spec'
|
4
|
+
require 'ruby-debug'
|
5
|
+
|
6
|
+
describe Tag, "tags" do
|
7
|
+
it "a server" do
|
8
|
+
mytags = ["provides:rs_blah=blah"]
|
9
|
+
search = ["provides:rs_blah"]
|
10
|
+
#mytags = ["blah", "blah2"]
|
11
|
+
s = Server.find(:first)
|
12
|
+
t = Tag.set(s.href, mytags)
|
13
|
+
t.response.code.should == "204"
|
14
|
+
f = Tag.search("server", mytags)
|
15
|
+
f.size.should > 0
|
16
|
+
t2 = Tag.unset(s.href, mytags)
|
17
|
+
t2.response.code.should == "204"
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest_connection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jeremy Deininger
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-06-22 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -74,16 +74,15 @@ files:
|
|
74
74
|
- Rakefile
|
75
75
|
- VERSION
|
76
76
|
- config/rest_api_config.yaml.sample
|
77
|
+
- examples/README.txt
|
77
78
|
- examples/console.rb
|
78
|
-
- examples/
|
79
|
+
- examples/cucumber/2mysql_5.x_v2_beta_from_scratch.feature
|
80
|
+
- examples/cucumber/step_definitions/deployment_steps.rb
|
81
|
+
- examples/cucumber/step_definitions/mysql_steps.rb
|
82
|
+
- examples/cucumber/step_definitions/recipe_steps.rb
|
83
|
+
- examples/cucumber/step_definitions/spot_check_steps.rb
|
79
84
|
- examples/relaunch_deployment.rb
|
80
|
-
- examples/restart_instance_agent.rb
|
81
85
|
- examples/right_scale_ec2_instances_api_test.rb
|
82
|
-
- examples/run_ebs_sequence.rb
|
83
|
-
- examples/run_ebs_terminate.rb
|
84
|
-
- examples/run_mysql_chef_sequence.rb
|
85
|
-
- examples/run_php_chef_sequence.rb
|
86
|
-
- examples/set_deployment_template_href.rb
|
87
86
|
- lib/rest_connection.rb
|
88
87
|
- lib/rest_connection/rightscale/audit_entry.rb
|
89
88
|
- lib/rest_connection/rightscale/deployment.rb
|
@@ -111,12 +110,14 @@ files:
|
|
111
110
|
- lib/rest_connection/rightscale/tag.rb
|
112
111
|
- lib/rest_connection/ssh_hax.rb
|
113
112
|
- rest_connection.gemspec
|
113
|
+
- spec/ec2_server_array_spec.rb
|
114
114
|
- spec/ec2_ssh_key_internal_spec.rb
|
115
115
|
- spec/image_jockey.rb
|
116
116
|
- spec/method_missing_spec.rb
|
117
117
|
- spec/rs_internal_spec.rb
|
118
118
|
- spec/server_internal_spec.rb
|
119
119
|
- spec/server_spec.rb
|
120
|
+
- spec/tag_spec.rb
|
120
121
|
has_rdoc: true
|
121
122
|
homepage: http://github.com/jeremyd/rest_connection
|
122
123
|
licenses: []
|
@@ -152,19 +153,18 @@ signing_key:
|
|
152
153
|
specification_version: 3
|
153
154
|
summary: lib for restful connections to the rightscale api
|
154
155
|
test_files:
|
156
|
+
- spec/ec2_server_array_spec.rb
|
155
157
|
- spec/ec2_ssh_key_internal_spec.rb
|
156
158
|
- spec/image_jockey.rb
|
157
159
|
- spec/method_missing_spec.rb
|
158
160
|
- spec/rs_internal_spec.rb
|
159
161
|
- spec/server_internal_spec.rb
|
160
162
|
- spec/server_spec.rb
|
163
|
+
- spec/tag_spec.rb
|
161
164
|
- examples/console.rb
|
162
|
-
- examples/
|
165
|
+
- examples/cucumber/step_definitions/deployment_steps.rb
|
166
|
+
- examples/cucumber/step_definitions/mysql_steps.rb
|
167
|
+
- examples/cucumber/step_definitions/recipe_steps.rb
|
168
|
+
- examples/cucumber/step_definitions/spot_check_steps.rb
|
163
169
|
- examples/relaunch_deployment.rb
|
164
|
-
- examples/restart_instance_agent.rb
|
165
170
|
- examples/right_scale_ec2_instances_api_test.rb
|
166
|
-
- examples/run_ebs_sequence.rb
|
167
|
-
- examples/run_ebs_terminate.rb
|
168
|
-
- examples/run_mysql_chef_sequence.rb
|
169
|
-
- examples/run_php_chef_sequence.rb
|
170
|
-
- examples/set_deployment_template_href.rb
|
data/examples/dev_setup.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'trollop'
|
4
|
-
require 'rest_connection'
|
5
|
-
require 'net/ssh'
|
6
|
-
|
7
|
-
opts = Trollop::options do
|
8
|
-
opt :deployment, "deployment nickname", :type => :string, :required => true
|
9
|
-
opt :only, "regex string matching the nickname of the servers you want to relaunch. This excludes servers that do not match\nExample --only ubuntu", :type => :string, :required => false
|
10
|
-
opt :growl, "use growl notification (string) when servers are all operational, requires ruby-growl gem", :type => :string, :required => false
|
11
|
-
end
|
12
|
-
|
13
|
-
# find all servers in the deployment (the fast way)
|
14
|
-
deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
15
|
-
servers = deployment.servers_no_reload
|
16
|
-
servers = servers.select { |s| s.nickname =~ /#{opts[:only]}/ } if opts[:only]
|
17
|
-
|
18
|
-
servers.each do |s|
|
19
|
-
s.wait_for_operational_with_dns
|
20
|
-
|
21
|
-
Net::SSH.start(s.dns_name, 'root', :keys => ['~/.ssh/publish-test']) do |ssh|
|
22
|
-
puts "setting up devmode: dropbox::install && devmode::setup_cookbooks"
|
23
|
-
puts ssh.exec!("rs_run_recipe -n 'dropbox::install'")
|
24
|
-
puts ssh.exec!("rs_run_recipe -n 'devmode::setup_cookbooks'")
|
25
|
-
end
|
26
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'trollop'
|
4
|
-
require 'rest_connection'
|
5
|
-
require 'net/ssh'
|
6
|
-
|
7
|
-
opts = Trollop::options do
|
8
|
-
opt :deployment, "deployment nickname", :type => :string, :required => true
|
9
|
-
opt :only, "regex string matching the nickname of the servers you want to relaunch. This excludes servers that do not match\nExample --only ubuntu", :type => :string, :required => false
|
10
|
-
opt :hard, "hard reset, uninstalls right_resources premium gem (for code update), and restarts the instance agent", :type => :bool, :required => false
|
11
|
-
end
|
12
|
-
|
13
|
-
# find all servers in the deployment (the fast way)
|
14
|
-
deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
15
|
-
servers = deployment.servers_no_reload
|
16
|
-
servers = servers.select { |s| s.nickname =~ /#{opts[:only]}/ } if opts[:only]
|
17
|
-
|
18
|
-
servers.each do |s|
|
19
|
-
s.wait_for_operational_with_dns
|
20
|
-
if opts[:hard]
|
21
|
-
s.spot_check("gem uninstall right_resources_premium") do |result|
|
22
|
-
puts result
|
23
|
-
end
|
24
|
-
s.spot_check("monit restart instance") do |result|
|
25
|
-
puts result
|
26
|
-
end
|
27
|
-
end
|
28
|
-
s.run_recipe("database_test::dev_pristine_restore")
|
29
|
-
end
|
@@ -1,95 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'trollop'
|
4
|
-
require 'rest_connection'
|
5
|
-
#
|
6
|
-
# EBS regression test
|
7
|
-
#
|
8
|
-
# prerequirements: run the macro for EBS stripe deployment
|
9
|
-
# enter the deployment name below
|
10
|
-
#
|
11
|
-
|
12
|
-
opts = Trollop::options do
|
13
|
-
opt :deployment, "deployment nickname", :type => :string, :required => true
|
14
|
-
end
|
15
|
-
|
16
|
-
#ebs_deployment = Deployment.find_by_nickname_speed("Regression Test - MySQL -STRIPE").first
|
17
|
-
ebs_deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
18
|
-
|
19
|
-
# select servers by nickname!
|
20
|
-
mysql_s3 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL S3 US db1/i }
|
21
|
-
mysql_db1 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL EBS db1/i }
|
22
|
-
mysql_db2 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL EBS Stripe db1/i }
|
23
|
-
mysql_db3 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL EBS Stripe db2/i }
|
24
|
-
|
25
|
-
# we must reload, so the server can populate it's state. we took a shortcut
|
26
|
-
# by grabbing the servers from the deployment's json (the rightscale default response)
|
27
|
-
mysql_s3.reload
|
28
|
-
mysql_db1.reload
|
29
|
-
mysql_db2.reload
|
30
|
-
mysql_db3.reload
|
31
|
-
|
32
|
-
# tweak: (this is closer to an actual user story) setup mysql_db1 for regular EBS
|
33
|
-
# the rest of the deployment is normally set to text:2
|
34
|
-
# mysql_db1 is [rev 13] so it needs the old input name
|
35
|
-
|
36
|
-
#mysql_db1.set_input("OPT_EBS_STRIPE_COUNT", "ignore:$ignore")
|
37
|
-
#mysql_db1.set_input("DB_EBS_PREFIX", "text:shouldnotmatter-candelete652")
|
38
|
-
#mysql_db1.set_input("DB_LINEAGE_NAME", "text:shouldnotmatter-candelete652")
|
39
|
-
#mysql_db2.set_input("DB_LINEAGE_NAME", "text:shouldnotmatter-candelete652")
|
40
|
-
#mysql_db3.set_input("DB_LINEAGE_NAME", "text:shouldnotmatter-candelete652")
|
41
|
-
|
42
|
-
# launch all
|
43
|
-
mysql_s3.start
|
44
|
-
mysql_db1.start
|
45
|
-
mysql_db2.start
|
46
|
-
mysql_db3.start
|
47
|
-
|
48
|
-
# wait for operational
|
49
|
-
mysql_s3.wait_for_state('operational')
|
50
|
-
mysql_db1.wait_for_state('operational')
|
51
|
-
mysql_db2.wait_for_state('operational')
|
52
|
-
mysql_db3.wait_for_state('operational')
|
53
|
-
|
54
|
-
sleep 10 #make sure they are operational
|
55
|
-
|
56
|
-
# we need better api support, but for now we can get our RightScripts from info.yml on an instance (or in the current dir)
|
57
|
-
template_scripts = RightScript.from_instance_info
|
58
|
-
|
59
|
-
# scripts from EBS [rev13]
|
60
|
-
slave_init_non_ebs_rev4 = RightScript.new('href' => 'right_scripts/45320')
|
61
|
-
slave_init_non_ebs_v1_rev6 = RightScript.new('href' => 'right_scripts/41484')
|
62
|
-
restore_rev4 = RightScript.new('href' => 'right_scripts/45319')
|
63
|
-
|
64
|
-
# see how easy this is to cherry pick the scripts by name? this means no resetting of ids across different templates
|
65
|
-
restore_script = template_scripts.detect { |script| script.name =~ /restore/i }
|
66
|
-
slave_init_non_ebs = template_scripts.detect { |script| script.name =~ /DB EBS slave init from non-EBS master v1/ }
|
67
|
-
slave_init_non_stripe = template_scripts.detect { |script| script.name =~ /DB EBS stripe slave init from EBS non-stripe master/i }
|
68
|
-
promote = template_scripts.detect { |script| script.name =~ /promote/i }
|
69
|
-
slave_init = template_scripts.detect { |script| script.name == "DB EBS slave init (Stripe alpha)" }
|
70
|
-
backup = template_scripts.detect { |script| script.name =~ /DB EBS backup/i }
|
71
|
-
|
72
|
-
# breathing room is needed below *only to let the servers
|
73
|
-
# settle after fail-over operations. wait_for_completed returns
|
74
|
-
# when the right_script status is 'success' or 'fail'
|
75
|
-
|
76
|
-
status = mysql_db1.run_script(slave_init_non_ebs_v1_rev6)
|
77
|
-
status = mysql_db1.run_script(slave_init_non_ebs_rev4)
|
78
|
-
status.wait_for_completed(mysql_db1.audit_link)
|
79
|
-
sleep 220 #breathing room
|
80
|
-
|
81
|
-
status = mysql_db1.run_script(promote)
|
82
|
-
status.wait_for_completed(mysql_db1.audit_link)
|
83
|
-
sleep 220 #breathing room
|
84
|
-
|
85
|
-
status = mysql_db2.run_script(slave_init_non_stripe)
|
86
|
-
status.wait_for_completed(mysql_db2.audit_link)
|
87
|
-
sleep 220 # breathing room
|
88
|
-
|
89
|
-
status = mysql_db2.run_script(promote)
|
90
|
-
status.wait_for_completed(mysql_db2.audit_link)
|
91
|
-
sleep 220 #breathing room
|
92
|
-
|
93
|
-
status = mysql_db3.run_script(slave_init)
|
94
|
-
status.wait_for_completed(mysql_db3.audit_link)
|
95
|
-
puts "done!"
|
@@ -1,40 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'trollop'
|
4
|
-
require File.join(File.dirname(__FILE__), '..', 'lib', 'rightscale_api_resources')
|
5
|
-
|
6
|
-
#
|
7
|
-
# EBS regression test
|
8
|
-
#
|
9
|
-
# prerequirements: run the macro for EBS stripe deployment
|
10
|
-
# enter the deployment name below
|
11
|
-
#
|
12
|
-
|
13
|
-
opts = Trollop::options do
|
14
|
-
opt :deployment, "deployment nickname", :type => :string, :required => true
|
15
|
-
end
|
16
|
-
|
17
|
-
ebs_deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
18
|
-
# select servers by nickname!
|
19
|
-
mysql_s3 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL S3 US db1/i }
|
20
|
-
mysql_db1 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL EBS db1/i }
|
21
|
-
mysql_db2 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL EBS Stripe db1/i }
|
22
|
-
mysql_db3 = ebs_deployment.servers.detect { |s| s.nickname =~ /MySQL EBS Stripe db2/i }
|
23
|
-
|
24
|
-
# we must reload, so the server can populate it's state
|
25
|
-
mysql_s3.reload
|
26
|
-
mysql_db1.reload
|
27
|
-
mysql_db2.reload
|
28
|
-
mysql_db3.reload
|
29
|
-
|
30
|
-
# stop all
|
31
|
-
mysql_s3.stop
|
32
|
-
mysql_db1.stop
|
33
|
-
mysql_db2.stop
|
34
|
-
mysql_db3.stop
|
35
|
-
|
36
|
-
# wait for stopped
|
37
|
-
mysql_s3.wait_for_state('stopped')
|
38
|
-
mysql_db1.wait_for_state('stopped')
|
39
|
-
mysql_db2.wait_for_state('stopped')
|
40
|
-
mysql_db3.wait_for_state('stopped')
|
@@ -1,43 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'trollop'
|
4
|
-
require 'rest_connection'
|
5
|
-
require 'net/ssh'
|
6
|
-
|
7
|
-
opts = Trollop::options do
|
8
|
-
opt :deployment, "deployment nickname", :type => :string, :required => false
|
9
|
-
opt :only, "regex string matching the nickname of the servers you want to relaunch. This excludes servers that do not match\nExample --only ubuntu", :type => :string, :required => false
|
10
|
-
opt :id, "deployment id", :type => :string, :required => false
|
11
|
-
end
|
12
|
-
|
13
|
-
# find all servers in the deployment (the fast way)
|
14
|
-
if opts[:id]
|
15
|
-
deployment = Deployment.find_by_id(opts[:id])
|
16
|
-
else
|
17
|
-
deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
18
|
-
end
|
19
|
-
servers = deployment.servers_no_reload
|
20
|
-
servers = servers.select { |s| s.nickname =~ /#{opts[:only]}/ } if opts[:only]
|
21
|
-
|
22
|
-
raise "need at least 2 servers to start, only have: #{servers.size}" if servers.size < 2
|
23
|
-
|
24
|
-
# wait for servers to be ready
|
25
|
-
servers.each do |s|
|
26
|
-
s.start
|
27
|
-
while(1)
|
28
|
-
puts "waiting for dns-name for #{s.nickname}"
|
29
|
-
break if s['dns-name'] && !s['dns-name'].empty?
|
30
|
-
s.reload
|
31
|
-
sleep 2
|
32
|
-
end
|
33
|
-
puts "DNS: #{s['dns-name']}"
|
34
|
-
|
35
|
-
s.wait_for_state('operational')
|
36
|
-
end
|
37
|
-
|
38
|
-
servers[0].run_recipe("db_mysql::do_restore_and_become_master")
|
39
|
-
|
40
|
-
sleep(10)
|
41
|
-
|
42
|
-
servers[1].run_recipe("db_mysql::do_init_slave")
|
43
|
-
servers[1].run_recipe("db_mysql::do_promote_to_master")
|
@@ -1,109 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'trollop'
|
4
|
-
require 'rest_connection'
|
5
|
-
require 'net/ssh'
|
6
|
-
|
7
|
-
def run_recipe(recipe, host_dns, continue=false)
|
8
|
-
STDOUT.puts "sshing to #{host_dns}"
|
9
|
-
result = nil
|
10
|
-
tail_command ="tail -f -n1 /var/log/messages"
|
11
|
-
expect = /RightLink.*RS> ([completed|failed]+: < #{recipe} >)/
|
12
|
-
|
13
|
-
Net::SSH.start(host_dns, 'root', :keys => ['~/.ssh/publish-test']) do |ssh|
|
14
|
-
STDOUT.puts ssh.exec!("rs_run_recipe -n '#{recipe}'")
|
15
|
-
log_channel = ssh.open_channel do |ch|
|
16
|
-
ch.exec tail_command do |ch, success|
|
17
|
-
raise "could not execute command" unless success
|
18
|
-
# "on_data" is called when the process writes something to stdout
|
19
|
-
ch.on_data do |c, data|
|
20
|
-
STDOUT.print data
|
21
|
-
if data =~ expect
|
22
|
-
STDOUT.puts "FOUND EXPECTED DATA, closing channel"
|
23
|
-
result = $1
|
24
|
-
end
|
25
|
-
end
|
26
|
-
# "on_extended_data" is called when the process writes something to stderr
|
27
|
-
ch.on_extended_data do |c, type, data|
|
28
|
-
STDERR.print data
|
29
|
-
end
|
30
|
-
ch.on_close do
|
31
|
-
STDOUT.puts "closed channel"
|
32
|
-
end
|
33
|
-
ch.on_process do |c|
|
34
|
-
if result
|
35
|
-
STDOUT.puts "attempting close"
|
36
|
-
ch.close
|
37
|
-
ssh.exec("killall tail")
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
log_channel.wait
|
43
|
-
end
|
44
|
-
raise "FATAL: halting execution, script #{result}" if result.include?('failed') && continue == false
|
45
|
-
return result
|
46
|
-
end
|
47
|
-
|
48
|
-
def spot_check(command, host_dns, &block)
|
49
|
-
Net::SSH.start(host_dns, 'root', :keys => ['~/.ssh/publish-test']) do |ssh|
|
50
|
-
result = ssh.exec!(command)
|
51
|
-
yield result
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
opts = Trollop::options do
|
56
|
-
opt :deployment, "deployment nickname", :type => :string, :required => false
|
57
|
-
opt :id, "deployment id", :type => :string, :required => false
|
58
|
-
opt :only, "regex string matching the nickname of the servers you want to relaunch. This excludes servers that do not match\nExample --only ubuntu", :type => :string, :required => false
|
59
|
-
end
|
60
|
-
if opts[:id]
|
61
|
-
deployment = Deployment.find_by_id(opts[:id])
|
62
|
-
else
|
63
|
-
deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
64
|
-
end
|
65
|
-
servers = deployment.servers_no_reload
|
66
|
-
servers = servers.select { |s| s.nickname =~ /#{opts[:only]}/ } if opts[:only]
|
67
|
-
|
68
|
-
raise "need at least 4 servers to start, only have: #{servers.size}" if servers.size < 4
|
69
|
-
# wait for servers to be ready
|
70
|
-
servers.each do |s|
|
71
|
-
while(1)
|
72
|
-
puts "waiting for dns-name for #{s.nickname}"
|
73
|
-
break if s['dns-name'] && !s['dns-name'].empty?
|
74
|
-
s.reload
|
75
|
-
sleep 2
|
76
|
-
end
|
77
|
-
puts "DNS: #{s['dns-name']}"
|
78
|
-
|
79
|
-
s.wait_for_state('operational')
|
80
|
-
end
|
81
|
-
|
82
|
-
servers.each do |s|
|
83
|
-
puts run_recipe("lb_haproxy::do_attach_request", s.dns_name)
|
84
|
-
end
|
85
|
-
sleep 20
|
86
|
-
|
87
|
-
a_frontend = servers.detect {|d| d.nickname.include?("FE")}
|
88
|
-
a_frontend.reload
|
89
|
-
raise "couldn't find a frontend with FE in the nickname!" unless a_frontend
|
90
|
-
puts a_frontend.dns_name
|
91
|
-
spot_check("cat /home/haproxy/rightscale_lb.cfg |grep server|grep -v '#'|wc -l", a_frontend.dns_name) do |result|
|
92
|
-
puts "found attached servers: #{result}"
|
93
|
-
raise "not enough servers #{result}" unless result.to_i == 4
|
94
|
-
end
|
95
|
-
|
96
|
-
servers.each do |s|
|
97
|
-
run_recipe("app_php::do_update_code", s.dns_name)
|
98
|
-
end
|
99
|
-
|
100
|
-
servers.each do |s|
|
101
|
-
run_recipe("lb_haproxy::do_detach_request", s.dns_name)
|
102
|
-
end
|
103
|
-
sleep 20
|
104
|
-
spot_check("cat /home/haproxy/rightscale_lb.cfg |grep server|grep -v '#'|wc -l", a_frontend.dns_name) do |result|
|
105
|
-
puts "found attached servers: #{result}"
|
106
|
-
raise "should be zero servers but was #{result}" unless result.to_i == 0
|
107
|
-
end
|
108
|
-
|
109
|
-
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rest_connection'
|
3
|
-
require 'trollop'
|
4
|
-
|
5
|
-
opts = Trollop::options do
|
6
|
-
opt :deployment, "deployment nickname", :type => :string, :required => true
|
7
|
-
opt :template, "server template href to set for all servers", :type => :string, :required => true
|
8
|
-
end
|
9
|
-
|
10
|
-
deployment = Deployment.find_by_nickname_speed(opts[:deployment]).first
|
11
|
-
|
12
|
-
deployment.servers.each do |s|
|
13
|
-
s.set_template(opts[:template])
|
14
|
-
end
|