ecs-rails 0.0.6 → 0.0.8
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/ecs-rails.gemspec +12 -11
- data/lib/ecs-rails/client.rb +7 -10
- data/lib/ecs-rails/task_selector.rb +12 -12
- data/lib/ecs-rails/version.rb +1 -1
- data/spec/ecs-rails/task_selector_spec.rb +96 -0
- metadata +33 -18
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cbc8985f5cda19d87cfcce63d4c9f41e9f8ee2b5bd044cc25e3078e94eb9df55
|
|
4
|
+
data.tar.gz: 7cc2193739fe260fbc5e8f21a0ec16ed75d3bdb5dabfa7b2a3288fa6360b05ad
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 934f84d9dad3623f110250f043d1a0030f9313859449b2b15a94e7ecd0fad7f3339f8f8d6165f4cb3dced1e7fa4a076e0cbdcaab05789506e45159b38fc9bb04
|
|
7
|
+
data.tar.gz: c2ddb51f5d6e50905702c6d464db9092a9712e0db7271d3055f0920c2a6f69a35dc5fb48f8da66ef8f255f2255a0eb05b4a56377cf85d3023c82ca35ab50c6f8
|
data/ecs-rails.gemspec
CHANGED
|
@@ -3,26 +3,27 @@
|
|
|
3
3
|
require_relative 'lib/ecs-rails/version'
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
|
-
s.name =
|
|
6
|
+
s.name = 'ecs-rails'
|
|
7
7
|
s.version = EcsRails::VERSION
|
|
8
|
-
s.summary =
|
|
9
|
-
s.description =
|
|
8
|
+
s.summary = 'Connect to your AWS ECS tasks'
|
|
9
|
+
s.description = 'Connect to your AWS ECS tasks'
|
|
10
10
|
s.authors = ["Franck D'agostini"]
|
|
11
|
-
s.email =
|
|
12
|
-
s.homepage =
|
|
13
|
-
s.license
|
|
11
|
+
s.email = 'franck.dagostini@gmail.com'
|
|
12
|
+
s.homepage = 'https://rubygems.org/gems/ecs-rails'
|
|
13
|
+
s.license = 'MIT'
|
|
14
14
|
s.required_ruby_version = '>= 2.7.0'
|
|
15
15
|
s.require_paths = ['lib']
|
|
16
16
|
|
|
17
17
|
s.files = `git ls-files -z`.split("\x0")
|
|
18
18
|
|
|
19
|
-
s.executables
|
|
19
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
20
20
|
|
|
21
21
|
s.add_development_dependency 'byebug', '~> 11.1'
|
|
22
22
|
s.add_development_dependency 'rspec', '~> 3.6', '>= 3.6.0'
|
|
23
23
|
|
|
24
|
-
s.add_runtime_dependency
|
|
25
|
-
s.add_runtime_dependency
|
|
26
|
-
s.add_runtime_dependency
|
|
27
|
-
s.add_runtime_dependency
|
|
24
|
+
s.add_runtime_dependency 'activesupport', '> 5.2'
|
|
25
|
+
s.add_runtime_dependency 'aws-sdk-ec2', '~> 1.425', '> 1.425'
|
|
26
|
+
s.add_runtime_dependency 'aws-sdk-ecs', '~> 1.132', '> 1.132'
|
|
27
|
+
s.add_runtime_dependency 'openssl', '>= 3.2.1'
|
|
28
|
+
s.add_runtime_dependency 'tty-prompt', '~> 0.23', '> 0.23'
|
|
28
29
|
end
|
data/lib/ecs-rails/client.rb
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
module EcsRails
|
|
2
2
|
class Client
|
|
3
|
-
|
|
4
3
|
def client
|
|
5
4
|
Aws::ECS::Client.new(aws_credentials)
|
|
6
5
|
end
|
|
7
6
|
|
|
8
7
|
private
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
def aws_credentials
|
|
10
|
+
@aws_credentials ||= {
|
|
11
|
+
region: ENV['AWS_REGION'],
|
|
12
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
|
13
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
|
14
|
+
}
|
|
15
|
+
end
|
|
18
16
|
end
|
|
19
17
|
end
|
|
20
|
-
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module EcsRails
|
|
2
2
|
class TaskSelector
|
|
3
|
-
|
|
4
3
|
def initialize(client, cluster_name, service_name)
|
|
5
4
|
@client = client
|
|
6
5
|
@cluster_name = cluster_name
|
|
@@ -13,7 +12,8 @@ module EcsRails
|
|
|
13
12
|
|
|
14
13
|
service_descriptions.each do |service|
|
|
15
14
|
service.deployments.each do |deployment|
|
|
16
|
-
task_arns = client.list_tasks(cluster: cluster_name, service_name: service.service_name,
|
|
15
|
+
task_arns = client.list_tasks(cluster: cluster_name, service_name: service.service_name,
|
|
16
|
+
desired_status: 'RUNNING').task_arns
|
|
17
17
|
next if task_arns.empty?
|
|
18
18
|
|
|
19
19
|
tasks = client.describe_tasks(cluster: cluster_name, tasks: task_arns).tasks
|
|
@@ -22,12 +22,12 @@ module EcsRails
|
|
|
22
22
|
tasks_for_deployment = tasks.select { |task| task.task_definition_arn == deployment.task_definition }
|
|
23
23
|
|
|
24
24
|
if tasks_for_deployment.empty?
|
|
25
|
-
puts(
|
|
25
|
+
puts(' No tasks found for this deployment.')
|
|
26
26
|
elsif tasks_for_deployment.size == 1
|
|
27
27
|
puts(" Task: #{task_arns.first}")
|
|
28
|
-
|
|
28
|
+
return task_arns.first
|
|
29
29
|
else
|
|
30
|
-
ask_for_task(tasks_for_deployment)
|
|
30
|
+
return ask_for_task(tasks_for_deployment)
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
@@ -35,13 +35,13 @@ module EcsRails
|
|
|
35
35
|
|
|
36
36
|
private
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
attr_reader :client, :cluster_name, :service_name
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
def ask_for_task(tasks)
|
|
41
|
+
prompt = TTY::Prompt.new
|
|
42
|
+
choices = tasks.map { |task| task.task_arn.split('/').last }
|
|
43
|
+
choice = prompt.enum_select('Select a task:', choices)
|
|
44
|
+
tasks.find { |task| task.task_arn.include?(choice) }.task_arn
|
|
45
|
+
end
|
|
46
46
|
end
|
|
47
47
|
end
|
data/lib/ecs-rails/version.rb
CHANGED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe EcsRails::TaskSelector do
|
|
4
|
+
let(:client) { instance_double(Aws::ECS::Client) }
|
|
5
|
+
let(:cluster_name) { 'test-cluster' }
|
|
6
|
+
let(:service_name) { 'test-service' }
|
|
7
|
+
let(:selector) { described_class.new(client, cluster_name, service_name) }
|
|
8
|
+
|
|
9
|
+
describe '#call' do
|
|
10
|
+
let(:service) { instance_double(Aws::ECS::Types::Service, service_name: service_name, deployments: [deployment]) }
|
|
11
|
+
let(:deployment) { instance_double(Aws::ECS::Types::Deployment, task_definition: 'task-def-arn') }
|
|
12
|
+
let(:task_arn) { 'arn:aws:ecs:us-east-1:123456789:task/cluster/abc123' }
|
|
13
|
+
|
|
14
|
+
before do
|
|
15
|
+
allow(client).to receive(:describe_services)
|
|
16
|
+
.with(cluster: cluster_name, services: [service_name])
|
|
17
|
+
.and_return(instance_double(Aws::ECS::Types::DescribeServicesResponse, services: [service]))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context 'when there are no running tasks' do
|
|
21
|
+
before do
|
|
22
|
+
allow(client).to receive(:list_tasks)
|
|
23
|
+
.with(cluster: cluster_name, service_name: service_name, desired_status: 'RUNNING')
|
|
24
|
+
.and_return(instance_double(Aws::ECS::Types::ListTasksResponse, task_arns: []))
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'does not return a task ARN' do
|
|
28
|
+
result = selector.call
|
|
29
|
+
expect(result).not_to be_a(String)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context 'when there is one running task' do
|
|
34
|
+
let(:task) { instance_double(Aws::ECS::Types::Task, task_definition_arn: 'task-def-arn', task_arn: task_arn) }
|
|
35
|
+
|
|
36
|
+
before do
|
|
37
|
+
allow(client).to receive(:list_tasks)
|
|
38
|
+
.with(cluster: cluster_name, service_name: service_name, desired_status: 'RUNNING')
|
|
39
|
+
.and_return(instance_double(Aws::ECS::Types::ListTasksResponse, task_arns: [task_arn]))
|
|
40
|
+
|
|
41
|
+
allow(client).to receive(:describe_tasks)
|
|
42
|
+
.with(cluster: cluster_name, tasks: [task_arn])
|
|
43
|
+
.and_return(instance_double(Aws::ECS::Types::DescribeTasksResponse, tasks: [task]))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'returns the task ARN' do
|
|
47
|
+
expect(selector.call).to eq(task_arn)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context 'when there are multiple running tasks' do
|
|
52
|
+
let(:task_arn_1) { 'arn:aws:ecs:us-east-1:123456789:task/cluster/abc123' }
|
|
53
|
+
let(:task_arn_2) { 'arn:aws:ecs:us-east-1:123456789:task/cluster/def456' }
|
|
54
|
+
let(:task_1) { instance_double(Aws::ECS::Types::Task, task_definition_arn: 'task-def-arn', task_arn: task_arn_1) }
|
|
55
|
+
let(:task_2) { instance_double(Aws::ECS::Types::Task, task_definition_arn: 'task-def-arn', task_arn: task_arn_2) }
|
|
56
|
+
let(:prompt) { instance_double(TTY::Prompt) }
|
|
57
|
+
|
|
58
|
+
before do
|
|
59
|
+
allow(client).to receive(:list_tasks)
|
|
60
|
+
.with(cluster: cluster_name, service_name: service_name, desired_status: 'RUNNING')
|
|
61
|
+
.and_return(instance_double(Aws::ECS::Types::ListTasksResponse, task_arns: [task_arn_1, task_arn_2]))
|
|
62
|
+
|
|
63
|
+
allow(client).to receive(:describe_tasks)
|
|
64
|
+
.with(cluster: cluster_name, tasks: [task_arn_1, task_arn_2])
|
|
65
|
+
.and_return(instance_double(Aws::ECS::Types::DescribeTasksResponse, tasks: [task_1, task_2]))
|
|
66
|
+
|
|
67
|
+
allow(TTY::Prompt).to receive(:new).and_return(prompt)
|
|
68
|
+
allow(prompt).to receive(:enum_select).with('Select a task:', %w[abc123 def456]).and_return('abc123')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'prompts the user to select a task and returns the selected task ARN' do
|
|
72
|
+
expect(selector.call).to eq(task_arn_1)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context 'when tasks do not match the deployment task definition' do
|
|
77
|
+
let(:task_arn) { 'arn:aws:ecs:us-east-1:123456789:task/cluster/abc123' }
|
|
78
|
+
let(:task) { instance_double(Aws::ECS::Types::Task, task_definition_arn: 'different-task-def', task_arn: task_arn) }
|
|
79
|
+
|
|
80
|
+
before do
|
|
81
|
+
allow(client).to receive(:list_tasks)
|
|
82
|
+
.with(cluster: cluster_name, service_name: service_name, desired_status: 'RUNNING')
|
|
83
|
+
.and_return(instance_double(Aws::ECS::Types::ListTasksResponse, task_arns: [task_arn]))
|
|
84
|
+
|
|
85
|
+
allow(client).to receive(:describe_tasks)
|
|
86
|
+
.with(cluster: cluster_name, tasks: [task_arn])
|
|
87
|
+
.and_return(instance_double(Aws::ECS::Types::DescribeTasksResponse, tasks: [task]))
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'does not return a task ARN' do
|
|
91
|
+
result = selector.call
|
|
92
|
+
expect(result).not_to be_a(String)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ecs-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Franck D'agostini
|
|
@@ -44,25 +44,19 @@ dependencies:
|
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
45
|
version: 3.6.0
|
|
46
46
|
- !ruby/object:Gem::Dependency
|
|
47
|
-
name:
|
|
47
|
+
name: activesupport
|
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
|
49
49
|
requirements:
|
|
50
|
-
- - "~>"
|
|
51
|
-
- !ruby/object:Gem::Version
|
|
52
|
-
version: '1.132'
|
|
53
50
|
- - ">"
|
|
54
51
|
- !ruby/object:Gem::Version
|
|
55
|
-
version: '
|
|
52
|
+
version: '5.2'
|
|
56
53
|
type: :runtime
|
|
57
54
|
prerelease: false
|
|
58
55
|
version_requirements: !ruby/object:Gem::Requirement
|
|
59
56
|
requirements:
|
|
60
|
-
- - "~>"
|
|
61
|
-
- !ruby/object:Gem::Version
|
|
62
|
-
version: '1.132'
|
|
63
57
|
- - ">"
|
|
64
58
|
- !ruby/object:Gem::Version
|
|
65
|
-
version: '
|
|
59
|
+
version: '5.2'
|
|
66
60
|
- !ruby/object:Gem::Dependency
|
|
67
61
|
name: aws-sdk-ec2
|
|
68
62
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -84,39 +78,59 @@ dependencies:
|
|
|
84
78
|
- !ruby/object:Gem::Version
|
|
85
79
|
version: '1.425'
|
|
86
80
|
- !ruby/object:Gem::Dependency
|
|
87
|
-
name:
|
|
81
|
+
name: aws-sdk-ecs
|
|
88
82
|
requirement: !ruby/object:Gem::Requirement
|
|
89
83
|
requirements:
|
|
90
84
|
- - "~>"
|
|
91
85
|
- !ruby/object:Gem::Version
|
|
92
|
-
version: '
|
|
86
|
+
version: '1.132'
|
|
93
87
|
- - ">"
|
|
94
88
|
- !ruby/object:Gem::Version
|
|
95
|
-
version: '
|
|
89
|
+
version: '1.132'
|
|
96
90
|
type: :runtime
|
|
97
91
|
prerelease: false
|
|
98
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
99
93
|
requirements:
|
|
100
94
|
- - "~>"
|
|
101
95
|
- !ruby/object:Gem::Version
|
|
102
|
-
version: '
|
|
96
|
+
version: '1.132'
|
|
103
97
|
- - ">"
|
|
104
98
|
- !ruby/object:Gem::Version
|
|
105
|
-
version: '
|
|
99
|
+
version: '1.132'
|
|
106
100
|
- !ruby/object:Gem::Dependency
|
|
107
|
-
name:
|
|
101
|
+
name: openssl
|
|
108
102
|
requirement: !ruby/object:Gem::Requirement
|
|
109
103
|
requirements:
|
|
104
|
+
- - ">="
|
|
105
|
+
- !ruby/object:Gem::Version
|
|
106
|
+
version: 3.2.1
|
|
107
|
+
type: :runtime
|
|
108
|
+
prerelease: false
|
|
109
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
110
|
+
requirements:
|
|
111
|
+
- - ">="
|
|
112
|
+
- !ruby/object:Gem::Version
|
|
113
|
+
version: 3.2.1
|
|
114
|
+
- !ruby/object:Gem::Dependency
|
|
115
|
+
name: tty-prompt
|
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
|
117
|
+
requirements:
|
|
118
|
+
- - "~>"
|
|
119
|
+
- !ruby/object:Gem::Version
|
|
120
|
+
version: '0.23'
|
|
110
121
|
- - ">"
|
|
111
122
|
- !ruby/object:Gem::Version
|
|
112
|
-
version: '
|
|
123
|
+
version: '0.23'
|
|
113
124
|
type: :runtime
|
|
114
125
|
prerelease: false
|
|
115
126
|
version_requirements: !ruby/object:Gem::Requirement
|
|
116
127
|
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '0.23'
|
|
117
131
|
- - ">"
|
|
118
132
|
- !ruby/object:Gem::Version
|
|
119
|
-
version: '
|
|
133
|
+
version: '0.23'
|
|
120
134
|
description: Connect to your AWS ECS tasks
|
|
121
135
|
email: franck.dagostini@gmail.com
|
|
122
136
|
executables:
|
|
@@ -146,6 +160,7 @@ files:
|
|
|
146
160
|
- lib/ecs-rails/task_selector.rb
|
|
147
161
|
- lib/ecs-rails/version.rb
|
|
148
162
|
- spec/ecs-rails/ecs_rails_configuration_spec.rb
|
|
163
|
+
- spec/ecs-rails/task_selector_spec.rb
|
|
149
164
|
- spec/fixtures/ecs-rails.yml
|
|
150
165
|
- spec/spec_helper.rb
|
|
151
166
|
homepage: https://rubygems.org/gems/ecs-rails
|