Merge "Handle unicode multi-byte characters"
This commit is contained in:
commit
caf1f6203a
@ -10,6 +10,9 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from oslo_utils import encodeutils
|
||||||
|
from six.moves.urllib import parse
|
||||||
|
|
||||||
from novaclient import api_versions
|
from novaclient import api_versions
|
||||||
from novaclient.tests.unit.fixture_data import base
|
from novaclient.tests.unit.fixture_data import base
|
||||||
|
|
||||||
@ -130,6 +133,31 @@ class V1(base.Fixture):
|
|||||||
json=get_os_hypervisors_search,
|
json=get_os_hypervisors_search,
|
||||||
headers=self.headers)
|
headers=self.headers)
|
||||||
|
|
||||||
|
if uuid_as_id:
|
||||||
|
get_os_hypervisors_search_u_v2_53 = {
|
||||||
|
'error_name': 'BadRequest',
|
||||||
|
'message': 'Invalid input for query parameters '
|
||||||
|
'hypervisor_hostname_pattern.',
|
||||||
|
'code': 400}
|
||||||
|
# hypervisor_hostname_pattern is encoded in the url method
|
||||||
|
url = self.url(hypervisor_hostname_pattern='\\u5de5\\u4f5c')
|
||||||
|
self.requests_mock.get(url,
|
||||||
|
json=get_os_hypervisors_search_u_v2_53,
|
||||||
|
headers=self.headers, status_code=400)
|
||||||
|
else:
|
||||||
|
get_os_hypervisors_search_unicode = {
|
||||||
|
'error_name': 'NotFound',
|
||||||
|
'message': "No hypervisor matching "
|
||||||
|
"'\\u5de5\\u4f5c' could be found.",
|
||||||
|
'code': 404
|
||||||
|
}
|
||||||
|
hypervisor_hostname_pattern = parse.quote(encodeutils.safe_encode(
|
||||||
|
'\\u5de5\\u4f5c'))
|
||||||
|
url = self.url(hypervisor_hostname_pattern, 'search')
|
||||||
|
self.requests_mock.get(url,
|
||||||
|
json=get_os_hypervisors_search_unicode,
|
||||||
|
headers=self.headers, status_code=404)
|
||||||
|
|
||||||
get_hyper_server = {
|
get_hyper_server = {
|
||||||
'hypervisors': [
|
'hypervisors': [
|
||||||
{
|
{
|
||||||
|
@ -126,6 +126,7 @@ class FakeSessionClient(base_client.SessionClient):
|
|||||||
munged_url = munged_url.replace('@', '_')
|
munged_url = munged_url.replace('@', '_')
|
||||||
munged_url = munged_url.replace('%20', '_')
|
munged_url = munged_url.replace('%20', '_')
|
||||||
munged_url = munged_url.replace('%3A', '_')
|
munged_url = munged_url.replace('%3A', '_')
|
||||||
|
munged_url = munged_url.replace('%', '_')
|
||||||
callback = "%s_%s" % (method.lower(), munged_url)
|
callback = "%s_%s" % (method.lower(), munged_url)
|
||||||
|
|
||||||
if url is None or callback == "get_http:__nova_api:8774":
|
if url is None or callback == "get_http:__nova_api:8774":
|
||||||
@ -176,6 +177,10 @@ class FakeSessionClient(base_client.SessionClient):
|
|||||||
"text": body,
|
"text": body,
|
||||||
"headers": headers,
|
"headers": headers,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if status >= 400:
|
||||||
|
raise exceptions.from_response(r, body, url, method)
|
||||||
|
|
||||||
return r, body
|
return r, body
|
||||||
|
|
||||||
def get_versions(self):
|
def get_versions(self):
|
||||||
@ -2167,6 +2172,9 @@ class FakeSessionClient(base_client.SessionClient):
|
|||||||
"total_errors": 3,
|
"total_errors": 3,
|
||||||
"total_instances": 6}})
|
"total_instances": 6}})
|
||||||
|
|
||||||
|
def get_os_instance_usage_audit_log__5Cu5de5_5Cu4f5c(self, **kw):
|
||||||
|
return (400, {}, {"Invalid timestamp for date \u6f22\u5b57"})
|
||||||
|
|
||||||
def post_servers_uuid1_action(self, **kw):
|
def post_servers_uuid1_action(self, **kw):
|
||||||
return 202, {}, {}
|
return 202, {}, {}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from novaclient import api_versions
|
from novaclient import api_versions
|
||||||
|
from novaclient import exceptions
|
||||||
from novaclient.tests.unit.fixture_data import client
|
from novaclient.tests.unit.fixture_data import client
|
||||||
from novaclient.tests.unit.fixture_data import hypervisors as data
|
from novaclient.tests.unit.fixture_data import hypervisors as data
|
||||||
from novaclient.tests.unit import utils
|
from novaclient.tests.unit import utils
|
||||||
@ -107,6 +108,17 @@ class HypervisorsTest(utils.FixturedTestCase):
|
|||||||
for idx, hyper in enumerate(result):
|
for idx, hyper in enumerate(result):
|
||||||
self.compare_to_expected(expected[idx], hyper)
|
self.compare_to_expected(expected[idx], hyper)
|
||||||
|
|
||||||
|
def test_hypervisor_search_unicode(self):
|
||||||
|
hypervisor_match = u'\\u5de5\\u4f5c'
|
||||||
|
if self.cs.api_version >= api_versions.APIVersion('2.53'):
|
||||||
|
self.assertRaises(exceptions.BadRequest,
|
||||||
|
self.cs.hypervisors.search,
|
||||||
|
hypervisor_match)
|
||||||
|
else:
|
||||||
|
self.assertRaises(exceptions.NotFound,
|
||||||
|
self.cs.hypervisors.search,
|
||||||
|
hypervisor_match)
|
||||||
|
|
||||||
def test_hypervisor_servers(self):
|
def test_hypervisor_servers(self):
|
||||||
expected = [
|
expected = [
|
||||||
dict(id=self.data_fixture.hyper_id_1,
|
dict(id=self.data_fixture.hyper_id_1,
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from novaclient import api_versions
|
from novaclient import api_versions
|
||||||
|
from novaclient import exceptions
|
||||||
from novaclient.tests.unit import utils
|
from novaclient.tests.unit import utils
|
||||||
from novaclient.tests.unit.v2 import fakes
|
from novaclient.tests.unit.v2 import fakes
|
||||||
|
|
||||||
@ -35,3 +36,8 @@ class InstanceUsageAuditLogTests(utils.TestCase):
|
|||||||
self.cs.assert_called(
|
self.cs.assert_called(
|
||||||
'GET',
|
'GET',
|
||||||
'/os-instance_usage_audit_log/2016-12-10%2013%3A59%3A59.999999')
|
'/os-instance_usage_audit_log/2016-12-10%2013%3A59%3A59.999999')
|
||||||
|
|
||||||
|
def test_instance_usage_audit_log_with_before_unicode(self):
|
||||||
|
before = u'\\u5de5\\u4f5c'
|
||||||
|
self.assertRaises(exceptions.BadRequest,
|
||||||
|
self.cs.instance_usage_audit_log.get, before)
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
Hypervisors interface
|
Hypervisors interface
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from oslo_utils import encodeutils
|
||||||
|
import six
|
||||||
from six.moves.urllib import parse
|
from six.moves.urllib import parse
|
||||||
|
|
||||||
from novaclient import api_versions
|
from novaclient import api_versions
|
||||||
@ -83,6 +85,8 @@ class HypervisorManager(base.ManagerWithFind):
|
|||||||
# Starting with microversion 2.53, the /servers and /search routes are
|
# Starting with microversion 2.53, the /servers and /search routes are
|
||||||
# deprecated and we get the same results using GET /os-hypervisors
|
# deprecated and we get the same results using GET /os-hypervisors
|
||||||
# using query parameters for the hostname pattern and servers.
|
# using query parameters for the hostname pattern and servers.
|
||||||
|
if six.PY2:
|
||||||
|
hypervisor_match = encodeutils.safe_encode(hypervisor_match)
|
||||||
if self.api_version >= api_versions.APIVersion('2.53'):
|
if self.api_version >= api_versions.APIVersion('2.53'):
|
||||||
url = ('/os-hypervisors?hypervisor_hostname_pattern=%s' %
|
url = ('/os-hypervisors?hypervisor_hostname_pattern=%s' %
|
||||||
parse.quote(hypervisor_match, safe=''))
|
parse.quote(hypervisor_match, safe=''))
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from oslo_utils import encodeutils
|
||||||
|
import six
|
||||||
from six.moves.urllib import parse
|
from six.moves.urllib import parse
|
||||||
|
|
||||||
from novaclient import base
|
from novaclient import base
|
||||||
@ -32,6 +34,8 @@ class InstanceUsageAuditLogManager(base.Manager):
|
|||||||
before which to list usage audits.
|
before which to list usage audits.
|
||||||
"""
|
"""
|
||||||
if before:
|
if before:
|
||||||
|
if six.PY2:
|
||||||
|
before = encodeutils.safe_encode(before)
|
||||||
return self._get('/os-instance_usage_audit_log/%s' %
|
return self._get('/os-instance_usage_audit_log/%s' %
|
||||||
parse.quote(before, safe=''),
|
parse.quote(before, safe=''),
|
||||||
'instance_usage_audit_log')
|
'instance_usage_audit_log')
|
||||||
|
Loading…
Reference in New Issue
Block a user