ecsl 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 94a40beb7124c294a0f65183b3cf022aed1883a2e902217cb254b68c9aa86db5
4
+ data.tar.gz: 57c19907a693109f2ae4193cf51d5b47dec083c2e6b399e2de9a87773ea22ee7
5
+ SHA512:
6
+ metadata.gz: c19d744509f9658920a7d1d5976d2eafdfcc2b138dd4e5e507b01a4644462baaff46e58ee3cf49c463893377eae1d9068fb8232c13af94afa4de6a3bee277dab
7
+ data.tar.gz: fbfea2857eb02439e384ff372b877753888d195aca592798a0cd4b5561116d35d55d3818134e4144446c58d9f8f304e8b66490ba8bd93845d5d33ad02bb0a3d0
data/exe/ecsl ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "ecsl"
5
+
6
+ Ecsl::Exec.new.run
data/lib/ecsl/exec.rb ADDED
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "optparse"
4
+ require "tty-prompt"
5
+ require "json"
6
+ require "aws-sdk-ecs"
7
+
8
+ module Ecsl
9
+ class Exec
10
+ def initialize
11
+ @profile = nil
12
+ @filter = nil
13
+ @region = nil
14
+ @prompt = TTY::Prompt.new(interrupt: :exit)
15
+ @ecs_client = nil
16
+ parse_options
17
+ end
18
+
19
+ def run
20
+ cluster = select_cluster
21
+ task, container = select_service_and_container(cluster)
22
+
23
+ command = ["aws", "--profile", @profile, "--region", @region, "ecs", "execute-command",
24
+ "--cluster", cluster, "--task", task, "--container", container,
25
+ "--interactive", "--command", "/bin/bash"].join(" ")
26
+ puts command
27
+ end
28
+
29
+ private
30
+
31
+ def parse_options
32
+ OptionParser.new do |opts|
33
+ opts.on("-p", "--profile PROFILE", "AWS profile") { |v| @profile = v }
34
+ opts.on("-f", "--filter FILTER", "Filter cluster name") { |v| @filter = v }
35
+ opts.on("-r", "--region REGION", "AWS region") { |v| @region = v }
36
+ end.parse!
37
+ end
38
+
39
+ def ecs_client
40
+ @ecs_client ||= Aws::ECS::Client.new(
41
+ profile: @profile,
42
+ region: @region
43
+ )
44
+ end
45
+
46
+ def list_clusters
47
+ clusters = ecs_client.list_clusters.cluster_arns
48
+ clusters.map { |arn| arn.split("/").last }
49
+ end
50
+
51
+ def list_services(cluster)
52
+ services = ecs_client.list_services(cluster: cluster).service_arns
53
+ services.map { |arn| arn.split("/").last }
54
+ end
55
+
56
+ def list_tasks(cluster, service)
57
+ tasks = ecs_client.list_tasks(
58
+ cluster: cluster,
59
+ service_name: service
60
+ ).task_arns
61
+ tasks.map { |arn| arn.split("/").last }
62
+ end
63
+
64
+ def list_containers(cluster, task)
65
+ containers = ecs_client.describe_tasks(
66
+ cluster: cluster,
67
+ tasks: [task]
68
+ ).tasks.first.containers
69
+ containers.map(&:name)
70
+ end
71
+
72
+ def select_or_auto(items, message)
73
+ return items.first if items.size == 1
74
+ @prompt.select(message, items.sort, filter: true)
75
+ end
76
+
77
+ def select_cluster
78
+ clusters = list_clusters
79
+ clusters = clusters.select { |c| c.include?(@filter) } if @filter
80
+ raise Error, "No clusters found" if clusters.empty?
81
+ select_or_auto(clusters, "Select a cluster:")
82
+ end
83
+
84
+ def select_service_and_container(cluster)
85
+ services = list_services(cluster)
86
+ raise Error, "No services found" if services.empty?
87
+ service = select_or_auto(services, "Select a service:")
88
+
89
+ tasks = list_tasks(cluster, service)
90
+ raise Error, "No tasks found" if tasks.empty?
91
+ task = select_or_auto(tasks, "Select a task:")
92
+
93
+ containers = list_containers(cluster, task)
94
+ raise Error, "No containers found" if containers.empty?
95
+ container = select_or_auto(containers, "Select a container:")
96
+
97
+ [task, container]
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ecsl
4
+ VERSION = "0.1.0"
5
+ end
data/lib/ecsl.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ecsl/version"
4
+ require "ecsl/exec"
5
+
6
+ module Ecsl
7
+ class Error < StandardError; end
8
+ # Your code goes here...
9
+ end
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ecsl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ikaruga
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: aws-sdk-ecs
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: json
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: open3
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: tty-prompt
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: bundler
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rake
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '13.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '13.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rspec
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '3.0'
110
+ description: A helper library for ECS Exec command
111
+ email:
112
+ - ikaruga777@gmail.com
113
+ executables:
114
+ - ecsl
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - exe/ecsl
119
+ - lib/ecsl.rb
120
+ - lib/ecsl/exec.rb
121
+ - lib/ecsl/version.rb
122
+ homepage: https://github.com/pepabo/ecsl
123
+ licenses:
124
+ - MIT
125
+ metadata:
126
+ allowed_push_host: https://rubygems.org
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubygems_version: 3.6.7
142
+ specification_version: 4
143
+ summary: ECS Exec helper library
144
+ test_files: []