ecs_cmd 0.1.0 → 0.1.1
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 +5 -5
- data/.travis.yml +2 -0
- data/Gemfile.lock +2 -2
- data/README.md +1 -1
- data/bin/ecs-cmd +39 -47
- data/lib/ecs_cmd.rb +6 -3
- data/lib/ecs_cmd/run_task.rb +39 -0
- data/lib/ecs_cmd/task_definition.rb +42 -5
- data/lib/ecs_cmd/utils.rb +24 -0
- data/lib/ecs_cmd/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: f215ab372a26cb580e3cc8c6ba5e1a2dc6f3fe946f4543652f7aa2ecf3ea0298
|
|
4
|
+
data.tar.gz: 473a4ccf2769d52faf13fc5787d82805ef6fb719bd1ddf5611755825ba685e72
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c36537549d61e3aa8c7474b0a25509fb90e41e825cef8d94d80227e8a5eb355ed4062bcbe1f28ef60f0090e4f93cf4526084df078af50c64395621f01786ec52
|
|
7
|
+
data.tar.gz: a3b25ffbf9a11d7018ef537b54361d4c1ede8c8f6eaf4294bad1db7fc417a02969f5c7de8b7604cb0c51d7ca35e6bb7ef4f0301044e7549416c24398f9e97344
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Ecs-Cmd
|
|
2
2
|
|
|
3
|
-
[](https://travis-ci.org/dschaaff/ecs-cmd)
|
|
3
|
+
[](https://travis-ci.org/dschaaff/ecs-cmd) [](https://badge.fury.io/rb/ecs_cmd)
|
|
4
4
|
|
|
5
5
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ecs_cmd`. To experiment with that code, run `bin/console` for an interactive prompt.
|
|
6
6
|
|
data/bin/ecs-cmd
CHANGED
|
@@ -10,76 +10,68 @@ version EcsCmd::VERSION
|
|
|
10
10
|
subcommand_option_handling :normal
|
|
11
11
|
arguments :strict
|
|
12
12
|
|
|
13
|
-
desc 'Describe some switch here'
|
|
14
|
-
switch [:s,:switch]
|
|
15
|
-
|
|
16
13
|
desc 'Set the aws region'
|
|
17
14
|
default_value 'us-east-1'
|
|
18
15
|
arg_name 'region'
|
|
19
|
-
flag [
|
|
16
|
+
flag %i[r region]
|
|
20
17
|
|
|
21
|
-
desc 'Get Info '
|
|
18
|
+
desc 'Get Info on Clusters and Services'
|
|
22
19
|
command :get do |c|
|
|
23
20
|
c.command :clusters do |clusters|
|
|
24
21
|
clusters.desc 'list ecs clusters'
|
|
25
|
-
clusters.action do |global_options,
|
|
22
|
+
clusters.action do |global_options, _options, _args|
|
|
26
23
|
clust = EcsCmd::Clusters.new(global_options[:region])
|
|
27
24
|
clust.list_clusters
|
|
28
25
|
end
|
|
29
26
|
end
|
|
30
27
|
|
|
31
|
-
c.arg_name '<cluster>'
|
|
32
28
|
c.command :services do |services|
|
|
29
|
+
services.flag %i[c cluster], desc: 'cluster name', arg_name: 'cluster', required: true
|
|
33
30
|
services.desc 'list services in a given ecs cluster'
|
|
34
|
-
services.action do |global_options, options,
|
|
31
|
+
services.action do |global_options, options, _args|
|
|
35
32
|
serv = EcsCmd::Services.new(global_options[:region])
|
|
36
|
-
serv.list_services(
|
|
33
|
+
serv.list_services(options[:cluster])
|
|
37
34
|
end
|
|
38
35
|
end
|
|
39
36
|
|
|
40
|
-
c.arg_name '<service>
|
|
37
|
+
c.arg_name '<service>'
|
|
41
38
|
c.command :service do |service|
|
|
39
|
+
service.flag %i[c cluster], desc: 'cluster name', arg_name: 'cluster', required: true
|
|
40
|
+
service.flag %i[s service], desc: 'service name', arg_name: 'service', required: true
|
|
42
41
|
service.default_desc 'get info about an ecs service'
|
|
43
|
-
service.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
end
|
|
54
|
-
service.arg_name '<service> <cluster> task_definition'
|
|
55
|
-
service.desc 'get json task definition for service'
|
|
56
|
-
service.command :task_definition do |task_definition|
|
|
57
|
-
task_definition.desc 'get the current task definition for the service'
|
|
58
|
-
task_definition.action do |global_options, options, args|
|
|
59
|
-
EcsCmd::TaskDefinition.new(EcsCmd::Service.new(args[1],args[0], global_options[:region]).task_definition).print_json
|
|
42
|
+
service.switch %i[e events], desc: 'get ecs events', default_value: false
|
|
43
|
+
service.switch %i[t task_definition], desc: 'get current task definition for service', default_value: false
|
|
44
|
+
service.action do |global_options, options|
|
|
45
|
+
if options[:events] == true
|
|
46
|
+
EcsCmd::Service.new(options[:cluster], options[:service], global_options[:region]).events
|
|
47
|
+
elsif options[:task_definition] == true
|
|
48
|
+
task_def = EcsCmd::Service.new(options[:cluster], options[:service], global_options[:region]).task_definition
|
|
49
|
+
EcsCmd::TaskDefinition.new(task_def, global_options[:region]).print_json
|
|
50
|
+
else
|
|
51
|
+
EcsCmd::Service.new(options[:cluster], options[:service], global_options[:region]).list_service
|
|
60
52
|
end
|
|
61
53
|
end
|
|
62
54
|
end
|
|
63
55
|
end
|
|
64
56
|
|
|
65
|
-
|
|
66
|
-
# arg_name 'Describe arguments here'
|
|
67
|
-
# command :get do |c|
|
|
68
|
-
# c.action do |global_options, options, args|
|
|
69
|
-
# if args[0] == 'task_definition'
|
|
70
|
-
# task = EcsCmd::TaskDefinition.new(args[1])
|
|
71
|
-
# puts JSON.pretty_generate(JSON[task.json])
|
|
72
|
-
# elsif
|
|
73
|
-
# puts "not implemented"
|
|
74
|
-
# end
|
|
75
|
-
# end
|
|
76
|
-
# end
|
|
77
|
-
|
|
78
|
-
desc 'Describe add here'
|
|
57
|
+
desc 'Run a One Off Task On an ECS Cluster'
|
|
79
58
|
arg_name 'Describe arguments to add here'
|
|
80
|
-
command :
|
|
81
|
-
c.
|
|
82
|
-
|
|
59
|
+
command :'run-task' do |c|
|
|
60
|
+
c.flag %i[c cluster], desc: 'cluster name', arg_name: 'cluster', required: true
|
|
61
|
+
c.flag %i[n container-name], desc: 'container name', arg_name: 'container name', required: false
|
|
62
|
+
c.flag %i[t task-definition], desc: 'the task definition to use for task', required: true
|
|
63
|
+
c.flag %i[i image], desc: 'docker image to use for task', arg_name: 'image', required: false
|
|
64
|
+
c.flag %i[d command], desc: 'override task definition command', arg_name: 'command'
|
|
65
|
+
c.action do |global_options, options, _args|
|
|
66
|
+
command = options[:d].tokenize
|
|
67
|
+
if options[:i]
|
|
68
|
+
puts "generating new task definition with image #{options[:i]}"
|
|
69
|
+
new_task = EcsCmd::TaskDefinition.new(options[:t], global_options[:region]).update_image(options[:i])
|
|
70
|
+
puts "registered task definition #{new_task}"
|
|
71
|
+
EcsCmd::RunTask.new(global_options[:region], options[:c], new_task, options[:n], command).run
|
|
72
|
+
else
|
|
73
|
+
EcsCmd::RunTask.new(global_options[:region], options[:c], options[:t], options[:n], command).run
|
|
74
|
+
end
|
|
83
75
|
end
|
|
84
76
|
end
|
|
85
77
|
|
|
@@ -91,7 +83,7 @@ end
|
|
|
91
83
|
# end
|
|
92
84
|
# end
|
|
93
85
|
|
|
94
|
-
pre do |
|
|
86
|
+
pre do |_global, _command, _options, _args|
|
|
95
87
|
# Pre logic here
|
|
96
88
|
# Return true to proceed; false to abort and not call the
|
|
97
89
|
# chosen command
|
|
@@ -100,13 +92,13 @@ pre do |global,command,options,args|
|
|
|
100
92
|
true
|
|
101
93
|
end
|
|
102
94
|
|
|
103
|
-
post do |global,command,options,args|
|
|
95
|
+
post do |global, command, options, args|
|
|
104
96
|
# Post logic here
|
|
105
97
|
# Use skips_post before a command to skip this
|
|
106
98
|
# block on that command only
|
|
107
99
|
end
|
|
108
100
|
|
|
109
|
-
on_error do |
|
|
101
|
+
on_error do |_exception|
|
|
110
102
|
# Error logic here
|
|
111
103
|
# return false to skip default error handling
|
|
112
104
|
true
|
data/lib/ecs_cmd.rb
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
require 'ecs_cmd/version'
|
|
2
2
|
require 'ecs_cmd/clusters.rb'
|
|
3
|
+
require 'ecs_cmd/run_task.rb'
|
|
3
4
|
require 'ecs_cmd/services.rb'
|
|
4
5
|
require 'ecs_cmd/service.rb'
|
|
5
6
|
require 'ecs_cmd/task_definition.rb'
|
|
7
|
+
require 'ecs_cmd/utils.rb'
|
|
6
8
|
|
|
7
|
-
module EcsCmd
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
# module EcsCmd
|
|
10
|
+
# # Your code goes here..
|
|
11
|
+
|
|
12
|
+
# end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'aws-sdk'
|
|
2
|
+
require 'terminal-table'
|
|
3
|
+
|
|
4
|
+
module EcsCmd
|
|
5
|
+
class RunTask
|
|
6
|
+
def initialize(region, cluster, task_def, container_name = nil, command = [])
|
|
7
|
+
@client = Aws::ECS::Client.new(region: region)
|
|
8
|
+
@cluster = cluster
|
|
9
|
+
@container_name = container_name
|
|
10
|
+
@task_def = task_def
|
|
11
|
+
@command = command
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# simply run the task
|
|
15
|
+
def run
|
|
16
|
+
puts 'running task...'
|
|
17
|
+
resp = if @container_name
|
|
18
|
+
@client.run_task(cluster: @cluster, task_definition: @task_def, overrides: {
|
|
19
|
+
container_overrides: [{
|
|
20
|
+
name: @container_name, command: @command
|
|
21
|
+
}]
|
|
22
|
+
})
|
|
23
|
+
else
|
|
24
|
+
@client.run_task(cluster: @cluster, task_definition: @task_def)
|
|
25
|
+
end
|
|
26
|
+
task_arn = resp[0][0]['task_arn']
|
|
27
|
+
result =
|
|
28
|
+
begin
|
|
29
|
+
puts 'waiting for task to complete...'
|
|
30
|
+
@client.wait_until(:tasks_stopped, cluster: @cluster, tasks: [task_arn])
|
|
31
|
+
rescue Aws::Waiters::Errors::WaiterFailed => error
|
|
32
|
+
puts "failed waiting for task to run: #{error.message}"
|
|
33
|
+
end
|
|
34
|
+
puts "task ended with exit code #{result[0][0]['containers'][0]['exit_code']}"
|
|
35
|
+
# return exit code
|
|
36
|
+
raise 'task appears to have failed, check container logs' if result[0][0]['containers'][0]['exit_code'] != 0
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
require 'aws-sdk'
|
|
2
2
|
require 'terminal-table'
|
|
3
|
+
require 'ecs_cmd/utils'
|
|
3
4
|
|
|
4
5
|
module EcsCmd
|
|
5
6
|
class TaskDefinition
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
@client = Aws::ECS::Client.new(region: 'us-east-1')
|
|
7
|
+
def initialize(task_definition, region)
|
|
8
|
+
@client = Aws::ECS::Client.new(region: region)
|
|
9
9
|
@task_def = @client.describe_task_definition(task_definition: task_definition)[0]
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
def
|
|
13
|
+
def container_definitions
|
|
14
14
|
@task_def['container_definitions']
|
|
15
15
|
end
|
|
16
|
+
|
|
17
|
+
def images
|
|
18
|
+
self.container_definitions.each do |e|
|
|
19
|
+
puts e['image']
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def family
|
|
24
|
+
@task_def['family']
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def revision
|
|
28
|
+
@task_def['revision']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def volumes
|
|
32
|
+
@task_def['volumes']
|
|
33
|
+
end
|
|
16
34
|
|
|
17
35
|
def hash
|
|
18
36
|
@task_def.to_hash
|
|
@@ -21,10 +39,29 @@ module EcsCmd
|
|
|
21
39
|
def json
|
|
22
40
|
hash.to_json
|
|
23
41
|
end
|
|
42
|
+
|
|
43
|
+
def task_role_arn
|
|
44
|
+
@task_def['task_role_arn']
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def update_image(image)
|
|
48
|
+
@new_task_def = @task_def.to_hash
|
|
49
|
+
@new_task_def[:container_definitions].each do |e, i=image|
|
|
50
|
+
if Utils.parse_image_name(e[:image]) == Utils.parse_image_name(i)
|
|
51
|
+
e[:image] = image
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
@new_task_def
|
|
55
|
+
resp = register_task_definition(@new_task_def[:family], @new_task_def[:container_definitions], @new_task_def[:volumes], @new_task_def[:task_role_arn])
|
|
56
|
+
resp.task_definition.task_definition_arn
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def register_task_definition(family, container_definitions, volumes, task_role_arn)
|
|
60
|
+
@client.register_task_definition(family: family, container_definitions: container_definitions, volumes: volumes, task_role_arn: task_role_arn)
|
|
61
|
+
end
|
|
24
62
|
|
|
25
63
|
def print_json
|
|
26
64
|
puts JSON.pretty_generate(JSON[json])
|
|
27
|
-
|
|
28
65
|
end
|
|
29
66
|
|
|
30
67
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module EcsCmd
|
|
2
|
+
module Utils
|
|
3
|
+
def self.parse_image_name(image)
|
|
4
|
+
regex = /^([a-zA-Z0-9\.\-]+):?([0-9]+)?\/([a-zA-Z0-9\._\-]+)(\/[\/a-zA-Z0-9\._\-]+)?:?([a-zA-Z0-9\._\-]+)?$/
|
|
5
|
+
raise 'invalid image supplied, please verify correct image format' unless regex.match(image)
|
|
6
|
+
if regex.match(image)[4].nil? || regex.match(image)[4] == false
|
|
7
|
+
regex.match(image)[3]
|
|
8
|
+
else
|
|
9
|
+
regex.match(image)[4].gsub(/\//, '')
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.parse_image_tag(image); end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class String
|
|
18
|
+
def tokenize
|
|
19
|
+
self.
|
|
20
|
+
split(/\s(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/).
|
|
21
|
+
select {|s| not s.empty? }.
|
|
22
|
+
map {|s| s.gsub(/(^ +)|( +$)|(^["']+)|(["']+$)/,'')}
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/ecs_cmd/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ecs_cmd
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Schaaff
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-
|
|
11
|
+
date: 2018-08-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: aws-sdk
|
|
@@ -132,9 +132,11 @@ files:
|
|
|
132
132
|
- ecs_cmd.gemspec
|
|
133
133
|
- lib/ecs_cmd.rb
|
|
134
134
|
- lib/ecs_cmd/clusters.rb
|
|
135
|
+
- lib/ecs_cmd/run_task.rb
|
|
135
136
|
- lib/ecs_cmd/service.rb
|
|
136
137
|
- lib/ecs_cmd/services.rb
|
|
137
138
|
- lib/ecs_cmd/task_definition.rb
|
|
139
|
+
- lib/ecs_cmd/utils.rb
|
|
138
140
|
- lib/ecs_cmd/version.rb
|
|
139
141
|
homepage: https://danielschaaff.com
|
|
140
142
|
licenses:
|
|
@@ -156,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
156
158
|
version: '0'
|
|
157
159
|
requirements: []
|
|
158
160
|
rubyforge_project:
|
|
159
|
-
rubygems_version: 2.6
|
|
161
|
+
rubygems_version: 2.7.6
|
|
160
162
|
signing_key:
|
|
161
163
|
specification_version: 4
|
|
162
164
|
summary: AWS ECS CLI Utility
|