PyScripts rating module¶
The PyScripts module allows you to create your own rating module. A script is supposed to process the given data and to set the different prices.
CAUTION: If you add several PyScripts, the order in which they will be executed is not guaranteed.
Custom module example¶
Price definitions¶
import decimal
# Price for each flavor. These are equivalent to hashmap field mappings.
flavors = {
'm1.micro': decimal.Decimal(0.65),
'm1.nano': decimal.Decimal(0.35),
'm1.large': decimal.Decimal(2.67)
}
# Price per MB / GB for images and volumes. These are equivalent to
# hashmap service mappings.
image_mb_price = decimal.Decimal(0.002)
volume_gb_price = decimal.Decimal(0.35)
Price calculation functions¶
# These functions return the price of a service usage on a collect period.
# The price is always equivalent to the price per unit multiplied by
# the quantity.
def get_instance_price(item):
if not item['metadata']['flavor_name'] in flavors:
return 0
else:
return (decimal.Decimal(item['vol']['qty'])
* flavors[item['metadata']['flavor_name']])
def get_image_price(item):
if not item['vol']['qty']:
return 0
else:
return decimal.Decimal(item['vol']['qty']) * image_mb_price
def get_volume_price(item):
if not item['vol']['qty']:
return 0
else:
return decimal.Decimal(item['vol']['qty']) * volume_gb_price
# Mapping each service to its price calculation function
services = {
'instance': get_instance_price,
'volume': get_volume_price,
'image': get_image_price
}
Processing the data¶
def process(data):
# The 'data' is a dictionary with the usage entries for each service
# in a given period.
usage_data = data['usage']
for service_name, service_data in usage_data.items():
# Do not calculate the price if the service has no
# price calculation function
if service_name in services.keys():
# A service can have several items. For example,
# each running instance is an item of the compute service
for item in service_data:
item['rating'] = {'price': services[service_name](item)}
return data
# 'data' is passed as a global variable. The script is supposed to set the
# 'rating' element of each item in each service
data = process(data)
Using your Script for rating¶
Enabling the PyScripts module¶
To use your script for rating, you will need to enable the pyscripts module
$ cloudkitty module enable pyscripts
+-----------+---------+----------+
| Module | Enabled | Priority |
+-----------+---------+----------+
| pyscripts | True | 1 |
+-----------+---------+----------+
Adding the script to CloudKitty¶
Create the script and specify its name, description, start and end dates.
If the start
and end
are not given, the start
will be set as the
creation date and the end
as None
. The script is valid from the
start
time until the end
time, if the end
time is None
, the
script is endless.
$ cloudkitty pyscript create my_awesome_script script.py
+-------------------+--------------------------------------+---------------------+---------------------+------+-------------+---------+----------------------------------+------------+------------+------------------------------------------+---------------------------------------+
| Name | Script ID | Created At | Start | End | Description | Deleted | Created By | Updated By | Deleted By | Checksum | Data |
+-------------------+--------------------------------------+---------------------+---------------------+------+-------------+---------+----------------------------------+------------+------------+------------------------------------------+---------------------------------------+
| my_awesome_script | 78e1955a-4e7e-47e3-843c-524d8e6ad4c4 | 2023-01-01T10:00:00 | 2023-01-01T10:00:00 | None | None | None | 7977999e2e2511e6a8b2df30b233ffcb | None | None | 49e889018eb86b2035437ebb69093c0b6379f18c | from __future__ import print_function |
| | | | | | | | | | | | from cloudkitty import rating |
| | | | | | | | | | | | |
| | | | | | | | | | | | import decimal |
| | | | | | | | | | | | |
| | | | | | | | | | | | {...} |
| | | | | | | | | | | | |
| | | | | | | | | | | | data = process(data) |
| | | | | | | | | | | | |
+-------------------+--------------------------------------+---------------------+---------------------+------+-------------+---------+----------------------------------+------------+------------+------------------------------------------+---------------------------------------+