veronic 0.0.9 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
data/bin/veronic CHANGED
@@ -26,6 +26,7 @@ opt_parser = OptionParser.new do |opt|
26
26
  opt.separator " start: start box"
27
27
  opt.separator " list: list boxes"
28
28
  opt.separator " status: status boxes"
29
+ opt.separator " create_image: create an image with the box"
29
30
  opt.separator ""
30
31
  opt.separator "Options"
31
32
 
@@ -84,11 +85,21 @@ opt_parser = OptionParser.new do |opt|
84
85
  options[:security_groups] = s
85
86
  end
86
87
 
88
+ options[:ami_image] = ENV['ami_image']
89
+ opt.on("-I","--ami_image ami_image","Which ami_image use for the box") do |i|
90
+ options[:ami_image] = i
91
+ end
92
+
87
93
  options[:deploy_cmd] = ENV['deploy_cmd']
88
- opt.on("-D","--deploy_cmd security_groups","Which command line us to deploy the box") do |dc|
94
+ opt.on("-D","--deploy_cmd commad-line","Which command line us to deploy the box") do |dc|
89
95
  options[:deploy_cmd] = dc
90
96
  end
91
97
 
98
+ options[:verbose] = ENV['verbose']
99
+ opt.on("-v","--verbose debug","Which verbose level us to deploy the box") do |v|
100
+ options[:verbose] = v
101
+ end
102
+
92
103
  opt.on("-h","--help","help")
93
104
  end
94
105
 
@@ -119,6 +130,9 @@ when "list"
119
130
  Veronic::Deployer.new(options).instances_list
120
131
  when "status"
121
132
  puts Veronic::Deployer.new(options).status
133
+ when "create_image"
134
+ image = Veronic::Deployer.new(options).create_image
135
+ puts "ID: #{image.id}", "NAME: #{image.name}", "STATE: #{image.state}"
122
136
  else
123
137
  puts opt_parser
124
138
  end
data/lib/config/config.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Veronic
2
2
  class Config
3
- attr_accessor :dnsprovider, :cloudprovider, :configprovider, :dnsprovider_access_key_id, :dnsprovider_secret_access_key, :cloudprovider_access_key_id, :cloudprovider_secret_access_key, :cloudprovider_images_owner_id, :dnsprovider_zones, :region, :availability_zone, :aws_ssh_key_id, :node_name, :client_key, :validation_client_name, :validation_key, :chef_server_url, :ssl_version, :identity_file, :branch, :environment, :ssh_user, :ssh_port, :role, :flavor, :security_groups, :deploy_cmd, :name, :image, :zone_name, :zone_url
3
+ attr_accessor :dnsprovider, :cloudprovider, :configprovider, :dnsprovider_access_key_id, :dnsprovider_secret_access_key, :cloudprovider_access_key_id, :cloudprovider_secret_access_key, :cloudprovider_images_owner_id, :dnsprovider_zones, :region, :availability_zone, :aws_ssh_key_id, :node_name, :client_key, :validation_client_name, :validation_key, :chef_server_url, :ssl_version, :identity_file, :branch, :environment, :ssh_user, :ssh_port, :role, :flavor, :security_groups, :deploy_cmd, :name, :image, :zone_name, :zone_url, :verbose
4
4
 
5
5
  def initialize(options={})
6
6
  config_file = File.exists?('/etc/veronic/veronic.yml') ? '/etc/veronic/veronic.yml' : '../../' + File.dirname($0) + '/veronic.yml'
@@ -34,7 +34,8 @@ module Veronic
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'
36
36
  @name = (options[:branch] || config_from_file['branch']) ? (options[:branch] || config_from_file['branch']) : (options[:name] || config_from_file['name'])
37
- @image = nil
37
+ @image = options[:ami_image] || config_from_file['ami_image']
38
+ @verbose = options[:verbose] || config_from_file['verbose']
38
39
  end
39
40
 
40
41
  def to_hash
@@ -7,7 +7,19 @@ require 'tempfile'
7
7
  require 'highline'
8
8
  require 'net/ssh'
9
9
  require 'net/ssh/multi'
