dployr 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/dployr/commands/base.rb +10 -0
- data/lib/dployr/commands/config.rb +0 -1
- data/lib/dployr/commands/execute.rb +5 -12
- data/lib/dployr/commands/info.rb +4 -12
- data/lib/dployr/commands/provision_test.rb +6 -13
- data/lib/dployr/commands/ssh.rb +6 -13
- data/lib/dployr/commands/start.rb +6 -16
- data/lib/dployr/commands/stop_destroy.rb +9 -16
- data/lib/dployr/compute/aws.rb +40 -38
- data/lib/dployr/compute/baremetal.rb +48 -0
- data/lib/dployr/compute/common.rb +9 -4
- data/lib/dployr/compute/gce.rb +118 -118
- data/lib/dployr/config/instance.rb +2 -13
- data/lib/dployr/configuration.rb +2 -2
- data/lib/dployr/scripts/default_hooks.rb +7 -7
- data/lib/dployr/scripts/hook.rb +9 -7
- data/lib/dployr/version.rb +1 -1
- data/spec/configuration_spec.rb +3 -37
- data/spec/fixtures/german/Dployrfile.yml +9 -3
- data/spec/fixtures/german/real_test.rb +2 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c470db55ac45d9fd7194b76fda8213aec26cbbd6
|
4
|
+
data.tar.gz: ba15cc25e47219751fc78170796b7c3c0014a6ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 812edd49fc33adeb9416e23040b7bf11c1057583e8019f708f8848eceed131405579c4cc5e8a80e242274f06209ae77bb3ecade5254d1687248b6ecefb734944
|
7
|
+
data.tar.gz: b34bb3786b51d1442a0034db7836c3092d77c08359ed91f90e9acc686b20e797ea9dbbacc597b97cef9d83a1ea35653c81f777bfaf05a893e3e9db6e32308c5b
|
data/README.md
CHANGED
data/lib/dployr/commands/base.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'logger'
|
2
2
|
require 'dployr/init'
|
3
3
|
require 'dployr/commands/utils'
|
4
|
+
require 'dployr/compute/aws'
|
5
|
+
require 'dployr/compute/gce'
|
6
|
+
require 'dployr/compute/baremetal'
|
4
7
|
|
5
8
|
module Dployr
|
6
9
|
module Commands
|
@@ -15,6 +18,13 @@ module Dployr
|
|
15
18
|
@name = options[:name]
|
16
19
|
@log = Logger.new STDOUT
|
17
20
|
@attrs = parse_attributes @options[:attributes]
|
21
|
+
if !options[:public_ip]
|
22
|
+
options[:public_ip] = false
|
23
|
+
end
|
24
|
+
@provider = options[:provider].upcase
|
25
|
+
create
|
26
|
+
@config = get_region_config options
|
27
|
+
@p_attrs = @config[:attributes]
|
18
28
|
end
|
19
29
|
|
20
30
|
def create
|
@@ -8,26 +8,19 @@ module Dployr
|
|
8
8
|
def initialize(options, stages)
|
9
9
|
super options
|
10
10
|
begin
|
11
|
-
create
|
12
|
-
config = get_region_config options
|
13
|
-
|
14
|
-
@name = config[:attributes]["name"]
|
15
|
-
@provider = options[:provider].upcase
|
16
|
-
@region = options[:region]
|
17
|
-
|
18
11
|
puts "Connecting to #{@provider}...".yellow
|
19
|
-
@client = Dployr::Compute.const_get(@provider.to_sym).new @
|
12
|
+
@client = Dployr::Compute.const_get(@provider.to_sym).new(@options, @p_attrs)
|
20
13
|
|
21
14
|
puts "Looking for #{@name} in #{@region}...".yellow
|
22
|
-
@ip = @client.get_ip
|
15
|
+
@ip = @client.get_ip
|
23
16
|
if @ip
|
24
|
-
puts "#{@name} found with IP #{@ip}".yellow
|
17
|
+
puts "#{@p_attrs["name"]} found with IP #{@ip}".yellow
|
25
18
|
else
|
26
|
-
raise "#{@name} not found"
|
19
|
+
raise "#{@p_attrs["name"]} not found"
|
27
20
|
end
|
28
21
|
|
29
22
|
stages.each do |stage|
|
30
|
-
Dployr::Scripts::Hook.new @ip, config, stage
|
23
|
+
Dployr::Scripts::Hook.new @ip, @config, stage
|
31
24
|
end
|
32
25
|
rescue Exception => e
|
33
26
|
self.log.error e
|
data/lib/dployr/commands/info.rb
CHANGED
@@ -8,20 +8,12 @@ module Dployr
|
|
8
8
|
def initialize(options)
|
9
9
|
super options
|
10
10
|
begin
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@name = config[:attributes]["name"]
|
15
|
-
@provider = options[:provider].upcase
|
16
|
-
@region = options[:region]
|
17
|
-
|
18
|
-
@client = Dployr::Compute.const_get(@provider.to_sym).new @region
|
19
|
-
|
20
|
-
@info = @client.get_info @name
|
11
|
+
@client = Dployr::Compute.const_get(@provider.to_sym).new(@options, @p_attrs)
|
12
|
+
@info = @client.get_info
|
21
13
|
if @info
|
22
|
-
puts @info.to_yaml
|
14
|
+
puts @info.attributes.to_yaml
|
23
15
|
else
|
24
|
-
raise "#{@name} not found"
|
16
|
+
raise "#{@p_attrs["name"]} not found"
|
25
17
|
end
|
26
18
|
|
27
19
|
rescue Exception => e
|
@@ -8,25 +8,18 @@ module Dployr
|
|
8
8
|
def initialize(options, action)
|
9
9
|
super options
|
10
10
|
begin
|
11
|
-
create
|
12
|
-
config = get_region_config options
|
13
|
-
|
14
|
-
@name = config[:attributes]["name"]
|
15
|
-
@provider = options[:provider].upcase
|
16
|
-
@region = options[:region]
|
17
|
-
|
18
11
|
puts "Connecting to #{@provider}...".yellow
|
19
|
-
@client = Dployr::Compute.const_get(@provider.to_sym).new @
|
12
|
+
@client = Dployr::Compute.const_get(@provider.to_sym).new(@options, @p_attrs)
|
20
13
|
|
21
|
-
puts "Looking for #{@name} in #{@region}...".yellow
|
22
|
-
@ip = @client.get_ip
|
14
|
+
puts "Looking for #{@p_attrs["name"]} in #{@options[:region]}...".yellow
|
15
|
+
@ip = @client.get_ip
|
23
16
|
if @ip
|
24
|
-
puts "#{@name} found with IP #{@ip}".yellow
|
17
|
+
puts "#{@p_attrs["name"]} found with IP #{@ip}".yellow
|
25
18
|
else
|
26
|
-
raise "#{@name} not found"
|
19
|
+
raise "#{@p_attrs["name"]} not found"
|
27
20
|
end
|
28
21
|
|
29
|
-
Dployr::Scripts::Default_Hooks.new @ip, config, action, self
|
22
|
+
Dployr::Scripts::Default_Hooks.new @ip, @config, action, self
|
30
23
|
rescue Exception => e
|
31
24
|
@log.error e
|
32
25
|
exit 1
|
data/lib/dployr/commands/ssh.rb
CHANGED
@@ -9,25 +9,18 @@ module Dployr
|
|
9
9
|
def initialize(options)
|
10
10
|
super options
|
11
11
|
begin
|
12
|
-
create
|
13
|
-
config = get_region_config options
|
14
|
-
|
15
|
-
@name = config[:attributes]["name"]
|
16
|
-
@provider = options[:provider].upcase
|
17
|
-
@region = options[:region]
|
18
|
-
|
19
12
|
puts "Connecting to #{@provider}...".yellow
|
20
|
-
@client = Dployr::Compute.const_get(@provider.to_sym).new @
|
13
|
+
@client = Dployr::Compute.const_get(@provider.to_sym).new(@options, @p_attrs)
|
21
14
|
|
22
|
-
puts "Looking for #{@name} in #{@region}...".yellow
|
23
|
-
@ip = @client.get_ip
|
15
|
+
puts "Looking for #{@p_attrs["name"]} in #{@options[:region]}...".yellow
|
16
|
+
@ip = @client.get_ip
|
24
17
|
if @ip
|
25
|
-
puts "#{@name} found with IP #{@ip}".yellow
|
18
|
+
puts "#{@p_attrs["name"]} found with IP #{@ip}".yellow
|
26
19
|
else
|
27
|
-
raise "#{@name} not found"
|
20
|
+
raise "#{@p_attrs["name"]} not found"
|
28
21
|
end
|
29
22
|
|
30
|
-
Dployr::Scripts::Ssh.new @ip, config
|
23
|
+
Dployr::Scripts::Ssh.new @ip, @config
|
31
24
|
|
32
25
|
rescue Exception => e
|
33
26
|
self.log.error e
|
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'dployr/commands/base'
|
2
|
-
require 'dployr/compute/aws'
|
3
|
-
require 'dployr/compute/gce'
|
4
2
|
|
5
3
|
module Dployr
|
6
4
|
module Commands
|
@@ -9,21 +7,13 @@ module Dployr
|
|
9
7
|
def initialize(options)
|
10
8
|
super options
|
11
9
|
begin
|
12
|
-
create
|
13
|
-
config = get_region_config options
|
14
|
-
|
15
|
-
@name = config[:attributes]["name"]
|
16
|
-
@provider = options[:provider].upcase
|
17
|
-
@region = options[:region]
|
18
|
-
@attributes = config[:attributes]
|
19
|
-
|
20
10
|
puts "Connecting to #{@provider}...".yellow
|
21
|
-
@client = Dployr::Compute.const_get(@provider.to_sym).new @
|
11
|
+
@client = Dployr::Compute.const_get(@provider.to_sym).new(@options, @p_attrs)
|
22
12
|
|
23
|
-
puts "Looking for #{@name} in #{@region}...".yellow
|
24
|
-
@ip = @client.get_ip
|
13
|
+
puts "Looking for #{@p_attrs["name"]} in #{@options[:region]}...".yellow
|
14
|
+
@ip = @client.get_ip
|
25
15
|
|
26
|
-
Dployr::Scripts::Default_Hooks.new @ip, config, "start", self
|
16
|
+
Dployr::Scripts::Default_Hooks.new @ip, @config, "start", self
|
27
17
|
rescue Exception => e
|
28
18
|
@log.error e
|
29
19
|
exit 1
|
@@ -34,8 +24,8 @@ module Dployr
|
|
34
24
|
if @ip
|
35
25
|
puts "#{@name} found with IP #{@ip}".yellow
|
36
26
|
else
|
37
|
-
@ip = @client.start
|
38
|
-
puts "Startded instance for #{@name} in #{@region} with IP #{@ip} succesfully".yellow
|
27
|
+
@ip = @client.start
|
28
|
+
puts "Startded instance for #{@p_attrs["name"]} in #{@options[:region]} with IP #{@ip} succesfully".yellow
|
39
29
|
end
|
40
30
|
@ip
|
41
31
|
end
|
@@ -8,27 +8,20 @@ module Dployr
|
|
8
8
|
def initialize(options, action)
|
9
9
|
super options
|
10
10
|
begin
|
11
|
-
create
|
12
|
-
config = get_region_config options
|
13
|
-
|
14
|
-
@name = config[:attributes]["name"]
|
15
|
-
@provider = options[:provider].upcase
|
16
|
-
@region = options[:region]
|
17
|
-
@attributes = config[:attributes]
|
18
11
|
@action = action
|
19
12
|
|
20
13
|
puts "Connecting to #{@provider}...".yellow
|
21
|
-
@client = Dployr::Compute.const_get(@provider.to_sym).new @
|
14
|
+
@client = Dployr::Compute.const_get(@provider.to_sym).new(@options, @p_attrs)
|
22
15
|
|
23
|
-
puts "Looking for #{@name} in #{@region}...".yellow
|
24
|
-
@ip = @client.get_ip
|
16
|
+
puts "Looking for #{@p_attrs["name"]} in #{@options[:region]}...".yellow
|
17
|
+
@ip = @client.get_ip
|
25
18
|
if @ip
|
26
|
-
puts "#{@name} found with IP #{@ip}".yellow
|
19
|
+
puts "#{@p_attrs["name"]} found with IP #{@ip}".yellow
|
27
20
|
else
|
28
|
-
puts "#{@name} not found".yellow
|
21
|
+
puts "#{@p_attrs["name"]} not found".yellow
|
29
22
|
end
|
30
23
|
|
31
|
-
Dployr::Scripts::Default_Hooks.new @ip, config, action, self
|
24
|
+
Dployr::Scripts::Default_Hooks.new @ip, @config, action, self
|
32
25
|
rescue Exception => e
|
33
26
|
@log.error e
|
34
27
|
exit 1
|
@@ -36,9 +29,9 @@ module Dployr
|
|
36
29
|
end
|
37
30
|
|
38
31
|
def action
|
39
|
-
puts "#{@action.capitalize}ing #{@name} in #{@region}...".yellow
|
40
|
-
@client.send(@action.to_sym
|
41
|
-
puts "#{@name} #{@action}ed sucesfully".yellow
|
32
|
+
puts "#{@action.capitalize}ing #{@p_attrs["name"]} in #{@options[:region]}...".yellow
|
33
|
+
@client.send(@action.to_sym)
|
34
|
+
puts "#{@p_attrs["name"]} #{@action}ed sucesfully".yellow
|
42
35
|
@ip
|
43
36
|
end
|
44
37
|
|
data/lib/dployr/compute/aws.rb
CHANGED
@@ -7,20 +7,22 @@ module Dployr
|
|
7
7
|
|
8
8
|
include Dployr::Compute::Common
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
12
|
-
region: region[0..-2],
|
10
|
+
def initialize(options, attrs)
|
11
|
+
@aws_options = {
|
12
|
+
region: options[:region][0..-2],
|
13
13
|
provider: 'AWS',
|
14
14
|
aws_access_key_id: ENV["AWS_ACCESS_KEY"],
|
15
|
-
aws_secret_access_key: ENV["AWS_SECRET_KEY"]
|
15
|
+
aws_secret_access_key: ENV["AWS_SECRET_KEY"],
|
16
16
|
}
|
17
|
-
@compute = Fog::Compute.new @
|
17
|
+
@compute = Fog::Compute.new @aws_options
|
18
|
+
@attrs = attrs
|
19
|
+
@options = options
|
18
20
|
end
|
19
21
|
|
20
|
-
def get_ip(
|
21
|
-
instance = get_instance(
|
22
|
+
def get_ip()
|
23
|
+
instance = get_instance(["running"]) # TODO: add starting states
|
22
24
|
if instance
|
23
|
-
if
|
25
|
+
if @options[:public_ip]
|
24
26
|
return instance.public_ip_address
|
25
27
|
else
|
26
28
|
return instance.private_ip_address
|
@@ -28,43 +30,43 @@ module Dployr
|
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
def get_info(
|
32
|
-
get_instance(
|
33
|
+
def get_info()
|
34
|
+
get_instance(["running", "stopped", "stopping"])
|
33
35
|
end
|
34
36
|
|
35
|
-
def destroy(
|
36
|
-
instance = get_instance(
|
37
|
+
def destroy()
|
38
|
+
instance = get_instance(["running", "stopped", "stopping"])
|
37
39
|
if instance
|
38
40
|
instance.destroy
|
39
41
|
else
|
40
|
-
raise "Instance #{name} not found"
|
42
|
+
raise "Instance #{@attrs["name"]} not found"
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
|
-
def halt(
|
45
|
-
instance = get_instance(
|
46
|
+
def halt()
|
47
|
+
instance = get_instance(["running"])
|
46
48
|
if instance
|
47
49
|
instance.stop
|
48
50
|
else
|
49
|
-
raise "Instance #{name} not found"
|
51
|
+
raise "Instance #{@attrs["name"]} not found"
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
53
|
-
def start(
|
54
|
-
server = get_instance(
|
55
|
+
def start()
|
56
|
+
server = get_instance(["stopped", "stopping"])
|
55
57
|
if server
|
56
|
-
puts "Starting stopped instance for #{
|
58
|
+
puts "Starting stopped instance for #{@attrs["name"]} in #{@options[:region]}...".yellow
|
57
59
|
server.start
|
58
60
|
else
|
59
|
-
puts "Creating new instance for #{
|
61
|
+
puts "Creating new instance for #{@attrs["name"]} in #{@options[:region]}...".yellow
|
60
62
|
options = {
|
61
|
-
availability_zone: region,
|
62
|
-
flavor_id:
|
63
|
-
image_id:
|
64
|
-
key_name:
|
65
|
-
subnet_id:
|
66
|
-
security_group_ids:
|
67
|
-
tags: { Name:
|
63
|
+
availability_zone: @options[:region],
|
64
|
+
flavor_id: @attrs["instance_type"],
|
65
|
+
image_id: @attrs["ami"],
|
66
|
+
key_name: @attrs["keypair"],
|
67
|
+
subnet_id: @attrs["subnet_id"],
|
68
|
+
security_group_ids: @attrs["security_groups"],
|
69
|
+
tags: { Name: @attrs["name"] }
|
68
70
|
}
|
69
71
|
puts options.to_yaml
|
70
72
|
server = @compute.servers.create(options)
|
@@ -72,35 +74,35 @@ module Dployr
|
|
72
74
|
print "Wait for instance to get online".yellow
|
73
75
|
server.wait_for { print ".".yellow; ready? }
|
74
76
|
print "\n"
|
75
|
-
elastic_ip(
|
76
|
-
wait_ssh(
|
77
|
+
elastic_ip(server)
|
78
|
+
wait_ssh(@attrs, server, @options[:public_ip])
|
77
79
|
end
|
78
80
|
|
79
81
|
private
|
80
82
|
|
81
|
-
def get_instance(
|
83
|
+
def get_instance(states)
|
82
84
|
servers = @compute.servers.all
|
83
85
|
servers.each do |instance|
|
84
|
-
if instance.tags["Name"] == name and states.include? instance.state
|
86
|
+
if instance.tags["Name"] == @attrs["name"] and states.include? instance.state
|
85
87
|
return instance
|
86
88
|
end
|
87
89
|
end
|
88
90
|
nil
|
89
91
|
end
|
90
92
|
|
91
|
-
def elastic_ip(
|
92
|
-
if
|
93
|
-
if
|
93
|
+
def elastic_ip(server)
|
94
|
+
if @attrs["public_ip"]
|
95
|
+
if @attrs["public_ip"] == "new"
|
94
96
|
puts "Creating new elastic ip...".yellow
|
95
97
|
response = @compute.allocate_address(server.vpc_id)
|
96
98
|
allocation_id = response[:body]["allocationId"]
|
97
|
-
|
99
|
+
@attrs["public_ip"] = response[:body]["publicIp"]
|
98
100
|
else
|
99
|
-
puts "Looking for elastic ip #{
|
100
|
-
eip = @compute.addresses.get(
|
101
|
+
puts "Looking for elastic ip #{@attrs["public_ip"]}...".yellow
|
102
|
+
eip = @compute.addresses.get(@attrs["public_ip"])
|
101
103
|
allocation_id = eip.allocation_id
|
102
104
|
end
|
103
|
-
puts "Associating elastic ip #{
|
105
|
+
puts "Associating elastic ip #{@attrs["public_ip"]}...".yellow
|
104
106
|
@compute.associate_address(server.id,nil,nil,allocation_id)
|
105
107
|
end
|
106
108
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'fog'
|
2
|
+
require 'dployr/compute/common'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module Dployr
|
6
|
+
module Compute
|
7
|
+
class BAREMETAL
|
8
|
+
|
9
|
+
include Dployr::Compute::Common
|
10
|
+
|
11
|
+
def initialize(options, attrs)
|
12
|
+
@options = options
|
13
|
+
@attrs = attrs
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_ip()
|
17
|
+
if @options["public_ip"]
|
18
|
+
return @attrs["public_ip"]
|
19
|
+
else
|
20
|
+
return @attrs["private_ip"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_info()
|
25
|
+
result = OpenStruct.new
|
26
|
+
result.attributes = {
|
27
|
+
public_ip: @attrs["public_ip"],
|
28
|
+
private_ip: @attrs["private_ip"],
|
29
|
+
}
|
30
|
+
return result
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy()
|
34
|
+
puts "Could not destroy baremetal machine".yellow
|
35
|
+
end
|
36
|
+
|
37
|
+
def halt()
|
38
|
+
puts "Could not halt baremetal machine".yellow
|
39
|
+
end
|
40
|
+
|
41
|
+
def start()
|
42
|
+
puts "Could not start baremetal machine".yellow
|
43
|
+
wait_ssh(attributes, server, @options["public_ip"])
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -6,13 +6,18 @@ module Dployr
|
|
6
6
|
|
7
7
|
module_function
|
8
8
|
|
9
|
-
def wait_ssh(
|
10
|
-
|
9
|
+
def wait_ssh(attrs, server, use_public_ip)
|
10
|
+
if use_public_ip
|
11
|
+
@ip = server.public_ip_address
|
12
|
+
else
|
13
|
+
@ip = server.private_ip_address
|
14
|
+
end
|
15
|
+
print "Wait for ssh (#{@ip}) to get ready...".yellow
|
11
16
|
while true
|
12
17
|
begin
|
13
|
-
Net::SSH.start(
|
18
|
+
Net::SSH.start(@ip, attrs["username"], :keys => attrs["private_key_path"]) do |ssh|
|
14
19
|
print "\n"
|
15
|
-
return
|
20
|
+
return @ip
|
16
21
|
end
|
17
22
|
rescue Exception => e
|
18
23
|
print ".".yellow
|
data/lib/dployr/compute/gce.rb
CHANGED
@@ -5,141 +5,111 @@ module Dployr
|
|
5
5
|
module Compute
|
6
6
|
class GCE
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# private
|
22
|
-
def get_instance(name, states)
|
23
|
-
servers = @compute.servers.all
|
24
|
-
servers.each do |instance|
|
25
|
-
if instance.name == name and states.include? instance.state
|
26
|
-
return instance
|
27
|
-
end
|
28
|
-
end
|
29
|
-
return nil
|
30
|
-
end
|
8
|
+
include Dployr::Compute::Common
|
9
|
+
|
10
|
+
def initialize(options, attrs)
|
11
|
+
@gce_options = {
|
12
|
+
provider: 'Google',
|
13
|
+
google_project: ENV["GOOGLE_PROJECT_ID"],
|
14
|
+
google_client_email: ENV["GOOGLE_CLIENT_EMAIL"],
|
15
|
+
google_key_location: ENV["GOOGLE_KEY_LOCATION"],
|
16
|
+
}
|
17
|
+
@compute = Fog::Compute.new @gce_options
|
18
|
+
@attrs = attrs
|
19
|
+
@options = options
|
20
|
+
end
|
31
21
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
22
|
+
def get_ip()
|
23
|
+
instance = get_instance(["PROVISIONING", "STAGING", "RUNNING"])
|
24
|
+
if instance
|
25
|
+
if @options[:public_ip]
|
26
|
+
return instance.public_ip_address
|
27
|
+
else
|
28
|
+
return instance.private_ip_address
|
40
29
|
end
|
41
30
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_info()
|
34
|
+
get_instance(["RUNNING", "STOPPED"])
|
35
|
+
end
|
46
36
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
raise "Instance #{name} not found"
|
37
|
+
def destroy()
|
38
|
+
instance = get_instance(["RUNNING", "STOPPED"])
|
39
|
+
if instance
|
40
|
+
puts "Destroying instance #{@attrs["name"]}...".yellow
|
41
|
+
instance.destroy(async = false)
|
42
|
+
puts "Destroying disk #{@attrs["name"]}...".yellow
|
43
|
+
disk = @compute.disks.get(@attrs["name"])
|
44
|
+
disk.destroy
|
45
|
+
# Bug in fog. It return "persistent-disk-0" instead of boot disk name (usually the same name of the machine)
|
46
|
+
# instance.disks.each do |disk|
|
47
|
+
# gdisk = @compute.disks.get(disk["deviceName"])
|
48
|
+
# gdisk.destroy
|
49
|
+
# end
|
50
|
+
return
|
63
51
|
end
|
52
|
+
raise "Instance #{@attrs["name"]} not found"
|
53
|
+
end
|
64
54
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
55
|
+
def halt()
|
56
|
+
instance = get_instance(["RUNNING"])
|
57
|
+
if instance
|
58
|
+
instance.disks.each do |disk|
|
59
|
+
if disk["autoDelete"] == true
|
60
|
+
raise "Cannot halt instance with autoDelete disks"
|
72
61
|
end
|
73
|
-
return instance.destroy
|
74
|
-
end
|
75
|
-
raise "Instance #{name} not found"
|
76
|
-
end
|
77
|
-
|
78
|
-
def create_disk(name, size_gb, zone_name, image_name)
|
79
|
-
disk = @compute.disks.get(name)
|
80
|
-
if disk != nil
|
81
|
-
puts "Disk #{name} already created. Reusing it.".yellow
|
82
|
-
return disk
|
83
|
-
else
|
84
|
-
puts "Creating new boot disk #{name}...".yellow
|
85
|
-
disk = @compute.disks.create(
|
86
|
-
name: name,
|
87
|
-
size_gb: size_gb,
|
88
|
-
zone_name: zone_name,
|
89
|
-
source_image: image_name
|
90
|
-
)
|
91
|
-
|
92
|
-
disk.wait_for { disk.ready? }
|
93
|
-
return disk
|
94
62
|
end
|
63
|
+
return instance.destroy
|
95
64
|
end
|
65
|
+
raise "Instance #{@attrs["name"]} not found"
|
66
|
+
end
|
96
67
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
68
|
+
def start()
|
69
|
+
external_ip()
|
70
|
+
server = get_instance(["STOPPED"])
|
71
|
+
if server
|
72
|
+
puts "Starting stopped instance for #{@attrs["name"]} in #{@options[:region]}...".yellow
|
73
|
+
server.start
|
74
|
+
else
|
75
|
+
puts "Creating boot disk...".yellow
|
76
|
+
disks = create_disk()
|
77
|
+
if defined? @attrs["autodelete_disk"]
|
78
|
+
autodelete_disk = @attrs["autodelete_disk"]
|
103
79
|
else
|
104
|
-
|
105
|
-
disks = create_disk(attributes["name"], 10, region, attributes["image_name"])
|
106
|
-
if defined? attributes["autodelete_disk"]
|
107
|
-
autodelete_disk = attributes["autodelete_disk"]
|
108
|
-
else
|
109
|
-
autodelete_disk = false
|
110
|
-
end
|
111
|
-
|
112
|
-
puts "Creating new instance for #{attributes["name"]} in #{region}...".yellow
|
113
|
-
|
114
|
-
options = {
|
115
|
-
name: attributes["name"],
|
116
|
-
zone_name: region,
|
117
|
-
machine_type: attributes["instance_type"],
|
118
|
-
network: attributes["network"],
|
119
|
-
disks: [disks.get_as_boot_disk(true, autodelete_disk)],
|
120
|
-
external_ip: attributes["public_ip"]
|
121
|
-
}
|
122
|
-
|
123
|
-
puts options.to_yaml
|
124
|
-
server = @compute.servers.create(options)
|
80
|
+
autodelete_disk = false
|
125
81
|
end
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
82
|
+
|
83
|
+
puts "Creating new instance for #{@attrs["name"]} in #{@options[:region]}...".yellow
|
84
|
+
|
85
|
+
start_options = {
|
86
|
+
name: @attrs["name"],
|
87
|
+
zone_name: @options[:region],
|
88
|
+
machine_type: @attrs["instance_type"],
|
89
|
+
network: @attrs["network"],
|
90
|
+
disks: [disks.get_as_boot_disk(true, autodelete_disk)],
|
91
|
+
external_ip: @attrs["public_ip"]
|
92
|
+
}
|
93
|
+
puts start_options.to_yaml
|
94
|
+
server = @compute.servers.create(start_options)
|
95
|
+
end
|
96
|
+
print "Wait for instance to get online".yellow
|
97
|
+
server.wait_for { print ".".yellow; ready? }
|
98
|
+
print "\n"
|
99
|
+
wait_ssh(@attrs, server, @options[:public_ip])
|
100
|
+
end
|
101
|
+
|
132
102
|
private
|
133
103
|
|
134
|
-
def external_ip(
|
135
|
-
if
|
104
|
+
def external_ip()
|
105
|
+
if @attrs["public_ip"] == "new"
|
136
106
|
puts "Looking for previous public_ip...".yellow
|
137
|
-
ip = @compute.insert_address(
|
107
|
+
ip = @compute.insert_address(@attrs["name"], @options[:region][0..-3])
|
138
108
|
while true
|
139
|
-
ip = @compute.get_address(
|
109
|
+
ip = @compute.get_address(@attrs["name"], @options[:region][0..-3])
|
140
110
|
if ip[:body]["address"]
|
141
|
-
|
142
|
-
puts "Using public_ip #{
|
111
|
+
@attrs["public_ip"].replace ip[:body]["address"]
|
112
|
+
puts "Using public_ip #{@attrs["public_ip"]}".yellow
|
143
113
|
break
|
144
114
|
end
|
145
115
|
puts "Waiting for ip to be ready...".yellow
|
@@ -147,6 +117,36 @@ module Dployr
|
|
147
117
|
end
|
148
118
|
end
|
149
119
|
end
|
120
|
+
|
121
|
+
def create_disk()
|
122
|
+
disk = @compute.disks.get(@attrs["name"])
|
123
|
+
if disk != nil
|
124
|
+
puts "Disk #{@attrs["name"]} already created. Reusing it.".yellow
|
125
|
+
return disk
|
126
|
+
else
|
127
|
+
puts "Creating new boot disk #{@attrs["name"]}...".yellow
|
128
|
+
disk = @compute.disks.create(
|
129
|
+
name: @attrs["name"],
|
130
|
+
size_gb: 10,
|
131
|
+
zone_name: @options[:region],
|
132
|
+
source_image: @attrs["image_name"]
|
133
|
+
)
|
134
|
+
|
135
|
+
disk.wait_for { disk.ready? }
|
136
|
+
return disk
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# https://developers.google.com/compute/docs/instances
|
141
|
+
def get_instance(states)
|
142
|
+
servers = @compute.servers.all
|
143
|
+
servers.each do |instance|
|
144
|
+
if instance.name == @attrs["name"] and states.include? instance.state
|
145
|
+
return instance
|
146
|
+
end
|
147
|
+
end
|
148
|
+
return nil
|
149
|
+
end
|
150
150
|
|
151
151
|
end
|
152
152
|
end
|
@@ -6,14 +6,13 @@ module Dployr
|
|
6
6
|
|
7
7
|
include Dployr::Utils
|
8
8
|
|
9
|
-
attr_reader :attributes, :providers, :
|
9
|
+
attr_reader :attributes, :providers, :scripts, :parents
|
10
10
|
attr_accessor :name
|
11
11
|
|
12
12
|
def initialize
|
13
13
|
@name = 'unnamed'
|
14
14
|
@attributes = {}
|
15
|
-
@
|
16
|
-
@scripts = []
|
15
|
+
@scripts = {}
|
17
16
|
@providers = {}
|
18
17
|
@parents = []
|
19
18
|
yield self if block_given?
|
@@ -23,7 +22,6 @@ module Dployr
|
|
23
22
|
if config.is_a? Hash
|
24
23
|
set_attributes get_by_key config, :attributes if has config, :attributes
|
25
24
|
set_providers get_by_key config, :providers if has config, :providers
|
26
|
-
set_auth get_by_key config, :authentication if has config, :authentication
|
27
25
|
set_scripts get_by_key config, :scripts if has config, :scripts
|
28
26
|
set_parents get_by_key config, :extends if has config, :extends
|
29
27
|
end
|
@@ -32,7 +30,6 @@ module Dployr
|
|
32
30
|
def get_values
|
33
31
|
deep_copy({
|
34
32
|
attributes: @attributes,
|
35
|
-
authentication: @authentication,
|
36
33
|
scripts: @scripts,
|
37
34
|
providers: @providers,
|
38
35
|
parents: @parents
|
@@ -55,10 +52,6 @@ module Dployr
|
|
55
52
|
@scripts << script if script.is_a? Hash
|
56
53
|
end
|
57
54
|
|
58
|
-
def add_auth(key, value)
|
59
|
-
@authentication[key] = value if key
|
60
|
-
end
|
61
|
-
|
62
55
|
def add_provider(name, provider)
|
63
56
|
@providers[name] = provider if provider.is_a? Hash
|
64
57
|
end
|
@@ -73,10 +66,6 @@ module Dployr
|
|
73
66
|
|
74
67
|
private
|
75
68
|
|
76
|
-
def set_auth(auth)
|
77
|
-
@authentication = auth if auth.is_a? Hash
|
78
|
-
end
|
79
|
-
|
80
69
|
def set_providers(providers)
|
81
70
|
@providers = providers if providers.is_a? Hash
|
82
71
|
end
|
data/lib/dployr/configuration.rb
CHANGED
@@ -149,12 +149,12 @@ module Dployr
|
|
149
149
|
end
|
150
150
|
|
151
151
|
def inherit_config(child, parent)
|
152
|
-
keys = [ :attributes, :scripts
|
152
|
+
keys = [ :attributes, :scripts ]
|
153
153
|
keys.each do |type|
|
154
154
|
current = deep_copy get_by_key(parent, type)
|
155
155
|
source = get_by_key child, type
|
156
156
|
if current and source
|
157
|
-
raise
|
157
|
+
raise "Cannot merge different types: #{parent}" if current.class != source.class
|
158
158
|
end
|
159
159
|
if type.to_sym == :scripts and current.is_a? Array
|
160
160
|
current = [] unless current.is_a? Array
|
@@ -1,24 +1,24 @@
|
|
1
1
|
module Dployr
|
2
2
|
module Scripts
|
3
3
|
class Default_Hooks
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(ip, config, stage, command)
|
6
6
|
@config = config
|
7
7
|
@ip = ip
|
8
8
|
@stage = stage
|
9
9
|
|
10
|
-
if @config[:scripts]["pre-#{@stage}"]
|
10
|
+
if @config[:scripts].is_a?(Hash) and @config[:scripts]["pre-#{@stage}"]
|
11
11
|
Dployr::Scripts::Hook.new @ip, config, "pre-#{@stage}"
|
12
12
|
end
|
13
13
|
@ip = command.action()
|
14
|
-
if @config[:scripts][@stage]
|
14
|
+
if @config[:scripts].is_a?(Hash) and @config[:scripts][@stage]
|
15
15
|
Dployr::Scripts::Hook.new @ip, config, "#{@stage}"
|
16
16
|
end
|
17
|
-
if @config[:scripts]["post-#{@stage}"]
|
17
|
+
if @config[:scripts].is_a?(Hash) and @config[:scripts]["post-#{@stage}"]
|
18
18
|
Dployr::Scripts::Hook.new @ip, config, "post-#{@stage}"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
data/lib/dployr/scripts/hook.rb
CHANGED
@@ -18,13 +18,15 @@ module Dployr
|
|
18
18
|
private_key_path = attrs["private_key_path"]
|
19
19
|
|
20
20
|
puts "Running stage '#{@stage}':".yellow
|
21
|
-
@instance[:scripts]
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
if @instance[:scripts].is_a?(Hash)
|
22
|
+
@instance[:scripts][@stage].each do |script|
|
23
|
+
if script["target"]
|
24
|
+
Dployr::Scripts::Scp.new @ip, host, username, private_key_path, script
|
25
|
+
elsif script["remote_path"]
|
26
|
+
Dployr::Scripts::Shell.new @ip, host, username, private_key_path, script
|
27
|
+
elsif script["local_path"]
|
28
|
+
Dployr::Scripts::Local_Shell.new script
|
29
|
+
end
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
data/lib/dployr/version.rb
CHANGED
data/spec/configuration_spec.rb
CHANGED
@@ -202,20 +202,6 @@ describe Dployr::Configuration do
|
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
205
|
-
describe "autentication" do
|
206
|
-
it "should exists" do
|
207
|
-
zeus[:authentication].should be_a Hash
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should have a valid number of values" do
|
211
|
-
zeus[:authentication].should have(2).items
|
212
|
-
end
|
213
|
-
|
214
|
-
it "should have a valid authentication values" do
|
215
|
-
zeus[:authentication][:user].should eql 'admin'
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
205
|
describe "providers" do
|
220
206
|
it "should exists" do
|
221
207
|
zeus[:providers].should be_a Hash
|
@@ -265,9 +251,6 @@ describe Dployr::Configuration do
|
|
265
251
|
region[:scripts].should have(2).items
|
266
252
|
end
|
267
253
|
|
268
|
-
it "should have inherited autentication" do
|
269
|
-
region[:authentication].should have(2).items
|
270
|
-
end
|
271
254
|
end
|
272
255
|
end
|
273
256
|
|
@@ -275,7 +258,7 @@ describe Dployr::Configuration do
|
|
275
258
|
|
276
259
|
describe "aws" do
|
277
260
|
it "should have the expected values" do
|
278
|
-
zeus[:providers][:aws].should have(
|
261
|
+
zeus[:providers][:aws].should have(3).items
|
279
262
|
end
|
280
263
|
|
281
264
|
describe "attributes" do
|
@@ -434,23 +417,6 @@ describe Dployr::Configuration do
|
|
434
417
|
end
|
435
418
|
end
|
436
419
|
|
437
|
-
describe "authentication" do
|
438
|
-
it "should exists" do
|
439
|
-
region[:authentication].should be_a Hash
|
440
|
-
end
|
441
|
-
|
442
|
-
it "should have a valid number" do
|
443
|
-
region[:authentication].should have(2).items
|
444
|
-
end
|
445
|
-
|
446
|
-
it "should have a valid user" do
|
447
|
-
region[:authentication][:user].should eql "admin"
|
448
|
-
end
|
449
|
-
|
450
|
-
it "should have a valid key_path" do
|
451
|
-
region[:authentication][:key_path].should eql "path/to/key.pem"
|
452
|
-
end
|
453
|
-
end
|
454
420
|
end
|
455
421
|
end
|
456
422
|
end
|
@@ -470,7 +436,7 @@ describe Dployr::Configuration do
|
|
470
436
|
end
|
471
437
|
|
472
438
|
it "should have one provider" do
|
473
|
-
@config.should have(
|
439
|
+
@config.should have(3).items
|
474
440
|
end
|
475
441
|
|
476
442
|
it "should have two regions" do
|
@@ -512,7 +478,7 @@ describe Dployr::Configuration do
|
|
512
478
|
end
|
513
479
|
|
514
480
|
it "should have a valid number of keys" do
|
515
|
-
@config.should have(
|
481
|
+
@config.should have(2).items
|
516
482
|
end
|
517
483
|
|
518
484
|
it "should have a attributes" do
|
@@ -10,13 +10,19 @@ german-template:
|
|
10
10
|
target: /tmp
|
11
11
|
provision:
|
12
12
|
- remote_path: /tmp/hello/hello.sh
|
13
|
-
post-halt:
|
14
|
-
- local_path: sleep
|
15
|
-
args: "50"
|
16
13
|
providers:
|
14
|
+
baremetal:
|
15
|
+
regions:
|
16
|
+
wizzo:
|
17
|
+
attributes:
|
18
|
+
private_ip: 10.111.6.56
|
17
19
|
aws:
|
18
20
|
attributes:
|
19
21
|
instance_type: t1.micro
|
22
|
+
scripts:
|
23
|
+
post-halt:
|
24
|
+
- local_path: sleep
|
25
|
+
args: "50"
|
20
26
|
regions:
|
21
27
|
sa-east-1a:
|
22
28
|
attributes:
|
@@ -1,5 +1,6 @@
|
|
1
1
|
#OPTIONS=" -f Dployrfile.yml -n german-template -p aws -r sa-east-1a"
|
2
|
-
OPTIONS=" -f Dployrfile.yml -n german-template -p gce -r europe-west1-a"
|
2
|
+
#OPTIONS=" -f Dployrfile.yml -n german-template -p gce -r europe-west1-a"
|
3
|
+
OPTIONS=" -f Dployrfile.yml -n german-template -p baremetal -r wizzo"
|
3
4
|
|
4
5
|
|
5
6
|
BIN="../../../bin/dployr"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dployr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomas Aparicio
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-05-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
@@ -140,6 +140,7 @@ files:
|
|
140
140
|
- lib/dployr/commands/stop_destroy.rb
|
141
141
|
- lib/dployr/commands/utils.rb
|
142
142
|
- lib/dployr/compute/aws.rb
|
143
|
+
- lib/dployr/compute/baremetal.rb
|
143
144
|
- lib/dployr/compute/common.rb
|
144
145
|
- lib/dployr/compute/gce.rb
|
145
146
|
- lib/dployr/config/constants.rb
|