amazon-pricing 0.1.94 → 0.1.95

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzE2MTU4YzE3YmEzM2ExYjlmOWZmMDk5ZWRhNjA2NjllZjZlZDY5Zg==
4
+ NDk2N2NkZjYwYzAxOTAyYzk2ZWM4ZmNhNzFhZWRlMmQ0YTQzMmM3Zg==
5
5
  data.tar.gz: !binary |-
6
- MzdjODUyZDg3NzI4OTY2ZDcxNzQwMmNiNThiMjY3NTBkOGNhZWI0OQ==
6
+ OTBkNWNkYzNlOWRkOTAyZmUwZjZmYjFhYjkzMWFlOGFmZmMyMGQ1Yw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MjBkYzJmZjgxMTc3MTFmMjdmNzM4YjMyMmIyMjVkNjRhN2VhODUyNTI5MDE0
10
- ZjVlZjY0NTk0OWQ4ZjM0OTE1ODYwM2Y5YzMxZjZkMTcwYjczYmZlM2ZhYzYw
11
- ZWU3MDJiMGFkZTM3YzdhNzU2ZGJiZDhlZjk4NDc4MDI3YzM4ZjE=
9
+ ZjExYTkzMjQ4ZWFkZmMzODMxZTIzYjUzNWM5YjlkNTI5ZjllOTlmYjEyYjg2
10
+ MmFiMDU0N2Q4MTljZDVmMTM2Y2RjN2Q2OGNmZDE3YTY0ZjllYzdhNWNkZWM3
11
+ ODMxYmYxYzBjMTNhYzVhZDhhOGJiOThlYjc5YjlhZDI1ZGRlOTg=
12
12
  data.tar.gz: !binary |-
13
- MTFiOTgzNDRjYTE5YWMxMDc5NjBjM2MyOTkwM2YxYTUzNjA2NmY1MDEyMWI3
14
- ZWI4ZWE0MmE4YjcyMDEwMTc1Zjk0MzFhMGJmODQ3YjNmYzM3Njc1OWY0Mjll
15
- OTkwYTEzZmRmZGJlZGI1NjY1NzFkZDg4NjAxMGJjZjZjOTA0MTg=
13
+ NDZjOTRjMmZmMTc3MjEyOTQyNjJjN2RmYTlhNDE3NTllMTI1M2FjMzIxZWQ2
14
+ OTlhNTUzNTM3NWFkMjE0MTE2NjI3YWY2OWNiNDQ3MjExNDE3MGJiYjNkMGVh
15
+ YzVjYmY5NjI1Y2MyMTJjMGRkZTUxMDVlYzY5ODFmMjY0YWMzMDY=
data/Rakefile CHANGED
@@ -34,6 +34,27 @@ task :print_ec2_price_list do
34
34
  print_ec2_table(pricing)
35
35
  end
36
36
 
37
+ desc "Prints current EC2 DI pricing in CSV format"
38
+ task :print_ec2_di_price_list do
39
+ require 'amazon-pricing'
40
+ pricing = AwsPricing::Ec2DiPriceList.new
41
+ print_ec2_table(pricing)
42
+ end
43
+
44
+ desc "Prints current EC2 Dedicated Host Instance pricing in CSV format"
45
+ task :print_ec2_dhi_price_list do
46
+ require 'amazon-pricing'
47
+ pricing = AwsPricing::Ec2DedicatedHostInstancePriceList.new
48
+ print_ec2_table(pricing)
49
+ end
50
+
51
+ desc "Prints current EC2 Dedicated Host pricing in CSV format"
52
+ task :print_ec2_dh_price_list do
53
+ require 'amazon-pricing'
54
+ pricing = AwsPricing::Ec2DedicatedHostPriceList.new
55
+ print_ec2_dh_table(pricing)
56
+ end
57
+
37
58
  desc "Prints current RDS pricing in CSV format"
38
59
  task :print_rds_price_list do
39
60
  require 'amazon-pricing'