10
+ require 'chef/knife'
11
+ require 'chef/knife/ec2_server_create'
12
+ require 'chef/knife/ec2_server_delete'
13
+ require 'chef/knife/bootstrap'
14
+ require 'chef/knife/ssh'
15
+ require 'chef/knife/node_run_list_add'
16
+ require 'chef/knife/core/bootstrap_context'
17
+ require 'chef/knife/ec2_base'
18
+ require 'chef/node'
19
+
20
+ require_relative 'rest_request'
10
21
  require_relative 'instance'
22
+ require_relative 'client'
11
23
 
12
24
  module Provider
13
25
  class ChefServer
@@ -47,7 +59,11 @@ module Provider
47
59
  end
48
60
 
49
61
  def instance
50
- instance = Provider::ChefServer::Instance.new(@config)
62
+ node = Provider::ChefServer::Instance.new(@config)
63
+ end
64
+
65
+ def client
66
+ node = Provider::ChefServer::Client.new(@config)
51
67
  end
52
68
 
53
69
  end
@@ -0,0 +1,27 @@
1
+ module Provider
2
+ class ChefServer
3
+ class Client
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+
9
+ def destroy(name=nil)
10
+ puts "Destroying client #{@name} ..."
11
+
12
+ knife = Chef::Knife.new()
13
+ knife.config[:yes] = true
14
+ knife.delete_object(Chef::ApiClient, @name) if self.exists?
15
+ end
16
+
17
+ def exists?
18
+ begin
19
+ Chef::ApiClient.load(@name)
20
+ rescue
21
+ return false
22
+ end
23
+ return true
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,15 +1,3 @@
1
- require 'chef/knife'
2
- require 'chef/knife/ec2_server_create'
3
- require 'chef/knife/ec2_server_delete'
4
- require 'chef/knife/bootstrap'
5
- require 'chef/knife/ssh'
6
- require 'chef/knife/node_run_list_add'
7
- require 'chef/knife/core/bootstrap_context'
8
- require 'chef/knife/ec2_base'
9
- require 'chef/node'
10
-
11
- require_relative 'rest_request'
12
-
13
1
  module Provider
14
2
  class ChefServer
15
3
  class Instance
@@ -126,6 +114,14 @@ module Provider
126
114
  sys_status = knife_ssh.run
127
115
  end
128
116
 
117
+ def client
118
+ Provider::ChefServer::Client.new(@name)
119
+ end
120
+
121
+ def delete_client_key(node, client_key="/etc/chef/client.pem")
122
+ puts "Deleting client_key #{client_key}"
123
+ self.ssh(node, "sudo rm -f #{client_key}", true)
124
+ end
129
125
  end
130
126
  end
131
127
  end
@@ -13,8 +13,8 @@ class CloudProvider
13
13
  CLOUDPROVIDERS[@config[:cloudprovider]].new(@config)
14
14
  end
15
15
 
16
- def image
17
- @provider.image
16
+ def image(name=nil)
17
+ @provider.image(name)
18
18
  end
19
19
 
20
20
  def instance
@@ -20,4 +20,8 @@ class ConfigProvider
20
20
  def instance
21
21
  @provider.instance
22
22
  end
23
+
24
+ def client
25
+ @provider.client
26
+ end
23
27
  end
@@ -14,12 +14,12 @@ module Provider
14
14
  @ec2 = ec2
15
15
  end
16
16
 
17
- def image
18
- Provider::Ec2::Image.new(@ec2, @environment, @owner_id)
17
+ def image(name=nil)
18
+ Provider::Ec2::Image.new(@ec2, @environment, @owner_id, name)
19
19
  end
20
20
 
21
21
  def instance
22
- Provider::Ec2::Instance.new(@ec2, @name)
22
+ Provider::Ec2::Instance.new(@ec2, @name, @environment)
23
23
  end
24
24
 
25
25
  def instances
@@ -2,12 +2,58 @@ module Provider
2
2
  class Ec2
3
3
  class Image
4
4
 
