opsicle 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b201eac6aa239dec9378f67aa1c34a03898eac11
4
- data.tar.gz: be6e9ece12c51bd6d7c47b8bed9bac8fc8510ca2
3
+ metadata.gz: 97dd611664d6cade219eb35829d9cc111636ab1b
4
+ data.tar.gz: 1ba96878b0d09b05dc2df05222507af9b4cfec48
5
5
  SHA512:
6
- metadata.gz: 6d1136716ed8666abb86979193ae285c5fd3d50534ca111a960d2f8ba1cb2334f96f46f5b23ee51c8c378dfdb2f9156a297f38347ed58006cda4e78a0e884ebe
7
- data.tar.gz: 2ca94d4ba02f75230c06b1e1e15f549c106f6f26e6ddb60e613d23b13a42de10a4e063e8ee0eee42071c84d4e6a56d74a1d6d1cefbf869ae6b293f9d7521e755
6
+ metadata.gz: beb8719a0691650d14a661a10b2b9cd5c79e63ae4d0f41d302a2ac30ed0b2585b09844914570bef34a1a73ca0515c2e091653da3344b8e78440f3d53c8ddf624
7
+ data.tar.gz: 3dfa883fabc57e83e0d04d56d6e41edbf52034c2c459c46a0ee97b09101ef7ea1c33f6179db86d927fad58a032977cf220752be93d413635d6ac0c55d6ad2751
data/bin/opsicle CHANGED
@@ -48,6 +48,7 @@ command :deploy do |c|
48
48
  c.switch [:g, :migrate], :desc => "Deploy with migrations"
49
49
  c.switch [:m, :monitor], :desc => "Run the Stack Monitor on deploy", :default_value => true
50
50
  c.switch [:t, :track], :desc => "Tracks to deploy and exits when completed. Exits with non-zero if the deploy fails."
51
+ c.flag [:j, :json], :desc => 'Custom json to add to the deploy', :type => String
51
52
  c.action do |global_options, options, args|
52
53
  raise ArgumentError, 'You must specify an environment' unless args.first
53
54
  Opsicle::Deploy.new(args.first).execute global_options.merge(options)
@@ -84,6 +85,15 @@ command 'ssh-key' do |c|
84
85
  end
85
86
  end
86
87
 
88
+ desc "Clear an environment's keys from your ssh known_hosts file"
89
+ arg_name '<environment>'
90
+ command 'ssh-clean-keys' do |c|
91
+ c.action do |global_options, options, args|
92
+ raise ArgumentError, "Environment is required" unless args.first
93
+ Opsicle::SSHCleanKeys.new(args.first).execute global_options.merge(options)
94
+ end
95
+ end
96
+
87
97
  desc "Launch the Opsicle Stack Monitor for the given environment stack"
88
98
  arg_name '<environment>'
89
99
  command 'monitor' do |c|
@@ -147,13 +157,14 @@ desc "Execute arbitrary recipes on the Stack"
147
157
  arg_name '<environment>'
148
158
  arg_name '<recipe>'
149
159
  command 'execute-recipes' do |c|
150
- c.switch [:m, :monitor], :desc => "Run the Stack Monitor on deploy", :default_value => true
151
- c.switch [:e, :eip], :desc => "Executes recipes on a single instance with an elastic IP", :default_value => false
152
- c.switch [:t, :track], :desc => "Tracks to deploy and exits when completed. Exits with non-zero if the deploy fails."
153
- c.flag [:r, :recipes], :desc => 'The recipes to execute', :type => Array, :required => true
154
- c.flag [:i, :instance_ids], :desc => 'The specific instances to execute recipes on', :type => Array
155
- c.flag [:l, :layers], :desc => 'The specific layers to execute recipes on', :type => Array
156
- c.flag [:a, :ip_addresses], :desc => 'The specific ip addresses of instance to execute recipes on', :type => Array
160
+ c.switch [:m, :monitor], :desc => "Run the Stack Monitor on deploy", :default_value => true
161
+ c.switch [:e, :eip], :desc => "Executes recipes on a single instance with an elastic IP", :default_value => false
162
+ c.switch [:t, :track], :desc => "Tracks to deploy and exits when completed. Exits with non-zero if the deploy fails."
163
+ c.flag [:j, :json], :desc => 'Custom json to add to the deploy', :type => String
164
+ c.flag [:r, :recipes], :desc => 'The recipes to execute', :type => Array, :required => true
165
+ c.flag [:i, :instance_ids], :desc => 'The specific instances to execute recipes on', :type => Array
166
+ c.flag [:l, :layers], :desc => 'The specific layers to execute recipes on', :type => Array
167
+ c.flag [:a, :ip_addresses], :desc => 'The specific ip addresses of instance to execute recipes on', :type => Array
157
168
  c.action do |global_options, options, args|
