opsicle 1.0.1 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd852564a1ede7fb04dcaed4294ee7f7b5b019ce
4
- data.tar.gz: cf272c9d62ee80a1769266762b518e7e009e954c
3
+ metadata.gz: f7c60c0212ad5626778f928fec737322f86a5a6f
4
+ data.tar.gz: c0a6568a58e989b40f014326d457a776ea421ead
5
5
  SHA512:
6
- metadata.gz: 9317e1d2e8c009041833869af3264bfe7cea202bd9a96c0a69684a153a0fb71697a0bdf086da3657008b0fecf1075afc5166adb1a071f14ab41ec301ac51809d
7
- data.tar.gz: 3e450fca539213c34991b150c3f7d9440ea6ce3dd6c14ac81ecc017a2e1fb1fb4fa27da7b5864658a47654c0e823338ec6e8e30cbb7f1f0f866f7aee675cccf7
6
+ metadata.gz: 50e99858c9decebd5a3159b79b1c76863b40c78bdb997b48e180c98ff94536317e558c1b83264fbd6b7eb0ac2b1fc1fa093c506f5743a655c07805d20c8c51b5
7
+ data.tar.gz: 15191e53bd2bed9c7c6d11fd3a1b9c5f856c82264365675c1f0dca810de0a287324037123115517ef1cb9a3762a3fa0043757ab98faf7265495123bb183cd364
data/bin/opsicle CHANGED
@@ -51,6 +51,15 @@ command 'legacy-credential-converter' do |c|
51
51
  end
52
52
  end
53
53
 
54
+ desc "Get most recent failure log for a stack"
55
+ arg_name '<environment>'
56
+ command 'failure-log' do |c|
57
+ c.action do |global_options, options, args|
58
+ raise ArgumentError, 'You must specify an environment' unless args.first
59
+ Opsicle::FailureLog.new(args.first).execute
60
+ end
61
+ end
62
+
54
63
  desc "Deploy your current app to the given environment stack"
55
64
  arg_name '<environment>'
56
65
  command :deploy do |c|
@@ -11,3 +11,4 @@ require "opsicle/commands/ssh_key"
11
11
  require "opsicle/commands/ssh_clean_keys"
12
12
  require "opsicle/commands/user_profile_info"
13
13
  require "opsicle/commands/legacy_credential_converter"
14
+ require "opsicle/commands/failure_log"
@@ -0,0 +1,65 @@
1
+ module Opsicle
2
+ class FailureLog
3
+ attr_reader :client, :stack
4
+
5
+ def initialize(environment)
6
+ @environment = environment
7
+ @client = Client.new(environment)
8
+ @stack = Opsicle::Stack.new(@client)
9
+ end
10
+
11
+ def execute
12
+ puts "Getting most recent failure log..."
13
+
14
+ fetch
15
+ end
16
+
17
+ def fetch
18
+ failed_deployments = fetch_failed_deployments
19
+
20
+ unless failed_deployments.empty?
21
+ failed_deployment_id = failed_deployments.first.deployment_id
22
+ failed_deployments_instances = failed_deployments.first.instance_ids
23
+
24
+ involved_instance_id = fetch_instance_id(failed_deployments_instances)
25
+
26
+ target_failed_command = fetch_target_command(involved_instance_id, failed_deployment_id)
27
+ log_url = target_failed_command.first.log_url
28
+
29
+ system("open", log_url) if log_url
30
+ puts "Unable to find a url to open." unless log_url
31
+ else
32
+ puts "No failed deployments in available history."
33
+ end
34
+ end
35
+
36
+ def fetch_failed_deployments
37
+ deployments = @client.opsworks.describe_deployments(stack_id: @stack.stack_id).deployments
38
+ deployments.select{ |deploy| deploy.status.eql? "failed" }
39
+ end
40
+
41
+ def fetch_instance_id(failed_deployments_instances)
42
+ involved_instances = @client.opsworks.describe_instances(instance_ids: failed_deployments_instances).instances
43
+ choice = select_instance(involved_instances)
44
+ involved_instances[choice-1].instance_id
45
+ end
46
+
47
+ def fetch_target_command(involved_instance_id, failed_deployment_id)
48
+ command_list = @client.opsworks.describe_commands(instance_id: involved_instance_id)[:commands]
49
+ command_list.select{ |command| command.deployment_id == failed_deployment_id }
50
+ end
51
+
52
+ def select_instance(instance_list)
53
+ if instance_list.length == 1
54
+ choice = 1
55
+ else
56
+ Output.say "Choose an Opsworks instance:"
57
+ instance_list.each_with_index do |instance, index|
58
+ Output.say "#{index+1}) #{instance[:hostname]}"
59
+ end
60
+ choice = Output.ask("? ", Integer) { |q| q.in = 1..instance_list.length }
61
+ end
62
+ return choice
63
+ end
64
+ end
65
+ end
data/lib/opsicle/stack.rb CHANGED
@@ -18,6 +18,10 @@ module Opsicle
18
18
  stack_summary[:name]
19
19
  end
20
20
 
21
+ def stack_id
22
+ stack_summary[:stack_id]
23
+ end
24
+
21
25
  def layers
22
26
  @layers ||= @client.api_call('describe_layers', stack_id: @client.config.opsworks_config[:stack_id])[:layers]
23
27
  end
