veronic 0.0.8 → 0.0.9
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/bin/veronic +3 -0
- data/lib/config/config.rb +2 -2
- data/lib/providers/chefserver/chefserver.rb +1 -1
- data/lib/providers/chefserver/instance.rb +57 -40
- data/lib/providers/ec2/ec2.rb +3 -1
- data/lib/providers/ec2/instance.rb +34 -15
- data/lib/providers/route53/record.rb +3 -2
- data/lib/veronic.rb +40 -12
- data/veronic.gemspec +1 -1
- data/veronic.yml +2 -1
- metadata +1 -1
data/bin/veronic
CHANGED
@@ -25,6 +25,7 @@ opt_parser = OptionParser.new do |opt|
|
|
25
25
|
opt.separator " stop: stop box"
|
26
26
|
opt.separator " start: start box"
|
27
27
|
opt.separator " list: list boxes"
|
28
|
+
opt.separator " status: status boxes"
|
28
29
|
opt.separator ""
|
29
30
|
opt.separator "Options"
|
30
31
|
|
@@ -116,6 +117,8 @@ when "start"
|
|
116
117
|
Veronic::Deployer.new(options).start
|
117
118
|
when "list"
|
118
119
|
Veronic::Deployer.new(options).instances_list
|
120
|
+
when "status"
|
121
|
+
puts Veronic::Deployer.new(options).status
|
119
122
|
else
|
120
123
|
puts opt_parser
|
121
124
|
end
|
data/lib/config/config.rb
CHANGED
@@ -26,10 +26,10 @@ module Veronic
|
|
26
26
|
@ssl_version = options[:ssl_version] || config_from_file['ssl_version']
|
27
27
|
@identity_file = options[:identity_file] || config_from_file['identity_file']
|
28
28
|
@branch = options[:branch] || config_from_file['branch']
|
29
|
-
@environment = options[:environment] || config_from_file['environment']
|
29
|
+
@environment = options[:environment] || config_from_file['environment']
|
30
30
|
@ssh_user = options[:ssh_user] || config_from_file['ssh_user'] || 'ubuntu'
|
31
31
|
@ssh_port = options[:ssh_port] || config_from_file['ssh_port'] || 22
|
32
|
-
@role = options[:role] || config_from_file['role']
|
32
|
+
@role = options[:role] || config_from_file['role']
|
33
33
|
@flavor = options[:flavor] || config_from_file['flavor'] || 'm1.medium'
|
34
34
|
@security_groups = [options[:security_groups]] || [config_from_file['security_groups']]
|
35
35
|
@deploy_cmd = options[:deploy_cmd] || config_from_file['deploy_cmd'] || 'sudo chef-client'
|
@@ -22,7 +22,7 @@ module Provider
|
|
22
22
|
Chef::Config[:validation_key] = config[:validation_key]
|
23
23
|
Chef::Config[:chef_server_url] = config[:chef_server_url]
|
24
24
|
Chef::Config[:ssl_version] = config[:ssl_version]
|
25
|
-
Chef::Config[:log_level] = :
|
25
|
+
Chef::Config[:log_level] = config[:verbose]
|
26
26
|
@knife = knife
|
27
27
|
end
|
28
28
|
|
@@ -6,6 +6,8 @@ require 'chef/knife/ssh'
|
|
6
6
|
require 'chef/knife/node_run_list_add'
|
7
7
|
require 'chef/knife/core/bootstrap_context'
|
8
8
|
require 'chef/knife/ec2_base'
|
9
|
+
require 'chef/node'
|
10
|
+
|
9
11
|
require_relative 'rest_request'
|
10
12
|
|
11
13
|
module Provider
|
@@ -27,6 +29,7 @@ module Provider
|
|
27
29
|
@flavor = config[:flavor]
|
28
30
|
@region = config[:region]
|
29
31
|
@availability_zone = config[:availability_zone]
|
32
|
+
@verbose = config[:verbose]
|
30
33
|
Chef::Config[:knife][:image] = @image
|
31
34
|
Chef::Config[:knife][:aws_ssh_key_id] = @aws_ssh_key_id
|
32
35
|
Chef::Config[:knife][:aws_access_key_id] = @access_key_id
|
@@ -39,56 +42,61 @@ module Provider
|
|
39
42
|
def create
|
40
43
|
puts "Creating ec2 server #{@name} ..."
|
41
44
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
puts
|
56
|
-
|
45
|
+
node = Chef::Knife::Ec2ServerCreate.new()
|
46
|
+
|
47
|
+
node.config[:run_list] = [@roles]
|
48
|
+
node.config[:image] = @image
|
49
|
+
node.config[:flavor] = @flavor
|
50
|
+
node.config[:security_groups] = @security_groups
|
51
|
+
node.config[:ssh_user] = @ssh_user
|
52
|
+
node.config[:ssh_port] = @ssh_port
|
53
|
+
node.config[:chef_node_name] = @name
|
54
|
+
node.config[:identity_file] = @identity_file
|
55
|
+
node.config[:environment] = @environment
|
56
|
+
node.config[:log_level] = @verbose
|
57
|
+
|
58
|
+
puts node.config
|
59
|
+
node.run
|
57
60
|
end
|
58
61
|
|
59
|
-
def bootstrap
|
62
|
+
def bootstrap(recursive_count=0)
|
60
63
|
puts "Bootstrapping ec2 server #{@name} ..."
|
61
64
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
puts
|
75
|
-
|
65
|
+
node = Chef::Knife::Ec2ServerCreate.new()
|
66
|
+
|
67
|
+
node.config[:image] = @image
|
68
|
+
node.config[:flavor] = @flavor
|
69
|
+
node.config[:security_groups] = @security_groups
|
70
|
+
node.config[:ssh_user] = @ssh_user
|
71
|
+
node.config[:ssh_port] = @ssh_port
|
72
|
+
node.config[:chef_node_name] = @name
|
73
|
+
node.config[:identity_file] = @identity_file
|
74
|
+
node.config[:environment] = @environment
|
75
|
+
node.config[:log_level] = @verbose
|
76
|
+
|
77
|
+
puts node.config
|
78
|
+
begin
|
79
|
+
node.run
|
80
|
+
rescue
|
81
|
+
self.destroy([node.server.id])
|
82
|
+
self.bootstrap(recursive_count+=1) if recursive_count < 3
|
83
|
+
end
|
76
84
|
end
|
77
85
|
|
78
86
|
def destroy(instance_ids = [])
|
79
87
|
puts "Deleting ec2 server #{@name} ..."
|
80
88
|
|
81
|
-
|
89
|
+
node = Chef::Knife::Ec2ServerDelete.new()
|
82
90
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
91
|
+
node.config[:purge] = true
|
92
|
+
node.config[:chef_node_name] = @name
|
93
|
+
node.config[:yes] = true
|
94
|
+
node.name_args = instance_ids
|
87
95
|
|
88
|
-
puts
|
89
|
-
|
90
|
-
|
91
|
-
|
96
|
+
puts node.config
|
97
|
+
node.run
|
98
|
+
node.destroy_item(Chef::Node, @name, "node")
|
99
|
+
node.destroy_item(Chef::ApiClient, @name, "client")
|
92
100
|
end
|
93
101
|
|
94
102
|
def set_role
|
@@ -97,13 +105,22 @@ module Provider
|
|
97
105
|
node.run
|
98
106
|
end
|
99
107
|
|
108
|
+
def set_environment
|
109
|
+
node = Chef::Node.new.tap do |n|
|
110
|
+
n.name( @name )
|
111
|
+
n.chef_environment( @environment )
|
112
|
+
end
|
113
|
+
node.save
|
114
|
+
puts "Environment: #{@environment}"
|
115
|
+
end
|
116
|
+
|
100
117
|
def ssh(query, cmd_line, manual)
|
101
118
|
knife_ssh = Chef::Knife::Ssh.new()
|
102
119
|
|
103
120
|
knife_ssh.config[:manual] = manual
|
104
121
|
knife_ssh.config[:ssh_user] = @ssh_user
|
105
122
|
knife_ssh.config[:identity_file] = @identity_file
|
106
|
-
knife_ssh.config[:log_level] =
|
123
|
+
knife_ssh.config[:log_level] = @verbose
|
107
124
|
|
108
125
|
knife_ssh.name_args = [query, cmd_line]
|
109
126
|
sys_status = knife_ssh.run
|
data/lib/providers/ec2/ec2.rb
CHANGED
@@ -5,32 +5,45 @@ module Provider
|
|
5
5
|
def initialize(ec2, name)
|
6
6
|
@ec2 = ec2
|
7
7
|
@name = name
|
8
|
-
|
8
|
+
@instance = instance
|
9
9
|
end
|
10
10
|
|
11
11
|
def stop
|
12
12
|
print "Stopping instance #{@name}..."
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
if self.exist?
|
14
|
+
@instance.stop
|
15
|
+
@i = 0
|
16
|
+
while self.status != :stopped
|
17
|
+
if @i > 120
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
print "." ; sleep 3 ; @i += 1
|
21
|
+
end
|
17
22
|
end
|
18
23
|
puts "\nInstance #{@name} is stopped"
|
19
24
|
end
|
20
25
|
|
21
26
|
def start
|
22
27
|
print "Starting instance #{@name}..."
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
28
|
+
if self.exist?
|
29
|
+
while self.status == :stopping
|
30
|
+
sleep 2
|
31
|
+
end
|
32
|
+
@instance.start
|
33
|
+
@i = 0
|
34
|
+
while self.status != :running
|
35
|
+
if @i > 120
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
print "." ; sleep 3 ; @i += 1
|
39
|
+
end
|
27
40
|
end
|
28
41
|
puts "\nInstance #{@name} is started"
|
29
42
|
end
|
30
43
|
|
31
44
|
def exist?
|
32
45
|
puts "Checking for ec2 server #{@name} ..."
|
33
|
-
if @ec2.instances.any? {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated}
|
46
|
+
if AWS.memoize do @ec2.instances.any? {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated} end
|
34
47
|
puts "Instance #{@name} found"
|
35
48
|
return true
|
36
49
|
else
|
@@ -40,11 +53,7 @@ module Provider
|
|
40
53
|
end
|
41
54
|
|
42
55
|
def status
|
43
|
-
|
44
|
-
@instance.status
|
45
|
-
rescue Exception => e
|
46
|
-
return :missing
|
47
|
-
end
|
56
|
+
@instance.status if @instance
|
48
57
|
end
|
49
58
|
|
50
59
|
def dns_name
|
@@ -58,6 +67,16 @@ module Provider
|
|
58
67
|
def id
|
59
68
|
@instance.id
|
60
69
|
end
|
70
|
+
|
71
|
+
def instance
|
72
|
+
@instance ||= get_instance
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_instance
|
76
|
+
AWS.memoize do
|
77
|
+
@ec2.instances.select {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated}.first
|
78
|
+
end
|
79
|
+
end
|
61
80
|
|
62
81
|
end
|
63
82
|
end
|
@@ -45,8 +45,9 @@ module Route53
|
|
45
45
|
|
46
46
|
def delete
|
47
47
|
if self.exist?
|
48
|
-
record =
|
49
|
-
record.
|
48
|
+
record = self.get
|
49
|
+
delete_record = Route53::DNSRecord.new(record.name, record.type, record.ttl, record.values, @zone)
|
50
|
+
delete_record.delete
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
data/lib/veronic.rb
CHANGED
@@ -54,7 +54,7 @@ module Veronic
|
|
54
54
|
deploy_stacks
|
55
55
|
end
|
56
56
|
query = cloudprovider.instance.dns_name
|
57
|
-
deploy_cmd =
|
57
|
+
deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_deploy]' #{config_hash[:verbose] ? '-l ' + config_hash[:verbose] : ''}"
|
58
58
|
manual = true
|
59
59
|
configprovider.ssh(query, deploy_cmd, manual)
|
60
60
|
end
|
@@ -65,7 +65,7 @@ module Veronic
|
|
65
65
|
deploy_apps
|
66
66
|
end
|
67
67
|
query = cloudprovider.instance.dns_name
|
68
|
-
deploy_cmd =
|
68
|
+
deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_testing]' #{config_hash[:verbose] ? '-l ' + config_hash[:verbose] : ''}"
|
69
69
|
manual = true
|
70
70
|
configprovider.ssh(query, deploy_cmd, manual)
|
71
71
|
end
|
@@ -76,7 +76,7 @@ module Veronic
|
|
76
76
|
@config.zone_url = z['zone_url']
|
77
77
|
dns = "#{config_hash[:name]}.#{z['zone_name']}"
|
78
78
|
puts "Setting DNS #{dns} ..."
|
79
|
-
record = dnsprovider.zone.record(dns, [
|
79
|
+
record = dnsprovider.zone.record(dns, [], "A", "1").delete
|
80
80
|
puts "DNS #{dns} deleted"
|
81
81
|
end
|
82
82
|
if cloudprovider.instance.exist?
|
@@ -106,7 +106,7 @@ module Veronic
|
|
106
106
|
@config.zone_url = z['zone_url']
|
107
107
|
dns = "#{config_hash[:name]}.#{z['zone_name']}"
|
108
108
|
puts "Setting DNS #{dns} ..."
|
109
|
-
record = dnsprovider.zone.record(dns, [cloudprovider.instance.public_ip_address], "A", "
|
109
|
+
record = dnsprovider.zone.record(dns, [cloudprovider.instance.public_ip_address], "A", "1").wait_set
|
110
110
|
puts "DNS #{dns} updated"
|
111
111
|
end
|
112
112
|
end
|
@@ -120,23 +120,51 @@ module Veronic
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def start
|
123
|
-
cloudprovider.instance.start
|
124
|
-
|
123
|
+
unless cloudprovider.instance.start == false
|
124
|
+
update_instance_dns
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def status
|
129
|
+
if config_hash[:name]
|
130
|
+
return cloudprovider.instance.status
|
131
|
+
else
|
132
|
+
return "Arguments name missing"
|
133
|
+
end
|
125
134
|
end
|
126
135
|
|
127
136
|
def bootstrap
|
128
|
-
|
137
|
+
get_image
|
129
138
|
if cloudprovider.instance.status == :running
|
130
|
-
|
139
|
+
puts "#{config_hash[:name]} is running"
|
131
140
|
elsif cloudprovider.instance.status == :stopped
|
132
141
|
start
|
133
|
-
configprovider.instance.bootstrap
|
134
142
|
elsif cloudprovider.instance.exist? == false
|
135
|
-
configprovider.instance.bootstrap
|
136
|
-
|
143
|
+
configprovider.instance.bootstrap
|
144
|
+
set_node
|
145
|
+
update_instance_dns
|
137
146
|
return true
|
138
147
|
else
|
139
|
-
|
148
|
+
abort('Error during connecting instance')
|
149
|
+
end
|
150
|
+
set_node
|
151
|
+
return false
|
152
|
+
end
|
153
|
+
|
154
|
+
def set_node
|
155
|
+
if config_hash[:role] && config_hash[:environment]
|
156
|
+
configprovider.instance.set_environment
|
157
|
+
configprovider.instance.set_role
|
158
|
+
else
|
159
|
+
abort('Arguments "role" or "environment" missing')
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def get_image
|
164
|
+
if config_hash[:environment]
|
165
|
+
@config.image = cloudprovider.image.id
|
166
|
+
else
|
167
|
+
abort('Arguments "environment" missing')
|
140
168
|
end
|
141
169
|
end
|
142
170
|
end
|
data/veronic.gemspec
CHANGED
data/veronic.yml
CHANGED