gaptool-server 0.6.0.beta1 → 0.6.0
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.
- checksums.yaml +4 -4
- data/Rakefile +11 -8
- data/VERSION +1 -1
- data/bin/gaptool_server_migrate_0.5-0.6 +30 -13
- data/lib/app.rb +9 -0
- data/lib/helpers/data.rb +27 -0
- data/lib/helpers/ec2.rb +17 -5
- data/lib/helpers/redis.rb +8 -4
- data/lib/helpers/rehash.rb +14 -14
- data/lib/routes.rb +21 -13
- data/lib/views/init.erb +8 -2
- data/tasks/config.rb +24 -0
- data/tasks/docker.rb +5 -0
- data/tasks/gem.rb +24 -21
- data/test/api_test.rb +27 -7
- data/test/data_test.rb +5 -0
- data/test/test_helper.rb +3 -1
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e207c02d589d8bfb58e728c7b9b62aa529a4dafa
|
4
|
+
data.tar.gz: a260e393c04319f65e9d805c5b2efd67834dc264
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 029ec75667629cab21f13458344987e3c76430e9d7aba798b92d088bccdf0e0b339bb8f374ea1db7db30839b83ec5de7bb4f1621855db260b57f0ac7e0fab924
|
7
|
+
data.tar.gz: e80e3092bfd5d8fa3ae1fe44c09ed21a09a97794c1ee968b8fd395c7304554b8cceea10634abcd904a8375c6511cee49222f50be72e6f4f9dfa171b8580447f1
|
data/Rakefile
CHANGED
@@ -5,6 +5,7 @@ require 'shellwords'
|
|
5
5
|
require 'rspec/core/rake_task'
|
6
6
|
require_relative 'lib/helpers/redis'
|
7
7
|
require_relative 'lib/helpers/init'
|
8
|
+
require_relative 'lib/helpers/rehash'
|
8
9
|
|
9
10
|
DH = Gaptool::Data
|
10
11
|
$stdout.sync = true
|
@@ -20,15 +21,17 @@ end
|
|
20
21
|
|
21
22
|
Dir.glob('tasks/*.rb').each { |r| load r}
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
unless File.exists?('/.dockerenv')
|
25
|
+
desc "Start the shell"
|
26
|
+
task :shell do
|
27
|
+
exec "racksh #{Shellwords.join(ARGV[1..-1])}"
|
28
|
+
end
|
29
|
+
task :sh => :shell
|
28
30
|
|
29
|
-
desc "Start the HTTP server"
|
30
|
-
task :server do
|
31
|
-
|
31
|
+
desc "Start the HTTP server"
|
32
|
+
task :server do
|
33
|
+
exec "unicorn #{Shellwords.join(ARGV[1..-1])}"
|
34
|
+
end
|
32
35
|
end
|
33
36
|
|
34
37
|
task :help do
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.0
|
1
|
+
0.6.0
|
@@ -13,15 +13,15 @@ puts "Removing cruft"
|
|
13
13
|
# First, remove cruft. Like all servers created but never registered, etc
|
14
14
|
['instance:*', '_*', 'apikey:*', 'service:*', 'running', 'ec2*',
|
15
15
|
'failover', 'capacity', 'sg:*'].each do |pattern|
|
16
|
-
$redis.keys(pattern).each do |key|
|
17
|
-
$redis.del key
|
16
|
+
$redis.redis.keys(pattern).each do |key|
|
17
|
+
$redis.redis.del key
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
puts "Migrating roles..."
|
22
|
-
$redis.keys('role:*').each do |key|
|
22
|
+
$redis.redis.keys('role:*').each do |key|
|
23
23
|
puts " - #{key}"
|
24
|
-
data = $redis.hgetall(key)
|
24
|
+
data = $redis.redis.hgetall(key)
|
25
25
|
role = key.sub('role:', '')
|
26
26
|
unless data['ami'].nil?
|
27
27
|
# We didn't have per-regin ami in roles, so
|
@@ -33,37 +33,40 @@ $redis.keys('role:*').each do |key|
|
|
33
33
|
end
|
34
34
|
|
35
35
|
puts "Migrating ami info to role..."
|
36
|
-
$redis.keys('amis:*').each do |key|
|
36
|
+
$redis.redis.keys('amis:*').each do |key|
|
37
37
|
role = key.sub("amis:", '')
|
38
38
|
puts " - #{key}"
|
39
|
-
amis = $redis.hgetall(key)
|
39
|
+
amis = $redis.redis.hgetall(key)
|
40
40
|
roledata = DH.get_role_data(role)
|
41
41
|
roledata['amis'] = amis.merge(roledata['amis'] || {})
|
42
42
|
DH.save_role_data(role, roledata)
|
43
|
-
$redis.del(key)
|
43
|
+
$redis.redis.del(key)
|
44
44
|
end
|
45
45
|
|
46
46
|
puts "Migrating apps..."
|
47
|
-
$redis.keys('app:*').each do |key|
|
47
|
+
$redis.redis.keys('app:*').each do |key|
|
48
48
|
puts " - #{key}"
|
49
49
|
appname = key.sub('app:', '')
|
50
|
-
role = $redis.hget(key, "role")
|
50
|
+
role = $redis.redis.hget(key, "role")
|
51
51
|
if role.nil? || appname.nil?
|
52
52
|
puts "Missing info for app: #{appname} role: #{role}"
|
53
53
|
end
|
54
|
-
$redis.del(key)
|
54
|
+
$redis.redis.del(key)
|
55
55
|
DH.add_app(appname, role) unless role.nil?
|
56
56
|
end
|
57
57
|
|
58
58
|
puts "Migrating instances..."
|
59
|
-
$redis.keys('host:*').each do |key|
|
59
|
+
$redis.redis.keys('host:*').each do |key|
|
60
60
|
puts " - #{key}"
|
61
61
|
pfx, role, env, iid = key.split(':')
|
62
|
-
data = $redis.hgetall(key)
|
62
|
+
data = $redis.redis.hgetall(key)
|
63
63
|
data['role'] = role
|
64
64
|
data['environment'] = env
|
65
|
+
unless data['chef_runlist'].nil?
|
66
|
+
data['chef_runlist'] = JSON.parse data['chef_runlist']
|
67
|
+
end
|
65
68
|
DH.addserver(iid, data, nil)
|
66
|
-
$redis.del(key)
|
69
|
+
$redis.redis.del(key)
|
67
70
|
# remove stale keys from hsh
|
68
71
|
$redis.hdel "instance:#{iid}", ["capacity", "mirror", "secret", 'instance']
|
69
72
|
end
|
@@ -84,6 +87,7 @@ $redis.smembers('instances').each do |inst|
|
|
84
87
|
end
|
85
88
|
|
86
89
|
puts "Rename old config keys"
|
90
|
+
$redis.redis.rename('config', 'gt:config')
|
87
91
|
$redis.hset('config', 'chef_repo', $redis.hget('config', 'chefrepo'))
|
88
92
|
$redis.hset('config', 'chef_branch', $redis.hget('config', 'chefbranch'))
|
89
93
|
|
@@ -93,4 +97,17 @@ puts "Removing old config keys"
|
|
93
97
|
$redis.hdel 'config', key
|
94
98
|
end
|
95
99
|
|
100
|
+
unless ARGV[0].nil?
|
101
|
+
puts "Updating GT_URL to #{ARGV[0]}"
|
102
|
+
$redis.hset('config', 'url', ARGV[0])
|
103
|
+
end
|
104
|
+
|
105
|
+
puts "Namespace remaining keys"
|
106
|
+
['users', 'amis'].each { |k| $redis.redis.rename(k, "gt:#{k}")}
|
107
|
+
|
108
|
+
puts "Removing out-of-namespace keys"
|
109
|
+
$redis.redis.keys('*').select { |k| !k.start_with? ('gt:')}.each do |k|
|
110
|
+
$redis.redis.del(k)
|
111
|
+
end
|
112
|
+
|
96
113
|
$redis.save
|
data/lib/app.rb
CHANGED
@@ -54,6 +54,15 @@ class GaptoolServer < Sinatra::Application
|
|
54
54
|
raise Unauthenticated unless user[:key] == env['HTTP_X_GAPTOOL_KEY']
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
after do
|
59
|
+
# Fix for old versions of gaptool-api
|
60
|
+
if request.preferred_type.to_str == "application/json"
|
61
|
+
content_type "application/json"
|
62
|
+
else
|
63
|
+
content_type 'text/html'
|
64
|
+
end
|
65
|
+
end
|
57
66
|
end
|
58
67
|
|
59
68
|
require_relative 'helpers/init'
|
data/lib/helpers/data.rb
CHANGED
@@ -44,6 +44,11 @@ module Gaptool
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
def self.set_server_data_attr(instance, attr, value)
|
48
|
+
return if value.nil? || (value.is_a?(String) && value.empty?) || !!value == value
|
49
|
+
$redis.hset("instance:#{instance}", attr, value)
|
50
|
+
end
|
51
|
+
|
47
52
|
def self.save_server_data(instance, data)
|
48
53
|
|
49
54
|
unless data['chef_runlist'].nil?
|
@@ -97,8 +102,23 @@ module Gaptool
|
|
97
102
|
$redis.hget('config', key)
|
98
103
|
end
|
99
104
|
|
105
|
+
def self.ensure_config(key, default)
|
106
|
+
cur = get_config(key)
|
107
|
+
cur = set_config(key, default) if cur.nil? || cur.empty?
|
108
|
+
cur
|
109
|
+
end
|
110
|
+
|
100
111
|
def self.set_config(key, value)
|
101
112
|
$redis.hset('config', key, value)
|
113
|
+
value
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.del_config(key)
|
117
|
+
$redis.hdel('config', key)
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.get_all_configs
|
121
|
+
$redis.hgetall('config')
|
102
122
|
end
|
103
123
|
|
104
124
|
def self.get_server_data(instance, opts={})
|
@@ -235,6 +255,13 @@ module Gaptool
|
|
235
255
|
$redis.smembers("role:#{role}:apps")
|
236
256
|
end
|
237
257
|
|
258
|
+
def self.stringify_apps(rs)
|
259
|
+
unless rs['apps'].nil?
|
260
|
+
rs['apps'] = rs['apps'].to_json
|
261
|
+
end
|
262
|
+
rs
|
263
|
+
end
|
264
|
+
|
238
265
|
def self.useradd(user, key=nil)
|
239
266
|
key = SecureRandom.hex(64) unless key
|
240
267
|
$redis.hset('users', user, key)
|
data/lib/helpers/ec2.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'aws-sdk'
|
1
2
|
require 'securerandom'
|
2
3
|
|
3
4
|
# encoding: utf-8
|
@@ -45,14 +46,25 @@ module Gaptool
|
|
45
46
|
end
|
46
47
|
|
47
48
|
def self.create_ec2_instance(ec2opts, data)
|
48
|
-
|
49
|
-
|
49
|
+
if ENV['DRYRUN']
|
50
|
+
id = "i-test#{SecureRandom.hex(2)}"
|
51
|
+
return {id: id,
|
52
|
+
hostname: "test-#{id}.#{data[:zone].chop}.compute.amazonaws.com",
|
53
|
+
launch_time: Time.now.to_s}
|
54
|
+
end
|
55
|
+
configure_ec2 data[:zone].chop
|
50
56
|
ec2 = AWS::EC2.new
|
51
57
|
|
52
|
-
instance = ec2.instances.create(
|
58
|
+
instance = ec2.instances.create(ec2opts)
|
53
59
|
instance.add_tag('Name', value: "#{data[:role]}-#{data[:env]}-#{instance.id}")
|
54
60
|
instance.add_tag('gaptool', :value => "yes")
|
55
|
-
instance.
|
61
|
+
launch_time = instance.launch_time.to_s
|
62
|
+
launch_time = launch_time.empty? ? Time.now.to_s : launch_time
|
63
|
+
{
|
64
|
+
id: instance.id,
|
65
|
+
hostname: instance.public_dns_name,
|
66
|
+
launch_time: launch_time
|
67
|
+
}
|
56
68
|
end
|
57
69
|
|
58
70
|
def self.terminate_ec2_instance(zone, id)
|
@@ -73,7 +85,7 @@ module Gaptool
|
|
73
85
|
ec2 = AWS::EC2.new
|
74
86
|
instance = ec2.instances[id]
|
75
87
|
return {
|
76
|
-
|
88
|
+
hostname: instance.dns_name
|
77
89
|
}
|
78
90
|
end
|
79
91
|
end
|
data/lib/helpers/redis.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'redis'
|
2
|
+
require 'redis-namespace'
|
2
3
|
|
3
4
|
# docker links support
|
4
5
|
unless ENV['REDIS_PORT_6379_TCP_ADDR'].nil?
|
@@ -12,8 +13,11 @@ ENV['REDIS_PORT'] = '6379' unless ENV['REDIS_PORT']
|
|
12
13
|
ENV['REDIS_PASS'] = nil unless ENV['REDIS_PASS']
|
13
14
|
ENV['REDIS_DB'] = '0' unless ENV['REDIS_DB']
|
14
15
|
|
15
|
-
|
16
|
-
:port => ENV['REDIS_PORT'].to_i,
|
17
|
-
:password => ENV['REDIS_PASS'],
|
18
|
-
:db => ENV['REDIS_DB'].to_i)
|
16
|
+
prefix = ENV.fetch('REDIS_PREFIX', 'gt')
|
19
17
|
|
18
|
+
conn = Redis.new(:host => ENV['REDIS_HOST'],
|
19
|
+
:port => ENV['REDIS_PORT'].to_i,
|
20
|
+
:password => ENV['REDIS_PASS'],
|
21
|
+
:db => ENV['REDIS_DB'].to_i)
|
22
|
+
|
23
|
+
$redis = Redis::Namespace.new(prefix, redis: conn)
|
data/lib/helpers/rehash.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
|
+
require_relative "ec2"
|
2
|
+
require_relative "data"
|
3
|
+
|
1
4
|
module Gaptool
|
2
5
|
module EC2
|
3
6
|
def self.rehash()
|
4
|
-
servers.each do |inst|
|
5
|
-
rmserver inst
|
7
|
+
Gaptool::Data::servers.each do |inst|
|
8
|
+
Gaptool::Data::rmserver inst
|
6
9
|
end
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@ec2 = AWS::EC2.new
|
11
|
-
:secret_access_key => $redis.hget('config', 'aws_secret'),
|
12
|
-
:ec2_endpoint => "ec2.#{zone}.amazonaws.com")
|
10
|
+
roles = Gaptool::Data::roles
|
11
|
+
Gaptool::Data::zones.each do |zone|
|
12
|
+
Gaptool::EC2::configure_ec2 zone
|
13
|
+
@ec2 = AWS::EC2.new
|
13
14
|
ilist = []
|
14
15
|
@ec2.instances.each do |instance|
|
15
16
|
if instance.tags['gaptool'] == 'yes' && instance.status == :running
|
@@ -18,18 +19,17 @@ module Gaptool
|
|
18
19
|
end
|
19
20
|
ilist.each do |instance|
|
20
21
|
puts " - #{instance.tags['Name']}"
|
21
|
-
role, environment, iid = instance.tags['Name'].split('-')
|
22
|
+
role, environment, iid = instance.tags['Name'].split('-', 3)
|
22
23
|
data = {
|
23
24
|
"zone"=> instance.availability_zone,
|
24
|
-
"itype"=> instance.instance_type,
|
25
25
|
"role"=> role,
|
26
26
|
"environment"=> environment,
|
27
|
-
"hostname"=> instance.public_dns_name,
|
28
|
-
"
|
27
|
+
"hostname" => instance.public_dns_name,
|
28
|
+
"launch_time" => instance.launch_time.to_s,
|
29
|
+
"apps" => roles[role].to_s,
|
29
30
|
"instance"=> instance.instance_id
|
30
31
|
}
|
31
|
-
|
32
|
-
addserver(data['instance'], data, nil)
|
32
|
+
Gaptool::Data::addserver(iid, data, nil)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
return {"action" => "complete"}
|
data/lib/routes.rb
CHANGED
@@ -31,15 +31,16 @@ class GaptoolServer < Sinatra::Application
|
|
31
31
|
sgid = Gaptool::EC2::get_or_create_securitygroup(data['role'], data['environment'], data['zone'], security_group)
|
32
32
|
image_id = data['ami'] || Gaptool::Data::get_ami_for_role(data['role'], data['zone'].chop)
|
33
33
|
data['terminable'] = data['terminable'].nil? ? true : !!data['terminable']
|
34
|
+
data['secret'] = secret
|
34
35
|
|
35
|
-
|
36
|
+
instance = Gaptool::EC2::create_ec2_instance(
|
36
37
|
{
|
37
38
|
:image_id => image_id,
|
38
39
|
:availability_zone => data['zone'],
|
39
40
|
:instance_type => data['itype'],
|
40
41
|
:key_name => "gaptool",
|
41
42
|
:security_group_ids => sgid,
|
42
|
-
:user_data => "#!/bin/bash\ncurl --silent -H 'X-GAPTOOL-USER: #{env['HTTP_X_GAPTOOL_USER']}' -H 'X-GAPTOOL-KEY: #{env['HTTP_X_GAPTOOL_KEY']}' #{
|
43
|
+
:user_data => "#!/bin/bash\ncurl --silent -H 'X-GAPTOOL-USER: #{env['HTTP_X_GAPTOOL_USER']}' -H 'X-GAPTOOL-KEY: #{env['HTTP_X_GAPTOOL_KEY']}' #{Gaptool::Data.get_config('url')}/register -X PUT --data '#{data.to_json}' | bash"
|
43
44
|
}, {
|
44
45
|
role: data['role'],
|
45
46
|
env: data['environment'],
|
@@ -47,10 +48,13 @@ class GaptoolServer < Sinatra::Application
|
|
47
48
|
}
|
48
49
|
)
|
49
50
|
# Add host tag
|
50
|
-
|
51
|
-
|
51
|
+
data.merge(instance.reject { |k, v| k == :id })
|
52
|
+
Gaptool::Data::addserver(instance[:id], data, secret)
|
53
|
+
json({instance: instance[:id],
|
52
54
|
ami: image_id,
|
53
55
|
role: data['role'],
|
56
|
+
hostname: instance[:hostname],
|
57
|
+
launch_time: instance[:launch_time],
|
54
58
|
environment: data['environment'],
|
55
59
|
secret: secret,
|
56
60
|
terminable: data['terminable'],
|
@@ -77,13 +81,15 @@ class GaptoolServer < Sinatra::Application
|
|
77
81
|
raise Forbidden, "Can't register instance: wrong secret or missing role/environment" unless instance_id
|
78
82
|
|
79
83
|
hostname = Gaptool::EC2::get_ec2_instance_data(data['zone'].chop, instance_id)[:hostname]
|
84
|
+
Gaptool::Data.set_server_data_attr(instance_id, "hostname", hostname)
|
80
85
|
host_data = Gaptool::Data::get_server_data instance_id, initkey: true, force_runlist: true
|
81
86
|
|
82
87
|
chef_repo = host_data['chef_repo']
|
83
88
|
chef_branch = host_data['chef_branch']
|
89
|
+
chef_environment = host_data['environment']
|
84
90
|
# FIXME: remove init key from redis
|
85
|
-
initkey =
|
86
|
-
run_list = host_data['chef_runlist']
|
91
|
+
initkey = Gaptool::Data::get_config("initkey")
|
92
|
+
run_list = host_data['chef_runlist']
|
87
93
|
|
88
94
|
jdata = {
|
89
95
|
'hostname' => hostname,
|
@@ -104,6 +110,8 @@ class GaptoolServer < Sinatra::Application
|
|
104
110
|
initkey: initkey,
|
105
111
|
chef_branch: chef_branch,
|
106
112
|
chef_repo: chef_repo,
|
113
|
+
chef_environment: chef_environment,
|
114
|
+
chef_version: Gaptool::Data::ensure_config("chef_version", "11.16.4"),
|
107
115
|
json: jdata
|
108
116
|
}
|
109
117
|
end
|
@@ -111,14 +119,14 @@ class GaptoolServer < Sinatra::Application
|
|
111
119
|
get '/hosts' do
|
112
120
|
servers = Gaptool::Data::servers.map do |inst|
|
113
121
|
Gaptool::Data::get_server_data inst
|
114
|
-
end
|
122
|
+
end.select{ |s| !s['registered']}
|
115
123
|
json servers
|
116
124
|
end
|
117
125
|
|
118
126
|
get '/apps' do
|
119
127
|
out = {}
|
120
128
|
Gaptool::Data.apps.each do |app|
|
121
|
-
out[app] = Gaptool::Data::get_app_data(app)
|
129
|
+
out["app:#{app}"] = Gaptool::Data::get_app_data(app)
|
122
130
|
end
|
123
131
|
json out
|
124
132
|
end
|
@@ -126,12 +134,12 @@ class GaptoolServer < Sinatra::Application
|
|
126
134
|
get '/hosts/:role' do
|
127
135
|
servers = Gaptool::Data::servers_in_role(params[:role]).map do |inst|
|
128
136
|
Gaptool::Data::get_server_data inst
|
129
|
-
end
|
137
|
+
end.select{ |s| !s['registered'] }
|
130
138
|
json servers
|
131
139
|
end
|
132
140
|
|
133
141
|
get '/instance/:id' do
|
134
|
-
json Gaptool::Data::get_server_data(params[:id])
|
142
|
+
json Gaptool::Data::stringify_apps(Gaptool::Data::get_server_data(params[:id]))
|
135
143
|
end
|
136
144
|
|
137
145
|
get '/hosts/:role/:environment' do
|
@@ -141,14 +149,14 @@ class GaptoolServer < Sinatra::Application
|
|
141
149
|
list = Gaptool::Data::servers_in_role_env params[:role], params[:environment]
|
142
150
|
end
|
143
151
|
servers = list.map do |inst|
|
144
|
-
Gaptool::Data::get_server_data
|
152
|
+
Gaptool::Data::stringify_apps(Gaptool::Data::get_server_data(inst))
|
145
153
|
end
|
146
154
|
|
147
155
|
json servers
|
148
156
|
end
|
149
157
|
|
150
158
|
get '/host/:role/:environment/:instance' do
|
151
|
-
json Gaptool::Data::get_server_data
|
159
|
+
json Gaptool::Data::stringify_apps(Gaptool::Data::get_server_data(params[:instance]))
|
152
160
|
end
|
153
161
|
|
154
162
|
get '/ssh/:role/:environment/:instance' do
|
@@ -166,7 +174,7 @@ class GaptoolServer < Sinatra::Application
|
|
166
174
|
end
|
167
175
|
|
168
176
|
post '/rehash' do
|
169
|
-
json Gaptool::
|
177
|
+
json Gaptool::EC2::rehash()
|
170
178
|
end
|
171
179
|
|
172
180
|
end
|
data/lib/views/init.erb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -e
|
3
|
+
cd /root
|
1
4
|
apt-get update
|
2
5
|
apt-get install -ymq zsh git libssl-dev ruby1.9.1-full build-essential
|
3
|
-
|
6
|
+
curl -LO https://www.getchef.com/chef/install.sh
|
7
|
+
bash install.sh -v <%= chef_version %>
|
8
|
+
|
4
9
|
cat << 'EOFKEY' > /root/.ssh/id_rsa
|
5
10
|
<%= initkey %>
|
6
11
|
EOFKEY
|
7
12
|
chmod 600 /root/.ssh/id_rsa
|
8
13
|
echo 'StrictHostKeyChecking no' > /root/.ssh/config
|
14
|
+
|
9
15
|
git clone -b <%= chef_branch %> <%= chef_repo %> /root/ops
|
10
16
|
echo '<%= json %>' > /root/init.json
|
11
|
-
chef-solo -c /root/ops/cookbooks/init.rb -j /root/init.json && \
|
17
|
+
chef-solo -c /root/ops/cookbooks/init.rb -j /root/init.json -E <%= chef_environment %> && \
|
12
18
|
(rm /root/.ssh/id_rsa; userdel -r ubuntu; rm -rf /root/.ssh; rm -rf /root/ops)
|
data/tasks/config.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
namespace :config do
|
2
|
+
desc "Add or update a new config key"
|
3
|
+
task :set, [:key,:value] do |t, args|
|
4
|
+
DH.set_config(args[:key], args[:value])
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Delete a key if set"
|
8
|
+
task :del, [:key] do |t, args|
|
9
|
+
DH.del_config(args[:key])
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Get a config"
|
13
|
+
task :get, [:key] do |t,args|
|
14
|
+
DH.get_config(args[:key])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "List config"
|
19
|
+
task :config do
|
20
|
+
puts 'Config:'
|
21
|
+
DH.get_all_configs().keys.each do |k|
|
22
|
+
puts " - #{k}"
|
23
|
+
end
|
24
|
+
end
|
data/tasks/docker.rb
CHANGED
@@ -43,6 +43,11 @@ unless File.exists?('/.dockerenv')
|
|
43
43
|
sys(%w(fig run --rm gaptool rake test))
|
44
44
|
end
|
45
45
|
|
46
|
+
desc "Rehash instances"
|
47
|
+
task :rehash => :build do
|
48
|
+
sys(%w(fig run --rm gaptool rake rehash))
|
49
|
+
end
|
50
|
+
|
46
51
|
desc "Stop docker containers"
|
47
52
|
task :stop do
|
48
53
|
sys(%w(fig stop))
|
data/tasks/gem.rb
CHANGED
@@ -1,27 +1,30 @@
|
|
1
|
-
|
1
|
+
unless File.exists?('/.dockerenv')
|
2
|
+
namespace :gem do
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
desc "Build the gem"
|
5
|
+
task :build => :clean do
|
6
|
+
sys(%w(gem build gaptool-server.gemspec))
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
desc "Clean built file"
|
10
|
+
task :clean do
|
11
|
+
sys(%w(rm -vf *.gem))
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
desc "Bump the version"
|
15
|
+
task :bump do
|
16
|
+
version = File.read('VERSION').strip
|
17
|
+
nver = version.next
|
18
|
+
f = File.open('VERSION', 'w')
|
19
|
+
f.write(nver)
|
20
|
+
f.close
|
21
|
+
puts "Bumped #{version} => #{nver}"
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
desc "Push"
|
25
|
+
task :push => :build do
|
26
|
+
version = File.read('VERSION').strip
|
27
|
+
sys(%W(gem push gaptool-server-#{version}.gem))
|
28
|
+
end
|
26
29
|
end
|
27
30
|
end
|
data/test/api_test.rb
CHANGED
@@ -44,7 +44,8 @@ describe "Test API" do
|
|
44
44
|
'chef_runlist' => ['recipe[myrecipe]'],
|
45
45
|
'terminable' => true,
|
46
46
|
'zone' => 'my-zone-1a',
|
47
|
-
'itype' => 'm1.type'
|
47
|
+
'itype' => 'm1.type',
|
48
|
+
"hostname" => 'fake.hostname.gild.com'
|
48
49
|
}
|
49
50
|
end
|
50
51
|
|
@@ -55,13 +56,18 @@ describe "Test API" do
|
|
55
56
|
it "should return 200" do
|
56
57
|
get '/'
|
57
58
|
expect(last_response.status).to eq(200)
|
59
|
+
expect(last_response.content_type).to include('text/html')
|
60
|
+
|
61
|
+
header 'Accept', 'application/json'
|
62
|
+
get '/'
|
63
|
+
expect(last_response.status).to eq(200)
|
64
|
+
expect(last_response.content_type).to include('application/json')
|
58
65
|
end
|
59
66
|
|
60
67
|
it "should create a instance" do
|
61
68
|
post '/init', host_data.to_json
|
62
69
|
expect(last_response.status).to eq(200)
|
63
|
-
expect(last_response.
|
64
|
-
expect(JSON.parse(last_response.body).keys).to eq(["instance", "ami", "role", "environment", "secret", "terminable", "security_group"])
|
70
|
+
expect(JSON.parse(last_response.body).keys).to eq(["instance", "ami", "role", "hostname", "launch_time", "environment", "secret", "terminable", "security_group"])
|
65
71
|
end
|
66
72
|
|
67
73
|
it "should get the runlist from the role" do
|
@@ -162,6 +168,20 @@ describe "Test API" do
|
|
162
168
|
|
163
169
|
it "should register the server" do
|
164
170
|
add_and_register_server
|
171
|
+
expect(last_response.body).to include("-E #{host_data['environment']}")
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should not find any hosts" do
|
175
|
+
post '/init', host_data.to_json
|
176
|
+
expect(last_response.status).to eq(200)
|
177
|
+
|
178
|
+
get '/hosts'
|
179
|
+
expect(last_response.status).to eq(200)
|
180
|
+
expect(JSON.parse(last_response.body)).to eq([])
|
181
|
+
|
182
|
+
get "/hosts/#{host_data['role']}"
|
183
|
+
expect(last_response.status).to eq(200)
|
184
|
+
expect(JSON.parse(last_response.body)).to eq([])
|
165
185
|
end
|
166
186
|
|
167
187
|
it "should find an host" do
|
@@ -190,7 +210,7 @@ describe "Test API" do
|
|
190
210
|
it "should find an host by role" do
|
191
211
|
other = host_data.merge({'role' => 'otherrole'})
|
192
212
|
id1 = add_and_register_server(other)['instance']
|
193
|
-
|
213
|
+
add_and_register_server()['instance']
|
194
214
|
|
195
215
|
get '/hosts/otherrole'
|
196
216
|
expect(last_response.status).to eq(200)
|
@@ -214,7 +234,7 @@ describe "Test API" do
|
|
214
234
|
it "should find all hosts by environment and role" do
|
215
235
|
id1 = add_and_register_server()['instance']
|
216
236
|
id2 = add_and_register_server()['instance']
|
217
|
-
|
237
|
+
add_and_register_server(host_data.merge({'environment' => 'otherenv'}))['instance']
|
218
238
|
id4 = add_and_register_server(host_data.merge({'role' => 'otherrole'}))['instance']
|
219
239
|
get '/hosts/testrole/testenv'
|
220
240
|
expect(last_response.status).to eq(200)
|
@@ -247,8 +267,8 @@ describe "Test API" do
|
|
247
267
|
it "should return the list of apps" do
|
248
268
|
DH.add_app("firstapp", "testrole")
|
249
269
|
DH.add_app("secondapp", "testrole")
|
250
|
-
apps_list = {"firstapp" => {"role" => "testrole"},
|
251
|
-
"secondapp" =>{"role" => "testrole"}}
|
270
|
+
apps_list = {"app:firstapp" => {"role" => "testrole"},
|
271
|
+
"app:secondapp" =>{"role" => "testrole"}}
|
252
272
|
get "/apps"
|
253
273
|
expect(last_response.status).to eq(200)
|
254
274
|
expect(JSON.parse(last_response.body)).to eq(apps_list)
|
data/test/data_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -11,6 +11,7 @@ libpath = File.realpath(File.join(File.dirname(__FILE__), "..", "lib"))
|
|
11
11
|
require 'rspec'
|
12
12
|
require 'rack/test'
|
13
13
|
require 'fakeredis/rspec'
|
14
|
+
require 'redis-namespace'
|
14
15
|
require "#{libpath}/app.rb"
|
15
16
|
|
16
17
|
RSpec.configure do |conf|
|
@@ -22,4 +23,5 @@ end
|
|
22
23
|
|
23
24
|
DH = Gaptool::Data
|
24
25
|
|
25
|
-
|
26
|
+
conn = Redis.new
|
27
|
+
$redis = Redis::Namespace.new(:gt, redis:conn)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gaptool-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.0
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Bailey
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: sinatra
|
@@ -152,6 +152,20 @@ dependencies:
|
|
152
152
|
- - "~>"
|
153
153
|
- !ruby/object:Gem::Version
|
154
154
|
version: '0.10'
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: redis-namespace
|
157
|
+
requirement: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - "~>"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '1.5'
|
162
|
+
type: :runtime
|
163
|
+
prerelease: false
|
164
|
+
version_requirements: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - "~>"
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '1.5'
|
155
169
|
- !ruby/object:Gem::Dependency
|
156
170
|
name: rspec
|
157
171
|
requirement: !ruby/object:Gem::Requirement
|
@@ -239,6 +253,7 @@ files:
|
|
239
253
|
- lib/routes.rb
|
240
254
|
- lib/views/init.erb
|
241
255
|
- tasks/app.rb
|
256
|
+
- tasks/config.rb
|
242
257
|
- tasks/docker.rb
|
243
258
|
- tasks/gem.rb
|
244
259
|
- tasks/user.rb
|
@@ -266,7 +281,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
266
281
|
version: '0'
|
267
282
|
requirements: []
|
268
283
|
rubyforge_project:
|
269
|
-
rubygems_version: 2.
|
284
|
+
rubygems_version: 2.4.3
|
270
285
|
signing_key:
|
271
286
|
specification_version: 4
|
272
287
|
summary: gaptool-server for managing cloud resources
|