5
- def initialize(ec2, environment, owner_id)
6
- @image = ec2.images.with_owner(owner_id).select {|x| x.name == environment + '-ami'}.first
5
+ def initialize(ec2, environment, owner_id, name=nil)
6
+ @ec2 = ec2
7
+ @environment = environment
8
+ @name = name
9
+ @ami_name = @name || @environment + '-ami'
10
+ @owner_id = owner_id
7
11
  end
8
12
 
9
13
  def id
10
- @image.id
14
+ if image
15
+ @image.id
16
+ end
17
+ end
18
+
19
+ def detroy
20
+ puts "Destroying image #{@ami_name}..."
21
+ if image
22
+ begin
23
+ @image.deregister
24
+ puts "Image #{@ami_name} destroyed"
25
+ rescue
26
+ return false
27
+ end
28
+ end
29
+ return true
30
+ end
31
+
32
+ def image
33
+ puts "Getting image #{@ami_name}..."
34
+ @image = get_image
35
+ unless @image
36
+ sleep 5
37
+ @image = get_image
38
+ end
39
+ if @image
40
+ while @image.exists? == false && @image.state != :failed
41
+ print "."
42
+ sleep 1
43
+ end
44
+ while @image.state == :pending && @image.state != :failed
45
+ print "."
46
+ sleep 1
47
+ end
48
+ puts ""
49
+ return @image
50
+ else
51
+ return false
52
+ end
53
+ end
54
+
55
+ def get_image
56
+ @ec2.images.with_owner(@owner_id).select {|x| x.name == @ami_name}.first
11
57
  end
12
58
 
13
59
  end
@@ -2,9 +2,10 @@ module Provider
2
2
  class Ec2
3
3
  class Instance
4
4
 
5
- def initialize(ec2, name)
5
+ def initialize(ec2, name, environment)
6
6
  @ec2 = ec2
7
7
  @name = name
8
+ @environment = environment
8
9
  @instance = instance
9
10
  end
10
11
 
@@ -77,6 +78,22 @@ module Provider
77
78
  @ec2.instances.select {|x| x.tags['Name'] == @name && x.status != :shutting_down && x.status != :terminated}.first
78
79
  end
79
80
  end
81
+
82
+ def create_image(name=nil)
83
+ @ami_name = name || @environment + '-ami'
84
+ puts "Create image #{@ami_name}"
85
+ image = @instance.create_image(@ami_name, { :no_reboot => true })
86
+ while image.exists? == false && image.state != :failed
87
+ print "."
88
+ sleep 1
89
+ end
90
+ while image.state == :pending && image.state != :failed
91
+ print "."
92
+ sleep 1
93
+ end
94
+ puts ""
95
+ return image
96
+ end
80
97
 
81
98
  end
82
99
  end
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 = "sudo chef-client -o 'recipe[lift_envs::app_deploy]' #{config_hash[:verbose] ? '-l ' + config_hash[:verbose] : ''}"
57
+ deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_deploy]' #{@config.verbose ? '-l ' + @config.verbose : ''}"
58
58
  manual = true
59
59
  configprovider.ssh(query, deploy_cmd, manual)
60
60
  end
@@ -65,16 +65,16 @@ module Veronic
65
65
  deploy_apps
66
66
  end
67
67
  query = cloudprovider.instance.dns_name
68
- deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_testing]' #{config_hash[:verbose] ? '-l ' + config_hash[:verbose] : ''}"
68
+ deploy_cmd = "sudo chef-client -o 'recipe[lift_envs::app_testing]' #{@config.verbose ? '-l ' + @config.verbose : ''}"
69
69
  manual = true
70
70
  configprovider.ssh(query, deploy_cmd, manual)
71
71
  end
72
72
 
73
73
  def destroy
74
- config_hash[:dnsprovider_zones].each do |z|
74
+ @config.dnsprovider_zones.each do |z|
75
75
  @config.zone_name = z['zone_name']
76
76
  @config.zone_url = z['zone_url']
77
- dns = "#{config_hash[:name]}.#{z['zone_name']}"
77
+ dns = "#{@config.name}.#{z['zone_name']}"
78
78
  puts "Setting DNS #{dns} ..."