@@ -95,6 +116,35 @@ def print_ec2_table(pricing, target_region = nil)
95
116
  end
96
117
  end
97
118
 
119
+ def print_ec2_dh_table(pricing, target_region = nil)
120
+ line = "Region,Instance Type,API Name,Memory (MB),Disk (GB),Compute Units,Virtual Cores,Disk Type,OD Linux PPH,OD Windows PPH,OD RHEL PPH,OD SLES PPH,OD MsWinSQL PPH,OD MsWinSQLWeb PPH,"
121
+ [:year1, :year3].each do |term|
122
+ [:light, :medium, :heavy, :allupfront, :partialupfront, :noupfront].each do |res_type|
123
+ [:linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb].each do |os|
124
+ line += "#{term} #{res_type} #{os} Prepay,#{term} #{res_type} #{os} PPH,"
125
+ end
126
+ end
127
+ end
128
+ puts line.chop
129
+ pricing.regions.each do |region|
130
+ next if region.name != target_region if target_region
131
+ region.ec2_dh_types.each do |t|
132
+ line = "#{region.name},#{t.name},#{t.api_name},#{t.memory_in_mb},#{t.disk_in_gb},#{t.compute_units},#{t.virtual_cores},#{t.disk_type},"
133
+ [:linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb].each do |os|
134
+ line += "#{t.price_per_hour(os, :ondemand)},"
135
+ end
136
+ [:year1, :year3].each do |term|
137
+ [:light, :medium, :heavy, :allupfront, :partialupfront, :noupfront].each do |res_type|
138
+ [:linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb].each do |os|
139
+ line += "#{t.prepay(os, res_type, term)},#{t.price_per_hour(os, res_type, term)},"
140
+ end
141
+ end
142
+ end
143
+ puts line.chop
144
+ end
145
+ end
146
+ end
147
+
98
148
  def print_elasticache_table(pricing, target_region = nil)
99
149
  line = "Region,Node Type,API Name,Memmory (MB),Virtual Cores,Disk Type,OD PPH,"
100
150
  [:year1, :year3].each do |term|
@@ -8,6 +8,8 @@ require 'amazon-pricing/common/ec2_common'
8
8
  require 'amazon-pricing/aws-price-list'
9
9
  require 'amazon-pricing/ec2-price-list'
10
10
  require 'amazon-pricing/ec2-di-price-list'
11
+ require 'amazon-pricing/ec2-dhi-price-list'
12
+ require 'amazon-pricing/ec2-dh-price-list'
11
13
  require 'amazon-pricing/rds-price-list'
12
14
  require 'amazon-pricing/dynamo-db-price-list'
13
15
  require 'amazon-pricing/elasticache-price-list'
@@ -104,6 +104,7 @@ module AwsPricing
104
104
  ELASTICACHE_BASE_URL = "http://a0.awsstatic.com/pricing/1/elasticache/"
105
105
 
106
106
  DI_OD_BASE_URL = "http://a0.awsstatic.com/pricing/1/dedicated-instances/"
107
+ DH_OD_BASE_URL = "http://a0.awsstatic.com/pricing/1/dedicated-hosts/"
107
108
  RESERVED_DI_BASE_URL = "http://a0.awsstatic.com/pricing/1/ec2/ri-v2/"
108
109
  RESERVED_DI_PREV_GEN_BASE_URL = "http://a0.awsstatic.com/pricing/1/ec2/previous-generation/ri-v2/"
109
110
 
@@ -1,5 +1,7 @@
1
1
  module AwsPricing
2
+
2
3
  module Ec2Common
4
+
3
5
  # Retrieves the EC2 on-demand instance pricing.
4
6
  # type_of_instance = :ondemand, :light, :medium, :heavy
5
7
  def fetch_ec2_instance_pricing(url, type_of_instance, operating_system)
