OpenStack Zed : How to use CloudKitty2023/06/30 |
This is how to use OpenStack Rating Service (CloudKitty).
This example is based on the environment like follows.
------------+--------------------------+--------------------------+------------ | | | eth0|10.0.0.30 eth0|10.0.0.50 eth0|10.0.0.51 +-----------+-----------+ +-----------+-----------+ +-----------+-----------+ | [ dlp.srv.world ] | | [ network.srv.world ] | | [ node01.srv.world ] | | (Control Node) | | (Network Node) | | (Compute Node) | | | | | | | | MariaDB RabbitMQ | | Neutron L2/L3 Agent | | Libvirt | | Memcached Nginx | | Neutron Metadata | | Nova Compute | | Keystone httpd | | Open vSwitch | | Neutron L2 Agent | | Glance Nova API | | iSCSI Target | | Open vSwitch | | Neutron Server | | Cinder Volume | | Ceilometer Compute | | Neutron Metadata | | httpd Gnocchi | | | | Cinder API | | Ceilometer Central | | | | | | CloudKitty API | | | +-----------------------+ +-----------------------+ +-----------------------+ |
[1] | Add [cloudkitty] user in [rating] role for each project you like to rate. |
root@dlp ~(keystone)# openstack project list +----------------------------------+-----------+ | ID | Name | +----------------------------------+-----------+ | 1c2f5dc8c4f9494fbaaa4217c8e3585a | hiroshima | | 757625ae78404e38a8cfdd7c6d262860 | admin | | d8b09d86ed7743039f92b2e542ea26c1 | service | +----------------------------------+-----------+root@dlp ~(keystone)# openstack role add --user cloudkitty --project hiroshima rating |
[2] | Enable [Hashmap] module. |
root@dlp ~(keystone)# openstack rating module list +-----------+---------+----------+ | Module | Enabled | Priority | +-----------+---------+----------+ | hashmap | False | 1 | | noop | True | 1 | | pyscripts | False | 1 | +-----------+---------+----------+root@dlp ~(keystone)# openstack rating module enable hashmap +---------+---------+----------+ | Module | Enabled | Priority | +---------+---------+----------+ | hashmap | True | 1 | +---------+---------+----------+root@dlp ~(keystone)# openstack rating module list +-----------+---------+----------+ | Module | Enabled | Priority | +-----------+---------+----------+ | hashmap | True | 1 | | noop | True | 1 | | pyscripts | False | 1 | +-----------+---------+----------+ |
[3] | Set rate to Instance Uptime. When users in the project set on [1] create and start instances with [flavor_id] you set, target project is charged at the rate you set every interval of the [period] you set in [cloudkitty.conf]. |
# add service matching rule root@dlp ~(keystone)# openstack rating hashmap service create instance +----------+--------------------------------------+ | Name | Service ID | +----------+--------------------------------------+ | instance | cd8247c2-e518-46d1-9eed-a3cd278dcba9 | +----------+--------------------------------------+ # add field matching rule root@dlp ~(keystone)# openstack rating hashmap field create cd8247c2-e518-46d1-9eed-a3cd278dcba9 flavor_id +-----------+--------------------------------------+--------------------------------------+ | Name | Field ID | Service ID | +-----------+--------------------------------------+--------------------------------------+ | flavor_id | 44483eb6-f758-4816-9e72-abc13bc48da0 | cd8247c2-e518-46d1-9eed-a3cd278dcba9 | +-----------+--------------------------------------+--------------------------------------+root@dlp ~(keystone)# openstack flavor list +----+-----------+------+------+-----------+-------+-----------+ | ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public | +----+-----------+------+------+-----------+-------+-----------+ | 1 | m1.small | 2048 | 10 | 0 | 1 | True | | 2 | m1.medium | 4096 | 10 | 0 | 2 | True | | 3 | m1.large | 8192 | 10 | 0 | 4 | True | | 4 | m2.large | 8192 | 10 | 10 | 4 | True | | 5 | m3.large | 8192 | 20 | 0 | 4 | True | +----+-----------+------+------+-----------+-------+-----------+ # add mapping rule # set a cost of [0.5] to instances with [flavor_id] = [2] root@dlp ~(keystone)# openstack rating hashmap mapping create 0.5 \ --field-id 44483eb6-f758-4816-9e72-abc13bc48da0 \ --value 2 -t flat +--------------------------------------+-------+--------------------------------+------+--------------------------------------+------------+----------+------------+ | Mapping ID | Value | Cost | Type | Field ID | Service ID | Group ID | Project ID | +--------------------------------------+-------+--------------------------------+------+--------------------------------------+------------+----------+------------+ | ddf302c3-3171-4c86-a763-538ca5292f33 | 2 | 0.5000000000000000000000000000 | flat | 44483eb6-f758-4816-9e72-abc13bc48da0 | None | None | None | +--------------------------------------+-------+--------------------------------+------+--------------------------------------+------------+----------+------------+ |
[4] | Verify settings with an user who is in the project you set on [1] to create or start an instance. |
debian@dlp ~(keystone)$ openstack server list +--------------------------------------+-----------+---------+------------------------------------+----------+-----------+ | ID | Name | Status | Networks | Image | Flavor | +--------------------------------------+-----------+---------+------------------------------------+----------+-----------+ | c3a4a792-a7ac-41bd-8c93-7fd162016f22 | Debian-12 | SHUTOFF | private=10.0.0.241, 192.168.100.66 | Debian12 | m1.medium | +--------------------------------------+-----------+---------+------------------------------------+----------+-----------+
debian@dlp ~(keystone)$
openstack server start Debian-12
# after a certain period of time, costs are charged debian@dlp ~(keystone)$ openstack rating summary get +----------------------------------+---------------+------+---------------------+---------------------+ | Tenant ID | Resource Type | Rate | Begin Time | End Time | +----------------------------------+---------------+------+---------------------+---------------------+ | 1c2f5dc8c4f9494fbaaa4217c8e3585a | ALL | 0.5 | 2023-06-01T00:00:00 | 2023-07-01T00:00:00 | +----------------------------------+---------------+------+---------------------+---------------------+ # if the instance continues to run, costs are charged every [period] of time debian@dlp ~(keystone)$ openstack rating summary get +----------------------------------+---------------+------+---------------------+---------------------+ | Tenant ID | Resource Type | Rate | Begin Time | End Time | +----------------------------------+---------------+------+---------------------+---------------------+ | 1c2f5dc8c4f9494fbaaa4217c8e3585a | ALL | 1.0 | 2023-06-01T00:00:00 | 2023-07-01T00:00:00 | +----------------------------------+---------------+------+---------------------+---------------------+ # display data frames debian@dlp ~(keystone)$ openstack rating dataframes get +---------------------+---------------------+---------------------------------- | Begin | End | Project ID +---------------------+---------------------+---------------------------------- | 2023-06-30T02:20:00 | 2023-06-30T02:30:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T02:50:00 | 2023-06-30T03:00:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T03:40:00 | 2023-06-30T03:50:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T03:50:00 | 2023-06-30T04:00:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a +---------------------+---------------------+---------------------------------- +-------------------------------------------------------------------------------------------------------------- | Resources +-------------------------------------------------------------------------------------------------------------- | [{'rating': '0.0', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.0', 'service': 'volume.size', 'desc': {'volume_type': 'add8758b-74e4-4f07-b737-e72e9017f517', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', +-------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------ 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'id': 'f7b74e86-2484-42f1-b657-ecf7fa8b61f8', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', ------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------- 'user_id': 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'user_id': 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'user_id': 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'user_id': 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, ------------------------------------------------------------------------------------------------- -------------------------------------------+ | -------------------------------------------+ 'volume': '1', 'rate_value': '0.0000'}] | 'volume': '1E+1', 'rate_value': '0.0000'}] | 'volume': '1', 'rate_value': '0.5000'}] | 'volume': '1', 'rate_value': '0.5000'}] | -------------------------------------------+ |
[5] | Set rate to Volume Size. When users in the project set on [1] create cinder volumes, target project is charged at the rate you set per gigabyte. |
# add service matching rule root@dlp ~(keystone)# openstack rating hashmap service create volume.size +-------------+--------------------------------------+ | Name | Service ID | +-------------+--------------------------------------+ | volume.size | 33174b3c-bcfe-4c8e-9664-21a2940a738e | +-------------+--------------------------------------+ # add mapping rule # set a cost of [1.5] per gigabyte root@dlp ~(keystone)# openstack rating hashmap mapping create 1.5 \ -s 33174b3c-bcfe-4c8e-9664-21a2940a738e \ -t flat +--------------------------------------+-------+--------------------------------+------+----------+--------------------------------------+----------+------------+ | Mapping ID | Value | Cost | Type | Field ID | Service ID | Group ID | Project ID | +--------------------------------------+-------+--------------------------------+------+----------+--------------------------------------+----------+------------+ | 1c589124-56e4-40ef-8bfd-d261b62769fe | None | 1.5000000000000000000000000000 | flat | None | 33174b3c-bcfe-4c8e-9664-21a2940a738e | None | None | +--------------------------------------+-------+--------------------------------+------+----------+--------------------------------------+----------+------------+ # set a 10% discount on over 30 GB volumes root@dlp ~(keystone)# openstack rating hashmap threshold create 30 0.90 \ -s 33174b3c-bcfe-4c8e-9664-21a2940a738e \ -t rate +--------------------------------------+-------------+--------------------------------+------+----------+--------------------------------------+----------+------------+ | Threshold ID | Level | Cost | Type | Field ID | Service ID | Group ID | Project ID | +--------------------------------------+-------------+--------------------------------+------+----------+--------------------------------------+----------+------------+ | 9a1ba030-a51c-40fa-a979-12be7c62d1f1 | 30.00000000 | 0.9000000000000000222044604925 | rate | None | 33174b3c-bcfe-4c8e-9664-21a2940a738e | None | None | +--------------------------------------+-------------+--------------------------------+------+----------+--------------------------------------+----------+------------+ |
[6] | Verify settings with an user who is in the project you set on [1] to create volumes. |
debian@dlp ~(keystone)$ openstack rating summary get
+----------------------------------+---------------+------+---------------------+---------------------+
| Tenant ID | Resource Type | Rate | Begin Time | End Time |
+----------------------------------+---------------+------+---------------------+---------------------+
| 1c2f5dc8c4f9494fbaaa4217c8e3585a | ALL | 1.5 | 2023-06-01T00:00:00 | 2023-07-01T00:00:00 |
+----------------------------------+---------------+------+---------------------+---------------------+
debian@dlp ~(keystone)$ openstack volume create --size 10 disk01
debian@dlp ~(keystone)$ openstack volume list +--------------------------------------+--------+-----------+------+-------------+ | ID | Name | Status | Size | Attached to | +--------------------------------------+--------+-----------+------+-------------+ | c6ab8750-7c89-4c4b-af98-77edf24b8b36 | disk01 | available | 10 | | +--------------------------------------+--------+-----------+------+-------------+ # after a certain period of time, costs are charged debian@dlp ~(keystone)$ openstack rating summary get +----------------------------------+---------------+------+---------------------+---------------------+ | Tenant ID | Resource Type | Rate | Begin Time | End Time | +----------------------------------+---------------+------+---------------------+---------------------+ | 1c2f5dc8c4f9494fbaaa4217c8e3585a | ALL | 16.5 | 2023-06-01T00:00:00 | 2023-07-01T00:00:00 | +----------------------------------+---------------+------+---------------------+---------------------+debian@dlp ~(keystone)$ openstack rating dataframes get +---------------------+---------------------+---------------------------------- | Begin | End | Project ID +---------------------+---------------------+---------------------------------- | 2023-06-30T02:20:00 | 2023-06-30T02:30:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T02:50:00 | 2023-06-30T03:00:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T03:40:00 | 2023-06-30T03:50:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T03:50:00 | 2023-06-30T04:00:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T04:00:00 | 2023-06-30T04:10:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T04:10:00 | 2023-06-30T04:20:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a +---------------------+---------------------+---------------------------------- +-------------------------------------------------------------------------------------------------------------- | Resources +-------------------------------------------------------------------------------------------------------------- | [{'rating': '0.0', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.0', 'service': 'volume.size', 'desc': {'volume_type': 'add8758b-74e4-4f07-b737-e72e9017f517', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '15.0', 'service': 'volume.size', 'desc': {'volume_type': 'add8758b-74e4-4f07-b737-e72e9017f517', +-------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------- 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'f7b74e86-2484-42f1-b657-ecf7fa8b61f8', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c6ab8750-7c89-4c4b-af98-77edf24b8b36', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': ----------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------+ | ----------------------------------------------------------------------------------------------------------------------------------+ 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.0000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1E+1', 'rate_value': '0.0000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.5000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.5000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.5000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1E+1', 'rate_value': '1.5000'}] | ----------------------------------------------------------------------------------------------------------------------------------+debian@dlp ~(keystone)$ openstack volume create --size 30 disk02 debian@dlp ~(keystone)$ openstack volume list +--------------------------------------+--------+-----------+------+-------------+ | ID | Name | Status | Size | Attached to | +--------------------------------------+--------+-----------+------+-------------+ | 55f9d7be-067a-45f8-91c2-c59bf79ba4ab | disk02 | available | 30 | | | c6ab8750-7c89-4c4b-af98-77edf24b8b36 | disk01 | available | 10 | | +--------------------------------------+--------+-----------+------+-------------+ # after a certain period of time, costs are charged # 1.5 x 30 x 0.9 = 40.5 debian@dlp ~(keystone)$ openstack rating summary get +----------------------------------+---------------+------+---------------------+---------------------+ | Tenant ID | Resource Type | Rate | Begin Time | End Time | +----------------------------------+---------------+------+---------------------+---------------------+ | 1c2f5dc8c4f9494fbaaa4217c8e3585a | ALL | 57.0 | 2023-06-01T00:00:00 | 2023-07-01T00:00:00 | +----------------------------------+---------------+------+---------------------+---------------------+debian@dlp ~(keystone)$ openstack rating dataframes get +---------------------+---------------------+---------------------------------- | Begin | End | Project ID +---------------------+---------------------+---------------------------------- | 2023-06-30T02:20:00 | 2023-06-30T02:30:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T02:50:00 | 2023-06-30T03:00:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T03:40:00 | 2023-06-30T03:50:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T03:50:00 | 2023-06-30T04:00:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T04:00:00 | 2023-06-30T04:10:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T04:10:00 | 2023-06-30T04:20:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a | 2023-06-30T04:30:00 | 2023-06-30T04:40:00 | 1c2f5dc8c4f9494fbaaa4217c8e3585a +---------------------+---------------------+---------------------------------- +-------------------------------------------------------------------------------------------------------------- | Resources +-------------------------------------------------------------------------------------------------------------- | [{'rating': '0.0', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.0', 'service': 'volume.size', 'desc': {'volume_type': 'add8758b-74e4-4f07-b737-e72e9017f517', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '0.5', 'service': 'instance', 'desc': {'flavor_name': 'm1.medium', 'flavor_id': '2', 'vcpus': '', | [{'rating': '15.0', 'service': 'volume.size', 'desc': {'volume_type': 'add8758b-74e4-4f07-b737-e72e9017f517', | [{'rating': '40.5', 'service': 'volume.size', 'desc': {'volume_type': 'add8758b-74e4-4f07-b737-e72e9017f517', +-------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------- 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'f7b74e86-2484-42f1-b657-ecf7fa8b61f8', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c3a4a792-a7ac-41bd-8c93-7fd162016f22', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': 'c6ab8750-7c89-4c4b-af98-77edf24b8b36', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': 'id': '55f9d7be-067a-45f8-91c2-c59bf79ba4ab', 'project_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a', 'user_id': ----------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------+ | ----------------------------------------------------------------------------------------------------------------------------------+ 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.0000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1E+1', 'rate_value': '0.0000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.5000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.5000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1', 'rate_value': '0.5000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '1E+1', 'rate_value': '1.5000'}] | 'de51d5f0ee2c485885877d21f5b424e0', 'tenant_id': '1c2f5dc8c4f9494fbaaa4217c8e3585a'}, 'volume': '3E+1', 'rate_value': '1.3500'}] | ----------------------------------------------------------------------------------------------------------------------------------+ |
Sponsored Link |
|