napkin 0.0.5 → 0.0.6

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZTYyYjBhODc3ZjRiNGY1NTMxMDY2N2FjYTY4NGI5ZTdhYTk4ZjU2Mw==
4
+ ZmUwMTU1Mjk4MTEzNzU2YWQ5Y2RkMjVkMThlODMwOTYyOGE2ZWVkZQ==
5
5
  data.tar.gz: !binary |-
6
- ZTZiZjdiYzNkZjk5MmMxNmNiNDc0YWJhNjYyODYyNzhjOWM3YmRjNg==
6
+ Y2JkMmFmODkzNTliOTNkNWVjMTQ2MTNiNjVhODAzMTg3YWZhNjllOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZTNiYTc5MDdlOGNjOTk2MTY2ZDEwZjQzMmZhN2FmZGQ1YmZmZjMyNGUyNDMz
10
- ODJkMjRkNWFmMTYyM2Y0Y2JmZjM3NWEzMTJiYTFiMWJmM2RhMmRjYzY4YTFh
11
- NDc3OWE4ZmE3MTE1MDA3NDMyZmQ0YjM4Njk2MmZhYzU3ODgyNTU=
9
+ MDUzMjk2ZjljZWFjY2YzZjhmZjdmZWU4N2RhYjg3OWM4ZTkzNjA1ZjA1OWY2
10
+ NjdiZjM2YTcyYjBjYzlkNzViNDhmZDc0NWYwOWFlZmY5MGEzNDZlYTEzNzU0
11
+ NmYzYWI0YzU2MmU3MzJkZjczN2Y4MzkyMzU2ZWU0MDAzMGE0ODY=
12
12
  data.tar.gz: !binary |-
13
- ZjFmYjFhZWIxMzA1MDdmOWJkYzY5NzA5OTZjZjQxZDBkMGY0MzM1Yjk5Zjcy
14
- ZGU5YTQ0ZmY4ZWE1NjlmMjVkNzVjY2FkMWQyYzNmMGFmNzIyMTk5ODgxYjIz
15
- MDUwMTk2NmU3MmQwNTg5NmI1YmYyMjMxM2Q5ZTdjNWUxYTEzYjU=
13
+ YzkxNWNhZGQxZWExNTgzY2IyYjg4MGExOGVmMmZlNzAxOGRkYWZmZGI2NDEw
14
+ N2Y1YjM5N2Q5NmUyYjcwYmYyMDdjMGZjZGMzMDM1MTIwNjg3YzQ0MjU3ZTkw
15
+ ZDUzNGM5NTljOWRiZWE3ZWIwZGY3NTM1YWE1MGNhNzYyZjBkMWU=
@@ -1,35 +1,59 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- napkin (0.0.4)
4
+ napkin (0.0.5)
5
+ aws-sdk (>= 2.0)
6
+ httparty (>= 0.13.3)
5
7
  jenkins_api_client (~> 1.3.0)
6
8
  octokit (~> 3.0)
7
9
  semantic (~> 1.3.0)
10
+ sshkit (>= 1.7.1)
8
11
  thor (~> 0.19.1)
9
12
 
10
13
  GEM
11
14
  remote: https://rubygems.org/
12
15
  specs:
13
- addressable (2.3.6)
16
+ addressable (2.3.7)
14
17
  ast (2.0.0)
18
+ aws-sdk (2.0.31)
19
+ aws-sdk-resources (= 2.0.31)
20
+ aws-sdk-core (2.0.31)
21
+ builder (~> 3.0)
22
+ jmespath (~> 1.0)
23
+ multi_json (~> 1.0)
24
+ multi_xml (~> 0.5)
25
+ aws-sdk-resources (2.0.31)
26
+ aws-sdk-core (= 2.0.31)
27
+ builder (3.2.2)
15
28
  coderay (1.1.0)
16
- faraday (0.9.0)
29
+ colorize (0.7.5)
30
+ faraday (0.9.1)
17
31
  multipart-post (>= 1.2, < 3)
32
+ httparty (0.13.3)
33
+ json (~> 1.8)
34
+ multi_xml (>= 0.5.2)
18
35
  jenkins_api_client (1.3.0)
19
36
  json
20
37
  mixlib-shellout (>= 1.1.0)
21
38
  nokogiri (~> 1.6.0)
22
39
  terminal-table (>= 1.4.0)
23
40
  thor (>= 0.16.0)
41
+ jmespath (1.0.2)
42
+ multi_json (~> 1.0)
24
43
  json (1.8.1)
25
44
  method_source (0.8.2)
26
45
  mini_portile (0.6.2)
27
46
  mixlib-shellout (2.0.1)
47
+ multi_json (1.11.0)
48
+ multi_xml (0.5.5)
28
49
  multipart-post (2.0.0)
