blob: 60afa5303722c08ff8e19364ffefffa7af7fe2ed [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.
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()