mirror of
https://github.com/quay/quay.git
synced 2026-01-27 18:42:52 +03:00
* Convert all Python2 to Python3 syntax. * Removes oauth2lib dependency * Replace mockredis with fakeredis * byte/str conversions * Removes nonexisting __nonzero__ in Python3 * Python3 Dockerfile and related * [PROJQUAY-98] Replace resumablehashlib with rehash * PROJQUAY-123 - replace gpgme with python3-gpg * [PROJQUAY-135] Fix unhashable class error * Update external dependencies for Python 3 - Move github.com/app-registry/appr to github.com/quay/appr - github.com/coderanger/supervisor-stdout - github.com/DevTable/container-cloud-config - Update to latest mockldap with changes applied from coreos/mockldap - Update dependencies in requirements.txt and requirements-dev.txt * Default FLOAT_REPR function to str in json encoder and removes keyword assignment True, False, and str were not keywords in Python2... * [PROJQUAY-165] Replace package `bencode` with `bencode.py` - Bencode is not compatible with Python 3.x and is no longer maintained. Bencode.py appears to be a drop-in replacement/fork that is compatible with Python 3. * Make sure monkey.patch is called before anything else ( * Removes anunidecode dependency and replaces it with text_unidecode * Base64 encode/decode pickle dumps/loads when storing value in DB Base64 encodes/decodes the serialized values when storing them in the DB. Also make sure to return a Python3 string instead of a Bytes when coercing for db, otherwise, Postgres' TEXT field will convert it into a hex representation when storing the value. * Implement __hash__ on Digest class In Python 3, if a class defines __eq__() but not __hash__(), its instances will not be usable as items in hashable collections (e.g sets). * Remove basestring check * Fix expected message in credentials tests * Fix usage of Cryptography.Fernet for Python3 (#219) - Specifically, this addresses the issue where Byte<->String conversions weren't being applied correctly. * Fix utils - tar+stream layer format utils - filelike util * Fix storage tests * Fix endpoint tests * Fix workers tests * Fix docker's empty layer bytes * Fix registry tests * Appr * Enable CI for Python 3.6 * Skip buildman tests Skip buildman tests while it's being rewritten to allow ci to pass. * Install swig for CI * Update expected exception type in redis validation test * Fix gpg signing calls Fix gpg calls for updated gpg wrapper, and add signing tests. * Convert / to // for Python3 integer division * WIP: Update buildman to use asyncio instead of trollius. This dependency is considered deprecated/abandoned and was only used as an implementation/backport of asyncio on Python 2.x This is a work in progress, and is included in the PR just to get the rest of the tests passing. The builder is actually being rewritten. * Target Python 3.8 * Removes unused files - Removes unused files that were added accidentally while rebasing - Small fixes/cleanup - TODO tasks comments * Add TODO to verify rehash backward compat with resumablehashlib * Revert "[PROJQUAY-135] Fix unhashable class error" and implements __hash__ instead. This reverts commit 735e38e3c1d072bf50ea864bc7e119a55d3a8976. Instead, defines __hash__ for encryped fields class, using the parent field's implementation. * Remove some unused files ad imports Co-authored-by: Kenny Lee Sin Cheong <kenny.lee@redhat.com> Co-authored-by: Tom McKay <thomasmckay@redhat.com>
98 lines
2.7 KiB
Python
98 lines
2.7 KiB
Python
import os
|
|
|
|
import pytest
|
|
import requests
|
|
|
|
from flask import Flask
|
|
from flask_testing import LiveServerTestCase
|
|
|
|
from storage import Storage
|
|
from util.security.instancekeys import InstanceKeys
|
|
|
|
from test.registry.liveserverfixture import *
|
|
from test.fixtures import *
|
|
|
|
|
|
@pytest.fixture(params=[True, False])
|
|
def is_proxying_enabled(request):
|
|
return request.param
|
|
|
|
|
|
@pytest.fixture()
|
|
def server_executor(app):
|
|
def reload_app(server_hostname):
|
|
# Close any existing connection.
|
|
close_db_filter(None)
|
|
|
|
# Reload the database config.
|
|
app.config["SERVER_HOSTNAME"] = server_hostname[len("http://") :]
|
|
configure(app.config)
|
|
return "OK"
|
|
|
|
executor = LiveServerExecutor()
|
|
executor.register("reload_app", reload_app)
|
|
return executor
|
|
|
|
|
|
@pytest.fixture()
|
|
def liveserver_app(app, server_executor, init_db_path, is_proxying_enabled):
|
|
server_executor.apply_blueprint_to_app(app)
|
|
|
|
if os.environ.get("DEBUG") == "true":
|
|
app.config["DEBUG"] = True
|
|
|
|
app.config["TESTING"] = True
|
|
app.config["INSTANCE_SERVICE_KEY_KID_LOCATION"] = "test/data/test.kid"
|
|
app.config["INSTANCE_SERVICE_KEY_LOCATION"] = "test/data/test.pem"
|
|
app.config["INSTANCE_SERVICE_KEY_SERVICE"] = "quay"
|
|
|
|
app.config["FEATURE_PROXY_STORAGE"] = is_proxying_enabled
|
|
|
|
app.config["DISTRIBUTED_STORAGE_CONFIG"] = {
|
|
"test": ["FakeStorage", {}],
|
|
}
|
|
app.config["DISTRIBUTED_STORAGE_PREFERENCE"] = ["test"]
|
|
return app
|
|
|
|
|
|
@pytest.fixture()
|
|
def instance_keys(liveserver_app):
|
|
return InstanceKeys(liveserver_app)
|
|
|
|
|
|
@pytest.fixture()
|
|
def storage(liveserver_app, instance_keys):
|
|
return Storage(liveserver_app, instance_keys=instance_keys)
|
|
|
|
|
|
@pytest.fixture()
|
|
def app_reloader(liveserver, server_executor):
|
|
server_executor.on(liveserver).reload_app(liveserver.url)
|
|
yield
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
os.environ.get("TEST_DATABASE_URI") is not None, reason="not supported for non SQLite testing"
|
|
)
|
|
def test_storage_proxy_auth(
|
|
storage, liveserver_app, liveserver_session, is_proxying_enabled, app_reloader
|
|
):
|
|
# Activate direct download on the fake storage.
|
|
storage.put_content(["test"], "supports_direct_download", b"true")
|
|
|
|
# Get the unwrapped URL.
|
|
direct_download_url = storage.get_direct_download_url(["test"], "somepath")
|
|
proxy_index = direct_download_url.find("/_storage_proxy/")
|
|
if is_proxying_enabled:
|
|
assert proxy_index >= 0
|
|
else:
|
|
assert proxy_index == -1
|
|
|
|
# Ensure that auth returns the expected value.
|
|
headers = {
|
|
"X-Original-URI": direct_download_url[proxy_index:] if proxy_index else "someurihere"
|
|
}
|
|
|
|
resp = liveserver_session.get("_storage_proxy_auth", headers=headers)
|
|
assert resp.status_code == (500 if not is_proxying_enabled else 200)
|