Merge "Reject evacuate with port having resource request"

This commit is contained in:
Zuul 2019-02-05 01:37:53 +00:00 committed by Gerrit Code Review
commit 961884beb3
4 changed files with 59 additions and 0 deletions

View File

@ -25,6 +25,7 @@ from nova import compute
import nova.conf
from nova import exception
from nova.i18n import _
from nova import network
from nova.policies import evacuate as evac_policies
from nova import utils
@ -36,6 +37,7 @@ class EvacuateController(wsgi.Controller):
super(EvacuateController, self).__init__(*args, **kwargs)
self.compute_api = compute.API()
self.host_api = compute.HostAPI()
self.network_api = network.API()
def _get_on_shared_storage(self, req, evacuate_body):
if api_version_request.is_supported(req, min_version='2.14'):
@ -114,6 +116,13 @@ class EvacuateController(wsgi.Controller):
msg = _("The target host can't be the same one.")
raise exc.HTTPBadRequest(explanation=msg)
if (common.instance_has_port_with_resource_request(
context, instance.uuid, self.network_api) and not
common.supports_port_resource_request_during_move(req)):
msg = _("The evacuate server operation with port having QoS "
"policy is not supported.")
raise exc.HTTPBadRequest(explanation=msg)
try:
self.compute_api.evacuate(context, instance, host,
on_shared_storage, password, force)

View File

@ -22,6 +22,7 @@ from nova.tests.functional.api_sample_tests import test_servers
class EvacuateJsonTest(test_servers.ServersSampleBase):
ADMIN_API = True
sample_dir = "os-evacuate"
USE_NEUTRON = True
def _test_evacuate(self, req_subs, server_req, server_resp,
expected_resp_code):

View File

@ -5560,3 +5560,27 @@ class PortResourceRequestBasedSchedulingTest(
self.assertIn(
'The live migrate server operation with port having QoS policy is '
'not supported.', six.text_type(ex))
def test_evacuate_server_with_port_resource_request_old_microversion(
self):
server = self._create_server(
flavor=self.flavor,
networks=[{'port': self.neutron.port_1['id']}])
self._wait_for_state_change(self.admin_api, server, 'ACTIVE')
# We need to simulate that the above server has a port that has
# resource request, we cannot boot with such a port but legacy servers
# can exists with such a port.
bound_port = self.neutron._ports[self.neutron.port_1['id']]
fake_resource_request = self.neutron.port_with_resource_request[
'resource_request']
bound_port['resource_request'] = fake_resource_request
ex = self.assertRaises(
client.OpenStackApiException,
self.api.post_server_action, server['id'], {'evacuate': {}})
self.assertEqual(400, ex.response.status_code)
self.assertIn(
'The evacuate server operation with port having QoS policy is '
'not supported.', six.text_type(ex))

View File

@ -12,8 +12,10 @@
# License for the specific language governing permissions and limitations
# under the License.
import fixtures
import mock
from oslo_utils.fixture import uuidsentinel as uuids
import six
import testtools
import webob
@ -66,6 +68,10 @@ class EvacuateTestV21(test.NoDBTestCase):
self.stub_out('nova.compute.api.API.get', fake_compute_api_get)
self.stub_out('nova.compute.api.HostAPI.service_get_by_compute_host',
fake_service_get_by_compute_host)
self.mock_list_port = self.useFixture(
fixtures.MockPatch(
'nova.network.neutronv2.api.API.list_ports')).mock
self.mock_list_port.return_value = {'ports': []}
self.UUID = uuids.fake
for _method in self._methods:
self.stub_out('nova.compute.api.API.%s' % _method,
@ -238,6 +244,21 @@ class EvacuateTestV21(test.NoDBTestCase):
else:
self.assertIsNone(res)
def test_evacuate_with_port_resource_request_old_microversion(self):
self.mock_list_port.return_value = {'ports': [
{'resource_request': {
"resources": {'CUSTOM_FOO': 1}}}]
}
admin_pass = 'MyNewPass'
ex = self.assertRaises(
webob.exc.HTTPBadRequest, self._get_evacuate_response,
{'host': 'my-host', 'onSharedStorage': 'False',
'adminPass': admin_pass})
self.assertIn('The evacuate server operation with port having QoS '
'policy is not supported.', six.text_type(ex))
class EvacuatePolicyEnforcementv21(test.NoDBTestCase):
@ -257,6 +278,10 @@ class EvacuatePolicyEnforcementv21(test.NoDBTestCase):
self.stub_out(
'nova.api.openstack.common.get_instance', fake_get_instance)
self.mock_list_port = self.useFixture(
fixtures.MockPatch(
'nova.network.neutronv2.api.API.list_ports')).mock
self.mock_list_port.return_value = {'ports': []}
def test_evacuate_policy_failed_with_other_project(self):
rule_name = "os_compute_api:os-evacuate"