@@ -0,0 +1,36 @@
1
+ require 'amazon-pricing/definitions/instance-type'
2
+
3
+ module AwsPricing
4
+ class Ec2DedicatedHostType < InstanceType
5
+
6
+ def initialize(region, family_name)
7
+ @category_types = {}
8
+ @region = region
9
+ @name = ''
10
+ @api_name = family_name
11
+ end
12
+
13
+ def category_types
14
+ @category_types
15
+ end
16
+
17
+ def region
18
+ @region
19
+ end
20
+
21
+ def update_dh_pricing(operating_system, dhprice)
22
+ os = get_category_type(operating_system)
23
+ if os.nil?
24
+ os = OperatingSystem.new(self, operating_system)
25
+ @category_types[operating_system] = os
26
+ end
27
+
28
+ category = operating_system.to_s
29
+ values = { category => dhprice }
30
+ price = coerce_price(values[category])
31
+ os.set_price_per_hour(:ondemand, nil, price)
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -88,6 +88,22 @@ module AwsPricing
88
88
  end
89
89
  end
90
90
 
91
+ # operating_system = :linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb
92
+ # dhprice is a string representing the price per hour for the Dedicated Host
93
+ # capacity is the number of this type of instancess supported on this Dedicated Host
94
+ def update_dhi_pricing(operating_system, dhprice, capacity)
95
+ os = get_category_type(operating_system)
96
+ if os.nil?
97
+ os = OperatingSystem.new(self, operating_system)
98
+ @category_types[operating_system] = os
99
+ end
100
+
101
+ category = operating_system.to_s
102
+ values = { category => dhprice }
103
+ price = coerce_price(values[category])
104
+ os.set_price_per_hour(:ondemand, nil, price/capacity)
105
+ end
106
+
91
107
  def update_pricing2(operating_system, res_type, ondemand_pph = nil, year1_prepay = nil, year3_prepay = nil, year1_pph = nil, year3_pph = nil)
92
108
 
93
109
  os = get_category_type(operating_system)
@@ -38,7 +38,7 @@ module AwsPricing
38
38
 
39
39
  # Keep this in for backwards compatibility within current major version of gem
40
40
  def disk_in_mb
41
- @disk_in_gb * 1000
41
+ @disk_in_gb.nil? ? 0 : @disk_in_gb * 1000
42
42
  end
43
43
 
44
44
  def memory_in_gb
@@ -15,13 +15,14 @@ module AwsPricing
15
15
  # e.g. us-east, us-west
16
16
  #
17
17
  class Region
18
- attr_accessor :name, :ebs_price, :ec2_instance_types, :rds_instance_types, :elasticache_node_types
18
+ attr_accessor :name, :ebs_price, :ec2_instance_types, :rds_instance_types, :elasticache_node_types, :ec2_dh_types
19
19
 
20
20
  def initialize(name)
21
21
  @name = name
22
22
  @ec2_instance_types = {}
23
23
  @rds_instance_types = {}
24
24
  @elasticache_node_types = {}
25
+ @ec2_dh_types = {}
25
26
  end
26
27
 
27
28
  # Maintained for backward compatibility reasons (retrieves EC2 instance type)
@@ -41,6 +42,10 @@ module AwsPricing
41
42
  @elasticache_node_types.values
42
43
  end
43
44
 
45
+ def ec2_dh_types
46
+ @ec2_dh_types.values
47
+ end
48
+
44
49
  # Returns whether an instance_type is available.
45
50
  # operating_system = :linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb
46
51
  # type_of_instance = :ondemand, :light, :medium, :heavy
@@ -78,6 +83,15 @@ module AwsPricing
78
83
  current
79
84
  end
80
85
 
86
+ def add_or_update_ec2_dh_type(family)
87
+ current = get_ec2_dh_type(family)
88
+ if current.nil?
89
+ current = Ec2DedicatedHostType.new(self, family)
90
+ @ec2_dh_types[family] = current
91
+ end
92
+ current
93
+ end
94
+
81
95
  # Maintained for backward compatibility reasons (retrieves EC2 instance type)
82
96
  def get_instance_type(api_name)
