sonic-screwdriver 1.2.0 → 1.3.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 +4 -4
- data/CHANGELOG.md +3 -0
- data/docs/_docs/settings.md +26 -3
- data/docs/_docs/tutorial-execute.md +4 -5
- data/docs/_docs/tutorial-list.md +50 -0
- data/docs/_includes/subnav.html +1 -0
- data/lib/sonic/cli.rb +1 -0
- data/lib/sonic/default/settings.yml +5 -1
- data/lib/sonic/execute.rb +91 -38
- data/lib/sonic/list.rb +14 -12
- data/lib/sonic/settings.rb +36 -2
- data/lib/sonic/ssh.rb +1 -1
- data/lib/sonic/ui.rb +3 -0
- data/lib/sonic/version.rb +1 -1
- data/spec/lib/sonic/execute_spec.rb +3 -5
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd37ca876dccfeb67a1540e2af0f312fafcde6a3
|
4
|
+
data.tar.gz: c728fd9cf1da7019cc2738912d372f937e36704d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04f2e8e50729ca19e70a5fdd720cdcef5bdbe1bef20f14c93287811ba44ca8864760715ab55af8a93ce609d3b4759cbb1c304640e981d765b72143f49deec99d
|
7
|
+
data.tar.gz: 67357d39582de07b37672ae14a101515afe8eb9be1569199a2eaa0b9f59226577c444a25530f8067427973351f04309fc0ec5ca7a56ca2d478462f988a19df24
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,9 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [1.3.0]
|
7
|
+
- support for different bastion cluster host mapping in settings
|
8
|
+
|
6
9
|
## [1.2.0]
|
7
10
|
- add old instance id support
|
8
11
|
- update docs and help
|
data/docs/_docs/settings.md
CHANGED
@@ -11,7 +11,11 @@ You can adjust the behavior of sonic and set some handy default values with `set
|
|
11
11
|
Here is an `settings.yml` example:
|
12
12
|
|
13
13
|
```yaml
|
14
|
-
bastion:
|
14
|
+
bastion: # cluster_host mapping
|
15
|
+
default: # default is nil - which means a bastion host wont be used
|
16
|
+
# Examples:
|
17
|
+
# prod: bastion.mydomain.com
|
18
|
+
# stag: ubuntu@bastion-stag.mydomain.com
|
15
19
|
host_key_check: false
|
16
20
|
service_cluster:
|
17
21
|
default: # defaults to nil
|
@@ -28,13 +32,32 @@ The following table covers the different setting options:
|
|
28
32
|
|
29
33
|
Setting | Description | Default
|
30
34
|
------------- | ------------- | -------------
|
31
|
-
bastion | Bastion
|
35
|
+
bastion | Bastion mapping allows you to set a bastion host on a per ECS cluster basis. The bastion host is used as the jump host. Examples: bastion.mydomain.com, myuser@bastion.myuser.com or 123.123.123.123. | (no value)
|
32
36
|
host_key_check | Controls whether or not use the strict host checking ssh option. Since EC2 server host changes often the default value is false. | false
|
33
37
|
service_cluster | Service to cluster mapping. This is a Hash structure that maps the service name to cluster names. | (no value)
|
34
38
|
user | User to ssh into the server with. This can be overriden at the CLI with the user@host notation but can be set in the settings.yml file also. | ec2-user
|
35
39
|
|
36
40
|
The default settings are located tool source code at [lib/sonic/default/settings.yml](https://github.com/boltopslabs/sonic/blob/master/lib/sonic/default/settings.yml).
|
37
41
|
|
42
|
+
### Bastion cluster to host mapping
|
43
|
+
|
44
|
+
Provided this example:
|
45
|
+
|
46
|
+
```yaml
|
47
|
+
bastion: # cluster_host mapping
|
48
|
+
default: ec2-user@bastion.mydomain.com
|
49
|
+
prod: ec2-user@bastion.mydomain.com
|
50
|
+
stag: ubuntu@bastion-stag.mydomain.com
|
51
|
+
```
|
52
|
+
|
53
|
+
This results in
|
54
|
+
|
55
|
+
```sh
|
56
|
+
sonic ssh --cluster prod [IDENTIFER] # ec2-user@bastion.mydomain.com used as the bastion host
|
57
|
+
sonic ssh --cluster stag [IDENTIFER] # ubuntu@bastion-stag.mydomain.com used as the bastion host
|
58
|
+
sonic ssh --cluster whatever [IDENTIFER] # ec2-user@bastion.mydomain.com used as the bastion host
|
59
|
+
```
|
60
|
+
|
38
61
|
### Service to Cluster Mapping
|
39
62
|
|
40
63
|
One of the useful options is the `service_cluster`. This option maps service names to cluster names. This saves you from typing the `--cluster` option over and over. Here is an example `~/.sonic/settings.yml`:
|
@@ -68,6 +91,6 @@ sonic ssh hi-worker-stag --cluster stag
|
|
68
91
|
```
|
69
92
|
|
70
93
|
|
71
|
-
<a id="prev" class="btn btn-basic" href="{% link _docs/tutorial-
|
94
|
+
<a id="prev" class="btn btn-basic" href="{% link _docs/tutorial-list.md %}">Back</a>
|
72
95
|
<a id="next" class="btn btn-primary" href="{% link _docs/help.md %}">Next Step</a>
|
73
96
|
<p class="keyboard-tip">Pro tip: Use the <- and -> arrow keys to move back and forward.</p>
|
@@ -15,7 +15,6 @@ Examples:
|
|
15
15
|
```sh
|
16
16
|
sonic execute hi-web-stag uptime
|
17
17
|
sonic execute hi-web-prod uptime
|
18
|
-
sonic execute hi-web-prod,hi-worker-prod,hi-clock-prod uptime
|
19
18
|
sonic execute i-030033c20c54bf149,i-030033c20c54bf150 uname -a
|
20
19
|
sonic execute i-030033c20c54bf149 file://hello.sh
|
21
20
|
```
|
@@ -42,12 +41,12 @@ The output of the commands ran are also showed in the EC2 Run Command Console.
|
|
42
41
|
|
43
42
|
### Polymorphic Filter
|
44
43
|
|
45
|
-
The `sonic execute` command can understand a variety of different filters. The filters can be a list of instances ids or
|
44
|
+
The `sonic execute` command can understand a variety of different filters. The filters can be a list of instances ids or one EC2 tag value. Note, ECS service names are *not* supported for the filter.
|
46
45
|
|
47
|
-
Here is an example, where the uptime command will run on
|
46
|
+
Here is an example, where the uptime command will run on both i-030033c20c54bf149 and i-030033c20c54bf150 instances.
|
48
47
|
|
49
48
|
```sh
|
50
|
-
sonic execute
|
49
|
+
sonic execute i-066b140d9479e9681,i-09482b1a6e330fbf7 uptime
|
51
50
|
```
|
52
51
|
|
53
52
|
### Run Scripts
|
@@ -75,5 +74,5 @@ The `sonic execute` command relies on EC2 Run Manager. So you will need to have
|
|
75
74
|
* You can read on [Why EC2 Run Manager]({% link _docs/why-ec2-run-command.md %}) is used also.
|
76
75
|
|
77
76
|
<a id="prev" class="btn btn-basic" href="{% link _docs/tutorial-ecs-run.md %}">Back</a>
|
78
|
-
<a id="next" class="btn btn-primary" href="{% link _docs/
|
77
|
+
<a id="next" class="btn btn-primary" href="{% link _docs/tutorial-list.md %}">Next Step</a>
|
79
78
|
<p class="keyboard-tip">Pro tip: Use the <- and -> arrow keys to move back and forward.</p>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
title: Sonic List
|
3
|
+
---
|
4
|
+
|
5
|
+
Sonic provides a quick way to list your instances.
|
6
|
+
|
7
|
+
```sh
|
8
|
+
sonic list [FILTER]
|
9
|
+
```
|
10
|
+
|
11
|
+
Example:
|
12
|
+
|
13
|
+
```sh
|
14
|
+
sonic list i-066b140d9479e9681,i-09482b1a6e330fbf7
|
15
|
+
sonic list ec2-tag-1,ec2-tag-2
|
16
|
+
```
|
17
|
+
|
18
|
+
You should see something like this:
|
19
|
+
|
20
|
+
```sh
|
21
|
+
$ sonic list i-066b140d9479e9681,i-09482b1a6e330fbf7
|
22
|
+
i-09482b1a6e330fbf7 prod-20170416110240 54.202.152.168 172.31.21.108 t2.small
|
23
|
+
i-066b140d9479e9681 docker-20170428071833 34.211.144.113 172.31.11.250 m3.medium
|
24
|
+
$
|
25
|
+
```
|
26
|
+
|
27
|
+
You can include a header with the `--header` option:
|
28
|
+
|
29
|
+
```sh
|
30
|
+
$ sonic list i-066b140d9479e9681,i-09482b1a6e330fbf7 --header
|
31
|
+
Instance Id Name Public IP Private IP Type
|
32
|
+
i-09482b1a6e330fbf7 prod-20170416110240 54.202.152.168 172.31.21.108 t2.small
|
33
|
+
i-066b140d9479e9681 docker-20170428071833 34.211.144.113 172.31.11.250 m3.medium
|
34
|
+
$
|
35
|
+
```
|
36
|
+
|
37
|
+
The list command can be helpful if you want to list out the instances and pipe it back into other tools. Here's a simple example:
|
38
|
+
|
39
|
+
```sh
|
40
|
+
$ for i in $(sonic list i-066b140d9479e9681,i-09482b1a6e330fbf7 | awk '{print $3}') ; do echo $i ; ssh ec2-user@$i uptime ; done
|
41
|
+
54.202.152.168
|
42
|
+
17:39:14 up 6 days, 1:24, 0 users, load average: 0.00, 0.00, 0.00
|
43
|
+
34.211.144.113
|
44
|
+
17:39:14 up 3 days, 12:03, 0 users, load average: 0.00, 0.00, 0.00
|
45
|
+
$
|
46
|
+
```
|
47
|
+
|
48
|
+
<a id="prev" class="btn btn-basic" href="{% link _docs/tutorial-execute.md %}">Back</a>
|
49
|
+
<a id="next" class="btn btn-primary" href="{% link _docs/settings.md %}">Next Step</a>
|
50
|
+
<p class="keyboard-tip">Pro tip: Use the <- and -> arrow keys to move back and forward.</p>
|
data/docs/_includes/subnav.html
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
<li><a href="{% link _docs/tutorial-ecs-exec.md %}">ECS Exec</a></li>
|
14
14
|
<li><a href="{% link _docs/tutorial-ecs-run.md %}">ECS Run</a></li>
|
15
15
|
<li><a href="{% link _docs/tutorial-execute.md %}">Execute</a></li>
|
16
|
+
<li><a href="{% link _docs/tutorial-list.md %}">List</a></li>
|
16
17
|
</ul>
|
17
18
|
</li>
|
18
19
|
<li><a href="{% link _docs/settings.md %}">Settings</a></li>
|
data/lib/sonic/cli.rb
CHANGED
@@ -30,6 +30,7 @@ module Sonic
|
|
30
30
|
|
31
31
|
desc "execute [FILTER] [COMMAND]", "runs command across fleet of servers via AWS Run Command"
|
32
32
|
long_desc Help.execute
|
33
|
+
option :zero_warn, type: :boolean, default: true, desc: "Warns user when no instances found"
|
33
34
|
# filter - Filter ec2 instances by tag name or instance_ids separated by commas
|
34
35
|
def execute(filter, *command)
|
35
36
|
Execute.new(command, options.merge(filter: filter)).execute
|
@@ -1,4 +1,8 @@
|
|
1
|
-
bastion: #
|
1
|
+
bastion: # cluster_host mapping
|
2
|
+
default: # default is nil - which means a bastion host wont be used
|
3
|
+
# Examples:
|
4
|
+
# prod: bastion.mydomain.com
|
5
|
+
# stag: ubuntu@bastion-stag.mydomain.com
|
2
6
|
host_key_check: false
|
3
7
|
service_cluster:
|
4
8
|
default: # defaults to nil
|
data/lib/sonic/execute.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "byebug"
|
1
2
|
module Sonic
|
2
3
|
class Execute
|
3
4
|
include AwsServices
|
@@ -19,16 +20,23 @@ module Sonic
|
|
19
20
|
if @options[:noop]
|
20
21
|
UI.noop = true
|
21
22
|
command_id = "fake command id"
|
23
|
+
success = true # fake it for specs
|
22
24
|
else
|
23
|
-
|
24
|
-
|
25
|
+
instances_count = check_instances
|
26
|
+
return unless instances_count > 0
|
27
|
+
|
28
|
+
success = nil
|
29
|
+
begin
|
30
|
+
resp = ssm.send_command(ssm_options)
|
31
|
+
command_id = resp.command.command_id
|
32
|
+
success = true
|
33
|
+
rescue Aws::SSM::Errors::InvalidInstanceId => e
|
34
|
+
ssm_invalid_instance_error_message(e)
|
35
|
+
end
|
25
36
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
if RUBY_PLATFORM =~ /darwin/
|
30
|
-
system("echo '#{list_command}' | pbcopy")
|
31
|
-
UI.say "Pro tip: the aws ssm command is already in your copy/paste clipboard."
|
37
|
+
if success
|
38
|
+
UI.say "Command sent to AWS SSM. To check the details of the command:"
|
39
|
+
display_list_command(command_id)
|
32
40
|
end
|
33
41
|
end
|
34
42
|
|
@@ -44,36 +52,6 @@ module Sonic
|
|
44
52
|
)
|
45
53
|
end
|
46
54
|
|
47
|
-
def build_command(command)
|
48
|
-
if file_path?(command)
|
49
|
-
path = file_path(command)
|
50
|
-
if File.exist?(path)
|
51
|
-
IO.readlines(path).map {|s| s.strip}
|
52
|
-
else
|
53
|
-
UI.error("File #{path} could not be found. Are you sure it exist?")
|
54
|
-
exit 1
|
55
|
-
end
|
56
|
-
else
|
57
|
-
# The script is being feed inline so just join the command together into one script.
|
58
|
-
# Still keep in an array form because that's how ssn.send_command with AWS-RunShellScript
|
59
|
-
# usually reads the command.
|
60
|
-
[command.join(" ")]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def file_path?(command)
|
65
|
-
return false unless command.size == 1
|
66
|
-
possible_path = command.first
|
67
|
-
possible_path.include?("file://")
|
68
|
-
end
|
69
|
-
|
70
|
-
def file_path(command)
|
71
|
-
path = command.first
|
72
|
-
path = path.sub('file://', '')
|
73
|
-
path = "#{@options[:project_root]}/#{path}" if @options[:project_root]
|
74
|
-
path
|
75
|
-
end
|
76
|
-
|
77
55
|
#
|
78
56
|
# Public: Transform the filter to the ssm send_command equivalent options
|
79
57
|
#
|
@@ -119,6 +97,69 @@ module Sonic
|
|
119
97
|
end
|
120
98
|
end
|
121
99
|
|
100
|
+
def build_command(command)
|
101
|
+
if file_path?(command)
|
102
|
+
path = file_path(command)
|
103
|
+
if File.exist?(path)
|
104
|
+
IO.readlines(path).map {|s| s.strip}
|
105
|
+
else
|
106
|
+
UI.error("File #{path} could not be found. Are you sure it exist?")
|
107
|
+
exit 1
|
108
|
+
end
|
109
|
+
else
|
110
|
+
# The script is being feed inline so just join the command together into one script.
|
111
|
+
# Still keep in an array form because that's how ssn.send_command works with AWS-RunShellScript
|
112
|
+
# usually reads the command.
|
113
|
+
[command.join(" ")]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# e = Aws::SSM::Errors::InvalidInstanceId
|
118
|
+
def ssm_invalid_instance_error_message(e)
|
119
|
+
# e.message is an empty string so not very helpful
|
120
|
+
ssm_describe_command = 'aws ssm describe-instance-information --output text --query "InstanceInformationList[*]"'
|
121
|
+
message = <<-EOS
|
122
|
+
One of the instance ids: #{@filter.join(",")} is invalid according to SSM.
|
123
|
+
This might be because the SSM agent on the instance has not yet checked in.
|
124
|
+
You can use the following command to check registered instances to SSM.
|
125
|
+
#{ssm_describe_command}
|
126
|
+
EOS
|
127
|
+
UI.warn(message)
|
128
|
+
copy_paste_clipboard(ssm_describe_command)
|
129
|
+
end
|
130
|
+
|
131
|
+
def file_path?(command)
|
132
|
+
return false unless command.size == 1
|
133
|
+
possible_path = command.first
|
134
|
+
possible_path.include?("file://")
|
135
|
+
end
|
136
|
+
|
137
|
+
def file_path(command)
|
138
|
+
path = command.first
|
139
|
+
path = path.sub('file://', '')
|
140
|
+
path = "#{@options[:project_root]}/#{path}" if @options[:project_root]
|
141
|
+
path
|
142
|
+
end
|
143
|
+
|
144
|
+
# Counts the number of instances found using the filter and displays a helpful
|
145
|
+
# message to the user if 0 found.
|
146
|
+
def check_instances
|
147
|
+
return if @options[:zero_warn] == false
|
148
|
+
|
149
|
+
# The list options is a superset of the execute options so we can pass
|
150
|
+
# it right through
|
151
|
+
instances = List.new(@options).instances
|
152
|
+
if instances.count == 0
|
153
|
+
message = <<~EOL
|
154
|
+
Unable to find any instances with filter #{@filter.join(',')}.
|
155
|
+
Are you sure you specify the filter with either a EC2 tag or list instance ids?
|
156
|
+
If you are using ECS identifiers, they are not supported with this command.
|
157
|
+
EOL
|
158
|
+
UI.warn(message)
|
159
|
+
end
|
160
|
+
instances.count
|
161
|
+
end
|
162
|
+
|
122
163
|
# TODO: make configurable
|
123
164
|
def tag_name
|
124
165
|
"Name"
|
@@ -129,5 +170,17 @@ module Sonic
|
|
129
170
|
# old format is 8 characters long after i-
|
130
171
|
text =~ /i-.{17}/ || text =~ /i-.{8}/
|
131
172
|
end
|
173
|
+
|
174
|
+
def display_list_command(command_id)
|
175
|
+
list_command = "aws ssm list-commands --command-id #{command_id}"
|
176
|
+
UI.say list_command
|
177
|
+
copy_paste_clipboard(list_command)
|
178
|
+
end
|
179
|
+
|
180
|
+
def copy_paste_clipboard(command)
|
181
|
+
return unless RUBY_PLATFORM =~ /darwin/
|
182
|
+
system("echo '#{command}' | pbcopy")
|
183
|
+
UI.say "Pro tip: the aws ssm command is already in your copy/paste clipboard."
|
184
|
+
end
|
132
185
|
end
|
133
186
|
end
|
data/lib/sonic/list.rb
CHANGED
@@ -8,20 +8,22 @@ module Sonic
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def run
|
11
|
+
display(instances)
|
12
|
+
end
|
13
|
+
|
14
|
+
def instances
|
15
|
+
return [] if @options[:noop]
|
16
|
+
|
11
17
|
filter_options = transform_filter_option(@filter)
|
12
|
-
|
13
|
-
instances =
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# ERROR: The instance ID 'i-066b140d9479e9682' does not exist
|
20
|
-
UI.error(e.message)
|
21
|
-
exit 1
|
22
|
-
end
|
18
|
+
begin
|
19
|
+
instances = ec2_resource.instances(filter_options)
|
20
|
+
instances.count # force eager loading
|
21
|
+
rescue Aws::EC2::Errors::InvalidInstanceIDNotFound => e
|
22
|
+
# ERROR: The instance ID 'i-066b140d9479e9682' does not exist
|
23
|
+
UI.error(e.message)
|
24
|
+
exit 1
|
23
25
|
end
|
24
|
-
|
26
|
+
instances
|
25
27
|
end
|
26
28
|
|
27
29
|
def display(instances)
|
data/lib/sonic/settings.rb
CHANGED
@@ -19,7 +19,8 @@ module Sonic
|
|
19
19
|
default = YAML.load_file(default_file)
|
20
20
|
|
21
21
|
@data = default.merge(user.merge(project))
|
22
|
-
ensure_default_cluster(@data)
|
22
|
+
ensure_default_cluster!(@data)
|
23
|
+
ensure_default_bastion!(data)
|
23
24
|
@data
|
24
25
|
end
|
25
26
|
|
@@ -55,13 +56,46 @@ module Sonic
|
|
55
56
|
# When user's .sonic/settings.yml lack the default cluster, we add it on.
|
56
57
|
# Otherwise the user get confusing and scary aws-sdk-core/param_validator errors:
|
57
58
|
# Example: https://gist.github.com/sonic/67b9a68a77363b908d1c36047bc2709a
|
58
|
-
def ensure_default_cluster(data)
|
59
|
+
def ensure_default_cluster!(data)
|
59
60
|
unless data["service_cluster"]["default"]
|
60
61
|
data["service_cluster"]["default"] = "default"
|
61
62
|
end
|
62
63
|
data
|
63
64
|
end
|
64
65
|
|
66
|
+
# Public: Returns default bastion host.
|
67
|
+
#
|
68
|
+
# cluster - cluster provided by user
|
69
|
+
#
|
70
|
+
# The settings.yml format:
|
71
|
+
#
|
72
|
+
# bastion:
|
73
|
+
# default: bastion.mydomain.com
|
74
|
+
# prod: bastion.mydomain.com
|
75
|
+
# stag: bastion-stag.mydomain.com
|
76
|
+
#
|
77
|
+
# Examples
|
78
|
+
#
|
79
|
+
# default_bastion('stag')
|
80
|
+
# # => 'bastion-stag.mydomain.com'
|
81
|
+
# default_bastion('whatever')
|
82
|
+
# # => 'bastion.mydomain.com'
|
83
|
+
#
|
84
|
+
# Returns the bastion host that is mapped to the cluster
|
85
|
+
def default_bastion(cluster)
|
86
|
+
bastion = data["bastion"]
|
87
|
+
bastion[cluster] || bastion["default"]
|
88
|
+
end
|
89
|
+
|
90
|
+
# When user's .sonic/settings.yml lack the default cluster, we add it on.
|
91
|
+
def ensure_default_bastion!(data)
|
92
|
+
unless data["bastion"] && data["bastion"].has_key?("default")
|
93
|
+
data["bastion"] ||= {}
|
94
|
+
data["bastion"]["default"] = nil
|
95
|
+
end
|
96
|
+
data
|
97
|
+
end
|
98
|
+
|
65
99
|
def host_key_check_options
|
66
100
|
if data["host_key_check"]
|
67
101
|
# no options by default enables strict host key checking
|
data/lib/sonic/ssh.rb
CHANGED
@@ -16,7 +16,7 @@ module Sonic
|
|
16
16
|
|
17
17
|
@service = @identifier # always set service even though it's not always used as the identifier
|
18
18
|
@cluster = options[:cluster] || settings.default_cluster(@service)
|
19
|
-
@bastion = options[:bastion] || settings.
|
19
|
+
@bastion = options[:bastion] || settings.default_bastion(@bastion)
|
20
20
|
end
|
21
21
|
|
22
22
|
def run
|
data/lib/sonic/ui.rb
CHANGED
data/lib/sonic/version.rb
CHANGED
@@ -4,7 +4,7 @@ describe Sonic::Execute do
|
|
4
4
|
before(:each) do
|
5
5
|
@options = {
|
6
6
|
project_root: "spec/fixtures/project",
|
7
|
-
filter: "
|
7
|
+
filter: "i-066b140d9479e9681,i-09482b1a6e330fbf7"
|
8
8
|
}
|
9
9
|
end
|
10
10
|
|
@@ -12,8 +12,7 @@ describe Sonic::Execute do
|
|
12
12
|
it "should build up options for ssm send command with inline command" do
|
13
13
|
execute = Sonic::Execute.new(["uname", "-a"], @options)
|
14
14
|
options = execute.build_ssm_options
|
15
|
-
expect(options[:instance_ids]).to eq
|
16
|
-
expect(options[:targets]).to eq [{:key=>"tag:Name", :values=>%w[hi-web-stag hi-clock-stag]}]
|
15
|
+
expect(options[:instance_ids]).to eq %w[i-066b140d9479e9681 i-09482b1a6e330fbf7]
|
17
16
|
expect(options[:document_name]).to eq "AWS-RunShellScript"
|
18
17
|
expect(options[:comment]).to include "sonic "
|
19
18
|
expect(options[:parameters]["commands"]).to eq ["uname -a"]
|
@@ -22,8 +21,7 @@ describe Sonic::Execute do
|
|
22
21
|
it "should build up options for ssm send command with file" do
|
23
22
|
execute = Sonic::Execute.new(["file://command.txt"], @options)
|
24
23
|
options = execute.build_ssm_options
|
25
|
-
expect(options[:instance_ids]).to eq
|
26
|
-
expect(options[:targets]).to eq [{:key=>"tag:Name", :values=>%w[hi-web-stag hi-clock-stag]}]
|
24
|
+
expect(options[:instance_ids]).to eq %w[i-066b140d9479e9681 i-09482b1a6e330fbf7]
|
27
25
|
expect(options[:document_name]).to eq "AWS-RunShellScript"
|
28
26
|
expect(options[:comment]).to include "sonic "
|
29
27
|
expect(options[:parameters]["commands"]).to eq([
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sonic-screwdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
@@ -183,6 +183,7 @@ files:
|
|
183
183
|
- docs/_docs/tutorial-ecs-exec.md
|
184
184
|
- docs/_docs/tutorial-ecs-run.md
|
185
185
|
- docs/_docs/tutorial-execute.md
|
186
|
+
- docs/_docs/tutorial-list.md
|
186
187
|
- docs/_docs/tutorial-ssh.md
|
187
188
|
- docs/_docs/tutorial.md
|
188
189
|
- docs/_docs/why-ec2-run-command.md
|