158
169
  raise ArgumentError, "Environment is required" unless args.first
159
170
 
@@ -17,7 +17,9 @@ module Opsicle
17
17
  #http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/OpsWorks/Client.html#create_deployment-instance_method
18
18
  command_args = {}
19
19
  command_args["migrate"] = [options[:migrate].to_s] if options[:migrate]
20
- response = client.run_command('deploy', command_args)
20
+ command_opts = {}
21
+ command_opts["custom_json"] = options.delete(:json) if options[:json]
22
+ response = client.run_command('deploy', command_args, command_opts)
21
23
 
22
24
  launch_stack_monitor(response, options)
23
25
  end
@@ -19,18 +19,19 @@ module Opsicle
19
19
  command_args["recipes"] = options[:recipes]
20
20
  command_opts = {}
21
21
  command_opts["instance_ids"] = determine_instance_ids(options)
22
+ command_opts["custom_json"] = options.delete(:json) if options[:json]
22
23
  command_opts.reject! {|key,value| value.nil?}
23
24
 
24
25
  response = client.run_command('execute_recipes', command_args, command_opts)
25
26
  launch_stack_monitor(response, options)
26
27
  end
27
-
28
+
28
29
  def determine_instance_ids(options)
29
30
  if options[:instance_ids]
30
31
  options[:instance_ids]
31
32
  elsif options[:layers]
32
33
  determine_from_layers(options[:layers])
33
- elsif options[:ip_addresses]
34
+ elsif options[:ip_addresses]
34
35
  determine_from_ips(options[:ip_addresses])
35
36
  elsif options[:eip]
36
37
  determine_from_eip
@@ -38,7 +39,7 @@ module Opsicle
38
39
  end
39
40
 
40
41
  def determine_from_ips(ips)
41
- if instances = Opsicle::Instances.find_by_ip(client, ips)
42
+ if instances = Opsicle::Instances.find_by_ip(client, ips)
42
43
  instances.map { |instance| instance[:instance_id] }
43
44
  else
44
45
  raise NoInstanceError, "Unable to find instances with given IP"
@@ -0,0 +1,29 @@
1
+ module Opsicle
2
+ class SSHCleanKeys
3
+ attr_reader :client
4
+
5
+ def initialize(environment)
6
+ @client = Client.new(environment)
7
+ end
8
+
9
+ def execute(options={})
10
+ instances.each do |instance|
11
+ # Fun note: public_dns will be for the elastic ip (if elastic_ip?)
12
+ host_keys = [:elastic_ip, :public_ip, :public_dns]
13
+ hosts = host_keys.map { |key| instance[key] }
14
+ hosts = hosts.reject { |i| i.nil? }
15
+ hosts.uniq.each do |host|
16
+ # Is this properly escaped against expansion?
17
+ command = "ssh-keygen -R #{host}"
18
+ Output.say_verbose "Executing: #{command}"
19
+ system(command)
20
+ end
21
+ end
22
+ end
23
+
24
+ def instances
25
+ client.api_call(:describe_instances, { stack_id: client.config.opsworks_config[:stack_id] })
26
+ .data[:instances]
27
+ end
28
+ end
29
+ end
@@ -7,3 +7,4 @@ require "opsicle/commands/list"
7
7
  require "opsicle/commands/list_instances"
8
8
  require "opsicle/commands/ssh"
9
9
  require "opsicle/commands/ssh_key"
10
+ require "opsicle/commands/ssh_clean_keys"
@@ -1,3 +1,3 @@
1
1
  module Opsicle
2
- VERSION = "0.8.2"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -10,7 +10,7 @@ module Opsicle
10
10
  let(:monitor) { double(:start => nil) }
11
11
  before do
12
12
  allow(Client).to receive(:new).with('derp').and_return(client)
13
- allow(client).to receive(:run_command).with('deploy', {}).and_return({deployment_id: 'derp'})
13
+ allow(client).to receive(:run_command).with('deploy', {}, {}).and_return({deployment_id: 'derp'})
14
14
 
15
15
  allow(Monitor::App).to receive(:new).and_return(monitor)
16
16
  allow(monitor).to receive(:start)
@@ -20,7 +20,7 @@ module Opsicle
20
20
  end
21
21
 
22
22
  it "creates a new deployment and opens stack monitor" do
