You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by qu...@apache.org on 2017/12/14 17:46:30 UTC
[2/3] libcloud git commit: [LIBCLOUD-969] Add pricing information to
UpCloud's driver list_sizes
[LIBCLOUD-969] Add pricing information to UpCloud's driver list_sizes
Signed-off-by: Quentin Pradet <qu...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/721a83ae
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/721a83ae
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/721a83ae
Branch: refs/heads/trunk
Commit: 721a83aec40894bd8e3be03cb5e4cea0fd278696
Parents: dcb0cef
Author: Mika Lackman <mi...@upcloud.com>
Authored: Mon Dec 11 11:04:16 2017 +0200
Committer: Quentin Pradet <qu...@apache.org>
Committed: Thu Dec 14 21:40:32 2017 +0400
----------------------------------------------------------------------
libcloud/common/upcloud.py | 34 +
libcloud/compute/drivers/upcloud.py | 17 +-
libcloud/test/common/test_upcloud.py | 26 +
.../compute/fixtures/upcloud/api_1_2_price.json | 683 +++++++++++++++++++
libcloud/test/compute/test_upcloud.py | 53 +-
5 files changed, 804 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/721a83ae/libcloud/common/upcloud.py
----------------------------------------------------------------------
diff --git a/libcloud/common/upcloud.py b/libcloud/common/upcloud.py
index 05fb5c2..c3fc6f7 100644
--- a/libcloud/common/upcloud.py
+++ b/libcloud/common/upcloud.py
@@ -199,6 +199,40 @@ class UpcloudNodeOperations(object):
method='DELETE')
+class PlanPrice(object):
+ """
+ Helper class to construct plan price in different zones
+
+ :param zone_prices: List of prices in different zones in UpCloud
+ :type zone_prices: ```list```
+
+ """
+
+ def __init__(self, zone_prices):
+ self._zone_prices = zone_prices
+
+ def get_prices_in_zones(self, plan_name):
+ """
+ Returns list of prices in different zones,
+ [{'zone_id': 'uk-lon1', 'price': 1.588'},...]
+ If plan is not found in a zone, price is set to None.
+
+ :param plan_name: Name of the plan
+ :type plan_name: ```str```
+
+ rtype: ``list``
+ """
+ server_plan_name = 'server_plan_' + plan_name
+
+ prices = []
+
+ for zone_price in self._zone_prices:
+ zone_id = zone_price['name']
+ price = zone_price.get(server_plan_name, {}).get('price')
+ prices.append({'zone_id': zone_id, 'price': price})
+ return prices
+
+
class _LoginUser(object):
def __init__(self, user_id, auth=None):
http://git-wip-us.apache.org/repos/asf/libcloud/blob/721a83ae/libcloud/compute/drivers/upcloud.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/upcloud.py b/libcloud/compute/drivers/upcloud.py
index 3d98d2f..e0357fc 100644
--- a/libcloud/compute/drivers/upcloud.py
+++ b/libcloud/compute/drivers/upcloud.py
@@ -27,6 +27,7 @@ from libcloud.common.types import InvalidCredsError
from libcloud.common.upcloud import UpcloudCreateNodeRequestBody
from libcloud.common.upcloud import UpcloudNodeDestroyer
from libcloud.common.upcloud import UpcloudNodeOperations
+from libcloud.common.upcloud import PlanPrice
class UpcloudResponse(JsonResponse):
@@ -109,10 +110,16 @@ class UpcloudDriver(NodeDriver):
"""
List available plans
+ Note: Node.price will be always None, because the pricing depends,
+ where the Node is hosted. Node.extra['zones'] will contain
+ pricing for different hosting zones.
+
:rtype: ``list`` of :class:`NodeSize`
"""
+ prices_response = self.connection.request('1.2/price')
response = self.connection.request('1.2/plan')
- return self._to_node_sizes(response.object['plans']['plan'])
+ return self._to_node_sizes(response.object['plans']['plan'],
+ prices_response.object['prices']['zone'])
def list_images(self):
"""
@@ -263,11 +270,13 @@ class UpcloudDriver(NodeDriver):
Zone_id format [country]_[city][number], like fi_hel1"""
return zone_id.split('-')[0].upper()
- def _to_node_sizes(self, plans):
- return [self._construct_node_size(plan) for plan in plans]
+ def _to_node_sizes(self, plans, prices):
+ plan_price = PlanPrice(prices)
+ return [self._construct_node_size(plan, plan_price) for plan in plans]
- def _construct_node_size(self, plan):
+ def _construct_node_size(self, plan, plan_price):
extra = self._copy_dict(('core_number', 'storage_tier'), plan)
+ extra['zones'] = plan_price.get_prices_in_zones(plan['name'])
return NodeSize(id=plan['name'], name=plan['name'],
ram=plan['memory_amount'],
disk=plan['storage_size'],
http://git-wip-us.apache.org/repos/asf/libcloud/blob/721a83ae/libcloud/test/common/test_upcloud.py
----------------------------------------------------------------------
diff --git a/libcloud/test/common/test_upcloud.py b/libcloud/test/common/test_upcloud.py
index 37bef0d..886a01a 100644
--- a/libcloud/test/common/test_upcloud.py
+++ b/libcloud/test/common/test_upcloud.py
@@ -20,6 +20,7 @@ from mock import Mock, call
from libcloud.common.upcloud import UpcloudCreateNodeRequestBody, UpcloudNodeDestroyer, UpcloudNodeOperations
from libcloud.common.upcloud import _StorageDevice
from libcloud.common.upcloud import UpcloudTimeoutException
+from libcloud.common.upcloud import PlanPrice
from libcloud.compute.base import NodeImage, NodeSize, NodeLocation, NodeAuthSSHKey
from libcloud.test import unittest
@@ -262,5 +263,30 @@ class TestUpcloudNodeDestroyer(unittest.TestCase):
self.assertTrue(self.destroyer.destroy_node(1))
+class TestPlanPrice(unittest.TestCase):
+
+ def test_zone_prices(self):
+ prices = [{'name': 'uk-lon1', 'server_plan_1xCPU-1GB': {'amount': 1, 'price': 1.488}},
+ {'name': 'fi-hel1', 'server_plan_1xCPU-1GB': {'amount': 1, 'price': 1.588}}]
+ pp = PlanPrice(prices)
+
+ zone_prices = pp.get_prices_in_zones('1xCPU-1GB')
+
+ self.assertEqual(len(zone_prices), 2)
+ self.assertIn({'zone_id': 'uk-lon1', 'price': 1.488}, zone_prices)
+ self.assertIn({'zone_id': 'fi-hel1', 'price': 1.588}, zone_prices)
+
+ def test_plan_not_found_in_zone(self):
+ prices = [{'name': 'uk-lon1', 'server_plan_1xCPU-1GB': {'amount': 1, 'price': 1.488}},
+ {'name': 'fi-hel1', 'server_plan_4xCPU-1GB': {'amount': 1, 'price': 1.588}}]
+ pp = PlanPrice(prices)
+
+ zone_prices = pp.get_prices_in_zones('1xCPU-1GB')
+
+ self.assertEqual(len(zone_prices), 2)
+ self.assertIn({'zone_id': 'uk-lon1', 'price': 1.488}, zone_prices)
+ self.assertIn({'zone_id': 'fi-hel1', 'price': None}, zone_prices)
+
+
if __name__ == '__main__':
sys.exit(unittest.main())
http://git-wip-us.apache.org/repos/asf/libcloud/blob/721a83ae/libcloud/test/compute/fixtures/upcloud/api_1_2_price.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/upcloud/api_1_2_price.json b/libcloud/test/compute/fixtures/upcloud/api_1_2_price.json
new file mode 100644
index 0000000..3b9d3c6
--- /dev/null
+++ b/libcloud/test/compute/fixtures/upcloud/api_1_2_price.json
@@ -0,0 +1,683 @@
+{
+ "prices" : {
+ "zone" : [
+ {
+ "firewall" : {
+ "amount" : 1,
+ "price" : 0.56
+ },
+ "io_request_backup" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_maxiops" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "ipv4_address" : {
+ "amount" : 1,
+ "price" : 0.336
+ },
+ "ipv6_address" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "name" : "de-fra1",
+ "public_ipv4_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv4_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "public_ipv6_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv6_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "server_core" : {
+ "amount" : 1,
+ "price" : 1.12
+ },
+ "server_memory" : {
+ "amount" : 256,
+ "price" : 0.14
+ },
+ "server_plan_12xCPU-32GB" : {
+ "amount" : 1,
+ "price" : 47.619
+ },
+ "server_plan_16xCPU-48GB" : {
+ "amount" : 1,
+ "price" : 71.4286
+ },
+ "server_plan_1xCPU-1GB" : {
+ "amount" : 1,
+ "price" : 1.488
+ },
+ "server_plan_20xCPU-64GB" : {
+ "amount" : 1,
+ "price" : 95.2381
+ },
+ "server_plan_2xCPU-2GB" : {
+ "amount" : 1,
+ "price" : 2.976
+ },
+ "server_plan_4xCPU-4GB" : {
+ "amount" : 1,
+ "price" : 5.952
+ },
+ "server_plan_6xCPU-8GB" : {
+ "amount" : 1,
+ "price" : 11.905
+ },
+ "server_plan_8xCPU-16GB" : {
+ "amount" : 1,
+ "price" : 23.8095
+ },
+ "storage_backup" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_maxiops" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_template" : {
+ "amount" : 1,
+ "price" : 0.031
+ }
+ },
+ {
+ "firewall" : {
+ "amount" : 1,
+ "price" : 0.56
+ },
+ "io_request_backup" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_hdd" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_maxiops" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "ipv4_address" : {
+ "amount" : 1,
+ "price" : 0.336
+ },
+ "ipv6_address" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "name" : "fi-dev2",
+ "public_ipv4_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv4_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "public_ipv6_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv6_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "server_core" : {
+ "amount" : 1,
+ "price" : 1.24
+ },
+ "server_memory" : {
+ "amount" : 256,
+ "price" : 0.34
+ },
+ "server_plan_12xCPU-32GB" : {
+ "amount" : 1,
+ "price" : 71.4286
+ },
+ "server_plan_16xCPU-48GB" : {
+ "amount" : 1,
+ "price" : 107.1429
+ },
+ "server_plan_1xCPU-1GB" : {
+ "amount" : 1,
+ "price" : 2.232
+ },
+ "server_plan_20xCPU-64GB" : {
+ "amount" : 1,
+ "price" : 142.8571
+ },
+ "server_plan_2xCPU-2GB" : {
+ "amount" : 1,
+ "price" : 4.464
+ },
+ "server_plan_4xCPU-4GB" : {
+ "amount" : 1,
+ "price" : 8.928
+ },
+ "server_plan_6xCPU-8GB" : {
+ "amount" : 1,
+ "price" : 17.857
+ },
+ "server_plan_8xCPU-16GB" : {
+ "amount" : 1,
+ "price" : 35.7143
+ },
+ "storage_backup" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_hdd" : {
+ "amount" : 1,
+ "price" : 0.0145
+ },
+ "storage_maxiops" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_template" : {
+ "amount" : 1,
+ "price" : 0.031
+ }
+ },
+ {
+ "firewall" : {
+ "amount" : 1,
+ "price" : 0.56
+ },
+ "io_request_backup" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_hdd" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_maxiops" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_ssd" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "ipv4_address" : {
+ "amount" : 1,
+ "price" : 0.336
+ },
+ "ipv6_address" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "name" : "fi-hel1",
+ "public_ipv4_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv4_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "public_ipv6_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv6_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "server_core" : {
+ "amount" : 1,
+ "price" : 1.24
+ },
+ "server_memory" : {
+ "amount" : 256,
+ "price" : 0.34
+ },
+ "server_plan_12xCPU-32GB" : {
+ "amount" : 1,
+ "price" : 71.4286
+ },
+ "server_plan_16xCPU-48GB" : {
+ "amount" : 1,
+ "price" : 107.1429
+ },
+ "server_plan_1xCPU-1GB" : {
+ "amount" : 1,
+ "price" : 2.232
+ },
+ "server_plan_20xCPU-64GB" : {
+ "amount" : 1,
+ "price" : 142.8571
+ },
+ "server_plan_2xCPU-2GB" : {
+ "amount" : 1,
+ "price" : 4.464
+ },
+ "server_plan_4xCPU-4GB" : {
+ "amount" : 1,
+ "price" : 8.928
+ },
+ "server_plan_6xCPU-8GB" : {
+ "amount" : 1,
+ "price" : 17.857
+ },
+ "server_plan_8xCPU-16GB" : {
+ "amount" : 1,
+ "price" : 35.7143
+ },
+ "storage_backup" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_hdd" : {
+ "amount" : 1,
+ "price" : 0.0145
+ },
+ "storage_maxiops" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_ssd" : {
+ "amount" : 1,
+ "price" : 0.056
+ },
+ "storage_template" : {
+ "amount" : 1,
+ "price" : 0.031
+ }
+ },
+ {
+ "firewall" : {
+ "amount" : 1,
+ "price" : 0.56
+ },
+ "io_request_backup" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_maxiops" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "ipv4_address" : {
+ "amount" : 1,
+ "price" : 0.336
+ },
+ "ipv6_address" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "name" : "nl-ams1",
+ "public_ipv4_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv4_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "public_ipv6_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv6_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "server_core" : {
+ "amount" : 1,
+ "price" : 1.12
+ },
+ "server_memory" : {
+ "amount" : 256,
+ "price" : 0.14
+ },
+ "server_plan_12xCPU-32GB" : {
+ "amount" : 1,
+ "price" : 47.619
+ },
+ "server_plan_16xCPU-48GB" : {
+ "amount" : 1,
+ "price" : 71.4286
+ },
+ "server_plan_1xCPU-1GB" : {
+ "amount" : 1,
+ "price" : 1.488
+ },
+ "server_plan_20xCPU-64GB" : {
+ "amount" : 1,
+ "price" : 95.2381
+ },
+ "server_plan_2xCPU-2GB" : {
+ "amount" : 1,
+ "price" : 2.976
+ },
+ "server_plan_4xCPU-4GB" : {
+ "amount" : 1,
+ "price" : 5.952
+ },
+ "server_plan_6xCPU-8GB" : {
+ "amount" : 1,
+ "price" : 11.905
+ },
+ "server_plan_8xCPU-16GB" : {
+ "amount" : 1,
+ "price" : 23.8095
+ },
+ "storage_backup" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_maxiops" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_template" : {
+ "amount" : 1,
+ "price" : 0.031
+ }
+ },
+ {
+ "firewall" : {
+ "amount" : 1,
+ "price" : 0.56
+ },
+ "io_request_backup" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_maxiops" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "ipv4_address" : {
+ "amount" : 1,
+ "price" : 0.336
+ },
+ "ipv6_address" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "name" : "sg-sin1",
+ "public_ipv4_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv4_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "public_ipv6_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv6_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "server_core" : {
+ "amount" : 1,
+ "price" : 1.12
+ },
+ "server_memory" : {
+ "amount" : 256,
+ "price" : 0.14
+ },
+ "server_plan_12xCPU-32GB" : {
+ "amount" : 1,
+ "price" : 47.619
+ },
+ "server_plan_16xCPU-48GB" : {
+ "amount" : 1,
+ "price" : 71.4286
+ },
+ "server_plan_1xCPU-1GB" : {
+ "amount" : 1,
+ "price" : 1.488
+ },
+ "server_plan_20xCPU-64GB" : {
+ "amount" : 1,
+ "price" : 95.2381
+ },
+ "server_plan_2xCPU-2GB" : {
+ "amount" : 1,
+ "price" : 2.976
+ },
+ "server_plan_4xCPU-4GB" : {
+ "amount" : 1,
+ "price" : 5.952
+ },
+ "server_plan_6xCPU-8GB" : {
+ "amount" : 1,
+ "price" : 11.905
+ },
+ "server_plan_8xCPU-16GB" : {
+ "amount" : 1,
+ "price" : 23.8095
+ },
+ "storage_backup" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_maxiops" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_template" : {
+ "amount" : 1,
+ "price" : 0.031
+ }
+ },
+ {
+ "firewall" : {
+ "amount" : 1,
+ "price" : 0.56
+ },
+ "io_request_backup" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_hdd" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_maxiops" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_ssd" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "ipv4_address" : {
+ "amount" : 1,
+ "price" : 0.336
+ },
+ "ipv6_address" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "name" : "uk-lon1",
+ "public_ipv4_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv4_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "public_ipv6_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv6_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "server_core" : {
+ "amount" : 1,
+ "price" : 1.12
+ },
+ "server_memory" : {
+ "amount" : 256,
+ "price" : 0.14
+ },
+ "server_plan_12xCPU-32GB" : {
+ "amount" : 1,
+ "price" : 47.619
+ },
+ "server_plan_16xCPU-48GB" : {
+ "amount" : 1,
+ "price" : 71.4286
+ },
+ "server_plan_1xCPU-1GB" : {
+ "amount" : 1,
+ "price" : 1.488
+ },
+ "server_plan_20xCPU-64GB" : {
+ "amount" : 1,
+ "price" : 95.2381
+ },
+ "server_plan_2xCPU-2GB" : {
+ "amount" : 1,
+ "price" : 2.976
+ },
+ "server_plan_4xCPU-4GB" : {
+ "amount" : 1,
+ "price" : 5.952
+ },
+ "server_plan_6xCPU-8GB" : {
+ "amount" : 1,
+ "price" : 11.905
+ },
+ "server_plan_8xCPU-16GB" : {
+ "amount" : 1,
+ "price" : 23.8095
+ },
+ "storage_backup" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_hdd" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_maxiops" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_ssd" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_template" : {
+ "amount" : 1,
+ "price" : 0.031
+ }
+ },
+ {
+ "firewall" : {
+ "amount" : 1,
+ "price" : 0.56
+ },
+ "io_request_backup" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "io_request_maxiops" : {
+ "amount" : 1000000,
+ "price" : 0
+ },
+ "ipv4_address" : {
+ "amount" : 1,
+ "price" : 0.336
+ },
+ "ipv6_address" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "name" : "us-chi1",
+ "public_ipv4_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv4_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "public_ipv6_bandwidth_in" : {
+ "amount" : 1,
+ "price" : 0
+ },
+ "public_ipv6_bandwidth_out" : {
+ "amount" : 1,
+ "price" : 5.6
+ },
+ "server_core" : {
+ "amount" : 1,
+ "price" : 1.12
+ },
+ "server_memory" : {
+ "amount" : 256,
+ "price" : 0.14
+ },
+ "server_plan_12xCPU-32GB" : {
+ "amount" : 1,
+ "price" : 47.619
+ },
+ "server_plan_16xCPU-48GB" : {
+ "amount" : 1,
+ "price" : 71.4286
+ },
+ "server_plan_1xCPU-1GB" : {
+ "amount" : 1,
+ "price" : 1.488
+ },
+ "server_plan_20xCPU-64GB" : {
+ "amount" : 1,
+ "price" : 95.2381
+ },
+ "server_plan_2xCPU-2GB" : {
+ "amount" : 1,
+ "price" : 2.976
+ },
+ "server_plan_4xCPU-4GB" : {
+ "amount" : 1,
+ "price" : 5.952
+ },
+ "server_plan_6xCPU-8GB" : {
+ "amount" : 1,
+ "price" : 11.905
+ },
+ "server_plan_8xCPU-16GB" : {
+ "amount" : 1,
+ "price" : 23.8095
+ },
+ "storage_backup" : {
+ "amount" : 1,
+ "price" : 0.0078
+ },
+ "storage_maxiops" : {
+ "amount" : 1,
+ "price" : 0.031
+ },
+ "storage_template" : {
+ "amount" : 1,
+ "price" : 0.031
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/libcloud/blob/721a83ae/libcloud/test/compute/test_upcloud.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_upcloud.py b/libcloud/test/compute/test_upcloud.py
index 951ee29..56aebe2 100644
--- a/libcloud/test/compute/test_upcloud.py
+++ b/libcloud/test/compute/test_upcloud.py
@@ -35,7 +35,8 @@ class UpcloudPersistResponse(UpcloudResponse):
def parse_body(self):
import os
- path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.path.pardir, 'compute', 'fixtures', 'upcloud'))
+ path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.path.pardir,
+ 'compute', 'fixtures', 'upcloud'))
filename = 'api' + self.request.path_url.replace('/', '_').replace('.', '_') + '.json'
filename = os.path.join(path, filename)
if not os.path.exists(filename):
@@ -83,6 +84,36 @@ class UpcloudDriverTests(LibcloudTestCase):
def test_list_sizes(self):
sizes = self.driver.list_sizes()
self.assertTrue(len(sizes) >= 1)
+ expected_zones = [
+ {
+ 'zone_id': 'de-fra1',
+ 'price': 1.488
+ },
+ {
+ 'zone_id': 'fi-dev2',
+ 'price': 2.232
+ },
+ {
+ 'zone_id': 'fi-hel1',
+ 'price': 2.232
+ },
+ {
+ 'zone_id': 'nl-ams1',
+ 'price': 1.488
+ },
+ {
+ 'zone_id': 'sg-sin1',
+ 'price': 1.488
+ },
+ {
+ 'zone_id': 'uk-lon1',
+ 'price': 1.488
+ },
+ {
+ 'zone_id': 'us-chi1',
+ 'price': 1.488
+ }
+ ]
expected_node_size = NodeSize(id='1xCPU-1GB',
name='1xCPU-1GB',
ram=1024,
@@ -91,7 +122,8 @@ class UpcloudDriverTests(LibcloudTestCase):
price=None,
driver=self.driver,
extra={'core_number': 1,
- 'storage_tier': 'maxiops'})
+ 'storage_tier': 'maxiops',
+ 'zones': expected_zones})
self.assert_object(expected_node_size, objects=sizes)
def test_list_images(self):
@@ -101,7 +133,7 @@ class UpcloudDriverTests(LibcloudTestCase):
name='Windows Server 2003 R2 Standard (CD 1)',
driver=self.driver,
extra={'access': 'public',
- 'licence': 0,
+ 'license': 0,
'size': 1,
'state': 'online',
'type': 'cdrom'})
@@ -189,8 +221,15 @@ class UpcloudDriverTests(LibcloudTestCase):
return expected_data == actual_data
def dicts_equals(self, d1, d2):
- """Assumes dicts to contain only hashable types"""
- return set(d1.values()) == set(d2.values())
+ dict_keys_same = set(d1.keys()) == set(d2.keys())
+ if not dict_keys_same:
+ return False
+
+ for key in d1.keys():
+ if d1[key] != d2[key]:
+ return False
+
+ return True
class UpcloudMockHttp(MockHttp):
@@ -219,6 +258,10 @@ class UpcloudMockHttp(MockHttp):
body = self.fixtures.load('api_1_2_storage_template.json')
return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+ def _1_2_price(self, method, url, body, headers):
+ body = self.fixtures.load('api_1_2_price.json')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
def _1_2_server(self, method, url, body, headers):
if method == 'POST':
dbody = json.loads(body)