aws-ec2-instance_types 1.1.0 → 1.3.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/aws-ec2-instance_types.gemspec +9 -4
- data/bin/aws-ec2-instance_types +9 -15
- data/lib/dldinternet/aws/ec2/instance_types.rb +7 -114
- data/lib/dldinternet/aws/ec2/instance_types/cli.rb +72 -0
- data/lib/dldinternet/aws/ec2/instance_types/error.rb +9 -0
- data/lib/dldinternet/aws/ec2/instance_types/get.rb +42 -0
- data/lib/dldinternet/aws/ec2/instance_types/mixins/ec2_instance_types.rb +88 -0
- data/lib/dldinternet/aws/ec2/instance_types/mixins/no_commands.rb +115 -0
- data/lib/dldinternet/aws/ec2/instance_types/scraper.rb +129 -0
- data/lib/dldinternet/aws/ec2/instance_types/version.rb +10 -0
- metadata +84 -9
- data/lib/aws/ec2/instance_types.rb +0 -1
- data/lib/aws/ec2/instance_types/version.rb +0 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: caa316960c670b445c5ad37dc905ec031a34ee41
|
|
4
|
+
data.tar.gz: 77e89cbd893fa0cb3f93982c8d6adf37c5e50351
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bc073cd502e92bf02f75e36b332d25c9728a75c4633d682d39e88e02944a5c592ef0378b97b6f849a6cafcb8ee3de6681717f48cb3a0b7cdf43bcc84d7558578
|
|
7
|
+
data.tar.gz: 50d0266df247bb3e6c1be7a8e87712b06a10052b56b58321a61f908ec47b8bdd85ee4088d88718ce524f3a7ba92b8ebf380df0d509274d9a3b041692dc74c01b
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
require File.expand_path('../lib/aws/ec2/instance_types/version', __FILE__)
|
|
3
|
+
require File.expand_path('../lib/dldinternet/aws/ec2/instance_types/version', __FILE__)
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |gem|
|
|
6
6
|
gem.name = 'aws-ec2-instance_types'
|
|
7
|
-
gem.version =
|
|
7
|
+
gem.version = DLDInternet::AWS::EC2::Instance_Types::VERSION
|
|
8
8
|
gem.summary =
|
|
9
9
|
gem.description = %q{Retrieve an up to date list of valid AWS EC2 Instance Types directly from Amazon Web Services official site.}
|
|
10
10
|
gem.license = 'Apachev2'
|
|
@@ -21,9 +21,14 @@ Gem::Specification.new do |gem|
|
|
|
21
21
|
gem.add_development_dependency 'rake', '~> 0.8'
|
|
22
22
|
gem.add_development_dependency 'rubygems-tasks', '~> 0.2'
|
|
23
23
|
|
|
24
|
+
gem.add_runtime_dependency('thor', ['>= 0.19.1'])
|
|
24
25
|
gem.add_runtime_dependency(%q<mechanize>, ['>= 2.7.2'])
|
|
25
26
|
gem.add_runtime_dependency(%q<nokogiri>, ['>= 1.5.0'])
|
|
26
|
-
gem.
|
|
27
|
-
gem.
|
|
27
|
+
gem.add_dependency 'awesome_print', '> 0'
|
|
28
|
+
gem.add_dependency 'inifile', '> 0'
|
|
29
|
+
gem.add_dependency 'colorize', '>= 0'
|
|
30
|
+
gem.add_dependency 'dldinternet-mixlib-logging', '>= 0.4.0'
|
|
31
|
+
gem.add_dependency 'psych'
|
|
32
|
+
gem.add_dependency 'json'
|
|
28
33
|
|
|
29
34
|
end
|
data/bin/aws-ec2-instance_types
CHANGED
|
@@ -3,20 +3,14 @@
|
|
|
3
3
|
# Adjust lib path
|
|
4
4
|
_lib=File.expand_path(File.dirname(__FILE__) + '/../lib')
|
|
5
5
|
$:.unshift(_lib) unless $:.include?(_lib)
|
|
6
|
+
require 'dldinternet/aws/ec2/instance_types/cli'
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
require 'awesome_print'
|
|
16
|
-
require 'colorize'
|
|
17
|
-
|
|
18
|
-
begin
|
|
19
|
-
puts getInstanceTypes(:mechanize => mechanize).ai
|
|
20
|
-
rescue Timeout::Error => e
|
|
21
|
-
puts "Unable to retrieve instance type details in a reasonable time (#{mechanize.open_timeout}s). Giving up ...".light_red
|
|
8
|
+
# =====================================================================================================================
|
|
9
|
+
rc = DLDInternet::AWS::EC2::Instance_Types::Cli.start(ARGV)
|
|
10
|
+
if rc.is_a?(Fixnum)
|
|
11
|
+
exit rc
|
|
12
|
+
else
|
|
13
|
+
puts rc.ai
|
|
14
|
+
exit 0
|
|
22
15
|
end
|
|
16
|
+
|
|
@@ -1,124 +1,17 @@
|
|
|
1
1
|
module DLDInternet
|
|
2
2
|
module AWS
|
|
3
3
|
module EC2
|
|
4
|
-
|
|
5
|
-
# HEADINGS = [
|
|
6
|
-
# :instance_family, # [0]
|
|
7
|
-
# :instance_type, # [1]
|
|
8
|
-
# :processor_arch, # [2]
|
|
9
|
-
# :vCPU, # [3]
|
|
10
|
-
# :ECU, # [4]
|
|
11
|
-
# :memory, # [5]
|
|
12
|
-
# :instance_storage, # [6]
|
|
13
|
-
# :EBS_optimized_available, # [7]
|
|
14
|
-
# :network_performance # [8]
|
|
15
|
-
# ]
|
|
16
|
-
#'Instance Type','vCPU','Memory (GiB)',' Storage (GB)','Networking Performance','Physical Processor','Clock Speed (GHz)','Intel® AES-NI','Intel® AVX†','Intel® Turbo','EBS OPT','Enhanced Networking'
|
|
17
|
-
HEADINGS_CPU = [
|
|
18
|
-
:instance_type, # [0]
|
|
19
|
-
:vCPU, # [1]
|
|
20
|
-
:memory, # [2]
|
|
21
|
-
:instance_storage, # [3]
|
|
22
|
-
:networking_performance, # [4]
|
|
23
|
-
:physical_processor, # [5]
|
|
24
|
-
:clock_speed, # [6]
|
|
25
|
-
:Intel_AES_NI, # [7]
|
|
26
|
-
:Intel_AVX, # [8]
|
|
27
|
-
:Intel_Turbo, # [9]
|
|
28
|
-
:EBS_OPT, # [10]
|
|
29
|
-
:enhanced_networking # [11]
|
|
30
|
-
]
|
|
31
|
-
DEBUG = true
|
|
32
|
-
attr_reader :instance_types
|
|
4
|
+
module Instance_Types
|
|
33
5
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@instance_types = {}
|
|
38
|
-
require "mechanize"
|
|
39
|
-
mechanize = options[:mechanize]
|
|
40
|
-
unless mechanize
|
|
41
|
-
mechanize = Mechanize.new
|
|
42
|
-
mechanize.user_agent_alias = 'Mac Safari' # Pretend to use a Mac
|
|
43
|
-
end
|
|
44
|
-
url = options[:url] || 'http://aws.amazon.com/ec2/instance-types/instance-details/'
|
|
45
|
-
|
|
46
|
-
page = mechanize.get(url)
|
|
47
|
-
|
|
48
|
-
require 'nokogiri'
|
|
49
|
-
|
|
50
|
-
nk = Nokogiri::HTML(page.body)
|
|
51
|
-
# noinspection RubyAssignmentExpressionInConditionalInspection
|
|
52
|
-
if div = find_div(nk, %r'^<div\s+class="nine columns content-with-nav')
|
|
53
|
-
# noinspection RubyAssignmentExpressionInConditionalInspection
|
|
54
|
-
if div = find_div(div, %r'^<div\s+class="content parsys')
|
|
55
|
-
divs = div.css('div').to_a
|
|
56
|
-
itm = nil
|
|
57
|
-
idx = 0
|
|
58
|
-
divs.each do |d|
|
|
59
|
-
as = d.css('div div h2 a')
|
|
60
|
-
as.each do |a|
|
|
61
|
-
# puts "'#{a.text}'"
|
|
62
|
-
if a.text == ' Instance Types Matrix '
|
|
63
|
-
itm = d
|
|
64
|
-
break
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
break if itm
|
|
68
|
-
idx += 1
|
|
69
|
-
end
|
|
70
|
-
itm = divs[idx+1+2]
|
|
71
|
-
table = itm.css('div table').first
|
|
72
|
-
# puts "#{idx}: #{table.to_s}"
|
|
73
|
-
@instance_types = scrapeTable(HEADINGS_CPU, table)
|
|
74
|
-
end
|
|
75
|
-
end
|
|
6
|
+
class << self
|
|
7
|
+
require 'dldinternet/aws/ec2/instance_types/mixins/ec2_instance_types'
|
|
8
|
+
include DLDInternet::AWS::EC2::Instance_Types::MixIns::EC2_Instance_Types
|
|
76
9
|
end
|
|
77
|
-
@instance_types
|
|
78
|
-
end
|
|
79
10
|
|
|
80
|
-
def find_div(nk,regex)
|
|
81
|
-
ret = nil
|
|
82
|
-
divs = nk.search('div')
|
|
83
|
-
if divs.count > 0
|
|
84
|
-
nine = divs.select { |div| div.to_s.match regex }
|
|
85
|
-
if nine.count == 1
|
|
86
|
-
nine = nine.shift
|
|
87
|
-
ret = nine
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
ret
|
|
91
11
|
end
|
|
92
12
|
|
|
93
|
-
# ---------------------------------------------------------------------------------------------------------------
|
|
94
|
-
def scrapeTable(cHeadings,table)
|
|
95
|
-
raise Error.new 'Cannot find instance type table' unless table.is_a?(Nokogiri::XML::Element)
|
|
96
|
-
rows = table.search('tr')[0..-1]
|
|
97
|
-
head = rows.shift
|
|
98
|
-
|
|
99
|
-
cols = head.search('td').collect { |td|
|
|
100
|
-
text = td.text.to_s
|
|
101
|
-
text = text.gsub(%r/(\r?\n)+/, ' ').strip
|
|
102
|
-
CGI.unescapeHTML(text)
|
|
103
|
-
}
|
|
104
|
-
instance_types = {
|
|
105
|
-
:headings => {},
|
|
106
|
-
:details => []
|
|
107
|
-
}
|
|
108
|
-
(0..cols.size-1).map { |i| instance_types[:headings][cHeadings[i]] = cols[i] }
|
|
109
|
-
|
|
110
|
-
rows.each do |row|
|
|
111
|
-
|
|
112
|
-
cells = row.search('td').collect { |td|
|
|
113
|
-
CGI.unescapeHTML(td.text.to_s.gsub(%r/(\r?\n)+/, ' ').strip.gsub('32-bit or64-bit', '32-bit or 64-bit'))
|
|
114
|
-
}
|
|
115
|
-
raise StandardError.new "This row does not have the same number of cells as the table header: #{row.text.to_s.strip}" unless cells.size == cols.size
|
|
116
|
-
instance = {}
|
|
117
|
-
(0..cells.size-1).map { |i| instance[cHeadings[i]] = cells[i] }
|
|
118
|
-
instance_types[:details] << instance
|
|
119
|
-
end
|
|
120
|
-
instance_types
|
|
121
|
-
end
|
|
122
13
|
end
|
|
14
|
+
|
|
123
15
|
end
|
|
124
|
-
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
require 'awesome_print'
|
|
3
|
+
require 'colorize'
|
|
4
|
+
require 'dldinternet/aws/ec2/instance_types/version'
|
|
5
|
+
require 'dldinternet/aws/ec2/instance_types/error'
|
|
6
|
+
require 'dldinternet/aws/ec2/instance_types/scraper'
|
|
7
|
+
require 'dldinternet/aws/ec2/instance_types/cli'
|
|
8
|
+
require 'dldinternet/aws/ec2/instance_types'
|
|
9
|
+
|
|
10
|
+
module DLDInternet
|
|
11
|
+
module AWS
|
|
12
|
+
module EC2
|
|
13
|
+
module Instance_Types
|
|
14
|
+
class Cli < Thor
|
|
15
|
+
class_option :verbose, :type => :boolean
|
|
16
|
+
class_option :debug, :type => :boolean
|
|
17
|
+
class_option :log_level, :type => :string, :banner => 'Log level ([:trace, :debug, :info, :step, :warn, :error, :fatal, :todo])'
|
|
18
|
+
class_option :inifile, :type => :string
|
|
19
|
+
|
|
20
|
+
no_commands do
|
|
21
|
+
|
|
22
|
+
require 'dldinternet/aws/ec2/instance_types/mixins/no_commands'
|
|
23
|
+
include DLDInternet::AWS::EC2::Instance_Types::MixIns::NoCommands
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.start(argv = ARGV, config = {})
|
|
28
|
+
if argv.size == 0 or argv[0].match(%r'^--')
|
|
29
|
+
argv.unshift('get')
|
|
30
|
+
end
|
|
31
|
+
super(argv,config)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def initialize(args = [], local_options = {}, config = {})
|
|
35
|
+
super(args,local_options,config)
|
|
36
|
+
@log_level = :step
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
desc 'get', 'get instance types'
|
|
40
|
+
def get()
|
|
41
|
+
parse_options
|
|
42
|
+
puts 'get instance types' if options[:verbose]
|
|
43
|
+
|
|
44
|
+
puts DLDInternet::AWS::EC2::Instance_Types.getEC2_Instance_Types().ai
|
|
45
|
+
0
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
desc 'load ARGS', 'load instance types'
|
|
49
|
+
def load(path)
|
|
50
|
+
parse_options
|
|
51
|
+
puts 'load instance types' if options[:verbose]
|
|
52
|
+
|
|
53
|
+
it = DLDInternet::AWS::EC2::Instance_Types.loadEC2_Instance_Types(path)
|
|
54
|
+
ap it
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
desc 'save', 'save instance types'
|
|
58
|
+
def save(path)
|
|
59
|
+
parse_options
|
|
60
|
+
puts 'save instance types' if options[:verbose]
|
|
61
|
+
|
|
62
|
+
it = DLDInternet::AWS::EC2::Instance_Types.getEC2_Instance_Types()
|
|
63
|
+
DLDInternet::AWS::EC2::Instance_Types.saveEC2_Instance_Types(path, it)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
default_task 'get'
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
require 'awesome_print'
|
|
3
|
+
require 'dldinternet/aws/ec2/instance_types/scraper'
|
|
4
|
+
require 'colorize'
|
|
5
|
+
require 'json'
|
|
6
|
+
require 'yaml'
|
|
7
|
+
|
|
8
|
+
module DLDInternet
|
|
9
|
+
module AWS
|
|
10
|
+
module EC2
|
|
11
|
+
module Instance_Types
|
|
12
|
+
# noinspection RubyParenthesesAfterMethodCallInspection
|
|
13
|
+
class Get < ::Thor
|
|
14
|
+
no_commands do
|
|
15
|
+
|
|
16
|
+
require 'dldinternet/aws/ec2/instance_types/mixins/no_commands'
|
|
17
|
+
include DLDInternet::AWS::EC2::Instance_Types::MixIns::NoCommands
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
desc 'load ARGS', 'load instance types'
|
|
22
|
+
def load(path)
|
|
23
|
+
parse_options
|
|
24
|
+
puts 'load instance types' if options[:verbose]
|
|
25
|
+
|
|
26
|
+
it = loadEC2_Instance_Types(path)
|
|
27
|
+
ap it
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
desc 'save', 'save instance types'
|
|
31
|
+
def save(path)
|
|
32
|
+
parse_options
|
|
33
|
+
puts 'save instance types' if options[:verbose]
|
|
34
|
+
|
|
35
|
+
it = getEC2_Instance_Types()
|
|
36
|
+
saveEC2_Instance_Types(path, it)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
require 'awesome_print'
|
|
3
|
+
require 'inifile'
|
|
4
|
+
require 'colorize'
|
|
5
|
+
|
|
6
|
+
module DLDInternet
|
|
7
|
+
module AWS
|
|
8
|
+
module EC2
|
|
9
|
+
module Instance_Types
|
|
10
|
+
module MixIns
|
|
11
|
+
module EC2_Instance_Types
|
|
12
|
+
|
|
13
|
+
def getFileFormat(path)
|
|
14
|
+
format = case File.extname(File.basename(path)).downcase
|
|
15
|
+
when /json|js/
|
|
16
|
+
'json'
|
|
17
|
+
when /yaml|yml/
|
|
18
|
+
'yaml'
|
|
19
|
+
else
|
|
20
|
+
raise DLDInternet::AWS::EC2::Instance_Types::Error.new("Unsupported file type: #{path}")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def saveEC2_Instance_Types(path,it)
|
|
25
|
+
format = getFileFormat(path)
|
|
26
|
+
begin
|
|
27
|
+
File.open path, File::CREAT|File::TRUNC|File::RDWR, 0644 do |f|
|
|
28
|
+
case format
|
|
29
|
+
when /yaml/
|
|
30
|
+
f.write it.to_yaml line_width: 1024, indentation: 4, canonical: false
|
|
31
|
+
when /json/
|
|
32
|
+
f.write JSON.pretty_generate(it, { indent: "\t", space: ' '})
|
|
33
|
+
else
|
|
34
|
+
abort! "Internal: Unsupported format #{format}. Should have noticed this earlier!"
|
|
35
|
+
end
|
|
36
|
+
f.close
|
|
37
|
+
end
|
|
38
|
+
rescue
|
|
39
|
+
abort! "!!! Could not write file #{path}: \nException: #{$!}\nParent directory exists? #{File.directory?(File.dirname(path))}\n"
|
|
40
|
+
end
|
|
41
|
+
0
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def loadEC2_Instance_Types(path)
|
|
45
|
+
format = getFileFormat(path)
|
|
46
|
+
spec = File.read(path)
|
|
47
|
+
case format
|
|
48
|
+
when /json/
|
|
49
|
+
JSON.parse(spec)
|
|
50
|
+
when /yaml/
|
|
51
|
+
begin
|
|
52
|
+
YAML.load(spec)
|
|
53
|
+
rescue Psych::SyntaxError => e
|
|
54
|
+
abort! "Error in the template specification: #{e.message}\n#{spec.split(/\n/).map{|l| "#{i+=1}: #{l}"}.join("\n")}"
|
|
55
|
+
end
|
|
56
|
+
else
|
|
57
|
+
abort! "Unsupported file type: #{path}"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def getEC2_Instance_Types(mechanize=nil)
|
|
62
|
+
unless mechanize
|
|
63
|
+
require 'mechanize'
|
|
64
|
+
mechanize = ::Mechanize.new
|
|
65
|
+
mechanize.open_timeout = 5
|
|
66
|
+
mechanize.read_timeout = 10
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
scraper = DLDInternet::AWS::EC2::Instance_Types::Scraper.new()
|
|
70
|
+
|
|
71
|
+
begin
|
|
72
|
+
return scraper.getInstanceTypes(:mechanize => mechanize)
|
|
73
|
+
rescue Timeout::Error => e
|
|
74
|
+
puts "Unable to retrieve instance type details in a reasonable time (#{mechanize.open_timeout}s). Giving up ...".light_red
|
|
75
|
+
return nil
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def abort!(msg)
|
|
80
|
+
raise DLDInternet::AWS::EC2::Instance_Types::Error.new msg
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
require 'awesome_print'
|
|
3
|
+
require 'inifile'
|
|
4
|
+
require 'colorize'
|
|
5
|
+
|
|
6
|
+
module DLDInternet
|
|
7
|
+
module AWS
|
|
8
|
+
module EC2
|
|
9
|
+
module Instance_Types
|
|
10
|
+
|
|
11
|
+
LOG_LEVELS = [:trace, :debug, :info, :step, :warn, :error, :fatal, :todo]
|
|
12
|
+
|
|
13
|
+
module MixIns
|
|
14
|
+
module NoCommands
|
|
15
|
+
require 'dldinternet/mixlib/logging'
|
|
16
|
+
include DLDInternet::Mixlib::Logging
|
|
17
|
+
|
|
18
|
+
def validate_options
|
|
19
|
+
_options = options.dup
|
|
20
|
+
if options[:log_level]
|
|
21
|
+
log_level = options[:log_level].to_sym
|
|
22
|
+
raise "Invalid log-level: #{log_level}" unless LOG_LEVELS.include?(log_level)
|
|
23
|
+
_options[:log_level] = log_level
|
|
24
|
+
else
|
|
25
|
+
_options[:log_level] ||= :step
|
|
26
|
+
end
|
|
27
|
+
@options = _options
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def parse_options
|
|
31
|
+
validate_options
|
|
32
|
+
|
|
33
|
+
lcs = ::Logging::ColorScheme.new( 'compiler', :levels => {
|
|
34
|
+
:trace => :blue,
|
|
35
|
+
:debug => :cyan,
|
|
36
|
+
:info => :green,
|
|
37
|
+
:step => :green,
|
|
38
|
+
:warn => :yellow,
|
|
39
|
+
:error => :red,
|
|
40
|
+
:fatal => :red,
|
|
41
|
+
:todo => :purple,
|
|
42
|
+
})
|
|
43
|
+
scheme = lcs.scheme
|
|
44
|
+
scheme['trace'] = "\e[38;5;33m"
|
|
45
|
+
scheme['fatal'] = "\e[38;5;89m"
|
|
46
|
+
scheme['todo'] = "\e[38;5;55m"
|
|
47
|
+
lcs.scheme scheme
|
|
48
|
+
@config = @options.dup
|
|
49
|
+
@config[:log_opts] = lambda{|mlll| {
|
|
50
|
+
:pattern => "%#{mlll}l: %m %g\n",
|
|
51
|
+
:date_pattern => '%Y-%m-%d %H:%M:%S',
|
|
52
|
+
:color_scheme => 'compiler',
|
|
53
|
+
:trace => (@config[:trace].nil? ? false : @config[:trace]),
|
|
54
|
+
# [2014-06-30 Christo] DO NOT do this ... it needs to be a FixNum!!!!
|
|
55
|
+
# If you want to do ::Logging.init first then fine ... go ahead :)
|
|
56
|
+
# :level => @config[:log_level],
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
@logger = getLogger(@config)
|
|
60
|
+
|
|
61
|
+
if @options[:inifile]
|
|
62
|
+
@options[:inifile] = File.expand_path(@options[:inifile])
|
|
63
|
+
unless File.exist?(@options[:inifile])
|
|
64
|
+
raise "#{@options[:inifile]} not found!"
|
|
65
|
+
end
|
|
66
|
+
begin
|
|
67
|
+
ini = ::IniFile.load(@options[:inifile])
|
|
68
|
+
ini['global'].each{ |key,value|
|
|
69
|
+
@options[key.to_s]=value
|
|
70
|
+
}
|
|
71
|
+
def _expand(k,v,regex,rerun)
|
|
72
|
+
matches = v.match(regex)
|
|
73
|
+
if matches
|
|
74
|
+
var = matches[1]
|
|
75
|
+
if options[var]
|
|
76
|
+
options[k]=v.gsub(/\%\(#{var}\)/,options[var]).gsub(/\%#{var}/,options[var])
|
|
77
|
+
else
|
|
78
|
+
rerun[var] = 1
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
pending = nil
|
|
84
|
+
rerun = {}
|
|
85
|
+
begin
|
|
86
|
+
pending = rerun
|
|
87
|
+
rerun = {}
|
|
88
|
+
options.to_hash.each{|k,v|
|
|
89
|
+
if v.to_s.match(/\%/)
|
|
90
|
+
_expand(k,v,%r'[^\\]\%\((\w+)\)', rerun)
|
|
91
|
+
_expand(k,v,%r'[^\\]\%(\w+)', rerun)
|
|
92
|
+
end
|
|
93
|
+
}
|
|
94
|
+
# Should break out the first time that we make no progress!
|
|
95
|
+
end while pending != rerun
|
|
96
|
+
rescue ::IniFile::Error => e
|
|
97
|
+
# noop
|
|
98
|
+
rescue ::Exception => e
|
|
99
|
+
@logger.error "#{e.class.name} #{e.message}"
|
|
100
|
+
raise e
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
if options[:verbose]
|
|
105
|
+
@logger.info "Options:\n#{options.ai}"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
module DLDInternet
|
|
2
|
+
module AWS
|
|
3
|
+
module EC2
|
|
4
|
+
|
|
5
|
+
module Instance_Types
|
|
6
|
+
HEADINGS_CPU = [
|
|
7
|
+
:instance_type, # [0]
|
|
8
|
+
:vCPU, # [1]
|
|
9
|
+
:memory, # [2]
|
|
10
|
+
:instance_storage, # [3]
|
|
11
|
+
:networking_performance, # [4]
|
|
12
|
+
:physical_processor, # [5]
|
|
13
|
+
:clock_speed, # [6]
|
|
14
|
+
:Intel_AES_NI, # [7]
|
|
15
|
+
:Intel_AVX, # [8]
|
|
16
|
+
:Intel_Turbo, # [9]
|
|
17
|
+
:EBS_OPT, # [10]
|
|
18
|
+
:enhanced_networking # [11]
|
|
19
|
+
]
|
|
20
|
+
DEBUG = true
|
|
21
|
+
class Scraper
|
|
22
|
+
attr_reader :instance_types
|
|
23
|
+
|
|
24
|
+
def initialize
|
|
25
|
+
@instance_types = {}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# ---------------------------------------------------------------------------------------------------------------
|
|
29
|
+
def getInstanceTypes(options={})
|
|
30
|
+
unless @instance_types.size > 0
|
|
31
|
+
mechanize = options[:mechanize]
|
|
32
|
+
unless mechanize
|
|
33
|
+
require 'mechanize'
|
|
34
|
+
mechanize = Mechanize.new
|
|
35
|
+
mechanize.user_agent_alias = 'Mac Safari' # Pretend to use a Mac
|
|
36
|
+
end
|
|
37
|
+
url = options[:url] || 'http://aws.amazon.com/ec2/instance-types/instance-details/'
|
|
38
|
+
|
|
39
|
+
page = mechanize.get(url)
|
|
40
|
+
|
|
41
|
+
require 'nokogiri'
|
|
42
|
+
|
|
43
|
+
nk = Nokogiri::HTML(page.body)
|
|
44
|
+
div = nk.css('div#aws-page-content')
|
|
45
|
+
div = nk.css('div.page-content') unless div.to_s.match %r'^<div id="'m
|
|
46
|
+
# noinspection RubyAssignmentExpressionInConditionalInspection
|
|
47
|
+
if div = find_div(div, %r'^<div\s+class="nine columns content-with-nav'm )
|
|
48
|
+
# noinspection RubyAssignmentExpressionInConditionalInspection
|
|
49
|
+
if div = find_div(div, %r'^<div\s+class="content parsys'm )
|
|
50
|
+
divs = div.css('div').to_a
|
|
51
|
+
itm = nil
|
|
52
|
+
idx = 0
|
|
53
|
+
divs.each do |d|
|
|
54
|
+
as = d.css('div div h2 a')
|
|
55
|
+
as.each do |a|
|
|
56
|
+
# puts "'#{a.text}'"
|
|
57
|
+
if a.text.match %r'\s*Instance Types Matrix\s*'
|
|
58
|
+
itm = d
|
|
59
|
+
break
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
break if itm
|
|
63
|
+
idx += 1
|
|
64
|
+
end
|
|
65
|
+
if idx < divs.count
|
|
66
|
+
divs = divs[idx..-1]
|
|
67
|
+
table = nil
|
|
68
|
+
divs.each do |d|
|
|
69
|
+
table = d.css('div.aws-table table')
|
|
70
|
+
break if table.to_s.match(%r'^<table'i)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
@instance_types = scrapeTable(HEADINGS_CPU, table) if table
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
@instance_types
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def find_div(nk,regex)
|
|
82
|
+
ret = nil
|
|
83
|
+
divs = nk.search('div').to_a
|
|
84
|
+
if divs.count > 0
|
|
85
|
+
nine = divs.select{ |div|
|
|
86
|
+
div.to_s.gsub(%r'\n',' ').match(regex)
|
|
87
|
+
}
|
|
88
|
+
if nine.count >= 1
|
|
89
|
+
nine = nine.shift
|
|
90
|
+
ret = nine
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
ret
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# ---------------------------------------------------------------------------------------------------------------
|
|
97
|
+
def scrapeTable(cHeadings,table)
|
|
98
|
+
raise Error.new 'Cannot find instance type table' unless (table.is_a?(Nokogiri::XML::Element) or table.is_a?(Nokogiri::XML::NodeSet))
|
|
99
|
+
rows = table.search('tr')[0..-1].to_a
|
|
100
|
+
head = rows.shift
|
|
101
|
+
|
|
102
|
+
cols = head.search('td').collect { |td|
|
|
103
|
+
text = td.text.to_s
|
|
104
|
+
text = text.gsub(%r/(\r?\n)+/, ' ').strip
|
|
105
|
+
CGI.unescapeHTML(text)
|
|
106
|
+
}
|
|
107
|
+
instance_types = {
|
|
108
|
+
:headings => {},
|
|
109
|
+
:details => []
|
|
110
|
+
}
|
|
111
|
+
(0..cols.size-1).map { |i| instance_types[:headings][cHeadings[i]] = cols[i] }
|
|
112
|
+
|
|
113
|
+
rows.each do |row|
|
|
114
|
+
|
|
115
|
+
cells = row.search('td').collect { |td|
|
|
116
|
+
CGI.unescapeHTML(td.text.to_s.gsub(%r/(\r?\n)+/, ' ').strip.gsub('32-bit or64-bit', '32-bit or 64-bit'))
|
|
117
|
+
}
|
|
118
|
+
raise StandardError.new "This row does not have the same number of cells as the table header: #{row.text.to_s.strip}" unless cells.size == cols.size
|
|
119
|
+
instance = {}
|
|
120
|
+
(0..cells.size-1).map { |i| instance[cHeadings[i]] = cells[i] }
|
|
121
|
+
instance_types[:details] << instance
|
|
122
|
+
end
|
|
123
|
+
instance_types
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aws-ec2-instance_types
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Christo De Lange
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-
|
|
11
|
+
date: 2014-09-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -52,6 +52,20 @@ dependencies:
|
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0.2'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: thor
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 0.19.1
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 0.19.1
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: mechanize
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -82,32 +96,88 @@ dependencies:
|
|
|
82
96
|
version: 1.5.0
|
|
83
97
|
- !ruby/object:Gem::Dependency
|
|
84
98
|
name: awesome_print
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: inifile
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - ">"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
type: :runtime
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - ">"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: colorize
|
|
85
127
|
requirement: !ruby/object:Gem::Requirement
|
|
86
128
|
requirements:
|
|
87
129
|
- - ">="
|
|
88
130
|
- !ruby/object:Gem::Version
|
|
89
|
-
version:
|
|
131
|
+
version: '0'
|
|
90
132
|
type: :runtime
|
|
91
133
|
prerelease: false
|
|
92
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
135
|
requirements:
|
|
94
136
|
- - ">="
|
|
95
137
|
- !ruby/object:Gem::Version
|
|
96
|
-
version:
|
|
138
|
+
version: '0'
|
|
97
139
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name:
|
|
140
|
+
name: dldinternet-mixlib-logging
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - ">="
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: 0.4.0
|
|
146
|
+
type: :runtime
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - ">="
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: 0.4.0
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: psych
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - ">="
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: '0'
|
|
160
|
+
type: :runtime
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - ">="
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '0'
|
|
167
|
+
- !ruby/object:Gem::Dependency
|
|
168
|
+
name: json
|
|
99
169
|
requirement: !ruby/object:Gem::Requirement
|
|
100
170
|
requirements:
|
|
101
171
|
- - ">="
|
|
102
172
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: 0
|
|
173
|
+
version: '0'
|
|
104
174
|
type: :runtime
|
|
105
175
|
prerelease: false
|
|
106
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
177
|
requirements:
|
|
108
178
|
- - ">="
|
|
109
179
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 0
|
|
180
|
+
version: '0'
|
|
111
181
|
description: Retrieve an up to date list of valid AWS EC2 Instance Types directly
|
|
112
182
|
from Amazon Web Services official site.
|
|
113
183
|
email: rubygems@dldinternet.com
|
|
@@ -135,10 +205,15 @@ files:
|
|
|
135
205
|
- features/step_definitions/.gitkeep
|
|
136
206
|
- features/step_definitions/aws-ec2-instance_types_steps.rb
|
|
137
207
|
- features/support/env.rb
|
|
138
|
-
- lib/aws/ec2/instance_types.rb
|
|
139
|
-
- lib/aws/ec2/instance_types/version.rb
|
|
140
208
|
- lib/dldinternet/aws/ec2.rb
|
|
141
209
|
- lib/dldinternet/aws/ec2/instance_types.rb
|
|
210
|
+
- lib/dldinternet/aws/ec2/instance_types/cli.rb
|
|
211
|
+
- lib/dldinternet/aws/ec2/instance_types/error.rb
|
|
212
|
+
- lib/dldinternet/aws/ec2/instance_types/get.rb
|
|
213
|
+
- lib/dldinternet/aws/ec2/instance_types/mixins/ec2_instance_types.rb
|
|
214
|
+
- lib/dldinternet/aws/ec2/instance_types/mixins/no_commands.rb
|
|
215
|
+
- lib/dldinternet/aws/ec2/instance_types/scraper.rb
|
|
216
|
+
- lib/dldinternet/aws/ec2/instance_types/version.rb
|
|
142
217
|
- test/helper.rb
|
|
143
218
|
- test/test_aws-ec2-instance_types.rb
|
|
144
219
|
homepage: https://rubygems.org/gems/aws-ec2-instance_types
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require 'aws/ec2/instance_types/version'
|