diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py index e9049f6..9c0cd19 100644 --- a/libcloud/compute/drivers/openstack.py +++ b/libcloud/compute/drivers/openstack.py @@ -33,7 +33,7 @@ from libcloud.common.openstack import OpenStackBaseConnection from libcloud.common.types import MalformedResponseError from libcloud.compute.types import NodeState, Provider from libcloud.compute.base import NodeSize, NodeImage -from libcloud.compute.base import NodeDriver, Node +from libcloud.compute.base import NodeDriver, Node, NodeLocation from libcloud.pricing import get_size_price from libcloud.common.base import Response from libcloud.utils import findall @@ -195,6 +195,9 @@ class OpenStackNodeDriver(NodeDriver): return self._to_sizes(self.connection.request('/flavors/detail') .object) + def list_locations(self): + return [NodeLocation(0, '', '', self)] + def _ex_connection_class_kwargs(self): rv = {} if self._ex_force_base_url: @@ -796,7 +799,7 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver): @type ex_files: C{dict} """ - server_params = self._create_args_to_params(None, kwargs) + server_params = self._create_args_to_params(None, **kwargs) resp = self.connection.request("/servers", method='POST', @@ -835,7 +838,7 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver): flavors = obj['flavors'] return [self._to_size(flavor) for flavor in flavors] - def _create_args_to_params(self, node, kwargs): + def _create_args_to_params(self, node, **kwargs): server_params = { 'name': kwargs.get('name'), 'metadata': kwargs.get('ex_metadata', {}), @@ -849,12 +852,20 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver): server_params['name'] = node.name if 'image' in kwargs: - server_params['imageRef'] = kwargs.get('image').id + image = kwargs.get('image') + if isinstance(image, NodeImage): + server_params['imageRef'] = image.id + else: + server_params['imageRef'] = image else: server_params['imageRef'] = node.extra.get('imageId') if 'size' in kwargs: - server_params['flavorRef'] = kwargs.get('size').id + size = kwargs.get('size') + if isinstance(size, NodeSize): + server_params['flavorRef'] = size.id + else: + server_params['flavorRef'] = size else: server_params['flavorRef'] = node.extra.get('flavorId') @@ -877,13 +888,20 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver): node.extra['password'] = password return resp.status == httplib.ACCEPTED - def ex_rebuild(self, node, **kwargs): - server_params = self._create_args_to_params(node, kwargs) + def ex_rebuild(self, node, image): + """ + Sets the Node's metadata. + + @node metadata: Key/Value metadata to associate with a node + @type metadata: C{dict} + """ + server_params = self._create_args_to_params(node, image=image) resp = self._node_action(node, 'rebuild', **server_params) return resp.status == httplib.ACCEPTED def ex_resize(self, node, size): - resp = self._node_action(node, 'resize', flavorRef=size.id) + server_params = self._create_args_to_params(node, size=size) + resp = self._node_action(node, 'resize', **server_params) return resp.status == httplib.ACCEPTED def ex_confirm_resize(self, node): @@ -945,7 +963,7 @@ class OpenStack_1_1_NodeDriver(OpenStackNodeDriver): @keyword name: New name for the server @type name: C{str} """ - potential_data = self._create_args_to_params(node, node_updates) + potential_data = self._create_args_to_params(node, **node_updates) updates = {'name': potential_data['name']} return self._update_node(node, **updates) diff --git a/test/compute/test_openstack.py b/test/compute/test_openstack.py index ae9a124..04ed6b0 100644 --- a/test/compute/test_openstack.py +++ b/test/compute/test_openstack.py @@ -565,7 +565,7 @@ class OpenStack_1_1_Tests(unittest.TestCase, TestCaseMixin): def test_ex_rebuild(self): image = NodeImage(id=11, name='Ubuntu 8.10 (intrepid)', driver=self.driver) try: - self.driver.ex_rebuild(self.node, image=image) + self.driver.ex_rebuild(self.node, image) except Exception, e: self.fail('An error was raised: ' + repr(e))