23
- expect(client).to receive(:run_command).with('deploy', {}).and_return({deployment_id: 'derp'})
23
+ expect(client).to receive(:run_command).with('deploy', {}, {}).and_return({deployment_id: 'derp'})
24
24
  expect(subject).to_not receive(:open_deploy)
25
25
  expect(Monitor::App).to receive(:new).with('derp', :monitor => true)
26
26
 
@@ -28,7 +28,7 @@ module Opsicle
28
28
  end
29
29
 
30
30
  it "creates a new deployment that exits the stack monitor on completion" do
31
- expect(client).to receive(:run_command).with('deploy', {}).and_return({deployment_id: 'derp'})
31
+ expect(client).to receive(:run_command).with('deploy', {}, {}).and_return({deployment_id: 'derp'})
32
32
  expect(subject).to_not receive(:open_deploy)
33
33
  expect(Monitor::App).to receive(:new).with('derp', :monitor => true, :deployment_id => 'derp')
34
34
 
@@ -36,17 +36,25 @@ module Opsicle
36
36
  end
37
37
 
38
38
  it "creates a new deployment with migrations" do
39
- expect(client).to receive(:run_command).with('deploy', {"migrate"=>["true"]}).and_return({deployment_id: 'derp'})
39
+ expect(client).to receive(:run_command).with('deploy', {"migrate"=>["true"]}, {}).and_return({deployment_id: 'derp'})
40
40
  expect(subject).to_not receive(:open_deploy)
41
41
  subject.execute({ monitor: false, migrate: true })
42
42
  end
43
43
 
44
44
  it "creates a new deployment migrations explicitly disabled" do
45
- expect(client).to receive(:run_command).with('deploy', {}).and_return({deployment_id: 'derp'})
45
+ expect(client).to receive(:run_command).with('deploy', {}, {}).and_return({deployment_id: 'derp'})
46
46
  expect(subject).to_not receive(:open_deploy)
47
47
  subject.execute({ monitor: false, migrate: false })
48
48
  end
49
49
 
50
+ it "pass custom json to the deploy if provided" do
51
+ expect(client).to receive(:run_command).with('deploy', {}, { 'custom_json' => '{ "expire_css": true }' }).and_return({deployment_id: 'derp'})
52
+ expect(subject).to_not receive(:open_deploy)
53
+ expect(Monitor::App).to_not receive(:new)
54
+
55
+ subject.execute({ json: '{ "expire_css": true }' })
56
+ end
57
+
50
58
  it "opens the OpsWorks deployments screen if browser option is given" do
51
59
  expect(subject).to receive(:open_deploy)
52
60
  expect(Monitor::App).to_not receive(:new)
@@ -53,6 +53,14 @@ module Opsicle
53
53
  end
54
54
  end
55
55
 
56
+ context "custom_json provided" do
57
+ let(:custom_json) { '{ "expire_css": true }' }
58
+ it "creates a new execute_recipes deployment and passes along the custom json" do
59
+ expect(client).to receive(:run_command).with('execute_recipes', {"recipes" => ['herp']}, {"custom_json" => custom_json}).and_return({deployment_id: 'derp'})
60
+ subject.execute({ monitor: false, json: custom_json, recipes: recipes })
61
+ end
62
+ end
63
+
56
64
  it "opens the OpsWorks deployments screen if browser option is given" do
57
65
  expect(subject).to receive(:open_deploy)
58
66
  expect(Monitor::App).to_not receive(:new)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opsicle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Fleener
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-12-08 00:00:00.000000000 Z
12
+ date: 2015-01-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -184,6 +184,7 @@ files:
184
184
  - lib/opsicle/commands/list.rb
185
185
  - lib/opsicle/commands/list_instances.rb
186
186
  - lib/opsicle/commands/ssh.rb
187
+ - lib/opsicle/commands/ssh_clean_keys.rb
187
188
  - lib/opsicle/commands/ssh_key.rb
188
189
  - lib/opsicle/config.rb
189
190
  - lib/opsicle/deploy_helper.rb
@@ -248,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
249
  version: '0'
249
250
  requirements: []
250
251
  rubyforge_project:
251
- rubygems_version: 2.2.2
252
+ rubygems_version: 2.4.2
252
253
  signing_key:
253
254
  specification_version: 4
254
255
  summary: An opsworks specific abstraction on top of the aws sdk
@@ -272,4 +273,3 @@ test_files:
272
273
  - spec/opsicle/monitor/subpanel_spec.rb
273
274
  - spec/opsicle/s3_bucket_spec.rb
274
275
  - spec/spec_helper.rb
275
- has_rdoc: