sonic-screwdriver 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Gemfile.lock +26 -2
  4. data/README.md +156 -23
  5. data/bin/sonic +8 -1
  6. data/docs/.gitignore +4 -0
  7. data/docs/CNAME +1 -0
  8. data/docs/Gemfile +3 -0
  9. data/docs/LICENSE +21 -0
  10. data/docs/README.md +21 -0
  11. data/docs/_config.yml +69 -0
  12. data/docs/_docs/commands.md +10 -0
  13. data/docs/_docs/how-it-works.md +34 -0
  14. data/docs/_docs/install.md +75 -0
  15. data/docs/_docs/next-steps.md +18 -0
  16. data/docs/_docs/settings.md +73 -0
  17. data/docs/_docs/sonic-ecs-exec.md +7 -0
  18. data/docs/_docs/sonic-ecs-run.md +7 -0
  19. data/docs/_docs/sonic-execute.md +7 -0
  20. data/docs/_docs/sonic-help.md +7 -0
  21. data/docs/_docs/sonic-list.md +7 -0
  22. data/docs/_docs/sonic-ssh.md +7 -0
  23. data/docs/_docs/tutorial-ecs-exec.md +69 -0
  24. data/docs/_docs/tutorial-ecs-run.md +94 -0
  25. data/docs/_docs/tutorial-execute.md +38 -0
  26. data/docs/_docs/tutorial-ssh.md +119 -0
  27. data/docs/_docs/tutorial.md +11 -0
  28. data/docs/_docs/why.md +27 -0
  29. data/docs/_includes/about.html +19 -0
  30. data/docs/_includes/commands.html +28 -0
  31. data/docs/_includes/contact.html +17 -0
  32. data/docs/_includes/contact_disqus.html +16 -0
  33. data/docs/_includes/contact_static.html +17 -0
  34. data/docs/_includes/content.html +21 -0
  35. data/docs/_includes/css/bootstrap.min.css +7 -0
  36. data/docs/_includes/css/main.css +481 -0
  37. data/docs/_includes/css/quotes.css +102 -0
  38. data/docs/_includes/css/sonic.css +163 -0
  39. data/docs/_includes/css/syntax.css +60 -0
  40. data/docs/_includes/css/table.css +53 -0
  41. data/docs/_includes/css/timeline.css +201 -0
  42. data/docs/_includes/edit-on-github.html +11 -0
  43. data/docs/_includes/example.html +21 -0
  44. data/docs/_includes/footer.html +49 -0
  45. data/docs/_includes/head.html +32 -0
  46. data/docs/_includes/header.html +15 -0
  47. data/docs/_includes/js.html +28 -0
  48. data/docs/_includes/js_disqus.html +21 -0
  49. data/docs/_includes/modals.html +40 -0
  50. data/docs/_includes/nav.html +27 -0
  51. data/docs/_includes/quotes.html +19 -0
  52. data/docs/_includes/subnav.html +35 -0
  53. data/docs/_includes/ufo-ship-options.md +13 -0
  54. data/docs/_includes/uses.html +19 -0
  55. data/docs/_layouts/default.html +11 -0
  56. data/docs/_layouts/style.css +6 -0
  57. data/docs/articles.md +5 -0
  58. data/docs/css/font-awesome/css/font-awesome.css +1566 -0
  59. data/docs/css/font-awesome/css/font-awesome.min.css +4 -0
  60. data/docs/css/font-awesome/fonts/FontAwesome.otf +0 -0
  61. data/docs/css/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  62. data/docs/css/font-awesome/fonts/fontawesome-webfont.svg +504 -0
  63. data/docs/css/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  64. data/docs/css/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  65. data/docs/docs.md +21 -0
  66. data/docs/img/logos/boltops-logo-full.png +0 -0
  67. data/docs/img/logos/boltops-logo.png +0 -0
  68. data/docs/img/sonic-screwdriver.jpg +0 -0
  69. data/docs/img/tutorials/ec2-console-public-ip.png +0 -0
  70. data/docs/img/ufo.jpg +0 -0
  71. data/docs/index.html +9 -0
  72. data/docs/js/bootstrap.js +2114 -0
  73. data/docs/js/bootstrap.min.js +6 -0
  74. data/docs/js/cbpAnimatedHeader.js +44 -0
  75. data/docs/js/cbpAnimatedHeader.min.js +11 -0
  76. data/docs/js/classie.js +80 -0
  77. data/docs/js/contact_me.js +70 -0
  78. data/docs/js/contact_me_static.js +23 -0
  79. data/docs/js/freelancer.js +37 -0
  80. data/docs/js/jqBootstrapValidation.js +912 -0
  81. data/docs/js/jquery-1.11.0.js +4 -0
  82. data/docs/js/jquery.easing.min.js +44 -0
  83. data/docs/js/nav.js +53 -0
  84. data/docs/quick-start.md +39 -0
  85. data/docs/style.css +3 -0
  86. data/lib/bash_scripts/docker-exec.sh +15 -0
  87. data/lib/bash_scripts/docker-run.sh +15 -0
  88. data/lib/sonic.rb +11 -2
  89. data/lib/sonic/aws_services.rb +19 -0
  90. data/lib/sonic/cli.rb +37 -8
  91. data/lib/sonic/cli/help.rb +123 -3
  92. data/lib/sonic/default/settings.yml +12 -0
  93. data/lib/sonic/docker.rb +128 -0
  94. data/lib/sonic/execute.rb +131 -0
  95. data/lib/sonic/list.rb +85 -0
  96. data/lib/sonic/settings.rb +80 -0
  97. data/lib/sonic/ssh.rb +136 -0
  98. data/lib/sonic/ssh/ec2_tag.rb +59 -0
  99. data/lib/sonic/ssh/identifier_detector.rb +145 -0
  100. data/lib/sonic/ui.rb +26 -0
  101. data/lib/sonic/version.rb +2 -2
  102. data/qa.md +21 -0
  103. data/sonic.gemspec +3 -1
  104. data/spec/fixtures/home/.gitkeep +0 -0
  105. data/spec/fixtures/project/.gitkeep +0 -0
  106. data/spec/fixtures/project/command.txt +2 -0
  107. data/spec/lib/cli_spec.rb +16 -6
  108. data/spec/lib/sonic/execute_spec.rb +35 -0
  109. data/spec/spec_helper.rb +5 -3
  110. metadata +133 -3
@@ -0,0 +1,145 @@
1
+ module Sonic
2
+ class Ssh
3
+ autoload :Ec2Tag, 'sonic/ssh/ec2_tag'
4
+ class IdentifierDetector
5
+
6
+ include Ec2Tag
7
+ include AwsServices
8
+
9
+ def initialize(cluster, service, identifier, options)
10
+ @cluster = cluster
11
+ @service = service
12
+ @identifier = identifier
13
+ @options = options
14
+ end
15
+
16
+ # Returns exactly 1 instance_id or exits the program.
17
+ # The bang check_* methods can exit early.
18
+ def detect!
19
+ instance_id = case detected_type
20
+ when :ecs_container_instance_or_task_arn
21
+ check_cluster_exists! unless @options[:noop]
22
+
23
+ find_container_instance(@identifier) ||
24
+ find_task(@identifier)
25
+ when :ecs_service
26
+ check_cluster_exists! unless @options[:noop]
27
+ check_service_exists!
28
+ check_tasks_running!
29
+
30
+ find_container_instance(task.container_instance_arn)
31
+ when :ec2_tag
32
+ find_ec2_instance
33
+ when :ec2_instance
34
+ @identifier
35
+ end
36
+ end
37
+
38
+ # Any of these methods either returns exactly 1 instance_id or exit the program.
39
+ #
40
+ # Returns detected_type
41
+ def detected_type
42
+ # Note order here matters because some checks are slower in performance
43
+ @detected_type ||= if instance_id? # fast
44
+ :ec2_instance
45
+ elsif container_instance_or_task_arn? # fast
46
+ :ecs_container_instance_or_task_arn
47
+ elsif ec2_tag_exists? # slow
48
+ :ec2_tag
49
+ else
50
+ :ecs_service # will be slower with the logic from the calling method
51
+ end
52
+ end
53
+
54
+ # takes argument
55
+ def find_container_instance(container_instance_arn)
56
+ response = ecs.describe_container_instances(
57
+ cluster: @cluster,
58
+ container_instances: [container_instance_arn])
59
+
60
+ container_instance = response.container_instances.first
61
+ return false unless container_instance
62
+
63
+ ec2_instance_id = container_instance.ec2_instance_id
64
+ end
65
+
66
+ def find_task(task_arn)
67
+ response = ecs.describe_tasks(cluster: @cluster, tasks: [task_arn])
68
+
69
+ task = response.tasks.first
70
+ unless task
71
+ puts "Unable to find a #{task_arn.green} container instance or task in the #{@cluster.green} cluster."
72
+ exit 1
73
+ end
74
+
75
+ find_container_instance(task.container_instance_arn)
76
+ end
77
+
78
+ def check_cluster_exists!
79
+ cluster = ecs.describe_clusters(clusters: [@cluster]).clusters.first
80
+ unless cluster
81
+ UI.error "The #{@cluster.green} cluster does not exist. Are you sure you specified the right cluster?"
82
+ exit 1
83
+ end
84
+ end
85
+
86
+ def check_service_exists!
87
+ begin
88
+ resp = ecs.describe_services(services: [@service], cluster: @cluster)
89
+ rescue Aws::ECS::Errors::ClusterNotFoundException
90
+ UI.error("Unable to find ECS cluster '#{@cluster}'. Are you sure the cluster exists?")
91
+ UI.say("You can specify the cluster with --cluster or you can specify it as a setting in settings.yml.")
92
+ UI.say("More info about settings available at: http://sonic-screwdriver.cloud/docs/settings")
93
+ exit 1
94
+ end
95
+
96
+ service = resp.services.first
97
+ unless service
98
+ UI.error "The #{@service.green} service does not exist in #{@cluster.green} cluster. Are you sure you specified the right service and cluster?"
99
+ exit 1
100
+ end
101
+ end
102
+
103
+ def check_tasks_running!
104
+ if task_arns.empty?
105
+ puts "Unable to find a running task that belongs to the #{@service} service on the #{@cluster} cluster."
106
+ puts "There must be a running task in order for sonic to look up an container instance."
107
+ exit 1
108
+ end
109
+ end
110
+
111
+ def task_arns
112
+ @task_arns ||= ecs.list_tasks(cluster: @cluster, service_name: @service).task_arns
113
+ end
114
+
115
+ # Only need one container instance to ssh into so we'll just use the first.
116
+ # Useful to have this in a method for subclasses like Sonic::Exec.
117
+ def task
118
+ @task ||= ecs.describe_tasks(cluster: @cluster, tasks: [task_arns.first]).tasks.first
119
+ end
120
+
121
+
122
+ # Examples:
123
+ #
124
+ # Container instance ids:
125
+ # b748e59a-b679-42a7-b713-afb12294935b
126
+ # 9f1dadc7-4f67-41da-abec-ec08810bfbc9
127
+ #
128
+ # Task ids:
129
+ # 222c9e66-780b-4755-8c16-8670988e8011
130
+ # 6358f9c2-b231-4f5b-a59b-15bf19d52a15
131
+ #
132
+ # Container instance and task ids have the same format
133
+ def container_instance_or_task_arn?
134
+ @identifier =~ /.{8}-.{4}-.{4}-.{4}-.{12}/
135
+ end
136
+
137
+ # Examples:
138
+ # i-006a097bb10643e20
139
+ def instance_id?
140
+ @identifier =~ /i-.{17}/
141
+ end
142
+
143
+ end
144
+ end
145
+ end
data/lib/sonic/ui.rb ADDED
@@ -0,0 +1,26 @@
1
+ module Sonic
2
+ class UI
3
+ class << self
4
+ @@mute = false
5
+ def mute
6
+ @@mute
7
+ end
8
+ def mute=(v)
9
+ @@mute=v
10
+ end
11
+
12
+ @@noop = false
13
+ def noop=(v)
14
+ @@noop=v
15
+ end
16
+
17
+ def say(msg='')
18
+ msg = "NOOP: #{msg}" if @@noop
19
+ puts msg unless mute
20
+ end
21
+ def error(msg='')
22
+ say "ERROR: #{msg}".colorize(:red)
23
+ end
24
+ end
25
+ end
26
+ end
data/lib/sonic/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sonic
2
- VERSION = "0.0.1"
3
- end
2
+ VERSION = "1.0.0"
3
+ end
data/qa.md ADDED
@@ -0,0 +1,21 @@
1
+ # QA Notes
2
+
3
+ sonic ssh [INSTANCE_ID]
4
+ * when instance is ready
5
+ * when instance is terminated
6
+ * when instance is pending
7
+ * when instance does not exist
8
+
9
+ sonic ssh [ECS_CONTAINER_ID]
10
+ * when container instance found
11
+ * when container instance is terminated
12
+ * when container instance does not exist
13
+
14
+ sonic ssh [ECS_SERVICE]
15
+ * when service found and instance found
16
+ * when service found but instance not found
17
+ * when service not found
18
+
19
+ sonic ssh [ECS_TASK_ID]
20
+ * when task found and instance found
21
+ * when task not found
data/sonic.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "sonic-screwdriver"
8
8
  spec.version = Sonic::VERSION
9
9
  spec.authors = ["Tung Nguyen"]
10
- spec.email = ["tongueroo@gmail.com"]
10
+ spec.email = ["tung@boltops.com"]
11
11
  spec.description = %q{Multi-functional tool to manage AWS infrastructure}
12
12
  spec.summary = %q{Multi-functional tool to manage AWS infrastructure}
13
13
  spec.homepage = ""
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "thor"
22
22
  spec.add_dependency "hashie"
23
23
  spec.add_dependency "colorize"
24
+ spec.add_dependency "aws-sdk"
25
+ spec.add_dependency "tty-prompt"
24
26
 
25
27
  spec.add_development_dependency "bundler", "~> 1.3"
26
28
  spec.add_development_dependency "rake"
File without changes
File without changes
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env ruby
2
+ puts "hi"
data/spec/lib/cli_spec.rb CHANGED
@@ -2,18 +2,28 @@ require 'spec_helper'
2
2
 
3
3
  # to run specs with what's remembered from vcr
4
4
  # $ rake
5
- #
5
+ #
6
6
  # to run specs with new fresh data from aws api calls
7
7
  # $ rake clean:vcr ; time rake
8
8
  describe Sonic::CLI do
9
9
  before(:all) do
10
- @args = "--from Tung"
10
+ @args = "--project-root spec/fixtures/project --noop"
11
11
  end
12
12
 
13
13
  describe "sonic" do
14
- it "should hello world" do
15
- out = execute("bin/sonic hello world #{@args}")
16
- expect(out).to include("from: Tung\nHello world")
14
+ it "ssh should print out ssh command to be ran" do
15
+ out = execute("bin/sonic ssh my-service #{@args} --cluster default")
16
+ expect(out).to include("=> ssh")
17
+ end
18
+
19
+ it "execute should print that command has been sent" do
20
+ out = execute("bin/sonic execute #{@args} --filter 1,2,3 uptime")
21
+ expect(out).to include("Command sent")
22
+ end
23
+
24
+ it "list should list running instances" do
25
+ out = execute("bin/sonic list #{@args} --filter 1,2,3 --header")
26
+ expect(out).to include("Instance Id")
17
27
  end
18
28
  end
19
- end
29
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonic::Execute do
4
+ before(:each) do
5
+ @options = {
6
+ project_root: "spec/fixtures/project",
7
+ filter: "hi-web-stag,hi-clock-stag"
8
+ }
9
+ end
10
+
11
+ describe "Sonic#execute" do
12
+ it "should build up options for ssm send command with inline command" do
13
+ execute = Sonic::Execute.new(["uname", "-a"], @options)
14
+ options = execute.build_ssm_options
15
+ expect(options[:instance_ids]).to eq nil
16
+ expect(options[:targets]).to eq [{:key=>"tag:Name", :values=>%w[hi-web-stag hi-clock-stag]}]
17
+ expect(options[:document_name]).to eq "AWS-RunShellScript"
18
+ expect(options[:comment]).to include "sonic "
19
+ expect(options[:parameters]["commands"]).to eq ["uname -a"]
20
+ end
21
+
22
+ it "should build up options for ssm send command with file" do
23
+ execute = Sonic::Execute.new(["file://command.txt"], @options)
24
+ options = execute.build_ssm_options
25
+ expect(options[:instance_ids]).to eq nil
26
+ expect(options[:targets]).to eq [{:key=>"tag:Name", :values=>%w[hi-web-stag hi-clock-stag]}]
27
+ expect(options[:document_name]).to eq "AWS-RunShellScript"
28
+ expect(options[:comment]).to include "sonic "
29
+ expect(options[:parameters]["commands"]).to eq([
30
+ '#!/usr/bin/env ruby',
31
+ 'puts "hi"'
32
+ ])
33
+ end
34
+ end
35
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  ENV['TEST'] = '1'
2
+ # Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
3
+ ENV['HOME'] = "spec/fixtures/home"
2
4
 
3
- require 'simplecov'
4
- SimpleCov.start
5
+ # Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
6
+ ENV['HOME'] = "spec/fixtures/home"
5
7
 
6
8
  require "pp"
7
9
 
@@ -19,4 +21,4 @@ end
19
21
 
20
22
  RSpec.configure do |c|
21
23
  c.include Helpers
22
- end
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sonic-screwdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-13 00:00:00.000000000 Z
11
+ date: 2017-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-prompt
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: bundler
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -124,7 +152,7 @@ dependencies:
124
152
  version: '0'
125
153
  description: Multi-functional tool to manage AWS infrastructure
126
154
  email:
127
- - tongueroo@gmail.com
155
+ - tung@boltops.com
128
156
  executables:
129
157
  - sonic
130
158
  extensions: []
@@ -132,6 +160,7 @@ extra_rdoc_files: []
132
160
  files:
133
161
  - ".gitignore"
134
162
  - ".rspec"
163
+ - CHANGELOG.md
135
164
  - Gemfile
136
165
  - Gemfile.lock
137
166
  - Guardfile
@@ -139,13 +168,110 @@ files:
139
168
  - README.md
140
169
  - Rakefile
141
170
  - bin/sonic
171
+ - docs/.gitignore
172
+ - docs/CNAME
173
+ - docs/Gemfile
174
+ - docs/LICENSE
175
+ - docs/README.md
176
+ - docs/_config.yml
177
+ - docs/_docs/commands.md
178
+ - docs/_docs/how-it-works.md
179
+ - docs/_docs/install.md
180
+ - docs/_docs/next-steps.md
181
+ - docs/_docs/settings.md
182
+ - docs/_docs/sonic-ecs-exec.md
183
+ - docs/_docs/sonic-ecs-run.md
184
+ - docs/_docs/sonic-execute.md
185
+ - docs/_docs/sonic-help.md
186
+ - docs/_docs/sonic-list.md
187
+ - docs/_docs/sonic-ssh.md
188
+ - docs/_docs/tutorial-ecs-exec.md
189
+ - docs/_docs/tutorial-ecs-run.md
190
+ - docs/_docs/tutorial-execute.md
191
+ - docs/_docs/tutorial-ssh.md
192
+ - docs/_docs/tutorial.md
193
+ - docs/_docs/why.md
194
+ - docs/_includes/about.html
195
+ - docs/_includes/commands.html
196
+ - docs/_includes/contact.html
197
+ - docs/_includes/contact_disqus.html
198
+ - docs/_includes/contact_static.html
199
+ - docs/_includes/content.html
200
+ - docs/_includes/css/bootstrap.min.css
201
+ - docs/_includes/css/main.css
202
+ - docs/_includes/css/quotes.css
203
+ - docs/_includes/css/sonic.css
204
+ - docs/_includes/css/syntax.css
205
+ - docs/_includes/css/table.css
206
+ - docs/_includes/css/timeline.css
207
+ - docs/_includes/edit-on-github.html
208
+ - docs/_includes/example.html
209
+ - docs/_includes/footer.html
210
+ - docs/_includes/head.html
211
+ - docs/_includes/header.html
212
+ - docs/_includes/js.html
213
+ - docs/_includes/js_disqus.html
214
+ - docs/_includes/modals.html
215
+ - docs/_includes/nav.html
216
+ - docs/_includes/quotes.html
217
+ - docs/_includes/subnav.html
218
+ - docs/_includes/ufo-ship-options.md
219
+ - docs/_includes/uses.html
220
+ - docs/_layouts/default.html
221
+ - docs/_layouts/style.css
222
+ - docs/articles.md
223
+ - docs/css/font-awesome/css/font-awesome.css
224
+ - docs/css/font-awesome/css/font-awesome.min.css
225
+ - docs/css/font-awesome/fonts/FontAwesome.otf
226
+ - docs/css/font-awesome/fonts/fontawesome-webfont.eot
227
+ - docs/css/font-awesome/fonts/fontawesome-webfont.svg
228
+ - docs/css/font-awesome/fonts/fontawesome-webfont.ttf
229
+ - docs/css/font-awesome/fonts/fontawesome-webfont.woff
230
+ - docs/docs.md
231
+ - docs/img/logos/boltops-logo-full.png
232
+ - docs/img/logos/boltops-logo.png
233
+ - docs/img/sonic-screwdriver.jpg
234
+ - docs/img/tutorials/ec2-console-public-ip.png
235
+ - docs/img/ufo.jpg
236
+ - docs/index.html
237
+ - docs/js/bootstrap.js
238
+ - docs/js/bootstrap.min.js
239
+ - docs/js/cbpAnimatedHeader.js
240
+ - docs/js/cbpAnimatedHeader.min.js
241
+ - docs/js/classie.js
242
+ - docs/js/contact_me.js
243
+ - docs/js/contact_me_static.js
244
+ - docs/js/freelancer.js
245
+ - docs/js/jqBootstrapValidation.js
246
+ - docs/js/jquery-1.11.0.js
247
+ - docs/js/jquery.easing.min.js
248
+ - docs/js/nav.js
249
+ - docs/quick-start.md
250
+ - docs/style.css
251
+ - lib/bash_scripts/docker-exec.sh
252
+ - lib/bash_scripts/docker-run.sh
142
253
  - lib/sonic.rb
254
+ - lib/sonic/aws_services.rb
143
255
  - lib/sonic/cli.rb
144
256
  - lib/sonic/cli/help.rb
145
257
  - lib/sonic/command.rb
258
+ - lib/sonic/default/settings.yml
259
+ - lib/sonic/docker.rb
260
+ - lib/sonic/execute.rb
261
+ - lib/sonic/list.rb
262
+ - lib/sonic/settings.rb
263
+ - lib/sonic/ssh.rb
264
+ - lib/sonic/ssh/ec2_tag.rb
265
+ - lib/sonic/ssh/identifier_detector.rb
266
+ - lib/sonic/ui.rb
146
267
  - lib/sonic/version.rb
268
+ - qa.md
147
269
  - sonic.gemspec
270
+ - spec/fixtures/home/.gitkeep
271
+ - spec/fixtures/project/.gitkeep
272
+ - spec/fixtures/project/command.txt
148
273
  - spec/lib/cli_spec.rb
274
+ - spec/lib/sonic/execute_spec.rb
149
275
  - spec/spec_helper.rb
150
276
  homepage: ''
151
277
  licenses:
@@ -172,5 +298,9 @@ signing_key:
172
298
  specification_version: 4
173
299
  summary: Multi-functional tool to manage AWS infrastructure
174
300
  test_files:
301
+ - spec/fixtures/home/.gitkeep
302
+ - spec/fixtures/project/.gitkeep
303
+ - spec/fixtures/project/command.txt
175
304
  - spec/lib/cli_spec.rb
305
+ - spec/lib/sonic/execute_spec.rb
176
306
  - spec/spec_helper.rb