napkin 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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