class AwsPricing::RdsPriceList

Public Class Methods

new() click to toggle source
Calls superclass method AwsPricing::PriceList::new
   # File lib/amazon-pricing/rds-price-list.rb
 4 def initialize
 5   super
 6   InstanceType.populate_lookups
 7   get_rds_on_demand_instance_pricing
 8   get_rds_reserved_instance_pricing2
 9   get_rds_reserved_instance_pricing
10 end

Protected Instance Methods

fetch_on_demand_rds_instance_pricing(url, type_of_rds_instance, db_type, is_byol, is_multi_az = false) click to toggle source
    # File lib/amazon-pricing/rds-price-list.rb
255 def fetch_on_demand_rds_instance_pricing(url, type_of_rds_instance, db_type, is_byol, is_multi_az = false)
256   #logger.debug "[#{__method__}] fetched #{url}"
257   res = PriceList.fetch_url(url)
258   res['config']['regions'].each do |reg|
259     region_name = reg['region']
260     region = get_region(region_name)
261     if region.nil?
262       $stderr.puts "[fetch_on_demand_rds_instance_pricing] WARNING: unable to find region #{region_name}"
263       next
264     end
265     reg['types'].each do |type|
266       type['tiers'].each do |tier|
267         begin
268           #
269           # this is special case URL, it is oracle - multiAZ type of deployment but it doesn't have mutliAZ attributes in json.
270           #if url == "http://aws.amazon.com/rds/pricing/oracle/pricing-li-multiAZ-deployments.min.js"
271           #  is_multi_az = true
272           #else
273           #  is_multi_az = is_multi_az? type["name"]
274           #end
275           api_name, name = RdsInstanceType.get_name(type["name"], tier["name"], type_of_rds_instance != :ondemand)
276 
277           instance_type = region.add_or_update_rds_instance_type(api_name, name)
278           instance_type.update_pricing(db_type, type_of_rds_instance, tier, is_multi_az, is_byol)
279         rescue UnknownTypeError
280           $stderr.puts "[fetch_on_demand_rds_instance_pricing] WARNING: encountered #{$!.message}"
281         end
282       end
283     end
284   end
285 end
fetch_reserved_rds_instance_pricing(url, type_of_rds_instance, db_type, is_byol) click to toggle source
    # File lib/amazon-pricing/rds-price-list.rb
287 def fetch_reserved_rds_instance_pricing(url, type_of_rds_instance, db_type, is_byol)
288   #logger.debug "[#{__method__}] fetched #{url}"
289   res = PriceList.fetch_url(url)
290   res['config']['regions'].each do |reg|
291     region_name = reg['region']
292     region = get_region(region_name)
293     reg['instanceTypes'].each do |type|
294       type['tiers'].each do |tier|
295         begin
296             is_multi_az = is_multi_az? type["type"]
297             api_name, name = RdsInstanceType.get_name(type["type"], tier["size"], true)
298 
299             instance_type = region.add_or_update_rds_instance_type(api_name, name)
300             instance_type.update_pricing(db_type, type_of_rds_instance, tier, is_multi_az, is_byol)
301         rescue UnknownTypeError
302           $stderr.puts "[fetch_reserved_rds_instance_pricing] WARNING: encountered #{$!.message}"
303         end
304       end
305     end
306   end
307 rescue => ex
308   $sterr.puts "Failed to fetch: #{url}"
309   raise
310 end
fetch_reserved_rds_instance_pricing2(url, dbs, is_multi_az, is_byol) click to toggle source
    # File lib/amazon-pricing/rds-price-list.rb
