diff --git a/openstack/cloud/_compute.py b/openstack/cloud/_compute.py index d153305a9..21961a910 100644 --- a/openstack/cloud/_compute.py +++ b/openstack/cloud/_compute.py @@ -1086,41 +1086,23 @@ class ComputeCloudMixin(_normalize.Normalizer): wait=False, timeout=180): kwargs = {} if image_id: - kwargs['imageRef'] = image_id + kwargs['image'] = image_id if admin_pass: - kwargs['adminPass'] = admin_pass + kwargs['admin_password'] = admin_pass - data = proxy._json_response( - self.compute.post( - '/servers/{server_id}/action'.format(server_id=server_id), - json={'rebuild': kwargs}), - error_message="Error in rebuilding instance") - server = self._get_and_munchify('server', data) + server = self.compute.rebuild_server( + server_id, + **kwargs + ) if not wait: return self._expand_server( - self._normalize_server(server), bare=bare, detailed=detailed) + server, bare=bare, detailed=detailed) admin_pass = server.get('adminPass') or admin_pass - for count in utils.iterate_timeout( - timeout, - "Timeout waiting for server {0} to " - "rebuild.".format(server_id), - wait=self._SERVER_AGE): - try: - server = self.get_server(server_id, bare=True) - except Exception: - continue - if not server: - continue - - if server['status'] == 'ERROR': - raise exc.OpenStackCloudException( - "Error in rebuilding the server", - extra_data=dict(server=server)) - - if server['status'] == 'ACTIVE': - server.adminPass = admin_pass - break + server = self.compute.wait_for_server( + server, wait=timeout) + if server['status'] == 'ACTIVE': + server.adminPass = admin_pass return self._expand_server(server, detailed=detailed, bare=bare) diff --git a/openstack/compute/v2/_proxy.py b/openstack/compute/v2/_proxy.py index 92b9f96f2..1760ff14e 100644 --- a/openstack/compute/v2/_proxy.py +++ b/openstack/compute/v2/_proxy.py @@ -754,7 +754,7 @@ class Proxy(proxy.Proxy): server = self._get_resource(_server.Server, server) server.reboot(self, reboot_type) - def rebuild_server(self, server, name, admin_password, **attrs): + def rebuild_server(self, server, image, **attrs): """Rebuild a server :param server: Either the ID of a server or a @@ -780,7 +780,7 @@ class Proxy(proxy.Proxy): instance. """ server = self._get_resource(_server.Server, server) - return server.rebuild(self, name, admin_password, **attrs) + return server.rebuild(self, image=image, **attrs) def resize_server(self, server, flavor): """Resize a server diff --git a/openstack/compute/v2/server.py b/openstack/compute/v2/server.py index 4a17accff..37241fd86 100644 --- a/openstack/compute/v2/server.py +++ b/openstack/compute/v2/server.py @@ -293,16 +293,16 @@ class Server(resource.Resource, metadata.MetadataMixin, tag.TagMixin): body = {'forceDelete': None} self._action(session, body) - def rebuild(self, session, name=None, admin_password=None, - preserve_ephemeral=False, image=None, + def rebuild(self, session, image, name=None, admin_password=None, + preserve_ephemeral=None, access_ipv4=None, access_ipv6=None, metadata=None, user_data=None): """Rebuild the server with the given arguments.""" action = { - 'preserve_ephemeral': preserve_ephemeral + 'imageRef': resource.Resource._get_id(image) } - if image is not None: - action['imageRef'] = resource.Resource._get_id(image) + if preserve_ephemeral is not None: + action['preserve_ephemeral'] = preserve_ephemeral if name is not None: action['name'] = name if admin_password is not None: diff --git a/openstack/tests/unit/cloud/test_rebuild_server.py b/openstack/tests/unit/cloud/test_rebuild_server.py index 24efb63d6..8cef0a533 100644 --- a/openstack/tests/unit/cloud/test_rebuild_server.py +++ b/openstack/tests/unit/cloud/test_rebuild_server.py @@ -82,8 +82,8 @@ class TestRebuildServer(base.TestCase): self.get_nova_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( - 'compute', 'public', append=['servers', 'detail']), - json={'servers': [self.error_server]}), + 'compute', 'public', append=['servers', self.server_id]), + json={'server': self.error_server}), ]) self.assertRaises( exc.OpenStackCloudException, @@ -109,8 +109,8 @@ class TestRebuildServer(base.TestCase): self.get_nova_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( - 'compute', 'public', append=['servers', 'detail']), - json={'servers': [self.rebuild_server]}), + 'compute', 'public', append=['servers', self.server_id]), + json={'server': self.rebuild_server}), ]) self.assertRaises( exc.OpenStackCloudTimeout, @@ -199,12 +199,12 @@ class TestRebuildServer(base.TestCase): self.get_nova_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( - 'compute', 'public', append=['servers', 'detail']), - json={'servers': [self.rebuild_server]}), + 'compute', 'public', append=['servers', self.server_id]), + json={'server': self.rebuild_server}), dict(method='GET', uri=self.get_mock_url( - 'compute', 'public', append=['servers', 'detail']), - json={'servers': [self.fake_server]}), + 'compute', 'public', append=['servers', self.server_id]), + json={'server': self.fake_server}), dict(method='GET', uri=self.get_mock_url( 'network', 'public', append=['v2.0', 'networks']), @@ -237,12 +237,12 @@ class TestRebuildServer(base.TestCase): self.get_nova_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( - 'compute', 'public', append=['servers', 'detail']), - json={'servers': [self.rebuild_server]}), + 'compute', 'public', append=['servers', self.server_id]), + json={'server': self.rebuild_server}), dict(method='GET', uri=self.get_mock_url( - 'compute', 'public', append=['servers', 'detail']), - json={'servers': [self.fake_server]}), + 'compute', 'public', append=['servers', self.server_id]), + json={'server': self.fake_server}), dict(method='GET', uri=self.get_mock_url( 'network', 'public', append=['v2.0', 'networks']), diff --git a/openstack/tests/unit/compute/v2/test_proxy.py b/openstack/tests/unit/compute/v2/test_proxy.py index 5e3f4bf2c..68f414004 100644 --- a/openstack/tests/unit/compute/v2/test_proxy.py +++ b/openstack/tests/unit/compute/v2/test_proxy.py @@ -729,19 +729,35 @@ class TestCompute(TestComputeProxy): self._verify( 'openstack.compute.v2.server.Server.rebuild', self.proxy.rebuild_server, - method_args=["value", "test_server", "test_pass"], - method_kwargs={"metadata": {"k1": "v1"}, "image": image_obj}, - expected_args=[self.proxy, "test_server", "test_pass"], - expected_kwargs={"metadata": {"k1": "v1"}, "image": image_obj}) + method_args=["value"], + method_kwargs={ + "name": "test_server", + "admin_password": "test_pass", + "metadata": {"k1": "v1"}, + "image": image_obj}, + expected_args=[self.proxy], + expected_kwargs={ + "name": "test_server", + "admin_password": "test_pass", + "metadata": {"k1": "v1"}, + "image": image_obj}) # Case2: image name or id is provided self._verify( 'openstack.compute.v2.server.Server.rebuild', self.proxy.rebuild_server, - method_args=["value", "test_server", "test_pass"], - method_kwargs={"metadata": {"k1": "v1"}, "image": id}, - expected_args=[self.proxy, "test_server", "test_pass"], - expected_kwargs={"metadata": {"k1": "v1"}, "image": id}) + method_args=["value"], + method_kwargs={ + "name": "test_server", + "admin_password": "test_pass", + "metadata": {"k1": "v1"}, + "image": id}, + expected_args=[self.proxy], + expected_kwargs={ + "name": "test_server", + "admin_password": "test_pass", + "metadata": {"k1": "v1"}, + "image": id}) def test_add_fixed_ip_to_server(self): self._verify( diff --git a/openstack/tests/unit/compute/v2/test_server.py b/openstack/tests/unit/compute/v2/test_server.py index d3eef970e..2a077063b 100644 --- a/openstack/tests/unit/compute/v2/test_server.py +++ b/openstack/tests/unit/compute/v2/test_server.py @@ -315,11 +315,14 @@ class TestServer(base.TestCase): # Let the translate pass through, that portion is tested elsewhere sot._translate_response = lambda arg: arg - result = sot.rebuild(self.sess, name='noo', admin_password='seekr3t', - image='http://image/1', access_ipv4="12.34.56.78", - access_ipv6="fe80::100", - metadata={"meta var": "meta val"}, - user_data="ZWNobyAiaGVsbG8gd29ybGQi") + result = sot.rebuild( + self.sess, name='noo', admin_password='seekr3t', + image='http://image/1', access_ipv4="12.34.56.78", + access_ipv6="fe80::100", + metadata={"meta var": "meta val"}, + user_data="ZWNobyAiaGVsbG8gd29ybGQi", + preserve_ephemeral=False + ) self.assertIsInstance(result, server.Server) @@ -357,7 +360,6 @@ class TestServer(base.TestCase): "name": "nootoo", "imageRef": "http://image/2", "adminPass": "seekr3two", - "preserve_ephemeral": False } } headers = {'Accept': ''}