blob: 0ce6656ba77eb64b67fc734eb73dd445c93092f3 [file] [log] [blame]
#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Loads Google Cloud Platform prices and updates the `pricing.json` data file.
"""
import os
import json
import simplejson
import sys
import time
import urllib2
import utils
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
PRICING_FILE_PATH = os.path.join(BASE_PATH, '../libcloud/data/pricing.json')
PRICING_FILE_PATH = os.path.abspath(PRICING_FILE_PATH)
GOOGLE_CLOUD_PRICES = 'https://cloudpricingcalculator.appspot.com/static/data/pricelist.json'
def main(argv):
# Read the current pricing data.
libcloud_data = {}
with open(PRICING_FILE_PATH, 'r') as libcloud_in:
libcloud_data = json.loads(libcloud_in.read())
# Download the current Google Cloud Platform pricing.
req = urllib2.Request(GOOGLE_CLOUD_PRICES, '')
google_ext_prices = json.loads(urllib2.urlopen(req).read())
if 'gcp_price_list' not in google_ext_prices:
sys.stderr.write('Google Cloud pricing data missing "gcp_price_list" node\n')
sys.exit(1)
# This is a map from regions used in the pricing JSON file to the regions as
# reflected in the Google Cloud Platform documentation and APIs.
pricing_to_region = {
'us': 'us',
'eu': 'europe', # alias for 'europe'
'europe': 'europe',
'apac': 'asia', # alias for 'asia'
'asia': 'asia',
'au': 'australia', # alias for 'australia'
'australia': 'australia'
}
# Initialize Google Cloud Platform regions.
for _, region in pricing_to_region.iteritems():
libcloud_data['compute']['google_%s' % region] = {}
# Update Google Compute Engine pricing.
gcp_price_list = google_ext_prices['gcp_price_list']
gce_vm_prefix = 'CP-COMPUTEENGINE-VMIMAGE-'
for name, prices in gcp_price_list.iteritems():
if not name.startswith(gce_vm_prefix):
continue
short_name = name[len(gce_vm_prefix):]
machine_type = short_name.lower()
for key, price in prices.iteritems():
if key in pricing_to_region:
region = pricing_to_region[key]
libcloud_data['compute']['google_%s' % region][machine_type] = price
# Update last-modified timestamp.
libcloud_data['updated'] = int(time.time())
# Write updated price list.
with open(PRICING_FILE_PATH, 'w') as libcloud_out:
json_str = simplejson.dumps(libcloud_data, indent=4 * ' ',
item_sort_key=utils.sortKeysNumerically)
libcloud_out.write(json_str)
if __name__ == '__main__':
sys.exit(main(sys.argv))