59663669c6
Updated service name and data object entries that do not match current default metrics.yml configuration Change-Id: Ib74661a764b887d24dcfb4e4f22ef376b6d1a4ad
135 lines
5.2 KiB
ReStructuredText
135 lines
5.2 KiB
ReStructuredText
=======================
|
|
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
|
|
-----------------
|
|
|
|
.. code-block:: python
|
|
|
|
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
|
|
---------------------------
|
|
|
|
.. code-block:: python
|
|
|
|
# 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
|
|
-------------------
|
|
|
|
.. code-block:: python
|
|
|
|
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
|
|
|
|
.. code-block:: console
|
|
|
|
$ cloudkitty module enable pyscripts
|
|
+-----------+---------+----------+
|
|
| Module | Enabled | Priority |
|
|
+-----------+---------+----------+
|
|
| pyscripts | True | 1 |
|
|
+-----------+---------+----------+
|
|
|
|
Adding the script to CloudKitty
|
|
-------------------------------
|
|
|
|
Create the script and specify its name.
|
|
|
|
.. code-block:: console
|
|
|
|
$ cloudkitty pyscript create my_awesome_script script.py
|
|
+-------------------+--------------------------------------+------------------------------------------+---------------------------------------+
|
|
| Name | Script ID | Checksum | Data |
|
|
+-------------------+--------------------------------------+------------------------------------------+---------------------------------------+
|
|
| my_awesome_script | 78e1955a-4e7e-47e3-843c-524d8e6ad4c4 | 49e889018eb86b2035437ebb69093c0b6379f18c | from __future__ import print_function |
|
|
| | | | from cloudkitty import rating |
|
|
| | | | |
|
|
| | | | import decimal |
|
|
| | | | |
|
|
| | | | {...} |
|
|
| | | | |
|
|
| | | | data = process(data) |
|
|
| | | | |
|
|
+-------------------+--------------------------------------+------------------------------------------+---------------------------------------+
|