50
+ net-scp (1.2.1)
51
+ net-ssh (>= 2.6.5)
52
+ net-ssh (2.9.2)
29
53
  nokogiri (1.6.6.2)
30
54
  mini_portile (~> 0.6.0)
31
- octokit (3.2.0)
32
- sawyer (~> 0.5.3)
55
+ octokit (3.8.0)
56
+ sawyer (~> 0.6.0, >= 0.5.3)
33
57
  parser (2.2.0.pre.3)
34
58
  ast (>= 1.1, < 3.0)
35
59
  slop (~> 3.4, >= 3.4.5)
@@ -46,11 +70,15 @@ GEM
46
70
  rainbow (>= 1.99.1, < 3.0)
47
71
  ruby-progressbar (~> 1.4)
48
72
  ruby-progressbar (1.5.1)
49
- sawyer (0.5.4)
73
+ sawyer (0.6.0)
50
74
  addressable (~> 2.3.5)
51
75
  faraday (~> 0.8, < 0.10)
52
76
  semantic (1.3.1)
53
77
  slop (3.6.0)
78
+ sshkit (1.7.1)
79
+ colorize (>= 0.7.0)
80
+ net-scp (>= 1.1.2)
81
+ net-ssh (>= 2.8.0)
54
82
  terminal-table (1.4.5)
55
83
  thor (0.19.1)
56
84
 
@@ -4,6 +4,7 @@ require 'thor'
4
4
 
5
5
  require_relative './cli/github'
6
6
  require_relative './cli/jenkins'
7
+ require_relative './cli/staging'
7
8
  require_relative './cli/tools'
8
9
 
9
10
  module Napkin
@@ -14,6 +15,9 @@ module Napkin
14
15
  desc 'jenkins', 'manage a jenkins instance'
15
16
  subcommand 'jenkins', Jenkins
16
17
 
18
+ desc 'staging', 'manage the staging (branch) environment'
19
+ subcommand 'staging', Staging
20
+
17
21
  desc 'tools', 'install and configure tools for builds'
18
22
  subcommand 'tools', Tools
19
23
  end