@@ -1,3 +1,3 @@
1
1
  module Opsicle
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -0,0 +1,102 @@
1
+ require "spec_helper"
2
+ require "opsicle"
3
+
4
+ module Opsicle
5
+ describe FailureLog do
6
+ before do
7
+ @instance = double('instance', instance_id: 123456)
8
+ @instances = double('instances', instances: [@instance])
9
+ @deploy1 = double('deploy', status: "failed", deployment_id: 678903, instance_ids: [123456])
10
+ @deploy2 = double('deploy', status: "failed", deployment_id: 294172, instance_ids: [123456])
11
+ @deployments = double('deployments', deployments: [@deploy1, @deploy2])
12
+ @command1 = double('command', log_url: 'http://example1.com', deployment_id: 678903)
13
+ @command2 = double('command', log_url: 'http://example2.com', deployment_id: 294172)
14
+ @commands = {:commands => [@command1, @command2]}
15
+ @stack = double('stack', stack_id: '12345')
16
+ @opsworks_client = double('opsworks_client', describe_deployments: @deployments,
17
+ describe_instances: @instances,
18
+ describe_commands: @commands)
19
+ @client = double('client', opsworks: @opsworks_client)
20
+ allow(Client).to receive(:new).and_return(@client)
21
+ allow(Opsicle::Stack).to receive(:new).and_return(@stack)
22
+ @log = FailureLog.new('environment')
23
+ allow(@log).to receive(:system).and_return(true)
24
+ end
25
+
26
+ context '#fetch' do
27
+ it "should initialize a new FailureLog" do
28
+ expect(Client).to receive(:new)
29
+ expect(Opsicle::Stack).to receive(:new)
30
+ FailureLog.new('environment')
31
+ end
32
+
33
+ it "should get the deployment id of the first failed deploy" do
34
+ expect(@deploy1).to receive(:deployment_id)
35
+ @log.fetch
36
+ end
37
+
38
+ it "should get the instance ids of the first failed deploy" do
39
+ expect(@deploy1).to receive(:instance_ids)
40
+ @log.fetch
41
+ end
42
+
43
+ it "should get the log_url of the first target command" do
44
+ expect(@command1).to receive(:log_url)
45
+ @log.fetch
46
+ end
47
+
48
+ it "should open a recent failure log" do
49
+ expect(@log).to receive(:system).and_return(true)
50
+ @log.fetch
51
+ end
52
+ end
53
+
54
+ context '#fetch_failed_deployments' do
55
+ it "should grab deployments from opsworks" do
56
+ expect(@opsworks_client).to receive(:describe_deployments)
57
+ @log.fetch_failed_deployments
58
+ end
59
+
60
+ it "should grab deployments from opsworks's deployments" do
61
+ expect(@deployments).to receive(:deployments)
62
+ @log.fetch_failed_deployments
63
+ end
64
+
65
+ it "should question the status of each deployment" do
66
+ expect(@deploy1).to receive(:status)
67
+ expect(@deploy2).to receive(:status)
68
+ @log.fetch_failed_deployments
69
+ end
70
+ end
71
+
72
+ context '#fetch_instance_id' do
73
+ it "should grab instances from opsworks" do
74
+ expect(@opsworks_client).to receive(:describe_instances)
75
+ @log.fetch_instance_id([123456])
76
+ end
77
+
78
+ it "should grab instances from opsworks's instances" do
79
+ expect(@instances).to receive(:instances)
80
+ @log.fetch_instance_id([123456])
81
+ end
82
+
83
+ it "should get the instance_id of the selected instance" do
84
+ expect(@instance).to receive(:instance_id)
85
+ @log.fetch_instance_id([123456])
86
+ end
87
+ end
88
+
89
+ context '#fetch_target_command' do
90
+ it "should grab commands from opsworks" do
91
+ expect(@opsworks_client).to receive(:describe_commands)
92
+ @log.fetch_target_command(123456, 678903)
93
+ end
94
+
95
+ it "should get the deployment id of each command" do
96
+ expect(@command1).to receive(:deployment_id)
97
+ expect(@command2).to receive(:deployment_id)
98
+ @log.fetch_target_command(123456, 678903)
99
+ end
100
+ end
101
+ end
102
+ end
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: 1.0.1
4
+ version: 1.1.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: 2016-07-18 00:00:00.000000000 Z
12
+ date: 2016-07-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -195,6 +195,7 @@ files:
195
195
  - lib/opsicle/commands/chef_update.rb
196
196
  - lib/opsicle/commands/deploy.rb
197
197
  - lib/opsicle/commands/execute_recipes.rb
198
+ - lib/opsicle/commands/failure_log.rb
198
199
  - lib/opsicle/commands/legacy_credential_converter.rb
199
200
  - lib/opsicle/commands/list.rb
200
201
  - lib/opsicle/commands/list_instances.rb
@@ -233,6 +234,7 @@ files:
233
234
  - spec/opsicle/commands/chef_update_spec.rb
234
235
  - spec/opsicle/commands/deploy_spec.rb
235
236
  - spec/opsicle/commands/execute_recipes_spec.rb
237
+ - spec/opsicle/commands/failure_log_spec.rb
236
238
  - spec/opsicle/commands/list_instances_spec.rb
237
239
  - spec/opsicle/commands/list_spec.rb
238
240
  - spec/opsicle/commands/ssh_key_spec.rb
@@ -281,6 +283,7 @@ test_files:
281
283
  - spec/opsicle/commands/chef_update_spec.rb
282
284
  - spec/opsicle/commands/deploy_spec.rb
283
285
  - spec/opsicle/commands/execute_recipes_spec.rb
286
+ - spec/opsicle/commands/failure_log_spec.rb
284
287
  - spec/opsicle/commands/list_instances_spec.rb
285
288
  - spec/opsicle/commands/list_spec.rb
286
289
  - spec/opsicle/commands/ssh_key_spec.rb