v2: Content-Type: application/octet-stream header always added
The bug: any existing Content-Type header cannot be found because the call to headers.get() fails. Therefore we end up with two Content-Type headers because a new one (applicaion/octet-stream) gets added unconditionally. The cause: the strings (keys and values) in the headers dict are converted from unicode sequences of type <str> to utf-8 sequences of type <bytes>. This happens in safe_encode() (oslo_utils/encodeutils.py:66). <str> != <bytes> even if they appear to have the same characters. Hence, for python 3.x, _set_common_request_kwargs() adds content-type to header even if custom content-type is set in the request. This results in unsupported media type exception when glance client is used with keystoneauth and python 3.x The fix: follow the directions in encode_headers(). It says to do this just before sending the request. Honor this principle; do not encode headers and then perform more business logic on them. Change-Id: Idf6079b32f70bc171f5016467048e917d42f296d Closes-bug: #1641239 Co-Authored-By: Pushkar Umaranikar <pushkar.umaranikar@intel.com>
This commit is contained in:
@@ -10,8 +10,10 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import glanceclient
|
||||
from keystoneauth1 import loading
|
||||
from keystoneauth1 import session
|
||||
import os
|
||||
|
||||
import os_client_config
|
||||
from tempest.lib.cli import base
|
||||
|
||||
@@ -60,3 +62,30 @@ class ClientTestBase(base.ClientTestBase):
|
||||
def glance(self, *args, **kwargs):
|
||||
return self.clients.glance(*args,
|
||||
**kwargs)
|
||||
|
||||
def glance_pyclient(self):
|
||||
ks_creds = dict(
|
||||
auth_url=self.creds["auth_url"],
|
||||
username=self.creds["username"],
|
||||
password=self.creds["password"],
|
||||
project_name=self.creds["project_name"])
|
||||
keystoneclient = self.Keystone(**ks_creds)
|
||||
return self.Glance(keystoneclient)
|
||||
|
||||
class Keystone(object):
|
||||
def __init__(self, **kwargs):
|
||||
loader = loading.get_plugin_loader("password")
|
||||
auth = loader.load_from_options(**kwargs)
|
||||
self.session = session.Session(auth=auth)
|
||||
|
||||
class Glance(object):
|
||||
def __init__(self, keystone, version="2"):
|
||||
self.glance = glanceclient.Client(
|
||||
version,
|
||||
session=keystone.session)
|
||||
|
||||
def find(self, image_name):
|
||||
for image in self.glance.images.list():
|
||||
if image.name == image_name:
|
||||
return image
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user