171 def fetch_reserved_rds_instance_pricing2(url, dbs, is_multi_az, is_byol)
172   #logger.debug "[#{__method__}] fetched #{url}"
173   res = PriceList.fetch_url(url)
174   res['config']['regions'].each do |reg|
175     region_name = reg['region']
176     region = get_region(region_name)
177     if region.nil?
178       $stderr.puts "[fetch_reserved_rds_instance_pricing2] WARNING: unable to find region #{region_name}"
179       next
180     end
181     reg['instanceTypes'].each do |type|
182       api_name = type["type"]
183       instance_type = region.get_rds_instance_type(api_name)
184       if instance_type.nil?
185         $stderr.puts "[fetch_reserved_rds_instance_pricing2] WARNING: new reserved instances not found for #{api_name} in #{region_name}"
186         next
187       end
188 
189       type["terms"].each do |term|
190         term["purchaseOptions"].each do |option|
191           case option["purchaseOption"]
192             when "noUpfront"
193               reservation_type = :noupfront
194             when "allUpfront"
195               reservation_type = :allupfront
196             when "partialUpfront"
197               reservation_type = :partialupfront
198           end
199 
200           duration = term["term"]
201           prices = option["valueColumns"]
202           dbs.each do |db|
203             instance_type.update_pricing_new(db, reservation_type, prices, duration, is_multi_az, is_byol)
204           end
205         end
206       end
207 
208     end
209   end
210 end
get_rds_on_demand_instance_pricing() click to toggle source
    # File lib/amazon-pricing/rds-price-list.rb
101 def get_rds_on_demand_instance_pricing
102   @@DB_TYPE.each do |db|
103     @@OD_DB_DEPLOY_TYPE[db].each {|db_type, db_instances|
104       db_instances.each do |dp_type|
105         #
106         # to find out the byol type
107         is_byol = is_byol? dp_type
108         # We believe Amazon made a mistake by hosting aurora's prices on a url that follows the multi-az pattern.
109         # Therefore we'll construct the URL as multi-az, but still treat the prices as for single-az.
110         is_multi_az = dp_type.upcase.include?("MULTIAZ") && db != :aurora
111         dp_type = dp_type.gsub('-multiAZ', '') if db == :sqlserver
112 
113         if [:mysql, :postgresql, :oracle, :aurora, :mariadb].include? db
114           fetch_on_demand_rds_instance_pricing(RDS_BASE_URL+"#{db}/pricing-#{dp_type}-deployments.min.js",:ondemand, db_type, is_byol, is_multi_az)
115         elsif db == :sqlserver
116           if is_multi_az
117             fetch_on_demand_rds_instance_pricing(RDS_BASE_URL+"#{db}/sqlserver-#{dp_type}-ondemand-maz.min.js",:ondemand, db_type, is_byol, is_multi_az)
118           else
119             fetch_on_demand_rds_instance_pricing(RDS_BASE_URL+"#{db}/sqlserver-#{dp_type}-ondemand.min.js",:ondemand, db_type, is_byol, is_multi_az)
120           end
121         end
122 
123         # Now repeat for legacy instances
124         if [:mysql, :postgresql, :oracle].include? db
125           fetch_on_demand_rds_instance_pricing(RDS_BASE_URL+"#{db}/previous-generation/pricing-#{dp_type}-deployments.min.js",:ondemand, db_type, is_byol, is_multi_az)
126         elsif db == :sqlserver
127           next if dp_type == 'li-ee' || dp_type == 'li-ee-multiAZ'
128           if is_multi_az
129             fetch_on_demand_rds_instance_pricing(RDS_BASE_URL+"#{db}/previous-generation/sqlserver-#{dp_type}-ondemand-maz.min.js",:ondemand, db_type, is_byol, is_multi_az)
130           else
131             fetch_on_demand_rds_instance_pricing(RDS_BASE_URL+"#{db}/previous-generation/sqlserver-#{dp_type}-ondemand.min.js",:ondemand, db_type, is_byol, is_multi_az)
132           end
133         end
134       end
135     }
136   end
137 end
get_rds_reserved_instance_pricing() click to toggle source
    # File lib/amazon-pricing/rds-price-list.rb