79
79
  record = dnsprovider.zone.record(dns, [], "A", "1").delete
80
80
  puts "DNS #{dns} deleted"
@@ -101,10 +101,10 @@ module Veronic
101
101
  end
102
102
 
103
103
  def update_instance_dns
104
- config_hash[:dnsprovider_zones].each do |z|
104
+ @config.dnsprovider_zones.each do |z|
105
105
  @config.zone_name = z['zone_name']
106
106
  @config.zone_url = z['zone_url']
107
- dns = "#{config_hash[:name]}.#{z['zone_name']}"
107
+ dns = "#{@config.name}.#{z['zone_name']}"
108
108
  puts "Setting DNS #{dns} ..."
109
109
  record = dnsprovider.zone.record(dns, [cloudprovider.instance.public_ip_address], "A", "1").wait_set
110
110
  puts "DNS #{dns} updated"
@@ -126,7 +126,7 @@ module Veronic
126
126
  end
127
127
 
128
128
  def status
129
- if config_hash[:name]
129
+ if @config.name
130
130
  return cloudprovider.instance.status
131
131
  else
132
132
  return "Arguments name missing"
@@ -134,25 +134,36 @@ module Veronic
134
134
  end
135
135
 
136
136
  def bootstrap
137
- get_image
137
+ status = false
138
138
  if cloudprovider.instance.status == :running
139
- puts "#{config_hash[:name]} is running"
139
+ puts "#{@config.name} is running"
140
140
  elsif cloudprovider.instance.status == :stopped
141
141
  start
142
142
  elsif cloudprovider.instance.exist? == false
143
+ get_image
143
144
  configprovider.instance.bootstrap
144
- set_node
145
145
  update_instance_dns
146
- return true
146
+ status = true
147
147
  else
148
148
  abort('Error during connecting instance')
149
149
  end
150
150
  set_node
151
- return false
151
+ return status
152
+ end
153
+
154
+ def create_image
155
+ unless @config.environment
156
+ abort('Arguments "environment" missing')
157
+ else
158
+ configprovider.instance.client.destroy
159
+ configprovider.instance.delete_client_key(cloudprovider.instance.dns_name)
160
+ cloudprovider.image.detroy
161
+ cloudprovider.instance.create_image
162
+ end
152
163
  end
153
164
 
154
165
  def set_node
155
- if config_hash[:role] && config_hash[:environment]
166
+ if @config.role && @config.environment
156
167
  configprovider.instance.set_environment
157
168
  configprovider.instance.set_role
158
169
  else
@@ -161,10 +172,14 @@ module Veronic
161
172
  end
162
173
 
163
174
  def get_image
164
- if config_hash[:environment]
165
- @config.image = cloudprovider.image.id
175
+ if @config.image.nil?
176
+ unless @config.environment
177
+ abort('Arguments "environment" missing')
178
+ else
179
+ @config.image = cloudprovider.image.id
180
+ end
166
181
  else
167
- abort('Arguments "environment" missing')
182
+ @config.image = cloudprovider.image(@config.image).id
168
183
  end
169
184
  end
170
185
  end
data/veronic.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'veronic'
3
- s.version = '0.0.9'
3
+ s.version = '0.0.11'
4
4
  s.date = '2013-04-05'
5
5
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
6
6
  s.summary = "Veronic, deux qui la tiennent trois qui la niquent"
data/veronic.yml CHANGED
@@ -20,6 +20,7 @@ ssh_user:
20
20
  ssh_port:
21
21
  role:
22
22
  flavor:
23
+ ami_image:
23
24
  security_groups:
24
25
  deploy_cmd:
25
26
  verbose:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: veronic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -88,6 +88,7 @@ files:
88
88
  - bin/veronic
89
89
  - lib/config/config.rb
90
90
  - lib/providers/chefserver/chefserver.rb
91
+ - lib/providers/chefserver/client.rb
91
92
  - lib/providers/chefserver/instance.rb
92
93
  - lib/providers/chefserver/rest_request.rb
93
94
  - lib/providers/cloudprovider.rb