@@ -0,0 +1,155 @@
1
+ # encoding: utf-8
2
+
3
+ require 'aws-sdk'
4
+ require 'aws-sdk-resources'
5
+ require 'httparty'
6
+ require 'sshkit'
7
+ require 'sshkit/dsl'
8
+
9
+ require 'pp'
10
+
11
+ SSHKit::Backend::Netssh.configure do |ssh|
12
+ ssh.connection_timeout = 30
13
+ ssh.ssh_options = {
14
+ :keys => [ File.join(ENV['HOME'], '.ssh', 'new_chef_deployer.pem') ],
15
+ :user => 'ubuntu',
16
+ :user_known_hosts_file => '/dev/null'
17
+ }
18
+ end
19
+
20
+ module Napkin
21
+ class CLI < Thor
22
+ class Staging < Thor
23
+ include Thor::Actions
24
+
25
+ desc 'list', 'list all hosts in the staging environment'
26
+ def list
27
+ instances.each do |instance|
28
+ name = instance.tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
29
+ say "#{name.ljust(30)}\t#{instance.instance_id}\t#{instance.public_dns_name}"
30
+ end
31
+ end
32
+
33
+ desc 'show ID', 'show the instance ID details'
34
+ def show(id)
35
+ name = instance(id).tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
36
+ say "#{name.ljust(30)}\t#{instance(id).instance_id}\t#{instance(id).public_dns_name}"
37
+ end
38
+
39
+ desc 'check_active ID', 'check if an instance is active'
40
+ def check_active(id)
41
+ commands = [
42
+ SSHKit::Command.new("[ `cat /proc/uptime | awk '{ printf \"%.0f\",($1/60/60/24) }'` -lt 3 ] && echo to_keep"),
43
+ SSHKit::Command.new("cat /lift/logs/nginx/*.log | grep -v robots.txt | grep 'HTTP/1.1\" 200'"),
44
+ SSHKit::Command.new("zcat /lift/logs/nginx/*.log.*.gz | grep -v robots.txt | grep 'HTTP/1.1\" 200' | egrep \"`date +%d/%b/%Y --date='1 day ago'`|`date +%d/%b/%Y --date='2 days ago'`\"")
45
+ ]
46
+
47
+ !check(id, *commands).empty?
48
+ end
49
+
50
+ desc 'destroy_inactive', 'destroy all inactive instances'
51
+ def destroy_inactive
52
+ instances.each do |i|
53
+ destroy(i.instance_id)
54
+ end
55
+ end
56
+
57
+ desc 'destroy ID', 'destroy an instance by ID'
58
+ method_option :force,
59
+ :aliases => '-f',
60
+ :default => false,
61
+ :desc => 'Force the destruction of the instance',
62
+ :required => false,
63
+ :type => :boolean
64
+ def destroy(id)
65
+ if check_active(id) && !options[:force]
66
+ say "#{id} is still active. Use -f to force.", :red
67
+ return false
68
+ end
69
+ staging_name = name_for(instance(id)).rpartition('-').first
70
+ if staging_name.empty?
71
+ say "#{id} isn't a staging box.", :red
72
+ return false
73
+ end
74
+ instance_ids = instances(true).collect { |instance| name_for(instance).start_with?(staging_name) ? instance.instance_id : nil }.compact
75
+ instance_ids.each do |instance_id|
76
+ show(instance_id)
77
+ destroy_instance(instance_id)
78
+ end
79
+
80
+ notify(staging_name)
81
+ end
82
+
83
+ private
84
+
85
+ def notify(name)
86
+ options = {
87
+ :headers => {
88
+ 'Content-Type' => 'application/json'
89
+ },
90
+ :body => {
91
+ :build => {
92
+ :phase => 'FINISHED',
93
+ :status => 'SUCCESS',
94
+ :parameters => {
95
+ :NODE_NAME => name
96
+ }
97
+ }
98
+ }.to_json
99
+ }
100
+ HTTParty.post('http://lift-jarvis.herokuapp.com/jenkins/branch_destroy', options)
101
+ end
102
+
103
+ def destroy_instance(id)
104
+ say "destroying #{id}", :cyan
105
+ instance(id).terminate
106
+ end
107
+
108
+ def name_for(instance)
109
+ instance.tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
110
+ rescue NoMethodError
111
+ ''
112
+ end
113
+
114
+ def check(id, *commands)
115
+ hostname = instance(id).public_dns_name
116
+ name = instance(id).tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
117
+ say "checking #{hostname} (#{name})", :blue
118
+ output = ''
119
+
120
+ on hostname do
121
+ commands.each do |command|
122
+ begin
123
+ output << capture(command)
124
+ rescue SSHKit::Command::Failed
125
+ # command failed, with a status code > 0, which means there were no logs found usually
126
+ end
127
+ end
128
+ end
129
+
130
+ output
131
+ end
132
+
133
+ def instance(id)
134
+ unless @instance_id == id
135
+ @instance = nil
136
+ @instance_id = id
137
+ end
138
+
139
+ @instance ||= Aws::EC2::Resource.new.instance(id)
140
+ end
141
+
142
+ def instances(all = false)
143
+ unless @all == all
144
+ @instances = nil
145
+ @all = all
146
+ end
147
+ @instances ||= ec2.describe_instances.reservations.map { |r| r.instances.map { |instance| instance if instance.tags.any? { |tag| tag.key == 'Name' && tag.value.end_with?('apps') || all } } }.flatten.compact.reject { |i| i.state.name != 'running' }
148
+ end
149
+
150
+ def ec2
151
+ @ec2 ||= Aws::EC2::Client.new(:region => 'us-east-1')
152
+ end
153
+ end
154
+ end
155
+ end
@@ -3,7 +3,7 @@
3
3
  require 'semantic'
4
4
 
5
5
  module Napkin
6
- VERSION = Semantic::Version.new('0.0.5')
6
+ VERSION = Semantic::Version.new('0.0.6')
7
7
 
8
8
  MAJOR = VERSION.major
9
9
  MINOR = VERSION.minor
@@ -28,9 +28,12 @@ Gem::Specification.new do |spec|
28
28
  end
29
29
 
30
30
  {
31
+ 'aws-sdk' => '>= 2.0',
32
+ 'httparty' => '>= 0.13.3',
31
33
  'jenkins_api_client' => '~> 1.3.0',
32
34
  'octokit' => '~> 3.0',
33
35
  'semantic' => '~> 1.3.0',
36
+ 'sshkit' => '>= 1.7.1',
34
37
  'thor' => '~> 0.19.1'
35
38
  }.each_pair do |dep, ver|
36
39
  spec.add_dependency(dep, ver)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: napkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Daniel
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.24.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: httparty
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.13.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.13.3
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: jenkins_api_client
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +108,20 @@ dependencies:
80
108
  - - ~>
81
109
  - !ruby/object:Gem::Version
82
110
  version: 1.3.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: sshkit
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.7.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: 1.7.1
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: thor
85
127
  requirement: !ruby/object:Gem::Requirement
@@ -111,6 +153,7 @@ files:
111
153
  - lib/napkin/cli.rb
112
154
  - lib/napkin/cli/github.rb
113
155
  - lib/napkin/cli/jenkins.rb
156
+ - lib/napkin/cli/staging.rb
114
157
  - lib/napkin/cli/tools.rb
115
158
  - lib/napkin/files/lifted-chef.erb
116
159
  - lib/napkin/version.rb