veronic 0.0.9 → 0.0.11

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 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