| #!/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 json |
| import time |
| import os |
| 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, 'r') 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() |