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