blob: 874b4948fbc05369f06fc39f5b004294a732e013 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys, unittest, httplib
try:
import json
except ImportError:
import simplejson as json
from libcloud.drivers.brightbox import BrightboxNodeDriver
from libcloud.types import NodeState, InvalidCredsError
from test import MockHttp, TestCaseMixin
from test.file_fixtures import FileFixtures
from secrets import BRIGHTBOX_CLIENT_ID, BRIGHTBOX_CLIENT_SECRET
class BrightboxTest(unittest.TestCase, TestCaseMixin):
def setUp(self):
BrightboxNodeDriver.connectionCls.conn_classes = (None, BrightboxMockHttp)
BrightboxMockHttp.type = None
self.driver = BrightboxNodeDriver(BRIGHTBOX_CLIENT_ID, BRIGHTBOX_CLIENT_SECRET)
def test_authentication(self):
BrightboxMockHttp.type = 'INVALID_CLIENT'
self.assertRaises(InvalidCredsError, self.driver.list_nodes)
BrightboxMockHttp.type = 'UNAUTHORIZED_CLIENT'
self.assertRaises(InvalidCredsError, self.driver.list_nodes)
def test_list_nodes(self):
nodes = self.driver.list_nodes()
self.assertEqual(len(nodes), 1)
self.assertTrue('109.107.42.129' in nodes[0].public_ip)
self.assertTrue('10.110.24.54' in nodes[0].private_ip)
self.assertEqual(nodes[0].state, NodeState.RUNNING)
def test_list_sizes(self):
sizes = self.driver.list_sizes()
self.assertEqual(len(sizes), 1)
self.assertEqual(sizes[0].id, 'typ-4nssg')
self.assertEqual(sizes[0].name, 'Brightbox Nano Instance')
self.assertEqual(sizes[0].ram, 512)
def test_list_images(self):
images = self.driver.list_images()
self.assertEqual(len(images), 1)
self.assertEqual(images[0].id, 'img-9vxqi')
self.assertEqual(images[0].name, 'Brightbox Lucid 32')
self.assertEqual(images[0].extra['arch'], '32-bit')
def test_reboot_node_response(self):
node = self.driver.list_nodes()[0]
self.assertRaises(NotImplementedError, self.driver.reboot_node, [node])
def test_destroy_node(self):
node = self.driver.list_nodes()[0]
self.assertTrue(self.driver.destroy_node(node))
def test_create_node(self):
size = self.driver.list_sizes()[0]
image = self.driver.list_images()[0]
node = self.driver.create_node(name='Test Node', image=image, size=size)
self.assertEqual('srv-3a97e', node.id)
self.assertEqual('Test Node', node.name)
class BrightboxMockHttp(MockHttp):
fixtures = FileFixtures('brightbox')
def _token(self, method, url, body, headers):
if method == 'POST':
return self.response(httplib.OK, self.fixtures.load('token.json'))
def _token_INVALID_CLIENT(self, method, url, body, headers):
if method == 'POST':
return self.response(httplib.BAD_REQUEST, '{"error":"invalid_client"}')
def _token_UNAUTHORIZED_CLIENT(self, method, url, body, headers):
if method == 'POST':
return self.response(httplib.UNAUTHORIZED, '{"error":"unauthorized_client"}')
def _1_0_images(self, method, url, body, headers):
if method == 'GET':
return self.response(httplib.OK, self.fixtures.load('list_images.json'))
def _1_0_servers(self, method, url, body, headers):
if method == 'GET':
return self.response(httplib.OK, self.fixtures.load('list_servers.json'))
elif method == 'POST':
body = json.loads(body)
node = json.loads(self.fixtures.load('create_server.json'))
node['name'] = body['name']
return self.response(httplib.ACCEPTED, json.dumps(node))
def _1_0_servers_srv_3a97e(self, method, url, body, headers):
if method == 'DELETE':
return self.response(httplib.ACCEPTED, '')
def _1_0_server_types(self, method, url, body, headers):
if method == 'GET':
return self.response(httplib.OK, self.fixtures.load('list_server_types.json'))
def _1_0_zones(self, method, url, body, headers):
if method == 'GET':
return self.response(httplib.OK, self.fixtures.load('list_zones.json'))
def response(self, status, body):
return (status, body, {'content-type': 'application/json'}, httplib.responses[status])
if __name__ == '__main__':
sys.exit(unittest.main())