This is definitely an issue. What is the right expectation here? If a customer specifies unicode in the server name, the unix hostname will not contain those characters, correct? What if all the characters are unicode? In addition, I think the initial migrations might have to be changed, since this affects how they are stored in the db. I haven't traced this at all, but I don't think its straightforward to support unicode. In the meantime perhaps we should disallow users from using unicode in the hostname.
Here's a Traceback just for fun:
2012-01-15 12:38:35,641 ERROR nova.api.openstack.v2 [f00369f6-ec7d-4239-b71d-b6d6affd300a username projectid] Caught error: 'utf8' codec can't decode byte 0xa8 in position 5: invalid start byte
(nova.api.openstack.v2): TRACE: Traceback (most recent call last):
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/nova/api/openstack/v2/__init__.py", line 59, in __call__
(nova.api.openstack.v2): TRACE: return req.get_response(self.application)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/request.py", line 919, in get_response
(nova.api.openstack.v2): TRACE: application, catch_exc_info=False)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/request.py", line 887, in call_application
(nova.api.openstack.v2): TRACE: app_iter = application(self.environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/dist-packages/keystone/middleware/auth_token.py", line 209, in __call__
(nova.api.openstack.v2): TRACE: return self._forward_request(env, start_response, proxy_headers)
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/dist-packages/keystone/middleware/auth_token.py", line 325, in _forward_request
(nova.api.openstack.v2): TRACE: return self.app(env, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 159, in __call__
(nova.api.openstack.v2): TRACE: return resp(environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 147, in __call__
(nova.api.openstack.v2): TRACE: resp = self.call_func(req, *args, **self.kwargs)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 208, in call_func
(nova.api.openstack.v2): TRACE: return self.func(req, *args, **kwargs)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/nova/api/openstack/wsgi.py", line 501, in __call__
(nova.api.openstack.v2): TRACE: response = req.get_response(self.application)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/request.py", line 919, in get_response
(nova.api.openstack.v2): TRACE: application, catch_exc_info=False)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/request.py", line 887, in call_application
(nova.api.openstack.v2): TRACE: app_iter = application(self.environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 159, in __call__
(nova.api.openstack.v2): TRACE: return resp(environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/routes/middleware.py", line 131, in __call__
(nova.api.openstack.v2): TRACE: response = self.app(environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 159, in __call__
(nova.api.openstack.v2): TRACE: return resp(environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 159, in __call__
(nova.api.openstack.v2): TRACE: return resp(environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/routes/middleware.py", line 131, in __call__
(nova.api.openstack.v2): TRACE: response = self.app(environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 159, in __call__
(nova.api.openstack.v2): TRACE: return resp(environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 147, in __call__
(nova.api.openstack.v2): TRACE: resp = self.call_func(req, *args, **self.kwargs)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/webob/dec.py", line 208, in call_func
(nova.api.openstack.v2): TRACE: return self.func(req, *args, **kwargs)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/nova/api/openstack/wsgi.py", line 589, in __call__
(nova.api.openstack.v2): TRACE: action=action)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/nova/api/openstack/wsgi.py", line 463, in serialize
(nova.api.openstack.v2): TRACE: action)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/nova/api/openstack/wsgi.py", line 475, in serialize_body
(nova.api.openstack.v2): TRACE: response.body = utils.dumps(data)
(nova.api.openstack.v2): TRACE: File "/usr/lib/pymodules/python2.6/nova/utils.py", line 742, in dumps
(nova.api.openstack.v2): TRACE: return json.dumps(value)
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/__init__.py", line 230, in dumps
(nova.api.openstack.v2): TRACE: return _default_encoder.encode(obj)
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
(nova.api.openstack.v2): TRACE: chunks = list(self.iterencode(o))
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
(nova.api.openstack.v2): TRACE: for chunk in self._iterencode_dict(o, markers):
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 275, in _iterencode_dict
(nova.api.openstack.v2): TRACE: for chunk in self._iterencode(value, markers):
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 306, in _iterencode
(nova.api.openstack.v2): TRACE: for chunk in self._iterencode_list(o, markers):
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 204, in _iterencode_list
(nova.api.openstack.v2): TRACE: for chunk in self._iterencode(value, markers):
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
(nova.api.openstack.v2): TRACE: for chunk in self._iterencode_dict(o, markers):
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 275, in _iterencode_dict
(nova.api.openstack.v2): TRACE: for chunk in self._iterencode(value, markers):
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/json/encoder.py", line 294, in _iterencode
(nova.api.openstack.v2): TRACE: yield encoder(o)
(nova.api.openstack.v2): TRACE: UnicodeDecodeError: 'utf8' codec can't decode byte 0xa8 in position 5: invalid start byte
(nova.api.openstack.v2): TRACE:
This is definitely an issue. What is the right expectation here? If a customer specifies unicode in the server name, the unix hostname will not contain those characters, correct? What if all the characters are unicode? In addition, I think the initial migrations might have to be changed, since this affects how they are stored in the db. I haven't traced this at all, but I don't think its straightforward to support unicode. In the meantime perhaps we should disallow users from using unicode in the hostname.
Here's a Traceback just for fun:
2012-01-15 12:38:35,641 ERROR nova.api. openstack. v2 [f00369f6- ec7d-4239- b71d-b6d6affd30 0a username projectid] Caught error: 'utf8' codec can't decode byte 0xa8 in position 5: invalid start byte openstack. v2): TRACE: Traceback (most recent call last): openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/nova/ api/openstack/ v2/__init_ _.py", line 59, in __call__ openstack. v2): TRACE: return req.get_ response( self.applicatio n) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ request. py", line 919, in get_response openstack. v2): TRACE: application, catch_exc_ info=False) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ request. py", line 887, in call_application openstack. v2): TRACE: app_iter = application( self.environ, start_response) openstack. v2): TRACE: File "/usr/lib/ python2. 6/dist- packages/ keystone/ middleware/ auth_token. py", line 209, in __call__ openstack. v2): TRACE: return self._forward_ request( env, start_response, proxy_headers) openstack. v2): TRACE: File "/usr/lib/ python2. 6/dist- packages/ keystone/ middleware/ auth_token. py", line 325, in _forward_request openstack. v2): TRACE: return self.app(env, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 159, in __call__ openstack. v2): TRACE: return resp(environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 147, in __call__ openstack. v2): TRACE: resp = self.call_func(req, *args, **self.kwargs) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 208, in call_func openstack. v2): TRACE: return self.func(req, *args, **kwargs) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/nova/ api/openstack/ wsgi.py" , line 501, in __call__ openstack. v2): TRACE: response = req.get_ response( self.applicatio n) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ request. py", line 919, in get_response openstack. v2): TRACE: application, catch_exc_ info=False) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ request. py", line 887, in call_application openstack. v2): TRACE: app_iter = application( self.environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 159, in __call__ openstack. v2): TRACE: return resp(environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/routes/ middleware. py", line 131, in __call__ openstack. v2): TRACE: response = self.app(environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 159, in __call__ openstack. v2): TRACE: return resp(environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 159, in __call__ openstack. v2): TRACE: return resp(environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/routes/ middleware. py", line 131, in __call__ openstack. v2): TRACE: response = self.app(environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 159, in __call__ openstack. v2): TRACE: return resp(environ, start_response) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 147, in __call__ openstack. v2): TRACE: resp = self.call_func(req, *args, **self.kwargs) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/webob/ dec.py" , line 208, in call_func openstack. v2): TRACE: return self.func(req, *args, **kwargs) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/nova/ api/openstack/ wsgi.py" , line 589, in __call__ openstack. v2): TRACE: action=action) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/nova/ api/openstack/ wsgi.py" , line 463, in serialize openstack. v2): TRACE: action) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/nova/ api/openstack/ wsgi.py" , line 475, in serialize_body openstack. v2): TRACE: response.body = utils.dumps(data) openstack. v2): TRACE: File "/usr/lib/ pymodules/ python2. 6/nova/ utils.py" , line 742, in dumps openstack. v2): TRACE: return json.dumps(value) openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ __init_ _.py", line 230, in dumps openstack. v2): TRACE: return _default_ encoder. encode( obj) openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 367, in encode openstack. v2): TRACE: chunks = list(self. iterencode( o)) openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 309, in _iterencode openstack. v2): TRACE: for chunk in self._iterencod e_dict( o, markers): openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 275, in _iterencode_dict openstack. v2): TRACE: for chunk in self._iterencod e(value, markers): openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 306, in _iterencode openstack. v2): TRACE: for chunk in self._iterencod e_list( o, markers): openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 204, in _iterencode_list openstack. v2): TRACE: for chunk in self._iterencod e(value, markers): openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 309, in _iterencode openstack. v2): TRACE: for chunk in self._iterencod e_dict( o, markers): openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 275, in _iterencode_dict openstack. v2): TRACE: for chunk in self._iterencod e(value, markers): openstack. v2): TRACE: File "/usr/lib/ python2. 6/json/ encoder. py", line 294, in _iterencode openstack. v2): TRACE: yield encoder(o) openstack. v2): TRACE: UnicodeDecodeError: 'utf8' codec can't decode byte 0xa8 in position 5: invalid start byte openstack. v2): TRACE:
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.
(nova.api.