contrib/scrape-azure-prices.py (52 lines of code) (raw):

#!/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. import os import json import time import requests PRICES_URL = "https://azure.microsoft.com/api/v3/pricing/" "virtual-machines/calculator/" 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) def get_azure_prices(): prices_raw = requests.get(PRICES_URL).json() region_map = {} regions = [] for region in prices_raw["regions"]: regions.append(region["slug"]) region_map[region["slug"]] = region["displayName"] result = {"windows": {}, "linux": {}} parsed_sizes = {"lowpriority", "basic", "standard"} for offer, value in prices_raw["offers"].items(): size_raw = offer.split("-") # Servers that go by the core with global price are not yet added if len(size_raw) != 3 or size_raw[2] not in parsed_sizes: continue if size_raw[0] not in {"linux", "windows"}: continue size = size_raw[2] + size_raw[1] prices = {} if not value["prices"].get("perhour"): continue for reg, price in value["prices"]["perhour"].items(): region = region_map[reg].lower().replace(" ", "") region = region.replace("(public)", "") # for germany region = region.replace("(sovereign)", "") # for germany prices[region] = price["value"] result[size_raw[0]][size] = prices return result def write_azure_prices(file_path, prices): with open(file_path) as f: content = f.read() data = json.loads(content) data["updated"] = int(time.time()) data["compute"]["azure_linux"] = prices["linux"] data["compute"]["azure_windows"] = prices["windows"] content = json.dumps(data, indent=4) lines = content.splitlines() lines = [line.rstrip() for line in lines] content = "\n".join(lines) with open(file_path, "w") as fp: fp.write(content) def main(): res = get_azure_prices() write_azure_prices(PRICING_FILE_PATH, res) if __name__ == "__main__": main()