amazon-pricing 0.1.53 → 0.1.54
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile.lock +30 -3
- data/Rakefile +21 -19
- data/lib/amazon-pricing.rb +0 -1
- data/lib/amazon-pricing/version.rb +1 -1
- data/lib/aws-price-list.rb +2 -7
- data/test/ec2_instance_types_test.rb +45 -0
- metadata +2 -6
- data/lib/gov-cloud-price-list.rb +0 -273
- data/test/govcloud_test.rb +0 -50
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTEzNzRlNDEyOWU3M2IyYmE0Y2IzMTc2ZTMwMjExYjA3OWQyOGJmZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YThhNmQ4MjM0ZjE3ZGY5MjQ1MzBhYzA5ZGE5ZDRiM2IyMDAyNzIxYQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YmE3MmQ1NzMxZTlmZjNkZmJjMTE1Y2YwZmI3MTk2NDBmNjIyZjNmMzllMmNm
|
10
|
+
MjM2Mjg4ODhiOTkyMDVmMGRkNTc1OTc0YWU4MzMxYjk5OTg5YzEwN2RhMmM4
|
11
|
+
ZmQwMjQyODA0YTVhNzc2Y2Y3ZGM1M2UyZDBiNDBiNWRkMWY1YTg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Y2NlNmE4ZDIyODRhNDZkNTAzYmRkZTRkMTYyNzBhNGI1ZDk1ZmVhNjA3MjUw
|
14
|
+
YTFhZGZmNDFkZmUxZDJiYTBkYmQ3ZmMyM2M0YzUxNjVjZmRhNDM5OTIzZmRj
|
15
|
+
MDk0YzNmYjU5YTZlMjVmMzAwZDM2MjEzZDI5ZTI4YTEzMjM4NjM=
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,34 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
amazon-pricing (0.1.
|
4
|
+
amazon-pricing (0.1.54)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
diff-lcs (1.1.3)
|
10
|
-
|
10
|
+
domain_name (0.5.23)
|
11
|
+
unf (>= 0.0.5, < 1.0.0)
|
12
|
+
http-cookie (1.0.2)
|
13
|
+
domain_name (~> 0.5)
|
14
|
+
mechanize (2.7.3)
|
15
|
+
domain_name (~> 0.5, >= 0.5.1)
|
16
|
+
http-cookie (~> 1.0)
|
17
|
+
mime-types (~> 2.0)
|
18
|
+
net-http-digest_auth (~> 1.1, >= 1.1.1)
|
19
|
+
net-http-persistent (~> 2.5, >= 2.5.2)
|
20
|
+
nokogiri (~> 1.4)
|
21
|
+
ntlm-http (~> 0.1, >= 0.1.1)
|
22
|
+
webrobots (>= 0.0.9, < 0.2)
|
23
|
+
mime-types (2.4.3)
|
24
|
+
mini_portile (0.6.1)
|
25
|
+
net-http-digest_auth (1.4)
|
26
|
+
net-http-persistent (2.9.4)
|
27
|
+
nokogiri (1.6.5)
|
28
|
+
mini_portile (~> 0.6.0)
|
29
|
+
ntlm-http (0.1.1)
|
30
|
+
power_assert (0.2.2)
|
31
|
+
rake (10.4.2)
|
11
32
|
rspec (2.11.0)
|
12
33
|
rspec-core (~> 2.11.0)
|
13
34
|
rspec-expectations (~> 2.11.0)
|
@@ -16,13 +37,19 @@ GEM
|
|
16
37
|
rspec-expectations (2.11.3)
|
17
38
|
diff-lcs (~> 1.1.3)
|
18
39
|
rspec-mocks (2.11.3)
|
19
|
-
test-unit (
|
40
|
+
test-unit (3.0.8)
|
41
|
+
power_assert
|
42
|
+
unf (0.1.4)
|
43
|
+
unf_ext
|
44
|
+
unf_ext (0.0.6)
|
45
|
+
webrobots (0.1.1)
|
20
46
|
|
21
47
|
PLATFORMS
|
22
48
|
ruby
|
23
49
|
|
24
50
|
DEPENDENCIES
|
25
51
|
amazon-pricing!
|
52
|
+
mechanize (~> 2.7.3)
|
26
53
|
rake
|
27
54
|
rspec (~> 2.11.0)
|
28
55
|
test-unit
|
data/Rakefile
CHANGED
@@ -44,22 +44,22 @@ end
|
|
44
44
|
desc "Prints current GovCloud EC2 pricing in CSV format"
|
45
45
|
task :print_govcloud_ec2_price_list do
|
46
46
|
require 'amazon-pricing'
|
47
|
-
pricing = AwsPricing::
|
48
|
-
print_ec2_table(pricing)
|
47
|
+
pricing = AwsPricing::Ec2PriceList.new
|
48
|
+
print_ec2_table(pricing, "us-gov-west-1")
|
49
49
|
end
|
50
50
|
|
51
51
|
desc "Prints current GovCloud RDS pricing in CSV format"
|
52
52
|
task :print_govcloud_rds_price_list do
|
53
53
|
require 'amazon-pricing'
|
54
|
-
pricing = AwsPricing::
|
55
|
-
print_rds_table(pricing)
|
54
|
+
pricing = AwsPricing::Ec2PriceList.new
|
55
|
+
print_rds_table(pricing, "us-gov-west-1")
|
56
56
|
end
|
57
57
|
|
58
58
|
task :default => [:test]
|
59
59
|
|
60
60
|
#########################################
|
61
61
|
|
62
|
-
def print_ec2_table(pricing)
|
62
|
+
def print_ec2_table(pricing, target_region = nil)
|
63
63
|
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,"
|
64
64
|
[:year1, :year3].each do |term|
|
65
65
|
[:light, :medium, :heavy, :allupfront, :partialupfront, :noupfront].each do |res_type|
|
@@ -70,6 +70,7 @@ def print_ec2_table(pricing)
|
|
70
70
|
end
|
71
71
|
puts line.chop
|
72
72
|
pricing.regions.each do |region|
|
73
|
+
next if region.name != target_region if target_region
|
73
74
|
region.ec2_instance_types.each do |t|
|
74
75
|
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},"
|
75
76
|
[:linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb].each do |os|
|
@@ -87,7 +88,7 @@ def print_ec2_table(pricing)
|
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
90
|
-
def print_rds_table(pricing)
|
91
|
+
def print_rds_table(pricing, target_region = nil)
|
91
92
|
line = "Region,Instance Type,API Name,Memory (MB),Disk (GB),Compute Units,Virtual Cores,Disk Type,"
|
92
93
|
|
93
94
|
AwsPricing::DatabaseType.get_database_name.each do |db|
|
@@ -118,10 +119,11 @@ def print_rds_table(pricing)
|
|
118
119
|
puts line.chop
|
119
120
|
|
120
121
|
pricing.regions.each do |region|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
122
|
+
next if region.name != target_region if target_region
|
123
|
+
region.rds_instance_types.each do |t|
|
124
|
+
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},"
|
125
|
+
AwsPricing::DatabaseType.get_database_name.each do |db|
|
126
|
+
unless AwsPricing::DatabaseType.get_available_types(db).nil?
|
125
127
|
AwsPricing::DatabaseType.get_available_types(db).each do |deploy_type|
|
126
128
|
if deploy_type == :byol_multiaz
|
127
129
|
line += "#{t.price_per_hour(db, :ondemand, nil, true, true)},"
|
@@ -129,11 +131,11 @@ def print_rds_table(pricing)
|
|
129
131
|
line += "#{t.price_per_hour(db, :ondemand, nil, deploy_type == :multiaz, deploy_type == :byol)},"
|
130
132
|
end
|
131
133
|
end
|
132
|
-
|
134
|
+
else
|
133
135
|
line += "#{t.price_per_hour(db, :ondemand, nil)},"
|
134
|
-
|
135
|
-
|
136
|
-
|
136
|
+
end
|
137
|
+
end
|
138
|
+
[:year1, :year3].each do |term|
|
137
139
|
[:light, :medium, :heavy].each do |res_type|
|
138
140
|
AwsPricing::DatabaseType.get_database_name.each do |db|
|
139
141
|
unless AwsPricing::DatabaseType.get_available_types(db).nil?
|
@@ -147,10 +149,10 @@ def print_rds_table(pricing)
|
|
147
149
|
else
|
148
150
|
line += "#{t.prepay(db, res_type, term)},#{t.price_per_hour(db, res_type, term)},"
|
149
151
|
end
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
puts line.chop
|
156
|
+
end
|
155
157
|
end
|
156
158
|
end
|
data/lib/amazon-pricing.rb
CHANGED
data/lib/aws-price-list.rb
CHANGED
@@ -16,16 +16,11 @@ module AwsPricing
|
|
16
16
|
class PriceList
|
17
17
|
attr_accessor :regions
|
18
18
|
|
19
|
-
def initialize(
|
19
|
+
def initialize()
|
20
20
|
@_regions = {}
|
21
21
|
|
22
22
|
# Creating regions upfront since different json files all use different naming conventions. No more ad-hoc creation.
|
23
|
-
|
24
|
-
regions = ["us-gov-west-1"]
|
25
|
-
else
|
26
|
-
# AWS added some but not all of teh data for us-gov-west-1. Not sure why they have not completed it. If they do not deprecate the screen scraping.
|
27
|
-
regions = ["eu-west-1", "sa-east-1", "us-east-1", "ap-northeast-1", "us-west-2", "us-west-1", "ap-southeast-1", "ap-southeast-2", "eu-central-1"]
|
28
|
-
end
|
23
|
+
regions = ["eu-west-1", "sa-east-1", "us-east-1", "ap-northeast-1", "us-west-2", "us-west-1", "ap-southeast-1", "ap-southeast-2", "eu-central-1", "us-gov-west-1"]
|
29
24
|
|
30
25
|
regions.each do |name|
|
31
26
|
@_regions[name] = Region.new(name)
|
@@ -146,4 +146,49 @@ class TestEc2InstanceTypes < Test::Unit::TestCase
|
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
|
+
def test_govcloud_cc8xlarge_issue
|
150
|
+
obj = @@ec2_pricing.get_instance_type('us-gov-west-1', 'm3.large')
|
151
|
+
assert obj.api_name == 'm3.large'
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_govcloud_memory
|
155
|
+
# Validate instance types in specific regions are available
|
156
|
+
region = @@ec2_pricing.get_region('us-gov-west-1')
|
157
|
+
instance = region.get_ec2_instance_type('m3.large')
|
158
|
+
assert instance.memory_in_mb == 7500
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_govcloud_virtual_cores
|
162
|
+
region = @@ec2_pricing.get_region('us-gov-west-1')
|
163
|
+
instance = region.get_ec2_instance_type('m3.large')
|
164
|
+
assert instance.virtual_cores == 2
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_govcloud_ebs
|
168
|
+
region = @@ec2_pricing.get_region('us-gov-west-1')
|
169
|
+
assert region.ebs_price.standard_per_gb == 0.065
|
170
|
+
assert region.ebs_price.standard_per_million_io == 0.065
|
171
|
+
assert region.ebs_price.preferred_per_gb == 0.15
|
172
|
+
assert region.ebs_price.preferred_per_iops == 0.078
|
173
|
+
assert region.ebs_price.s3_snaps_per_gb == 0.125
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_govcloud_new_reservation_types
|
177
|
+
region = @@ec2_pricing.get_region('us-gov-west-1')
|
178
|
+
instance = region.get_ec2_instance_type('r3.large')
|
179
|
+
os = instance.get_operating_system(:linux)
|
180
|
+
assert os.ondemand_price_per_hour == 0.210
|
181
|
+
assert os.partialupfront_prepay_1_year == 649
|
182
|
+
assert os.allupfront_prepay_1_year == 976
|
183
|
+
assert os.partialupfront_prepay_3_year == 1239
|
184
|
+
assert os.allupfront_prepay_3_year == 1935
|
185
|
+
assert os.noupfront_effective_rate_1_year == 0.1320
|
186
|
+
assert os.partialupfront_effective_rate_1_year == 0.1131
|
187
|
+
assert os.allupfront_effective_rate_1_year == 0.1114
|
188
|
+
assert os.partialupfront_effective_rate_3_year == 0.0781
|
189
|
+
assert os.allupfront_effective_rate_3_year == 0.0736
|
190
|
+
end
|
191
|
+
|
192
|
+
|
193
|
+
|
149
194
|
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.
|
4
|
+
version: 0.1.54
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Kinsella
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A Ruby library for retrieving pricing for Amazon Web Services
|
14
14
|
email:
|
@@ -43,7 +43,6 @@ files:
|
|
43
43
|
- lib/amazon-pricing/version.rb
|
44
44
|
- lib/aws-price-list.rb
|
45
45
|
- lib/ec2-price-list.rb
|
46
|
-
- lib/gov-cloud-price-list.rb
|
47
46
|
- lib/rds-price-list.rb
|
48
47
|
- spec/instance_type_spec.rb
|
49
48
|
- spec/price_list_spec.rb
|
@@ -51,7 +50,6 @@ files:
|
|
51
50
|
- spec/spec_helper.rb
|
52
51
|
- spec/support/.gitignore
|
53
52
|
- test/ec2_instance_types_test.rb
|
54
|
-
- test/govcloud_test.rb
|
55
53
|
- test/helper.rb
|
56
54
|
homepage: http://github.com/CloudHealth/amazon-pricing
|
57
55
|
licenses:
|
@@ -89,6 +87,4 @@ test_files:
|
|
89
87
|
- spec/spec_helper.rb
|
90
88
|
- spec/support/.gitignore
|
91
89
|
- test/ec2_instance_types_test.rb
|
92
|
-
- test/govcloud_test.rb
|
93
90
|
- test/helper.rb
|
94
|
-
has_rdoc:
|
data/lib/gov-cloud-price-list.rb
DELETED
@@ -1,273 +0,0 @@
|
|
1
|
-
module AwsPricing
|
2
|
-
|
3
|
-
class GovCloudEc2PriceList < PriceList
|
4
|
-
GOV_CLOUD_URL = "http://aws.amazon.com/govcloud-us/pricing/ec2/"
|
5
|
-
GOV_CLOUD_EBS_URL = "http://aws.amazon.com/govcloud-us/pricing/ebs/"
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
super(true)
|
9
|
-
InstanceType.populate_lookups
|
10
|
-
get_ec2_instance_pricing
|
11
|
-
fetch_ec2_ebs_pricing
|
12
|
-
end
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
def get_ec2_instance_pricing
|
17
|
-
|
18
|
-
client = Mechanize.new
|
19
|
-
page = client.get(GOV_CLOUD_URL)
|
20
|
-
tables = page.search("//div[@class='aws-table ']")
|
21
|
-
for i in 0..3
|
22
|
-
create_ondemand_instances(tables[i])
|
23
|
-
end
|
24
|
-
|
25
|
-
for i in 4..9
|
26
|
-
# GovCloud no longer supports reservation types
|
27
|
-
#create_reserved_instances(tables[i], :light)
|
28
|
-
end
|
29
|
-
for i in 9..22
|
30
|
-
# GovCloud no longer supports reservation types
|
31
|
-
#create_reserved_instances(tables[i], :medium)
|
32
|
-
end
|
33
|
-
for i in 23..33
|
34
|
-
# GovCloud no longer supports reservation types
|
35
|
-
#create_reserved_instances(tables[i], :heavy)
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
# e.g. [["Prices / Hour", "Amazon Linux", "RHEL", "SLES"], ["m1.small", "$0.053", "$0.083", "$0.083"]]
|
41
|
-
def create_ondemand_instances(table)
|
42
|
-
rows = get_rows(table)
|
43
|
-
header = rows[0]
|
44
|
-
@_regions.values.each do |region|
|
45
|
-
|
46
|
-
rows.slice(1, rows.size).each do |row|
|
47
|
-
api_name = row[0]
|
48
|
-
instance_type = region.get_ec2_instance_type(api_name)
|
49
|
-
if instance_type.nil?
|
50
|
-
api_name, name = Ec2InstanceType.get_name(nil, row[0], false)
|
51
|
-
instance_type = region.add_or_update_ec2_instance_type(api_name, name)
|
52
|
-
end
|
53
|
-
instance_type.update_pricing2(get_os(header[1]), :ondemand, row[1])
|
54
|
-
instance_type.update_pricing2(get_os(header[2]), :ondemand, row[2])
|
55
|
-
instance_type.update_pricing2(get_os(header[3]), :ondemand, row[3])
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# e.g. [["RHEL", "1 yr Term Upfront", "1 yr TermHourly", "3 yr TermUpfront", "3 yr Term Hourly"], ["m1.small", "$68.00", "$0.099", "$105.00", "$0.098"]]
|
61
|
-
def create_reserved_instances(table, res_type)
|
62
|
-
rows = get_rows(table)
|
63
|
-
operating_system = get_os(table.search(".//td/p").last.inner_text.strip) # Wow...
|
64
|
-
|
65
|
-
@_regions.values.each do |region|
|
66
|
-
|
67
|
-
rows.slice(1, rows.size).each do |row|
|
68
|
-
api_name = row[0]
|
69
|
-
instance_type = region.get_instance_type(api_name)
|
70
|
-
if instance_type.nil?
|
71
|
-
api_name, name = Ec2InstanceType.get_name(nil, api_name, true)
|
72
|
-
instance_type = region.add_or_update_ec2_instance_type(api_name, name)
|
73
|
-
end
|
74
|
-
instance_type.update_pricing2(operating_system, res_type, nil, row[1], row[3], row[2], row[4])
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def fetch_ec2_ebs_pricing
|
80
|
-
client = Mechanize.new
|
81
|
-
page = client.get(GOV_CLOUD_EBS_URL)
|
82
|
-
ebs_costs = page.search("//div[@class='text-box section']//li")
|
83
|
-
@_regions.values.each do |region|
|
84
|
-
region.ebs_price = EbsPrice.new(region)
|
85
|
-
region.ebs_price.preferred_per_gb = get_ebs_price(ebs_costs[1])
|
86
|
-
region.ebs_price.preferred_per_iops = get_ebs_price(ebs_costs[2])
|
87
|
-
region.ebs_price.standard_per_gb = get_ebs_price(ebs_costs[3])
|
88
|
-
region.ebs_price.standard_per_million_io = get_ebs_price(ebs_costs[4])
|
89
|
-
region.ebs_price.ssd_per_gb = nil
|
90
|
-
region.ebs_price.s3_snaps_per_gb = get_ebs_price(ebs_costs[5])
|
91
|
-
end
|
92
|
-
|
93
|
-
end
|
94
|
-
|
95
|
-
# e.g. $0.065 per GB-Month of provisioned storage
|
96
|
-
def get_ebs_price(xml_element)
|
97
|
-
tokens = xml_element.text.split(" ")
|
98
|
-
tokens[0].gsub("$", "").to_f
|
99
|
-
end
|
100
|
-
|
101
|
-
def get_os(val)
|
102
|
-
case val
|
103
|
-
when "Amazon Linux"
|
104
|
-
:linux
|
105
|
-
when "RHEL"
|
106
|
-
:rhel
|
107
|
-
when "SLES"
|
108
|
-
:sles
|
109
|
-
when "Windows"
|
110
|
-
:mswin
|
111
|
-
when "Windows SQL Server Web", "Windows SQL Server Web Edition", "Windows SQL Server\n Web Edition", "Server Web"
|
112
|
-
:mswinSQL
|
113
|
-
when "Windows SQL Server Standard", "Windows SQL Server Standard Edition", "Windows SQL Server\n Standard Edition"
|
114
|
-
:mswinSQLWeb
|
115
|
-
else
|
116
|
-
raise "Unable to identify operating system '#{val}'"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def get_rows(html_table)
|
121
|
-
rows = []
|
122
|
-
html_table.search(".//tr").each do |tr|
|
123
|
-
row = []
|
124
|
-
tr.search(".//td").each do |td|
|
125
|
-
row << td.inner_text.strip.sub("\n", " ").sub(" ", " ")
|
126
|
-
end
|
127
|
-
next if row.size == 1
|
128
|
-
rows << row unless row.empty?
|
129
|
-
end
|
130
|
-
rows
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
|
135
|
-
class GovCloudRdsPriceList < PriceList
|
136
|
-
GOV_CLOUD_URL = "http://aws.amazon.com/govcloud-us/pricing/rds/"
|
137
|
-
|
138
|
-
def initialize
|
139
|
-
@_regions = {}
|
140
|
-
@_regions["us-gov-west-1"] = Region.new("us-gov-west-1")
|
141
|
-
InstanceType.populate_lookups
|
142
|
-
get_rds_instance_pricing
|
143
|
-
end
|
144
|
-
|
145
|
-
protected
|
146
|
-
#@@DB_TYPE = [:mysql, :postgresql, :oracle, :sqlserver]
|
147
|
-
#@@RES_TYPES = [:light, :medium, :heavy]
|
148
|
-
|
149
|
-
def get_rds_instance_pricing
|
150
|
-
|
151
|
-
client = Mechanize.new
|
152
|
-
page = client.get(GOV_CLOUD_URL)
|
153
|
-
tables = page.search("//div[@class='aws-table ']")
|
154
|
-
|
155
|
-
# Mysql
|
156
|
-
create_ondemand_instances(:mysql, :ondemand, false, false, get_rows(tables[0]))
|
157
|
-
create_ondemand_instances(:mysql, :ondemand, true, false, get_rows(tables[1]))
|
158
|
-
no_multi_az_rows, multi_az_rows = get_reserved_rows(get_rows(tables[2]))
|
159
|
-
create_reserved_instances(:mysql, :light, false, false, no_multi_az_rows)
|
160
|
-
create_reserved_instances(:mysql, :light, true, false, multi_az_rows)
|
161
|
-
no_multi_az_rows, multi_az_rows = get_reserved_rows(get_rows(tables[3]))
|
162
|
-
create_reserved_instances(:mysql, :medium, false, false, no_multi_az_rows)
|
163
|
-
create_reserved_instances(:mysql, :medium, true, false, multi_az_rows)
|
164
|
-
no_multi_az_rows, multi_az_rows = get_reserved_rows(get_rows(tables[4]))
|
165
|
-
create_reserved_instances(:mysql, :heavy, false, false, no_multi_az_rows)
|
166
|
-
create_reserved_instances(:mysql, :heavy, true, false, multi_az_rows)
|
167
|
-
|
168
|
-
# Oracle
|
169
|
-
create_ondemand_instances(:oracle_se1, :ondemand, false, false, get_rows(tables[5]))
|
170
|
-
create_ondemand_instances(:oracle_se1, :ondemand, true, false, get_rows(tables[6]))
|
171
|
-
create_ondemand_instances(:oracle_se1, :ondemand, false, true, get_rows(tables[7]))
|
172
|
-
create_ondemand_instances(:oracle_se1, :ondemand, true, true, get_rows(tables[8]))
|
173
|
-
|
174
|
-
row = 9
|
175
|
-
[false, true].each do |is_byol|
|
176
|
-
[:light, :medium, :heavy].each do |res_type|
|
177
|
-
no_multi_az_rows, multi_az_rows = get_reserved_rows(get_rows(tables[9]))
|
178
|
-
create_reserved_instances(:oracle_se1, res_type, false, is_byol, no_multi_az_rows)
|
179
|
-
create_reserved_instances(:oracle_se1, res_type, true, is_byol, multi_az_rows)
|
180
|
-
row += 1
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
# SQL Server
|
185
|
-
create_ondemand_instances(:sqlserver_ex, :ondemand, false, false, get_rows(tables[15]))
|
186
|
-
create_ondemand_instances(:sqlserver_web, :ondemand, false, false, get_rows(tables[16]))
|
187
|
-
create_ondemand_instances(:sqlserver_se, :ondemand, false, false, get_rows(tables[17]))
|
188
|
-
row = 18
|
189
|
-
[:light, :medium, :heavy].each do |restype|
|
190
|
-
[:sqlserver_ex, :sqlserver_web, :sqlserver_se].each do |db|
|
191
|
-
no_multi_az_rows, multi_az_rows = get_reserved_rows(get_rows(tables[row]))
|
192
|
-
create_reserved_instances(db, restype, false, false, no_multi_az_rows)
|
193
|
-
create_reserved_instances(db, restype, true, false, multi_az_rows)
|
194
|
-
row += 1
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
# Postgres
|
199
|
-
# Mysql
|
200
|
-
create_ondemand_instances(:postgresql, :ondemand, false, false, get_rows(tables[31]))
|
201
|
-
create_ondemand_instances(:postgresql, :ondemand, true, false, get_rows(tables[32]))
|
202
|
-
row = 33
|
203
|
-
[:light, :medium, :heavy].each do |restype|
|
204
|
-
no_multi_az_rows, multi_az_rows = get_reserved_rows(get_rows(tables[row]))
|
205
|
-
create_reserved_instances(:postgresql, restype, false, false, no_multi_az_rows)
|
206
|
-
create_reserved_instances(:postgresql, restype, true, false, multi_az_rows)
|
207
|
-
row += 1
|
208
|
-
end
|
209
|
-
|
210
|
-
end
|
211
|
-
|
212
|
-
# e.g. [["General Purpose - Previous Generation", "Price Per Hour"], ["m1.small", "$0.090"], ["m1.medium", "$0.185"]]
|
213
|
-
def create_ondemand_instances(db_type, res_type, is_multi_az, is_byol, rows)
|
214
|
-
@_regions.values.each do |region|
|
215
|
-
# Skip header row
|
216
|
-
rows.each do |row|
|
217
|
-
api_name = row[0]
|
218
|
-
unless api_name.include?("db.")
|
219
|
-
$stderr.puts "Skipping row containing non-db type: #{api_name}"
|
220
|
-
next
|
221
|
-
end
|
222
|
-
instance_type = region.get_rds_instance_type(api_name)
|
223
|
-
if instance_type.nil?
|
224
|
-
api_name, name = RdsInstanceType.get_name(nil, row[0], false)
|
225
|
-
instance_type = region.add_or_update_rds_instance_type(api_name, name)
|
226
|
-
end
|
227
|
-
instance_type.update_pricing2(db_type, res_type, is_multi_az, is_byol, row[1])
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
# e.g. [[" ", "1 yr Term", "3 yr Term"], [" ", "Upfront", "Hourly", "Upfront", "Hourly"], ["m1.small", "$159", "$0.035", "$249", "$0.033"]]
|
233
|
-
def create_reserved_instances(db_type, res_type, is_multi_az, is_byol, rows)
|
234
|
-
@_regions.values.each do |region|
|
235
|
-
rows.each do |row|
|
236
|
-
api_name = row[0]
|
237
|
-
unless api_name.include?("db.")
|
238
|
-
$stderr.puts "Skipping row containing non-db type: #{api_name}"
|
239
|
-
next
|
240
|
-
end
|
241
|
-
instance_type = region.get_rds_instance_type(api_name)
|
242
|
-
if instance_type.nil?
|
243
|
-
api_name, name = RdsInstanceType.get_name(nil, row[0], true)
|
244
|
-
instance_type = region.add_or_update_rds_instance_type(api_name, name)
|
245
|
-
end
|
246
|
-
instance_type.update_pricing2(db_type, res_type, is_multi_az, is_byol, nil, row[1], row[3], row[2], row[4])
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
def get_reserved_rows(rows)
|
252
|
-
# Skip 2 header rows
|
253
|
-
new_rows = rows.slice(2, rows.size)
|
254
|
-
no_multi_az_rows = new_rows.slice(0, new_rows.size / 2)
|
255
|
-
multi_az_rows = new_rows.slice(new_rows.size / 2, new_rows.size / 2)
|
256
|
-
[no_multi_az_rows, multi_az_rows]
|
257
|
-
end
|
258
|
-
|
259
|
-
def get_rows(html_table)
|
260
|
-
rows = []
|
261
|
-
html_table.search(".//tr").each do |tr|
|
262
|
-
row = []
|
263
|
-
tr.search(".//td").each do |td|
|
264
|
-
row << td.inner_text.strip.sub("\n", " ").sub(" ", " ")
|
265
|
-
end
|
266
|
-
# Various <tR> elements contain labels which have only 1 <td> - except heavy multi-az ;)
|
267
|
-
next if row.size == 1 || row[0].include?("Multi-AZ Deployment")
|
268
|
-
rows << row unless row.empty?
|
269
|
-
end
|
270
|
-
rows
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|
data/test/govcloud_test.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
#--
|
4
|
-
# Amazon Web Services Pricing Ruby library
|
5
|
-
#
|
6
|
-
# Ruby Gem Name:: amazon-pricing
|
7
|
-
# Author:: Joe Kinsella (mailto:joe.kinsella@gmail.com)
|
8
|
-
# Copyright:: Copyright (c) 2011-2013 CloudHealth
|
9
|
-
# License:: Distributes under the same terms as Ruby
|
10
|
-
# Home:: http://github.com/CloudHealth/amazon-pricing
|
11
|
-
#++
|
12
|
-
|
13
|
-
$: << File.expand_path(File.dirname(__FILE__))
|
14
|
-
require 'helper'
|
15
|
-
require 'test/unit'
|
16
|
-
|
17
|
-
class TestGovCloud < Test::Unit::TestCase
|
18
|
-
def setup
|
19
|
-
#This is expensive, so only do once.
|
20
|
-
@@ec2_pricing = AwsPricing::GovCloudEc2PriceList.new
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_cc8xlarge_issue
|
24
|
-
obj = @@ec2_pricing.get_instance_type('us-gov-west-1', 'm3.large')
|
25
|
-
assert obj.api_name == 'm3.large'
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_memory
|
29
|
-
# Validate instance types in specific regions are available
|
30
|
-
region = @@ec2_pricing.get_region('us-gov-west-1')
|
31
|
-
instance = region.get_ec2_instance_type('m3.large')
|
32
|
-
assert instance.memory_in_mb == 7500
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_virtual_cores
|
36
|
-
region = @@ec2_pricing.get_region('us-gov-west-1')
|
37
|
-
instance = region.get_ec2_instance_type('m3.large')
|
38
|
-
assert instance.virtual_cores == 2
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_ebs
|
42
|
-
region = @@ec2_pricing.get_region('us-gov-west-1')
|
43
|
-
assert region.ebs_price.standard_per_gb == 0.065
|
44
|
-
assert region.ebs_price.standard_per_million_io == 0.065
|
45
|
-
assert region.ebs_price.preferred_per_gb == 0.15
|
46
|
-
assert region.ebs_price.preferred_per_iops == 0.078
|
47
|
-
assert region.ebs_price.s3_snaps_per_gb == 0.125
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|