212 def get_rds_reserved_instance_pricing
213   @@DB_TYPE.each do |db|
214     next if @@NO_LEGACY_RI_PRICING_AVAILABLE.include? db
215     if [:mysql, :postgresql].include? db
216       @@RES_TYPES.each do |res_type|
217         if db == :postgresql and res_type == :heavy
218           fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/pricing-#{res_type}-utilization-reserved-instances.min.js", res_type, db, false)
219         elsif db == :mysql
220           fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/pricing-#{res_type}-utilization-reserved-instances.min.js", res_type, db, false)
221         end
222 
223         # Now repeat for legacy instances
224         if db == :postgresql and res_type == :heavy
225           fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/previous-generation/pricing-#{res_type}-utilization-reserved-instances.min.js", res_type, db, false)
226         elsif db == :mysql
227           fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/previous-generation/pricing-#{res_type}-utilization-reserved-instances.min.js", res_type, db, false)
228         end
229       end
230     else
231       @@RESERVED_DB_DEPLOY_TYPE[db].each {|db_type, db_instance|
232         @@RES_TYPES.each do |res_type|
233           db_instance.each do |dp_type|
234             is_byol = is_byol? dp_type
235             if db == :oracle
236               fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/pricing-#{dp_type}-#{res_type}-utilization-reserved-instances.min.js", res_type, db_type, is_byol)
237             elsif db == :sqlserver
238               fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/sqlserver-#{dp_type}-#{res_type}-ri.min.js", res_type, db_type, is_byol)
239             end
240 
241             # Now repeat for legacy instances
242             if db == :oracle
243               fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/previous-generation/pricing-#{dp_type}-#{res_type}-utilization-reserved-instances.min.js", res_type, db_type, is_byol)
244             elsif db == :sqlserver
245               fetch_reserved_rds_instance_pricing(RDS_BASE_URL+"#{db}/previous-generation/sqlserver-#{dp_type}-#{res_type}-ri.min.js", res_type, db_type, is_byol)
246             end
247 
248           end
249         end
250       }
251     end
252   end
253 end
get_rds_reserved_instance_pricing2() click to toggle source
    # File lib/amazon-pricing/rds-price-list.rb
139 def get_rds_reserved_instance_pricing2
140   @@DB_TYPE.each do |db_name|
141     @@RESERVED_DB_DEPLOY_TYPE2[db_name].each do |db, deploy_types|
142       deploy_types.each do |deploy_type|
143         is_byol = is_byol? deploy_type
144         # We believe Amazon made a mistake by hosting aurora's prices on a url that follows the multi-az pattern.
145         # Therefore we'll construct the URL as multi-az, but still treat the prices as for single-az.
146         is_multi_az = deploy_type.upcase.include?("MULTIAZ") && db != :aurora
147 
148         # map sqlserver to aws strings (notice '-' between sql-server)
149         case db
150           when :sqlserver_se
151             db_str = 'sql-server-se'
152           when :sqlserver_ee
153             db_str = 'sql-server-ee'
154           when :sqlserver_web
155             db_str = 'sql-server-web'
156           when :sqlserver_ex
157             db_str = 'sql-server-express'
158           else
159             db_str = db.to_s.gsub(/_/, '-')
160         end
161 
162         # nb: the intersection of @@RESERVED_DB_DEPLOY_TYPE2 and @@RESERVED_DB_WITH_SAME_PRICING2 should
163         #     not overlap, since they have different pricings
164         dbs_with_same_pricing = @@RESERVED_DB_WITH_SAME_PRICING2[db]
165         fetch_reserved_rds_instance_pricing2(RDS_BASE_URL+"reserved-instances/#{db_str}-#{deploy_type}.min.js", dbs_with_same_pricing, is_multi_az, is_byol)
166       end
167     end
168   end
169 end
is_byol?(type) click to toggle source
   # File lib/amazon-pricing/rds-price-list.rb
96 def is_byol?(type)
97   return true if type.match("byol")
98   false
99 end
is_multi_az?(type) click to toggle source
   # File lib/amazon-pricing/rds-price-list.rb
91 def is_multi_az?(type)
92   return true if type.upcase.match("MULTI-AZ")
93   false
94 end