blob: bd2b730ebeb5ceeaba0c7849c529641217f6f3c2 [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.
"""
# pylint: skip-file
import os
import json
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 = json.dumps(
libcloud_data, indent=4 * " ", item_sort_key=utils.sortKeysNumerically
)
libcloud_out.write(json_str)
if __name__ == "__main__":
sys.exit(main(sys.argv))