83
97
  get_ec2_instance_type(api_name)
@@ -95,6 +109,10 @@ module AwsPricing
95
109
  @elasticache_node_types[api_name]
96
110
  end
97
111
 
112
+ def get_ec2_dh_type(family)
113
+ @ec2_dh_types[family]
114
+ end
115
+
98
116
  end
99
117
 
100
118
  end
@@ -0,0 +1,52 @@
1
+ module AwsPricing
2
+ class Ec2DedicatedHostPriceList < PriceList
3
+ include AwsPricing::Ec2Common
4
+
5
+ def initialize
6
+ super
7
+ InstanceType.populate_lookups
8
+ get_ec2_dh_od_pricing
9
+ end
10
+
11
+ def os_types
12
+ @@OS_TYPES
13
+ end
14
+
15
+ protected
16
+
17
+ @@OS_TYPES = [ 'linux', 'rhel', 'sles', 'mswin', 'mswinSQL', 'mswinSQLWeb', 'mswinSQLEnterprise' ]
18
+
19
+ def get_ec2_dh_od_pricing
20
+ @@OS_TYPES.each do |os|
21
+ fetch_ec2_dedicated_host_pricing(DH_OD_BASE_URL + "dh-od.min.js", os.to_sym)
22
+ end
23
+ end
24
+
25
+ def fetch_ec2_dedicated_host_pricing(url, operating_system)
26
+ res = PriceList.fetch_url(url)
27
+ begin
28
+ res['config']['regions'].each do |reg|
29
+ region_name = reg['region']
30
+ region = get_region(region_name)
31
+ if region.nil?
32
+ $stderr.puts "[fetch_ec2_dedicated_host_pricing] WARNING: unable to find region #{region_name}"
33
+ next
34
+ end
35
+ reg['types'].each do |type|
36
+ type_name = type['name']
37
+ tiers = type['tiers']
38
+ tiers.each do |tier|
39
+ family = tier['name']
40
+ api_name = family
41
+ dhprice = tier['prices']['USD']
42
+ dh_type = region.add_or_update_ec2_dh_type(family)
43
+ dh_type.update_dh_pricing(operating_system, dhprice)
44
+ end
45
+ end
46
+ end
47
+ rescue UnknownTypeError
48
+ $stderr.puts "[fetch_ec2_dedicated_host_pricing] WARNING: encountered #{$!.message}"
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,74 @@
1
+ module AwsPricing
2
+ class Ec2DedicatedHostInstancePriceList < PriceList
3
+ include AwsPricing::Ec2Common
4
+
5
+ def initialize
6
+ super
7
+ InstanceType.populate_lookups
8
+ get_ec2_dhi_od_pricing
9
+ end
10
+
11
+ def os_types
12
+ @@OS_TYPES
13
+ end
14
+
15
+ protected
16
+
17
+ @@OS_TYPES = [ 'linux', 'rhel', 'sles', 'mswin', 'mswinSQL', 'mswinSQLWeb', 'mswinSQLEnterprise' ]
18
+
19
+ @@CAPACITY_HASH = {
20
+ 'c3' => { "large"=>16, "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
21
+ 'c4' => { "large"=>16, "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
22
+ 'p2' => { "xlarge"=>16, "8xlarge"=>2, "16xlarge"=>1 },
23
+ 'g2' => { "2xlarge"=>4, "8xlarge"=>1 },
24
+ 'm3' => { "medium"=>32, "large"=>16, "xlarge"=>8, "2xlarge"=>4 },
25
+ 'd2' => { "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
26
+ 'r4' => { "large"=>32, "xlarge"=>16, "2xlarge"=>8, "4xlarge"=>4, "8xlarge"=>2, "16xlarge"=>1 },
27
+ 'r3' => { "large"=>16, "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
28
+ 'm4' => { "large"=>22, "xlarge"=>11, "2xlarge"=>5, "4xlarge"=>4, "10xlarge"=>1, "16xlarge"=>1 },
29
+ 'i2' => { "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1, "16xlarge"=>1 },
30
+ 'i3' => { "large"=>32, "xlarge"=>16, "2xlarge"=>8, "4xlarge"=>4, "8xlarge"=>2, "16xlarge"=>1 },
31
+ 'x1' => { "16xlarge"=>2, "32xlarge"=>1 }
32
+ }
33
+
34
+ def get_ec2_dhi_od_pricing
35
+ @@OS_TYPES.each do |os|
36
+ fetch_ec2_dedicated_host_instance_pricing(DH_OD_BASE_URL + "dh-od.min.js", os.to_sym)
37
+ end
38
+ end
39
+
40
+ def fetch_ec2_dedicated_host_instance_pricing(url, operating_system)
41
+ res = PriceList.fetch_url(url)
42
+ res['config']['regions'].each do |reg|
43
+ begin
44
+ region_name = reg['region']
45
+ region = get_region(region_name)
46
+ if region.nil?
47
+ $stderr.puts "[fetch_ec2_dedicated_host_instance_pricing] WARNING: unable to find region #{region_name}"
48
+ next
49
+ end
50
+ reg['types'].each do |type|
51
+ type_name = type['name']
52
+ tiers = type['tiers']
53
+ tiers.each do |tier|
54
+ family = tier['name']
55
+
56
+ # hack for now until I can get capacity for fpga instances
57
+ next if family == 'f1'
58
+
59
+ dhprice = tier['prices']['USD']
60
+ @@CAPACITY_HASH[family].each do |inst_size,capacity|
61
+ api_name, name = Ec2InstanceType.get_name(family, "#{family}.#{inst_size}", false)
62
+ instance_type = region.add_or_update_ec2_instance_type(api_name, name)
63
+ instance_type.update_dhi_pricing(operating_system, dhprice, capacity)
64
+ end
65
+ end
66
+ end
67
+
68
+ rescue UnknownTypeError
69
+ $stderr.puts "[fetch_ec2_dedicated_host_instance_pricing] WARNING: encountered #{$!.message}"
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -8,5 +8,5 @@
8
8
  # Home:: http://github.com/CloudHealth/amazon-pricing
9
9
  #++
10
10
  module AwsPricing
11
- VERSION = '0.1.94'
11
+ VERSION = '0.1.95'
12
12
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe AwsPricing::Ec2DedicatedHostPriceList do
4
+
5
+ before(:all) do
6
+ @pricing = AwsPricing::Ec2DedicatedHostPriceList.new
7
+ end
8
+
9
+ def validate_price_in_region region
10
+ # Result have valid node name
11
+ region.ec2_dh_types.each do |dh_type|
12
+ expect(dh_type.api_name).to have(2).characters
13
+ expect(dh_type.region.ec2_dh_types[0].category_types[:linux].name).to eq(:linux)
14
+ expect(dh_type.region.ec2_dh_types[0].category_types[:linux].ondemand_price_per_hour.class).to eq(Float)
15
+ end
16
+ end
17
+
18
+ describe 'new' do
19
+ it 'Ec2DedicatedHostPriceList.new should return valid response' do
20
+ @pricing.regions.each do |region|
21
+ validate_price_in_region region
22
+ end
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe AwsPricing::Ec2DedicatedHostInstancePriceList do
4
+
5
+ before(:all) do
6
+ @pricing = AwsPricing::Ec2DedicatedHostInstancePriceList.new
7
+ @dh_pricing = AwsPricing::Ec2DedicatedHostPriceList.new
8
+ end
9
+
10
+ def validate_price_in_region region
11
+ # Result have valid node name
12
+ region.ec2_instance_types.each do |inst_type|
13
+ expect(inst_type.api_name).to match(/[[:alpha:]][[:alpha:]]./)
14
+ expect(inst_type.category_types).to have_exactly(@pricing.os_types.length).items
15
+ expect(inst_type.category_types[0].price_per_hour.class).to eq(Float)
16
+
17
+ family_name = inst_type.api_name.split('.').first
18
+ dh_region_arr = @dh_pricing.regions.select { |reg| reg.name == region.name }
19
+ expect(dh_region_arr).to have_exactly(1).items
20
+ dh_region = dh_region_arr[0]
21
+ dh_price_per_hour = dh_region.ec2_dh_types[0].price_per_hour(:linux, :ondemand)
22
+ dh_dh_type_arr = dh_region.ec2_dh_types.select { |type| type.api_name == family_name }
23
+ expect(dh_dh_type_arr).to have_exactly(1).items
24
+ dh_dh_type = dh_dh_type_arr[0]
25
+ expect(inst_type.category_types[0].price_per_hour).to be <= dh_dh_type.category_types[:linux].ondemand_price_per_hour
26
+ end
27
+ end
28
+
29
+ describe 'new' do
30
+ it 'Ec2DedicatedHostInstancePriceList.new should return valid response' do
31
+ @pricing.regions.each do |region|
32
+ validate_price_in_region region
33
+ end
34
+ end
35
+ end
36
+
37
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amazon-pricing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.94
4
+ version: 0.1.95
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Kinsella
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-02 00:00:00.000000000 Z
11
+ date: 2017-05-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A Ruby library for retrieving pricing for Amazon Web Services
14
14
  email:
@@ -38,6 +38,7 @@ files:
38
38
  - lib/amazon-pricing/definitions/category-type.rb
39
39
  - lib/amazon-pricing/definitions/database-type.rb
40
40
  - lib/amazon-pricing/definitions/ebs-price.rb
41
+ - lib/amazon-pricing/definitions/ec2-dh-type.rb
41
42
  - lib/amazon-pricing/definitions/ec2-instance-type.rb
42
43
  - lib/amazon-pricing/definitions/elasticache_node_type.rb
43
44
  - lib/amazon-pricing/definitions/instance-type.rb
@@ -45,6 +46,8 @@ files:
45
46
  - lib/amazon-pricing/definitions/rds-instance-type.rb
46
47
  - lib/amazon-pricing/definitions/region.rb
47
48
  - lib/amazon-pricing/dynamo-db-price-list.rb
49
+ - lib/amazon-pricing/ec2-dh-price-list.rb
50
+ - lib/amazon-pricing/ec2-dhi-price-list.rb
48
51
  - lib/amazon-pricing/ec2-di-price-list.rb
49
52
  - lib/amazon-pricing/ec2-price-list.rb
50
53
  - lib/amazon-pricing/elasticache-price-list.rb
@@ -52,6 +55,8 @@ files:
52
55
  - lib/amazon-pricing/rds-price-list.rb
53
56
  - lib/amazon-pricing/version.rb
54
57
  - spec/lib/amazon-pricing/definitions/database-type_spec.rb
58
+ - spec/lib/amazon-pricing/ec2_dh_pricing_spec.rb
59
+ - spec/lib/amazon-pricing/ec2_dhi_pricing_spec.rb
55
60
  - spec/lib/amazon-pricing/elasticache_pricing_spec.rb
56
61
  - spec/lib/amazon-pricing/helpers/instance-type-spec.rb
57
62
  - spec/lib/amazon-pricing/rds_pricing_spec.rb
@@ -90,6 +95,8 @@ specification_version: 4
90
95
  summary: Amazon Web Services Pricing Ruby gem
91
96
  test_files:
92
97
  - spec/lib/amazon-pricing/definitions/database-type_spec.rb
98
+ - spec/lib/amazon-pricing/ec2_dh_pricing_spec.rb
99
+ - spec/lib/amazon-pricing/ec2_dhi_pricing_spec.rb
93
100
  - spec/lib/amazon-pricing/elasticache_pricing_spec.rb
94
101
  - spec/lib/amazon-pricing/helpers/instance-type-spec.rb
95
102
  - spec/lib/amazon-pricing/rds_pricing_spec.rb