amazon-pricing 0.1.1 → 0.1.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.
- data/Gemfile +9 -0
- data/Rakefile +4 -1
- data/lib/amazon-pricing.rb +10 -2
- data/lib/amazon-pricing/instance-type.rb +13 -12
- data/lib/amazon-pricing/reserved-instance-type.rb +6 -8
- data/lib/amazon-pricing/version.rb +1 -1
- data/spec/instance_type_spec.rb +11 -0
- data/spec/price_list_spec.rb +39 -0
- data/test/helper.rb +1 -1
- data/test/test-ec2-instance-types.rb +2 -2
- metadata +7 -2
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
require 'rake/testtask'
|
3
|
-
|
3
|
+
|
4
|
+
$: << File.expand_path(File.dirname(__FILE__), 'lib')
|
5
|
+
|
6
|
+
require 'amazon-pricing/version'
|
4
7
|
|
5
8
|
Rake::TestTask.new(:test) do |test|
|
6
9
|
test.libs << 'lib' << 'test'
|
data/lib/amazon-pricing.rb
CHANGED
@@ -73,7 +73,11 @@ module AwsPricing
|
|
73
73
|
region = find_or_create_region(region_name)
|
74
74
|
reg['instanceTypes'].each do |type|
|
75
75
|
type['sizes'].each do |size|
|
76
|
-
|
76
|
+
begin
|
77
|
+
region.add_or_update_instance_type(:on_demand, InstanceType.new(region, type['type'], size))
|
78
|
+
rescue UnknownTypeError
|
79
|
+
$stderr.puts "WARNING: encountered #{$!.message}"
|
80
|
+
end
|
77
81
|
end
|
78
82
|
end
|
79
83
|
end
|
@@ -98,7 +102,11 @@ module AwsPricing
|
|
98
102
|
region = find_or_create_region(region_name)
|
99
103
|
reg['instanceTypes'].each do |type|
|
100
104
|
type['sizes'].each do |size|
|
101
|
-
|
105
|
+
begin
|
106
|
+
region.add_or_update_instance_type(:reserved, ReservedInstanceType.new(region, type['type'], size, reserved_usage_type, platform), reserved_usage_type)
|
107
|
+
rescue UnknownTypeError
|
108
|
+
$stderr.puts "WARNING: encountered #{$!.message}"
|
109
|
+
end
|
102
110
|
end
|
103
111
|
end
|
104
112
|
end
|
@@ -9,6 +9,9 @@
|
|
9
9
|
#++
|
10
10
|
module AwsPricing
|
11
11
|
|
12
|
+
class UnknownTypeError < NameError
|
13
|
+
end
|
14
|
+
|
12
15
|
# InstanceType is a specific type of instance in a region with a defined
|
13
16
|
# price per hour. The price will vary by platform (Linux, Windows).
|
14
17
|
#
|
@@ -23,7 +26,7 @@ module AwsPricing
|
|
23
26
|
# type (e.g. stdODI) and the json for the specific instance. The json is
|
24
27
|
# based on the current undocumented AWS pricing API.
|
25
28
|
def initialize(region, instance_type, json)
|
26
|
-
values = get_values(json)
|
29
|
+
values = InstanceType::get_values(json)
|
27
30
|
|
28
31
|
@size = json['size']
|
29
32
|
@linux_price_per_hour = values['linux'].to_f
|
@@ -32,8 +35,8 @@ module AwsPricing
|
|
32
35
|
@windows_price_per_hour = nil if @windows_price_per_hour == 0
|
33
36
|
@instance_type = instance_type
|
34
37
|
|
35
|
-
@api_name = get_api_name(@instance_type, @size)
|
36
|
-
@name = get_name(@instance_type, @size)
|
38
|
+
@api_name = self.class.get_api_name(@instance_type, @size)
|
39
|
+
@name = self.class.get_name(@instance_type, @size)
|
37
40
|
|
38
41
|
@memory_in_mb = @@Memory_Lookup[@api_name]
|
39
42
|
@disk_in_mb = @@Disk_Lookup[@api_name]
|
@@ -63,23 +66,21 @@ module AwsPricing
|
|
63
66
|
|
64
67
|
attr_accessor :size, :instance_type
|
65
68
|
|
66
|
-
def get_api_name(instance_type, size)
|
69
|
+
def self.get_api_name(instance_type, size)
|
67
70
|
# Let's handle new instances more gracefully
|
68
|
-
unless @@Api_Name_Lookup.has_key?
|
69
|
-
raise "
|
70
|
-
|
71
|
-
|
72
|
-
raise "The instance type #{instance_type} of size #{size} is not found"
|
71
|
+
unless @@Api_Name_Lookup.has_key? instance_type
|
72
|
+
raise UnknownTypeError, "Unknown instance type #{instance_type}", caller
|
73
|
+
else
|
74
|
+
@@Api_Name_Lookup[instance_type][size]
|
73
75
|
end
|
74
|
-
@@Api_Name_Lookup[instance_type][size]
|
75
76
|
end
|
76
77
|
|
77
|
-
def get_name(instance_type, size)
|
78
|
+
def self.get_name(instance_type, size)
|
78
79
|
@@Name_Lookup[instance_type][size]
|
79
80
|
end
|
80
81
|
|
81
82
|
# Turn json into hash table for parsing
|
82
|
-
def get_values(json)
|
83
|
+
def self.get_values(json)
|
83
84
|
values = {}
|
84
85
|
json['valueColumns'].each do |val|
|
85
86
|
values[val['name']] = val['prices']['USD']
|
@@ -73,18 +73,16 @@ module AwsPricing
|
|
73
73
|
protected
|
74
74
|
attr_accessor :size, :instance_type
|
75
75
|
|
76
|
-
def get_api_name(instance_type, size)
|
76
|
+
def self.get_api_name(instance_type, size)
|
77
77
|
# Let's handle new instances more gracefully
|
78
|
-
unless @@Api_Name_Lookup_Reserved.has_key?
|
79
|
-
raise "
|
78
|
+
unless @@Api_Name_Lookup_Reserved.has_key? instance_type
|
79
|
+
raise UnknownTypeError, "Unknown instance type #{instance_type}", caller
|
80
|
+
else
|
81
|
+
@@Api_Name_Lookup_Reserved[instance_type][size]
|
80
82
|
end
|
81
|
-
if @@Api_Name_Lookup_Reserved[instance_type][size].nil?
|
82
|
-
raise "The instance type #{instance_type} of size #{size} is not found"
|
83
|
-
end
|
84
|
-
@@Api_Name_Lookup_Reserved[instance_type][size]
|
85
83
|
end
|
86
84
|
|
87
|
-
def get_name(instance_type, size)
|
85
|
+
def self.get_name(instance_type, size)
|
88
86
|
@@Name_Lookup_Reserved[instance_type][size]
|
89
87
|
end
|
90
88
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'amazon-pricing/instance-type'
|
2
|
+
|
3
|
+
describe AwsPricing::InstanceType do
|
4
|
+
describe '::get_api_name' do
|
5
|
+
it "raises an UnknownTypeError on an unexpected instance type" do
|
6
|
+
expect {
|
7
|
+
AwsPricing::InstanceType::get_api_name 'QuantumODI', 'huge'
|
8
|
+
}.to raise_error(AwsPricing::UnknownTypeError)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'amazon-pricing'
|
2
|
+
|
3
|
+
describe AwsPricing::PriceList do
|
4
|
+
describe "#get_ec2_on_demand_instance_pricing" do
|
5
|
+
let(:price_list) {
|
6
|
+
{
|
7
|
+
'config' => {
|
8
|
+
'regions' => [{
|
9
|
+
'region' => 'us-east',
|
10
|
+
'instanceTypes' => [{
|
11
|
+
'type' => 'stdODI',
|
12
|
+
'sizes' => [{
|
13
|
+
'size' => 'sm',
|
14
|
+
'valueColumns' => [
|
15
|
+
{'name' => 'linux', 'prices' => { 'USD' => '0.065' }},
|
16
|
+
{'name' => 'mswin', 'prices' => { 'USD' => '0.265' }}
|
17
|
+
]}]}]}]
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
before do
|
23
|
+
AwsPricing::PriceList.any_instance.tap do |it|
|
24
|
+
it.stub :get_ec2_reserved_instance_pricing
|
25
|
+
it.stub :fetch_ec2_ebs_pricing
|
26
|
+
it.stub :fetch_url => price_list
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "doesn't break when amazon adds instance types" do
|
31
|
+
newType = {'type' => 'quantumODI', 'sizes' => [{'size' => 'sm', 'valueColumns' => []}]}
|
32
|
+
price_list['config']['regions'][0]['instanceTypes'] << newType
|
33
|
+
|
34
|
+
expect {
|
35
|
+
AwsPricing::PriceList.new
|
36
|
+
}.to_not raise_error
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/test/helper.rb
CHANGED
@@ -10,8 +10,8 @@
|
|
10
10
|
# Home:: http://github.com/sonian/amazon-pricing
|
11
11
|
#++
|
12
12
|
|
13
|
-
|
14
|
-
require
|
13
|
+
$: << File.expand_path(File.dirname(__FILE__))
|
14
|
+
require 'helper'
|
15
15
|
require 'test/unit'
|
16
16
|
|
17
17
|
class TestEc2InstanceTypes < Test::Unit::TestCase
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-03 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A Ruby library for retrieving pricing for Amazon Web Services
|
15
15
|
email:
|
@@ -21,6 +21,7 @@ extra_rdoc_files:
|
|
21
21
|
- README
|
22
22
|
files:
|
23
23
|
- CHANGELOG
|
24
|
+
- Gemfile
|
24
25
|
- LICENSE
|
25
26
|
- README
|
26
27
|
- Rakefile
|
@@ -31,6 +32,8 @@ files:
|
|
31
32
|
- lib/amazon-pricing/region.rb
|
32
33
|
- lib/amazon-pricing/reserved-instance-type.rb
|
33
34
|
- lib/amazon-pricing/version.rb
|
35
|
+
- spec/instance_type_spec.rb
|
36
|
+
- spec/price_list_spec.rb
|
34
37
|
- test/helper.rb
|
35
38
|
- test/test-ec2-instance-types.rb
|
36
39
|
homepage: http://github.com/sonian/amazon-pricing
|
@@ -63,5 +66,7 @@ signing_key:
|
|
63
66
|
specification_version: 3
|
64
67
|
summary: Amazon Web Services Pricing Ruby gem
|
65
68
|
test_files:
|
69
|
+
- spec/instance_type_spec.rb
|
70
|
+
- spec/price_list_spec.rb
|
66
71
|
- test/helper.rb
|
67
72
|
- test/test-ec2-instance-types.rb
|