stax 0.0.1 → 0.0.2
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/bin/stax +1 -4
- data/lib/stax.rb +33 -3
- data/lib/stax/asg.rb +140 -0
- data/lib/stax/aws/alb.rb +28 -0
- data/lib/stax/aws/asg.rb +34 -0
- data/lib/stax/aws/cfn.rb +102 -0
- data/lib/stax/aws/dynamodb.rb +27 -0
- data/lib/stax/aws/ec2.rb +22 -0
- data/lib/stax/aws/ecr.rb +25 -0
- data/lib/stax/aws/ecs.rb +54 -0
- data/lib/stax/aws/elb.rb +30 -0
- data/lib/stax/aws/emr.rb +28 -0
- data/lib/stax/aws/iam.rb +19 -0
- data/lib/stax/aws/keypair.rb +26 -0
- data/lib/stax/aws/kms.rb +19 -0
- data/lib/stax/aws/lambda.rb +33 -0
- data/lib/stax/aws/logs.rb +25 -0
- data/lib/stax/aws/s3.rb +41 -0
- data/lib/stax/aws/sdk.rb +21 -0
- data/lib/stax/aws/sg.rb +42 -0
- data/lib/stax/aws/sqs.rb +30 -0
- data/lib/stax/aws/ssm.rb +49 -0
- data/lib/stax/aws/sts.rb +31 -0
- data/lib/stax/base.rb +92 -4
- data/lib/stax/cfer.rb +59 -0
- data/lib/stax/cli.rb +13 -4
- data/lib/stax/docker.rb +106 -0
- data/lib/stax/dsl.rb +15 -0
- data/lib/stax/git.rb +61 -0
- data/lib/stax/github.rb +25 -0
- data/lib/stax/iam.rb +18 -0
- data/lib/stax/keypair.rb +75 -0
- data/lib/stax/mixin/alb.rb +45 -0
- data/lib/stax/mixin/asg.rb +115 -0
- data/lib/stax/mixin/dynamodb.rb +62 -0
- data/lib/stax/mixin/ec2.rb +37 -0
- data/lib/stax/mixin/ecs.rb +114 -0
- data/lib/stax/mixin/elb.rb +42 -0
- data/lib/stax/mixin/emr.rb +69 -0
- data/lib/stax/mixin/keypair.rb +45 -0
- data/lib/stax/mixin/kms.rb +30 -0
- data/lib/stax/mixin/lambda.rb +76 -0
- data/lib/stax/mixin/logs.rb +94 -0
- data/lib/stax/mixin/s3.rb +76 -0
- data/lib/stax/mixin/sg.rb +95 -0
- data/lib/stax/mixin/sqs.rb +49 -0
- data/lib/stax/mixin/ssh.rb +52 -0
- data/lib/stax/mixin/ssm.rb +137 -0
- data/lib/stax/stack.rb +19 -35
- data/lib/stax/stack/cfn.rb +24 -0
- data/lib/stax/stack/crud.rb +92 -0
- data/lib/stax/stack/outputs.rb +24 -0
- data/lib/stax/stack/parameters.rb +24 -0
- data/lib/stax/stack/resources.rb +35 -0
- data/lib/stax/staxfile.rb +41 -0
- data/lib/stax/subcommand.rb +12 -0
- data/lib/stax/version.rb +1 -1
- data/stax.gemspec +6 -13
- metadata +105 -9
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'stax/aws/alb'
|
2
|
+
|
3
|
+
module Stax
|
4
|
+
module Alb
|
5
|
+
def self.included(thor)
|
6
|
+
thor.desc(:alb, 'ALB subcommands')
|
7
|
+
thor.subcommand(:alb, Cmd::Alb)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Cmd
|
12
|
+
class Alb < SubCommand
|
13
|
+
|
14
|
+
COLORS = {
|
15
|
+
healthy: :green,
|
16
|
+
unhealthy: :red,
|
17
|
+
unavailable: :red,
|
18
|
+
}
|
19
|
+
|
20
|
+
no_commands do
|
21
|
+
def stack_albs
|
22
|
+
Aws::Cfn.resources_by_type(my.stack_name, 'AWS::ElasticLoadBalancingV2::LoadBalancer')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'dns', 'ALB DNS names'
|
27
|
+
def dns
|
28
|
+
puts Aws::Alb.describe(stack_albs.map(&:physical_resource_id)).map(&:dns_name)
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'status', 'ALB instance status'
|
32
|
+
def status
|
33
|
+
stack_albs.each do |alb|
|
34
|
+
Aws::Alb.target_groups(alb.physical_resource_id).each do |t|
|
35
|
+
debug("ALB status for #{alb.logical_resource_id} #{t.protocol}:#{t.port} #{t.target_group_name}")
|
36
|
+
print_table Aws::Alb.target_health(t.target_group_arn).map { |h|
|
37
|
+
[h.target.id, h.target.port, color(h.target_health.state, COLORS), h.target_health.reason, h.target_health.description]
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'stax/aws/asg'
|
2
|
+
|
3
|
+
module Stax
|
4
|
+
module Asg
|
5
|
+
def self.included(thor)
|
6
|
+
thor.desc(:asg, 'ASG subcommands')
|
7
|
+
thor.subcommand(:asg, Cmd::Asg)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Cmd
|
12
|
+
class Asg < SubCommand
|
13
|
+
COLORS = {
|
14
|
+
## lifecycle states
|
15
|
+
Pending: :yellow, InService: :green, Terminating: :red,
|
16
|
+
## health statuses
|
17
|
+
Healthy: :green, Unhealthy: :red,
|
18
|
+
## same for asg instances describe
|
19
|
+
HEALTHY: :green, UNHEALTHY: :red,
|
20
|
+
## activity status
|
21
|
+
Successful: :green, Failed: :red, Cancelled: :red,
|
22
|
+
## instance state
|
23
|
+
running: :green, stopped: :yellow, terminated: :red,
|
24
|
+
}
|
25
|
+
|
26
|
+
class_option :groups, aliases: '-g', type: :array, default: nil, desc: 'limit ASGs returned by id'
|
27
|
+
|
28
|
+
no_commands do
|
29
|
+
def stack_asgs
|
30
|
+
a = Aws::Cfn.resources_by_type(my.stack_name, 'AWS::AutoScaling::AutoScalingGroup')
|
31
|
+
filter_asgs(a, options[:groups])
|
32
|
+
end
|
33
|
+
|
34
|
+
def filter_asgs(asgs, groups)
|
35
|
+
return asgs unless groups
|
36
|
+
ids = groups.map { |g| prepend(:asg, g) }
|
37
|
+
asgs.select { |g| ids.include?(g.logical_resource_id) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'ls', 'list ASGs for stack'
|
42
|
+
def ls
|
43
|
+
print_table Aws::Asg.describe(stack_asgs.map(&:physical_resource_id)).map { |a|
|
44
|
+
[
|
45
|
+
a.auto_scaling_group_name[0,40],
|
46
|
+
a.launch_configuration_name[0,40],
|
47
|
+
"#{a.instances.length}/#{a.desired_capacity}",
|
48
|
+
"#{a.min_size}-#{a.max_size}",
|
49
|
+
a.availability_zones.map{ |az| az[-1,1] }.sort.join(','),
|
50
|
+
a.created_time
|
51
|
+
]
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
desc 'status', 'status of instances by ASG'
|
56
|
+
def status
|
57
|
+
stack_asgs.each do |asg|
|
58
|
+
debug("ASG status for #{asg.physical_resource_id}")
|
59
|
+
print_table Aws::Asg.instances(asg.physical_resource_id).map { |i|
|
60
|
+
[
|
61
|
+
i.instance_id,
|
62
|
+
i.availability_zone,
|
63
|
+
color(i.lifecycle_state, COLORS),
|
64
|
+
color(i.health_status, COLORS),
|
65
|
+
i.launch_configuration_name,
|
66
|
+
]
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
desc 'terminate [ID_REGEXES]', 'terminate matching instances'
|
72
|
+
method_option :decrement, aliases: '-d', type: :boolean, default: false, desc: 'decrement desired count after terminate'
|
73
|
+
def terminate(*ids)
|
74
|
+
instances = Aws::Asg.instances(stack_asgs.map(&:physical_resource_id))
|
75
|
+
instances.select do |i|
|
76
|
+
ids.any? { |id| i.instance_id.match(id) }
|
77
|
+
end.each do |i|
|
78
|
+
yes?("Terminate #{i.instance_id}?", :yellow) && Aws::Asg.terminate(i.instance_id, options[:decrement])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
desc 'old', 'ASG instances with outdated launch config'
|
83
|
+
method_option :terminate, aliases: '-t', type: :boolean, default: false, desc: 'terminate outdated instances'
|
84
|
+
method_option :decrement, aliases: '-d', type: :boolean, default: false, desc: 'decrement desired count after terminate'
|
85
|
+
def old
|
86
|
+
Aws::Asg.describe(stack_asgs.map(&:physical_resource_id)).map do |a|
|
87
|
+
Aws::Asg.instances(a.auto_scaling_group_name).select do |i|
|
88
|
+
i.launch_configuration_name != a.launch_configuration_name
|
89
|
+
end
|
90
|
+
end.flatten.tap do |list|
|
91
|
+
print_table list.map { |i| [i.instance_id, i.auto_scaling_group_name, i.launch_configuration_name] }
|
92
|
+
if options[:terminate]
|
93
|
+
list.each do |i|
|
94
|
+
yes?("Terminate #{i.instance_id}?", :yellow) && Aws::Asg.terminate(i.instance_id, options[:decrement])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
desc 'scale', 'ASG scale instance count'
|
101
|
+
method_option :desired_capacity, aliases: '-d', type: :numeric, default: nil, desc: 'set desired instance count'
|
102
|
+
method_option :min_size, aliases: '-m', type: :numeric, default: nil, desc: 'set minimum capacity'
|
103
|
+
method_option :max_size, aliases: '-M', type: :numeric, default: nil, desc: 'set maximum capacity'
|
104
|
+
def scale
|
105
|
+
opt = options.slice(:desired_capacity, :min_size, :max_size)
|
106
|
+
fail_task('No change requested') if opt.empty?
|
107
|
+
stack_asgs.each do |a|
|
108
|
+
debug("Scaling to #{opt} for #{a.logical_resource_id} #{a.physical_resource_id}")
|
109
|
+
Aws::Asg.update(a.physical_resource_id, opt)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'stax/aws/dynamodb'
|
2
|
+
|
3
|
+
module Stax
|
4
|
+
module DynamoDB
|
5
|
+
def self.included(thor)
|
6
|
+
thor.desc(:dynamodb, 'Dynamo subcommands')
|
7
|
+
thor.subcommand(:dynamodb, Cmd::DynamoDB)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Cmd
|
12
|
+
class DynamoDB < SubCommand
|
13
|
+
|
14
|
+
COLORS = {
|
15
|
+
CREATING: :yellow,
|
16
|
+
UPDATING: :yellow,
|
17
|
+
DELETING: :red,
|
18
|
+
ACTIVE: :green,
|
19
|
+
}
|
20
|
+
|
21
|
+
no_commands do
|
22
|
+
def stack_tables
|
23
|
+
Aws::Cfn.resources_by_type(my.stack_name, 'AWS::DynamoDB::Table')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'tables', 'list tables for stack'
|
28
|
+
def tables
|
29
|
+
print_table stack_tables.map { |r|
|
30
|
+
t = Aws::DynamoDB.table(r.physical_resource_id)
|
31
|
+
[ t.table_name, color(t.table_status, COLORS), t.item_count, t.table_size_bytes, t.creation_date_time ]
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
desc 'gsi ID', 'list global secondary indexes for table with ID'
|
36
|
+
def gsi(id)
|
37
|
+
print_table Aws::DynamoDB.gsi(my.resource(id)).map { |i|
|
38
|
+
hash = i.key_schema.find{ |k| k.key_type == 'HASH' }&.attribute_name
|
39
|
+
range = i.key_schema.find{ |k| k.key_type == 'RANGE' }&.attribute_name
|
40
|
+
[i.index_name, hash, range, i.projection.projection_type, i.index_size_bytes, i.item_count]
|
41
|
+
}.sort
|
42
|
+
end
|
43
|
+
|
44
|
+
desc 'lsi ID', 'list local secondary indexes for table with ID'
|
45
|
+
def lsi(id)
|
46
|
+
print_table Aws::DynamoDB.lsi(my.resource(id)).map { |i|
|
47
|
+
hash = i.key_schema.find{ |k| k.key_type == 'HASH' }&.attribute_name
|
48
|
+
range = i.key_schema.find{ |k| k.key_type == 'RANGE' }&.attribute_name
|
49
|
+
[i.index_name, hash, range, i.projection.projection_type, i.index_size_bytes, i.item_count]
|
50
|
+
}.sort
|
51
|
+
end
|
52
|
+
|
53
|
+
desc 'keys ID', 'get hash and range keys of table with ID'
|
54
|
+
def keys(id)
|
55
|
+
print_table Aws::DynamoDB.table(my.resource(id)).key_schema.each_with_object({}) { |schema, h|
|
56
|
+
h[schema.key_type.downcase.to_sym] = schema.attribute_name
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'stax/aws/ec2'
|
2
|
+
|
3
|
+
module Stax
|
4
|
+
module Ec2
|
5
|
+
def self.included(thor)
|
6
|
+
thor.desc(:ec2, 'EC2 subcommands')
|
7
|
+
thor.subcommand(:ec2, Cmd::Ec2)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Cmd
|
12
|
+
class Ec2 < SubCommand
|
13
|
+
COLORS = {
|
14
|
+
running: :green,
|
15
|
+
stopped: :yellow,
|
16
|
+
terminated: :red,
|
17
|
+
}
|
18
|
+
|
19
|
+
desc 'ls', 'list instances for stack'
|
20
|
+
def ls
|
21
|
+
print_table Aws::Ec2.instances(my.stack_name).map { |i|
|
22
|
+
name = i.tags.find { |t| t.key == 'Name' }&.value
|
23
|
+
[
|
24
|
+
name,
|
25
|
+
i.instance_id,
|
26
|
+
i.instance_type,
|
27
|
+
i.placement.availability_zone,
|
28
|
+
color(i.state.name, COLORS),
|
29
|
+
i.private_ip_address,
|
30
|
+
i.public_ip_address
|
31
|
+
]
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'stax/aws/ecs'
|
2
|
+
|
3
|
+
module Stax
|
4
|
+
module Ecs
|
5
|
+
def self.included(thor)
|
6
|
+
thor.desc(:ecs, 'ECS subcommands')
|
7
|
+
thor.subcommand(:ecs, Cmd::Ecs)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Cmd
|
12
|
+
class Ecs < SubCommand
|
13
|
+
COLORS = {
|
14
|
+
ACTIVE: :green,
|
15
|
+
INACTIVE: :red,
|
16
|
+
RUNNING: :green,
|
17
|
+
STOPPED: :red,
|
18
|
+
}
|
19
|
+
|
20
|
+
no_commands do
|
21
|
+
def ecs_cluster_name
|
22
|
+
@_ecs_cluster_name ||= my.stack_name
|
23
|
+
end
|
24
|
+
|
25
|
+
def ecs_task_definitions
|
26
|
+
@_ecs_task_definitions ||= Aws::Cfn.resources_by_type(my.stack_name, 'AWS::ECS::TaskDefinition' )
|
27
|
+
end
|
28
|
+
|
29
|
+
def ecs_task_definition(id)
|
30
|
+
Aws::Cfn.id(my.stack_name, id)
|
31
|
+
end
|
32
|
+
|
33
|
+
def ecs_services
|
34
|
+
@_ecs_services ||= Aws::Cfn.resources_by_type(my.stack_name, 'AWS::ECS::Service')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'clusters', 'ECS cluster for stack'
|
39
|
+
def clusters
|
40
|
+
print_table Aws::Ecs.clusters(ecs_cluster_name).map { |c|
|
41
|
+
[
|
42
|
+
c.cluster_name,
|
43
|
+
color(c.status, COLORS),
|
44
|
+
"instances:#{c.registered_container_instances_count}",
|
45
|
+
"pending:#{c.pending_tasks_count}",
|
46
|
+
"running:#{c.running_tasks_count}",
|
47
|
+
]
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'services', 'ECS services for stack'
|
52
|
+
def services
|
53
|
+
print_table Aws::Ecs.services(ecs_cluster_name, ecs_services.map(&:physical_resource_id)).map { |s|
|
54
|
+
[s.service_name, color(s.status, COLORS), s.task_definition.split('/').last, "#{s.running_count}/#{s.desired_count}"]
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
desc 'definitions', 'ECS task definitions for stack'
|
59
|
+
def definitions
|
60
|
+
print_table ecs_task_definitions.map { |r|
|
61
|
+
t = Aws::Ecs.task_definition(r.physical_resource_id)
|
62
|
+
[r.logical_resource_id, t.family, t.revision, color(t.status, COLORS)]
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
desc 'tasks' , 'ECS tasks for stack'
|
67
|
+
method_option :status, aliases: '-s', type: :string, default: 'RUNNING', desc: 'status to list'
|
68
|
+
def tasks
|
69
|
+
print_table Aws::Ecs.tasks(ecs_cluster_name, options[:status].upcase).map { |t|
|
70
|
+
[
|
71
|
+
t.task_arn.split('/').last,
|
72
|
+
t.task_definition_arn.split('/').last,
|
73
|
+
t.container_instance_arn.split('/').last,
|
74
|
+
color(t.last_status, COLORS),
|
75
|
+
"(#{t.desired_status})",
|
76
|
+
t.started_by,
|
77
|
+
]
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
desc 'instances', 'ECS instances'
|
82
|
+
def instances
|
83
|
+
print_table Aws::Ecs.instances(ecs_cluster_name).map { |i|
|
84
|
+
[
|
85
|
+
i.container_instance_arn.split('/').last,
|
86
|
+
i.ec2_instance_id,
|
87
|
+
i.agent_connected,
|
88
|
+
color(i.status, COLORS),
|
89
|
+
i.running_tasks_count,
|
90
|
+
"(#{i.pending_tasks_count})",
|
91
|
+
"agent #{i.version_info.agent_version}",
|
92
|
+
i.version_info.docker_version,
|
93
|
+
]
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
desc 'run_task [ID]', 'run task by id'
|
98
|
+
def run_task(id)
|
99
|
+
Aws::Ecs.run(ecs_cluster_name, Aws::Cfn.id(my.stack_name, id)).tap do |tasks|
|
100
|
+
puts tasks.map(&:container_instance_arn)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
desc 'stop_task [TASK]', 'stop task'
|
105
|
+
def stop_task(task)
|
106
|
+
Aws::Ecs.stop(ecs_cluster_name, task).tap do |task|
|
107
|
+
puts task.container_instance_arn
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'stax/aws/elb'
|
2
|
+
|
3
|
+
module Stax
|
4
|
+
module Elb
|
5
|
+
def self.included(thor)
|
6
|
+
thor.desc(:elb, 'ELB subcommands')
|
7
|
+
thor.subcommand(:elb, Cmd::Elb)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Cmd
|
12
|
+
class Elb < SubCommand
|
13
|
+
|
14
|
+
COLORS = {
|
15
|
+
InService: :green,
|
16
|
+
OutOfService: :red,
|
17
|
+
}
|
18
|
+
|
19
|
+
no_commands do
|
20
|
+
def stack_elbs
|
21
|
+
Aws::Cfn.resources_by_type(my.stack_name, 'AWS::ElasticLoadBalancing::LoadBalancer')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'dns', 'ALB DNS names'
|
26
|
+
def dns
|
27
|
+
puts Aws::Elb.describe(stack_elbs.map(&:physical_resource_id)).map(&:dns_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'status', 'ELB instance status'
|
31
|
+
def status
|
32
|
+
stack_elbs.each do |elb|
|
33
|
+
debug("ELB status for #{elb.logical_resource_id} #{elb.physical_resource_id}")
|
34
|
+
print_table Aws::Elb.instance_health(elb.physical_resource_id).map { |i|
|
35
|
+
[i.instance_id, color(i.state, COLORS), i.reason_code, i.description]
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'stax/aws/emr'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Stax
|
5
|
+
module Emr
|
6
|
+
def self.included(thor)
|
7
|
+
thor.desc(:emr, 'Emr subcommands')
|
8
|
+
thor.subcommand(:emr, Cmd::Emr)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Cmd
|
13
|
+
class Emr < SubCommand
|
14
|
+
|
15
|
+
COLORS = {
|
16
|
+
RUNNING: :green,
|
17
|
+
WAITING: :green,
|
18
|
+
TERMINATING: :red,
|
19
|
+
TERMINATED: :red,
|
20
|
+
TERMINATED_WITH_ERRORS: :red,
|
21
|
+
}
|
22
|
+
|
23
|
+
no_commands do
|
24
|
+
def stack_emr_clusters
|
25
|
+
Aws::Cfn.resources_by_type(my.stack_name, 'AWS::EMR::Cluster')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
desc 'status', 'EMR cluster state'
|
30
|
+
def status
|
31
|
+
print_table stack_emr_clusters.map { |r|
|
32
|
+
c = Aws::Emr.describe(r.physical_resource_id)
|
33
|
+
[color(c.status.state, COLORS), c.status.state_change_reason.message]
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'describe', 'describe EMR clusters'
|
38
|
+
def describe
|
39
|
+
stack_emr_clusters.each do |r|
|
40
|
+
Aws::Emr.describe(r.physical_resource_id).tap do |c|
|
41
|
+
puts YAML.dump(stringify_keys(c.to_hash))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
desc 'groups', 'EMR instance groups'
|
47
|
+
def groups
|
48
|
+
stack_emr_clusters.each do |r|
|
49
|
+
debug("Instance groups for #{r.logical_resource_id} #{r.physical_resource_id}")
|
50
|
+
print_table Aws::Emr.groups(r.physical_resource_id).map { |g|
|
51
|
+
[g.id, color(g.status.state, COLORS), g.name, g.instance_type, g.running_instance_count, g.market]
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
desc 'instances', 'EMR instances'
|
57
|
+
def instances
|
58
|
+
stack_emr_clusters.each do |r|
|
59
|
+
debug("Instances for #{r.logical_resource_id} #{r.physical_resource_id}")
|
60
|
+
group_names = Aws::Emr.groups(r.physical_resource_id).each_with_object({}) { |g,h| h[g.id] = g.name }
|
61
|
+
print_table Aws::Emr.instances(r.physical_resource_id).map { |i|
|
62
|
+
[i.id, i.ec2_instance_id, group_names[i.instance_group_id], i.instance_type, color(i.status.state, COLORS), i.public_ip_address]
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|