summaryrefslogtreecommitdiff
path: root/tests/v1_0/fakes.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/v1_0/fakes.py')
-rw-r--r--tests/v1_0/fakes.py412
1 files changed, 412 insertions, 0 deletions
diff --git a/tests/v1_0/fakes.py b/tests/v1_0/fakes.py
new file mode 100644
index 00000000..c47affc5
--- /dev/null
+++ b/tests/v1_0/fakes.py
@@ -0,0 +1,412 @@
+import httplib2
+import urllib
+import urlparse
+
+from novaclient import client as base_client
+from novaclient.v1_0 import client
+from tests import fakes
+
+
+class FakeClient(fakes.FakeClient, client.Client):
+
+ def __init__(self, *args, **kwargs):
+ client.Client.__init__(self, 'username', 'apikey',
+ 'project_id', 'auth_url')
+ self.client = FakeHTTPClient(**kwargs)
+
+
+class FakeHTTPClient(base_client.HTTPClient):
+ def __init__(self, **kwargs):
+ self.username = 'username'
+ self.apikey = 'apikey'
+ self.auth_url = 'auth_url'
+ self.callstack = []
+
+ def _cs_request(self, url, method, **kwargs):
+ # Check that certain things are called correctly
+ if method in ['GET', 'DELETE']:
+ assert 'body' not in kwargs
+ elif method in ['PUT', 'POST']:
+ assert 'body' in kwargs
+
+ # Call the method
+ munged_url = url.strip('/').replace('/', '_').replace('.', '_')
+ callback = "%s_%s" % (method.lower(), munged_url)
+ if not hasattr(self, callback):
+ raise AssertionError('Called unknown API method: %s %s' % (method, url))
+
+ # Note the call
+ self.callstack.append((method, url, kwargs.get('body', None)))
+
+ status, body = getattr(self, callback)(**kwargs)
+ return httplib2.Response({"status": status}), body
+
+ def _munge_get_url(self, url):
+ return url
+
+ #
+ # Limits
+ #
+
+ def get_limits(self, **kw):
+ return (200, {"limits": {
+ "rate": [
+ {
+ "verb": "POST",
+ "URI": "*",
+ "regex": ".*",
+ "value": 10,
+ "remaining": 2,
+ "unit": "MINUTE",
+ "resetTime": 1244425439
+ },
+ {
+ "verb": "POST",
+ "URI": "*/servers",
+ "regex": "^/servers",
+ "value": 50,
+ "remaining": 49,
+ "unit": "DAY", "resetTime": 1244511839
+ },
+ {
+ "verb": "PUT",
+ "URI": "*",
+ "regex": ".*",
+ "value": 10,
+ "remaining": 2,
+ "unit": "MINUTE",
+ "resetTime": 1244425439
+ },
+ {
+ "verb": "GET",
+ "URI": "*changes-since*",
+ "regex": "changes-since",
+ "value": 3,
+ "remaining": 3,
+ "unit": "MINUTE",
+ "resetTime": 1244425439
+ },
+ {
+ "verb": "DELETE",
+ "URI": "*",
+ "regex": ".*",
+ "value": 100,
+ "remaining": 100,
+ "unit": "MINUTE",
+ "resetTime": 1244425439
+ }
+ ],
+ "absolute": {
+ "maxTotalRAMSize": 51200,
+ "maxIPGroups": 50,
+ "maxIPGroupMembers": 25
+ }
+ }})
+
+ #
+ # Servers
+ #
+
+ def get_servers(self, **kw):
+ return (200, {"servers": [
+ {'id': 1234, 'name': 'sample-server'},
+ {'id': 5678, 'name': 'sample-server2'}
+ ]})
+
+ def get_servers_detail(self, **kw):
+ return (200, {"servers": [
+ {
+ "id": 1234,
+ "name": "sample-server",
+ "imageId": 2,
+ "flavorId": 1,
+ "hostId": "e4d909c290d0fb1ca068ffaddf22cbd0",
+ "status": "BUILD",
+ "progress": 60,
+ "addresses": {
+ "public": ["1.2.3.4", "5.6.7.8"],
+ "private": ["10.11.12.13"]
+ },
+ "metadata": {
+ "Server Label": "Web Head 1",
+ "Image Version": "2.1"
+ }
+ },
+ {
+ "id": 5678,
+ "name": "sample-server2",
+ "imageId": 2,
+ "flavorId": 1,
+ "hostId": "9e107d9d372bb6826bd81d3542a419d6",
+ "status": "ACTIVE",
+ "addresses": {
+ "public": ["9.10.11.12"],
+ "private": ["10.11.12.14"]
+ },
+ "metadata": {
+ "Server Label": "DB 1"
+ }
+ }
+ ]})
+
+ def post_servers(self, body, **kw):
+ assert body.keys() == ['server']
+ fakes.assert_has_keys(body['server'],
+ required=['name', 'imageId', 'flavorId'],
+ optional=['sharedIpGroupId', 'metadata',
+ 'personality', 'min_count', 'max_count'])
+ if 'personality' in body['server']:
+ for pfile in body['server']['personality']:
+ fakes.assert_has_keys(pfile, required=['path', 'contents'])
+ return (202, self.get_servers_1234()[1])
+
+ def get_servers_1234(self, **kw):
+ r = {'server': self.get_servers_detail()[1]['servers'][0]}
+ return (200, r)
+
+ def get_servers_5678(self, **kw):
+ r = {'server': self.get_servers_detail()[1]['servers'][1]}
+ return (200, r)
+
+ def put_servers_1234(self, body, **kw):
+ assert body.keys() == ['server']
+ fakes.assert_has_keys(body['server'], optional=['name', 'adminPass'])
+ return (204, None)
+
+ def delete_servers_1234(self, **kw):
+ return (202, None)
+
+ #
+ # Server Addresses
+ #
+
+ def get_servers_1234_ips(self, **kw):
+ return (200, {'addresses':
+ self.get_servers_1234()[1]['server']['addresses']})
+
+ def get_servers_1234_ips_public(self, **kw):
+ return (200, {'public':
+ self.get_servers_1234_ips()[1]['addresses']['public']})
+
+ def get_servers_1234_ips_private(self, **kw):
+ return (200, {'private':
+ self.get_servers_1234_ips()[1]['addresses']['private']})
+
+ def put_servers_1234_ips_public_1_2_3_4(self, body, **kw):
+ assert body.keys() == ['shareIp']
+ fakes.assert_has_keys(body['shareIp'], required=['sharedIpGroupId',
+ 'configureServer'])
+ return (202, None)
+
+ def delete_servers_1234_ips_public_1_2_3_4(self, **kw):
+ return (202, None)
+
+ #
+ # Server actions
+ #
+
+ def post_servers_1234_action(self, body, **kw):
+ assert len(body.keys()) == 1
+ action = body.keys()[0]
+ if action == 'reboot':
+ assert body[action].keys() == ['type']
+ assert body[action]['type'] in ['HARD', 'SOFT']
+ elif action == 'rebuild':
+ assert body[action].keys() == ['imageId']
+ elif action == 'resize':
+ assert body[action].keys() == ['flavorId']
+ elif action == 'createBackup':
+ assert set(body[action].keys()) == \
+ set(['name', 'rotation', 'backup_type'])
+ elif action == 'confirmResize':
+ assert body[action] is None
+ # This one method returns a different response code
+ return (204, None)
+ elif action == 'revertResize':
+ assert body[action] is None
+ elif action == 'migrate':
+ assert body[action] is None
+ elif action == 'addFixedIp':
+ assert body[action].keys() == ['networkId']
+ elif action == 'removeFixedIp':
+ assert body[action].keys() == ['address']
+ else:
+ raise AssertionError("Unexpected server action: %s" % action)
+ return (202, None)
+
+ #
+ # Flavors
+ #
+
+ def get_flavors(self, **kw):
+ return (200, {'flavors': [
+ {'id': 1, 'name': '256 MB Server'},
+ {'id': 2, 'name': '512 MB Server'}
+ ]})
+
+ def get_flavors_detail(self, **kw):
+ return (200, {'flavors': [
+ {'id': 1, 'name': '256 MB Server', 'ram': 256, 'disk': 10},
+ {'id': 2, 'name': '512 MB Server', 'ram': 512, 'disk': 20}
+ ]})
+
+ def get_flavors_1(self, **kw):
+ return (200, {'flavor': self.get_flavors_detail()[1]['flavors'][0]})
+
+ def get_flavors_2(self, **kw):
+ return (200, {'flavor': self.get_flavors_detail()[1]['flavors'][1]})
+
+ #
+ # Images
+ #
+ def get_images(self, **kw):
+ return (200, {'images': [
+ {'id': 1, 'name': 'CentOS 5.2'},
+ {'id': 2, 'name': 'My Server Backup'}
+ ]})
+
+ def get_images_detail(self, **kw):
+ return (200, {'images': [
+ {
+ 'id': 1,
+ 'name': 'CentOS 5.2',
+ "updated": "2010-10-10T12:00:00Z",
+ "created": "2010-08-10T12:00:00Z",
+ "status": "ACTIVE"
+ },
+ {
+ "id": 743,
+ "name": "My Server Backup",
+ "serverId": 12,
+ "updated": "2010-10-10T12:00:00Z",
+ "created": "2010-08-10T12:00:00Z",
+ "status": "SAVING",
+ "progress": 80
+ }
+ ]})
+
+ def get_images_1(self, **kw):
+ return (200, {'image': self.get_images_detail()[1]['images'][0]})
+
+ def get_images_2(self, **kw):
+ return (200, {'image': self.get_images_detail()[1]['images'][1]})
+
+ def post_images(self, body, **kw):
+ assert body.keys() == ['image']
+ fakes.assert_has_keys(body['image'], required=['serverId', 'name'])
+ return (202, self.get_images_1()[1])
+
+ def delete_images_1(self, **kw):
+ return (204, None)
+
+ #
+ # Backup schedules
+ #
+ def get_servers_1234_backup_schedule(self, **kw):
+ return (200, {"backupSchedule": {
+ "enabled": True,
+ "weekly": "THURSDAY",
+ "daily": "H_0400_0600"
+ }})
+
+ def post_servers_1234_backup_schedule(self, body, **kw):
+ assert body.keys() == ['backupSchedule']
+ fakes.assert_has_keys(body['backupSchedule'], required=['enabled'],
+ optional=['weekly', 'daily'])
+ return (204, None)
+
+ def delete_servers_1234_backup_schedule(self, **kw):
+ return (204, None)
+
+ #
+ # Shared IP groups
+ #
+ def get_shared_ip_groups(self, **kw):
+ return (200, {'sharedIpGroups': [
+ {'id': 1, 'name': 'group1'},
+ {'id': 2, 'name': 'group2'},
+ ]})
+
+ def get_shared_ip_groups_detail(self, **kw):
+ return (200, {'sharedIpGroups': [
+ {'id': 1, 'name': 'group1', 'servers': [1234]},
+ {'id': 2, 'name': 'group2', 'servers': [5678]},
+ ]})
+
+ def get_shared_ip_groups_1(self, **kw):
+ return (200, {'sharedIpGroup':
+ self.get_shared_ip_groups_detail()[1]['sharedIpGroups'][0]})
+
+ def post_shared_ip_groups(self, body, **kw):
+ assert body.keys() == ['sharedIpGroup']
+ fakes.assert_has_keys(body['sharedIpGroup'], required=['name'],
+ optional=['server'])
+ return (201, {'sharedIpGroup': {
+ 'id': 10101,
+ 'name': body['sharedIpGroup']['name'],
+ 'servers': 'server' in body['sharedIpGroup'] and \
+ [body['sharedIpGroup']['server']] or None
+ }})
+
+ def delete_shared_ip_groups_1(self, **kw):
+ return (204, None)
+
+ #
+ # Zones
+ #
+ def get_zones(self, **kw):
+ return (200, {'zones': [
+ {'id': 1, 'api_url': 'http://foo.com', 'username': 'bob'},
+ {'id': 2, 'api_url': 'http://foo.com', 'username': 'alice'},
+ ]})
+
+ def get_zones_detail(self, **kw):
+ return (200, {'zones': [
+ {'id': 1, 'api_url': 'http://foo.com', 'username': 'bob',
+ 'password': 'qwerty'},
+ {'id': 2, 'api_url': 'http://foo.com', 'username': 'alice',
+ 'password': 'password'}
+ ]})
+
+ def get_zones_1(self, **kw):
+ r = {'zone': self.get_zones_detail()[1]['zones'][0]}
+ return (200, r)
+
+ def get_zones_2(self, **kw):
+ r = {'zone': self.get_zones_detail()[1]['zones'][1]}
+ return (200, r)
+
+ def post_zones(self, body, **kw):
+ assert body.keys() == ['zone']
+ fakes.assert_has_keys(body['zone'],
+ required=['api_url', 'username', 'password'],
+ optional=['weight_offset', 'weight_scale'])
+
+ return (202, self.get_zones_1()[1])
+
+ def put_zones_1(self, body, **kw):
+ assert body.keys() == ['zone']
+ fakes.assert_has_keys(body['zone'], optional=['api_url', 'username',
+ 'password',
+ 'weight_offset',
+ 'weight_scale'])
+ return (204, None)
+
+ def delete_zones_1(self, **kw):
+ return (202, None)
+
+ #
+ # Accounts
+ #
+ def post_accounts_test_account_create_instance(self, body, **kw):
+ assert body.keys() == ['server']
+ fakes.assert_has_keys(body['server'],
+ required=['name', 'imageId', 'flavorId'],
+ optional=['sharedIpGroupId', 'metadata',
+ 'personality', 'min_count', 'max_count'])
+ if 'personality' in body['server']:
+ for pfile in body['server']['personality']:
+ fakes.assert_has_keys(pfile, required=['path', 'contents'])
+ return (202, self.get_servers_1234()[1])
+
+