jcf 0.0.12 → 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 +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/jcf/cf/base.rb +11 -1
- data/lib/jcf/cli/commands/cf/metrics.rb +1 -0
- data/lib/jcf/cli/commands/cf/organizations.rb +6 -6
- data/lib/jcf/cli/commands/cf/quota.rb +6 -5
- data/lib/jcf/cli/commands/cf/service_brokers.rb +12 -6
- data/lib/jcf/cli/commands/cf/service_instances.rb +11 -13
- data/lib/jcf/cli/commands/cf/service_offerings.rb +7 -5
- data/lib/jcf/cli/commands/cf/service_plans.rb +7 -9
- data/lib/jcf/cli/commands/cf/services.rb +3 -8
- data/lib/jcf/cli/commands/cf/spaces.rb +7 -5
- data/lib/jcf/cli/commands/cf/users.rb +7 -5
- data/lib/jcf/cli/commands/plugins.rb +10 -0
- data/lib/jcf/cli/commands.rb +2 -0
- data/lib/jcf/cli/errors.rb +4 -8
- data/lib/jcf/cli/output_formatters/text.rb +21 -29
- data/lib/jcf/cli.rb +2 -3
- data/lib/jcf/plugins/aws_rds.rb +13 -13
- data/lib/jcf/version.rb +1 -1
- metadata +1 -2
- data/lib/jcf/aws/cloudwatch.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65808aa6761614f5fd189ae66ffe581709eaaebe1bbca0b9833ee00ead7957be
|
4
|
+
data.tar.gz: 223665d3d2608a6a2a12d870e718fd969753c43fb73db5edad10c4bc4dfa3166
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 179b7adbe213bbc2a317fbd06407abdd1f2d3ce27e3da8e2e42495db4b9fc748d5a798f4920017d00d0039c34fa168d2dfa1ef721313853abf1202be5b5de4d7
|
7
|
+
data.tar.gz: f2e8ec3f17848da098d049ae482e8529927f77e52337023fbda07ce6f4a438cb2ac441d69095552396e913a59d2c6e52099171c6bfc0bea62f05d8a1c0785270
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## [0.0.14] - 2023-10-19
|
2
|
+
|
3
|
+
- Fix all the output I broker in the last release...I need some more extensive tests
|
4
|
+
|
5
|
+
## [0.0.13] - 2023-10-19
|
6
|
+
|
7
|
+
- Fix a bug where I'd left in some unnecessary code
|
8
|
+
|
1
9
|
## [0.0.12] - 2023-10-19
|
2
10
|
|
3
11
|
- Refactored broker backend querying for metrics to use a plugin system that can be extended to support other brokers. Currently only the AWS and S3 broker is supported, but it should be easy to add others.
|
data/lib/jcf/cf/base.rb
CHANGED
@@ -40,7 +40,7 @@ module JCF
|
|
40
40
|
class << self
|
41
41
|
attr_accessor :endpoint
|
42
42
|
|
43
|
-
def keys
|
43
|
+
def keys = new.keys
|
44
44
|
|
45
45
|
def find_by(attrs)
|
46
46
|
objects = all
|
@@ -48,6 +48,7 @@ module JCF
|
|
48
48
|
keys = obj.attributes.keys & attrs.keys
|
49
49
|
keys.all? do |key|
|
50
50
|
return true if attrs[key].nil?
|
51
|
+
|
51
52
|
obj.attributes[key].include? attrs[key]
|
52
53
|
end
|
53
54
|
end
|
@@ -72,6 +73,15 @@ module JCF
|
|
72
73
|
endpoint || name.demodulize.tableize
|
73
74
|
end
|
74
75
|
|
76
|
+
def format(data)
|
77
|
+
data.each_with_object({}) do |broker, h|
|
78
|
+
broker.attributes.each do |k, v|
|
79
|
+
h[k] ||= []
|
80
|
+
h[k] << v
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
75
85
|
private
|
76
86
|
|
77
87
|
def resources(params: {})
|
@@ -107,6 +107,7 @@ module JCF
|
|
107
107
|
end
|
108
108
|
|
109
109
|
# values = { guid: { name: "name", space: "space" }, guid2: { name: "name2", space: "space2" } }
|
110
|
+
# output = { header1: %w[name1 name2], header2: %w[space1 space2]}
|
110
111
|
output = Hash.new { |hash, key| hash[key] = [] }
|
111
112
|
values.each do |guid, metrics|
|
112
113
|
metrics.each do |k, v|
|
@@ -13,12 +13,12 @@ module JCF
|
|
13
13
|
argument :name, required: false, desc: "Organization name"
|
14
14
|
|
15
15
|
def call(name: nil, **)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
out.puts formatter.format(
|
16
|
+
data = if name
|
17
|
+
Organization.find_by(name: name)
|
18
|
+
else
|
19
|
+
Organization.all
|
20
|
+
end
|
21
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -13,11 +13,12 @@ module JCF
|
|
13
13
|
option :org, aliases: ["-o", "--org", "--organization"], type: :string, desc: "Filter to an organization"
|
14
14
|
|
15
15
|
def call(name: nil, **options)
|
16
|
-
if name
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
data = if name
|
17
|
+
JCF::CF::Quota.find_by(name: name)
|
18
|
+
else
|
19
|
+
JCF::CF::Quota.all(org: options[:org])
|
20
|
+
end
|
21
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
@@ -8,19 +8,25 @@ module JCF
|
|
8
8
|
module Commands
|
9
9
|
module CF
|
10
10
|
class ServiceBrokers < Command
|
11
|
+
include JCF::CF
|
12
|
+
|
11
13
|
argument :name, required: false, desc: "Service Broker name"
|
12
14
|
|
13
15
|
option :space, aliases: ["-s", "--space"], type: :string, desc: "Filter to a space"
|
14
16
|
|
15
17
|
def call(name: nil, **options)
|
16
18
|
if name
|
17
|
-
out.puts formatter.format(JCF::CF::ServiceBroker.find_by(name: name))
|
19
|
+
out.puts formatter.format(data: JCF::CF::ServiceBroker.find_by(name: name))
|
18
20
|
else
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
# [
|
22
|
+
# #<ServiceBroker @name="cdn-broker", @guid="aaaa", @relationships=[]>,
|
23
|
+
# #<ServiceBroker @name="rds-broker", @guid="bbbb", @relationships=[]>
|
24
|
+
# ]
|
25
|
+
# output = { name: %w[cdn-broker rds-broker], header2: %w[aaaa bbbb]}
|
26
|
+
|
27
|
+
data = ServiceBroker.all(space_guids: options[:space])
|
28
|
+
|
29
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
24
30
|
end
|
25
31
|
end
|
26
32
|
end
|
@@ -15,21 +15,19 @@ module JCF
|
|
15
15
|
option :service_plan, aliases: ["-p", "--plan", "--service-plan"], type: :string,
|
16
16
|
desc: "Filter to a service plan"
|
17
17
|
|
18
|
-
# rubocop:disable Metrics/MethodLength
|
19
18
|
def call(name: nil, **options)
|
20
|
-
if name
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
19
|
+
data = if name
|
20
|
+
JCF::CF::ServiceInstance.find_by(name: name)
|
21
|
+
else
|
22
|
+
JCF::CF::ServiceInstance.all(
|
23
|
+
organization_guids: options[:org],
|
24
|
+
space_guids: options[:space],
|
25
|
+
service_plan: options[:service_plan]
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
31
30
|
end
|
32
|
-
# rubocop:enable Metrics/MethodLength
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
@@ -13,11 +13,13 @@ module JCF
|
|
13
13
|
option :org, aliases: ["-o", "--org", "--organization"], type: :string, desc: "Filter to an organization guid"
|
14
14
|
|
15
15
|
def call(name: nil, **options)
|
16
|
-
if name
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
data = if name
|
17
|
+
JCF::CF::ServiceOffering.find_by(name: name)
|
18
|
+
else
|
19
|
+
JCF::CF::ServiceOffering.all(organization_guids: options[:org])
|
20
|
+
end
|
21
|
+
|
22
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -13,15 +13,13 @@ module JCF
|
|
13
13
|
option :org, aliases: ["-o", "--org", "--organization"], type: :string, desc: "Filter to an organization"
|
14
14
|
|
15
15
|
def call(name: nil, **options)
|
16
|
-
if name
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
)
|
24
|
-
end
|
16
|
+
data = if name
|
17
|
+
JCF::CF::ServicePlan.find_by(name: name)
|
18
|
+
else
|
19
|
+
JCF::CF::ServicePlan.all(organization_guids: options[:org])
|
20
|
+
end
|
21
|
+
|
22
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
25
23
|
end
|
26
24
|
end
|
27
25
|
end
|
@@ -9,16 +9,11 @@ module JCF
|
|
9
9
|
module Commands
|
10
10
|
module CF
|
11
11
|
class Services < Command
|
12
|
-
argument :broker, required:
|
12
|
+
argument :broker, required: true, desc: "Broker name"
|
13
13
|
|
14
|
-
def call(broker
|
14
|
+
def call(broker:, **)
|
15
15
|
# gather all service offerings and plans for a single broker
|
16
|
-
|
17
|
-
out.puts formatter.format(JCF::CF::Services.first(name: broker), tree: true)
|
18
|
-
else
|
19
|
-
# TODO: this is a stub, it should be a list of all brokers
|
20
|
-
# out.puts formatter.format(JCF::CF::Organization.all)
|
21
|
-
end
|
16
|
+
out.puts formatter.format(data: JCF::CF::Services.first(name: broker), tree: true)
|
22
17
|
end
|
23
18
|
end
|
24
19
|
end
|
@@ -13,11 +13,13 @@ module JCF
|
|
13
13
|
option :org, aliases: ["-o", "--org", "--organization"], type: :string, desc: "Filter to an organization"
|
14
14
|
|
15
15
|
def call(name: nil, **options)
|
16
|
-
if name
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
data = if name
|
17
|
+
JCF::CF::Space.find_by(name: name)
|
18
|
+
else
|
19
|
+
JCF::CF::Space.all(organization_guids: options[:org])
|
20
|
+
end
|
21
|
+
|
22
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -11,11 +11,13 @@ module JCF
|
|
11
11
|
argument :name, required: false, desc: "Partial username"
|
12
12
|
|
13
13
|
def call(name: nil, **_options)
|
14
|
-
if name
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
data = if name
|
15
|
+
JCF::CF::User.all(partial_usernames: name)
|
16
|
+
else
|
17
|
+
JCF::CF::User.all
|
18
|
+
end
|
19
|
+
|
20
|
+
out.puts formatter.format(data: JCF::CF::Base.format(data))
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
@@ -10,10 +10,20 @@ module JCF
|
|
10
10
|
out.puts "JCF Plugins:"
|
11
11
|
plugin_dir = File.join(JCF.root, "jcf", "plugins", "*.rb")
|
12
12
|
pp "plugin dir: #{plugin_dir}" if ENV["DEBUG"]
|
13
|
+
load_plugins(plugin_dir)
|
14
|
+
list_plugins
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def load_plugins(plugin_dir)
|
13
20
|
Dir[plugin_dir].each do |plugin|
|
14
21
|
out.puts " file: #{File.basename(plugin, ".rb")}" if ENV["DEBUG"]
|
15
22
|
JCF::Plugins.load_plugin(File.basename(plugin, ".rb").to_sym)
|
16
23
|
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def list_plugins
|
17
27
|
JCF::Plugins.plugins.each do |plugin|
|
18
28
|
out.puts " #{plugin}"
|
19
29
|
end
|
data/lib/jcf/cli/commands.rb
CHANGED
@@ -5,6 +5,7 @@ module JCF
|
|
5
5
|
module Commands
|
6
6
|
end
|
7
7
|
|
8
|
+
# rubocop:disable Metrics/MethodLength
|
8
9
|
def self.register_commands!
|
9
10
|
register "version", Commands::Version, aliases: ["v", "-v", "--version"]
|
10
11
|
register "plugins", Commands::Plugins
|
@@ -19,5 +20,6 @@ module JCF
|
|
19
20
|
register "service_instances", Commands::CF::ServiceInstances, aliases: %w[si service_instance]
|
20
21
|
register "service_plans", Commands::CF::ServicePlans, aliases: %w[sp service_plan]
|
21
22
|
end
|
23
|
+
# rubocop:enable Metrics/MethodLength
|
22
24
|
end
|
23
25
|
end
|
data/lib/jcf/cli/errors.rb
CHANGED
@@ -5,13 +5,9 @@ module JCF
|
|
5
5
|
class Error < StandardError
|
6
6
|
end
|
7
7
|
|
8
|
-
class NotImplementedError < Error
|
9
|
-
end
|
10
|
-
|
11
|
-
class
|
12
|
-
end
|
13
|
-
|
14
|
-
class InvalidOptionError < StandardError
|
15
|
-
end
|
8
|
+
class NotImplementedError < Error; end
|
9
|
+
class NotLoggedInError < StandardError; end
|
10
|
+
class InvalidOptionError < StandardError; end
|
11
|
+
class EmptyResultError < StandardError; end
|
16
12
|
end
|
17
13
|
end
|
@@ -7,6 +7,19 @@ module JCF
|
|
7
7
|
module OutputFormatters
|
8
8
|
class Text
|
9
9
|
class << self
|
10
|
+
# @param data [Hash] the data to be formatted
|
11
|
+
# @param tree [Boolean] whether to format as a tree or a table
|
12
|
+
# @return [String] the formatted data
|
13
|
+
# @example
|
14
|
+
#
|
15
|
+
# data: { header1: %w[name1 name2], header2: %w[space1 space2]}
|
16
|
+
# output:
|
17
|
+
# ┌────────┬────────┐
|
18
|
+
# │header1 │header2 │
|
19
|
+
# ├────────┼────────┤
|
20
|
+
# │name1 │space1 │
|
21
|
+
# │name2 │space2 │
|
22
|
+
# └────────┴────────┘
|
10
23
|
def format(data:, tree: false)
|
11
24
|
return "" if data.nil? || data.empty?
|
12
25
|
|
@@ -19,9 +32,15 @@ module JCF
|
|
19
32
|
|
20
33
|
private
|
21
34
|
|
35
|
+
# @param data [Hash] the data to be formatted
|
36
|
+
# @return [String] the formatted data
|
37
|
+
# @example
|
38
|
+
#
|
39
|
+
# data: { header1: %w[name1 name2], header2: %w[space1 space2]}
|
40
|
+
# values: [["name1", "space1"], ["name2", "space2"]]
|
22
41
|
def render_data(data)
|
23
|
-
keys =
|
24
|
-
values =
|
42
|
+
keys = data.keys.collect(&:to_s)
|
43
|
+
values = data.values.transpose
|
25
44
|
|
26
45
|
table = TTY::Table.new(keys, values)
|
27
46
|
table.render(:unicode, resize: true)
|
@@ -30,33 +49,6 @@ module JCF
|
|
30
49
|
def render_tree(data)
|
31
50
|
TTY::Tree.new(data).render
|
32
51
|
end
|
33
|
-
|
34
|
-
def collect_keys(data)
|
35
|
-
return ["Empty result"] if !data || data.empty?
|
36
|
-
|
37
|
-
if data.is_a?(Array)
|
38
|
-
data.first.keys.collect(&:to_s)
|
39
|
-
elsif data.is_a?(Hash)
|
40
|
-
data.keys.collect(&:to_s) || ["Empty result"]
|
41
|
-
else
|
42
|
-
data.keys.collect(&:to_s)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Hash:
|
47
|
-
# values: [["name1", "name2"], ["space1", "space2"]]
|
48
|
-
# output: [["name1", "space1"], ["name2", "space2"]]
|
49
|
-
def collect_values(data)
|
50
|
-
return [["Empty result"]] if !data || data.empty?
|
51
|
-
|
52
|
-
if data.is_a?(Array)
|
53
|
-
data.map { |d| d.attributes.values.collect(&:to_s) }
|
54
|
-
elsif data.is_a?(Hash)
|
55
|
-
data.values.transpose
|
56
|
-
else
|
57
|
-
[data.attributes.values.collect(&:to_s)]
|
58
|
-
end
|
59
|
-
end
|
60
52
|
end
|
61
53
|
end
|
62
54
|
end
|
data/lib/jcf/cli.rb
CHANGED
@@ -25,7 +25,7 @@ module JCF
|
|
25
25
|
puts "Validating plugin (#{plugin}) implementation conforms to interface" if ENV["DEBUG"]
|
26
26
|
|
27
27
|
%i[metrics names values].each do |method|
|
28
|
-
raise "Plugin does not conform to interface (missing method \"#{method
|
28
|
+
raise "Plugin does not conform to interface (missing method \"#{method}\")" \
|
29
29
|
unless plugin.new(name: nil).respond_to?(method)
|
30
30
|
end
|
31
31
|
rescue JCF::CLI::NotLoggedInError => e
|
@@ -46,6 +46,7 @@ module JCF
|
|
46
46
|
puts "Loading plugin #{name}" if ENV["DEBUG"]
|
47
47
|
require "jcf/plugins/#{name}"
|
48
48
|
raise "Plugin didn't correctly register itself" unless @plugins[name]
|
49
|
+
|
49
50
|
@plugins[name]
|
50
51
|
end
|
51
52
|
|
@@ -98,8 +99,6 @@ module JCF
|
|
98
99
|
require_relative "cli/output_formatters"
|
99
100
|
require_relative "cli/commands"
|
100
101
|
require_relative "cli/errors"
|
101
|
-
# require_relative "cf.rb"
|
102
|
-
require_relative "aws/cloudwatch"
|
103
102
|
|
104
103
|
extend Dry::CLI::Registry
|
105
104
|
|
data/lib/jcf/plugins/aws_rds.rb
CHANGED
@@ -33,7 +33,7 @@ module JCF
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def to_s
|
36
|
-
|
36
|
+
metrics.to_s
|
37
37
|
end
|
38
38
|
|
39
39
|
private
|
@@ -59,8 +59,8 @@ module JCF
|
|
59
59
|
def storage_allocated(name:)
|
60
60
|
rds = Aws::RDS::Client.new
|
61
61
|
size = rds
|
62
|
-
|
63
|
-
|
62
|
+
.describe_db_instances(db_instance_identifier: name)
|
63
|
+
.db_instances.first.allocated_storage
|
64
64
|
Filesize.from("#{size} GB").to_i
|
65
65
|
end
|
66
66
|
|
@@ -78,18 +78,18 @@ module JCF
|
|
78
78
|
cloudwatch(name: name, metric: :cpu)
|
79
79
|
end
|
80
80
|
|
81
|
-
# rubocop:disable Metrics/MethodLength
|
81
|
+
# rubocop:disable Metrics/MethodLength
|
82
82
|
def cloudwatch(name:, metric:)
|
83
83
|
cloudwatch = Aws::CloudWatch::Client.new
|
84
84
|
res = cloudwatch.get_metric_statistics({
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
85
|
+
namespace: "AWS/RDS",
|
86
|
+
metric_name: metric,
|
87
|
+
dimensions: [{ name: "DBInstanceIdentifier", value: name }],
|
88
|
+
start_time: 1.day.ago,
|
89
|
+
end_time: Time.now,
|
90
|
+
period: 86_400,
|
91
|
+
statistics: ["Average"]
|
92
|
+
})
|
93
93
|
|
94
94
|
pp res if ENV["DEBUG"]
|
95
95
|
|
@@ -97,7 +97,7 @@ module JCF
|
|
97
97
|
rescue Aws::Errors::MissingCredentialsError
|
98
98
|
puts "You are not logged in to an AWS shell. 'gds aws <ACCOUNT> -s'"
|
99
99
|
end
|
100
|
-
# rubocop:enable Metrics/MethodLength
|
100
|
+
# rubocop:enable Metrics/MethodLength
|
101
101
|
|
102
102
|
def to_gb(bytes)
|
103
103
|
Filesize.from("#{bytes} b").to("GB").to_fs(:rounded, precision: 2)
|
data/lib/jcf/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jcf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie van Dyke
|
@@ -275,7 +275,6 @@ files:
|
|
275
275
|
- lib/.DS_Store
|
276
276
|
- lib/jcf.rb
|
277
277
|
- lib/jcf/.DS_Store
|
278
|
-
- lib/jcf/aws/cloudwatch.rb
|
279
278
|
- lib/jcf/cf.rb
|
280
279
|
- lib/jcf/cf/.DS_Store
|
281
280
|
- lib/jcf/cf/base.rb
|
data/lib/jcf/aws/cloudwatch.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "aws-sdk-cloudwatch"
|
4
|
-
require "aws-sdk-rds"
|
5
|
-
require "aws-sdk-s3"
|
6
|
-
require "active_support/core_ext/integer/time"
|
7
|
-
require "active_support/isolated_execution_state"
|
8
|
-
require "filesize"
|
9
|
-
|
10
|
-
module JCF
|
11
|
-
module AWS
|
12
|
-
class CloudWatch
|
13
|
-
NAMESPACES = {
|
14
|
-
rds: "AWS/RDS",
|
15
|
-
s3: "AWS/S3"
|
16
|
-
}.freeze
|
17
|
-
METRICS = {
|
18
|
-
free_storage: "FreeStorageSpace",
|
19
|
-
allocated_storage: "AllocatedStorage",
|
20
|
-
iops: "WriteIOPS",
|
21
|
-
cpu: "CPUUtilization"
|
22
|
-
}.freeze
|
23
|
-
|
24
|
-
def storage_free(name:)
|
25
|
-
storage_free = rds(name: name, metric: :free_storage)
|
26
|
-
storage_free.to_i
|
27
|
-
end
|
28
|
-
|
29
|
-
def storage_allocated(name:)
|
30
|
-
rds = Aws::RDS::Client.new
|
31
|
-
size = rds
|
32
|
-
.describe_db_instances(db_instance_identifier: name)
|
33
|
-
.db_instances.first.allocated_storage
|
34
|
-
Filesize.from("#{size} GB").to_i
|
35
|
-
end
|
36
|
-
|
37
|
-
def rds_storage_used(name:)
|
38
|
-
free = storage_free(name: name)
|
39
|
-
allocated = storage_allocated(name: name)
|
40
|
-
allocated - free
|
41
|
-
end
|
42
|
-
|
43
|
-
def s3_storage_used(name:)
|
44
|
-
s3 = Aws::S3::Client.new
|
45
|
-
total_size = 0
|
46
|
-
response = s3.list_objects_v2(bucket: name)
|
47
|
-
response.contents.each do |object|
|
48
|
-
total_size += object.size
|
49
|
-
end
|
50
|
-
total_size
|
51
|
-
end
|
52
|
-
|
53
|
-
def iops(name:)
|
54
|
-
rds(name: name, metric: :iops)
|
55
|
-
end
|
56
|
-
|
57
|
-
def cpu(name:)
|
58
|
-
rds(name: name, metric: :cpu)
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
def rds(name:, metric:)
|
64
|
-
dimensions = { name: "DBInstanceIdentifier", value: name }
|
65
|
-
aws(namespace: NAMESPACES[:rds], metric: METRICS[metric], dimensions: dimensions)
|
66
|
-
end
|
67
|
-
|
68
|
-
# rubocop:disable Metrics/ParameterLists, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
69
|
-
def aws(namespace:, metric:, dimensions:, start_time: nil, end_time: nil, period: nil, statistic: nil)
|
70
|
-
cloudwatch = Aws::CloudWatch::Client.new
|
71
|
-
res = cloudwatch.get_metric_statistics({
|
72
|
-
namespace: namespace,
|
73
|
-
metric_name: metric,
|
74
|
-
dimensions: [dimensions],
|
75
|
-
start_time: (start_time || 1.day.ago),
|
76
|
-
end_time: (end_time || Time.now),
|
77
|
-
period: (period || 86_400),
|
78
|
-
statistics: [(statistic || "Average")]
|
79
|
-
})
|
80
|
-
|
81
|
-
pp res if ENV["DEBUG"]
|
82
|
-
|
83
|
-
res.datapoints.first&.average || 0
|
84
|
-
rescue Aws::Errors::MissingCredentialsError
|
85
|
-
puts "You are not logged in to an AWS shell. 'gds aws <ACCOUNT> -s'"
|
86
|
-
end
|
87
|
-
# rubocop:enable Metrics/ParameterLists, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|