Merge pull request #3250 from quay/joseph.schorr/QUAY-1030/interfacing-part-9
Implement blob uploader and change V1 to use it
This commit is contained in:
commit
468e5a8fc2
14 changed files with 717 additions and 84 deletions
|
@ -135,6 +135,7 @@ def appconfig(database_uri):
|
|||
@pytest.fixture()
|
||||
def initialized_db(appconfig):
|
||||
""" Configures the database for the database found in the appconfig. """
|
||||
under_test_real_database = bool(os.environ.get('TEST_DATABASE_URI'))
|
||||
|
||||
# Configure the database.
|
||||
configure(appconfig)
|
||||
|
@ -144,8 +145,12 @@ def initialized_db(appconfig):
|
|||
model._basequery.get_public_repo_visibility()
|
||||
model.log.get_log_entry_kinds()
|
||||
|
||||
if not under_test_real_database:
|
||||
# Make absolutely sure foreign key constraints are on.
|
||||
db.obj.execute_sql('PRAGMA foreign_keys = ON;')
|
||||
assert db.obj.execute_sql('PRAGMA foreign_keys;').fetchone()[0] == 1
|
||||
|
||||
# If under a test *real* database, setup a savepoint.
|
||||
under_test_real_database = bool(os.environ.get('TEST_DATABASE_URI'))
|
||||
if under_test_real_database:
|
||||
with db.transaction():
|
||||
test_savepoint = db.savepoint()
|
||||
|
|
|
@ -14,6 +14,7 @@ class V1ProtocolSteps(Enum):
|
|||
GET_IMAGES = 'get-images'
|
||||
PUT_TAG = 'put-tag'
|
||||
PUT_IMAGE_JSON = 'put-image-json'
|
||||
DELETE_TAG = 'delete-tag'
|
||||
|
||||
|
||||
class V1Protocol(RegistryProtocol):
|
||||
|
@ -192,3 +193,18 @@ class V1Protocol(RegistryProtocol):
|
|||
expected_status=204, headers=headers)
|
||||
|
||||
return PushResult(checksums=None, manifests=None, headers=headers)
|
||||
|
||||
def delete(self, session, namespace, repo_name, tag_names, credentials=None,
|
||||
expected_failure=None, options=None):
|
||||
auth = self._auth_for_credentials(credentials)
|
||||
tag_names = [tag_names] if isinstance(tag_names, str) else tag_names
|
||||
|
||||
# Ping!
|
||||
self.ping(session)
|
||||
|
||||
for tag_name in tag_names:
|
||||
# DELETE /v1/repositories/{namespace}/{repository}/tags/{tag}
|
||||
self.conduct(session, 'DELETE',
|
||||
'/v1/repositories/%s/tags/%s' % (self.repo_name(namespace, repo_name), tag_name),
|
||||
auth=auth,
|
||||
expected_status=(200, expected_failure, V1ProtocolSteps.DELETE_TAG))
|
||||
|
|
|
@ -37,6 +37,21 @@ def test_basic_push_pull(pusher, puller, basic_images, liveserver_session, app_r
|
|||
credentials=credentials)
|
||||
|
||||
|
||||
def test_multi_layer_images_push_pull(pusher, puller, multi_layer_images, liveserver_session,
|
||||
app_reloader):
|
||||
""" Test: Basic push and pull of a multi-layered image to a new repository. """
|
||||
credentials = ('devtable', 'password')
|
||||
|
||||
# Push a new repository.
|
||||
pusher.push(liveserver_session, 'devtable', 'newrepo', 'latest', multi_layer_images,
|
||||
credentials=credentials)
|
||||
|
||||
# Pull the repository to verify.
|
||||
puller.pull(liveserver_session, 'devtable', 'newrepo', 'latest', multi_layer_images,
|
||||
credentials=credentials)
|
||||
|
||||
|
||||
|
||||
def test_no_tag_manifests(pusher, puller, basic_images, liveserver_session, app_reloader,
|
||||
liveserver, registry_server_executor):
|
||||
""" Test: Basic pull without manifests. """
|
||||
|
@ -601,19 +616,19 @@ def test_invalid_blob_reference(manifest_protocol, basic_images, liveserver_sess
|
|||
expected_failure=Failures.INVALID_BLOB)
|
||||
|
||||
|
||||
def test_delete_tag(manifest_protocol, puller, basic_images, liveserver_session,
|
||||
def test_delete_tag(pusher, puller, basic_images, liveserver_session,
|
||||
app_reloader):
|
||||
""" Test: Push a repository, delete a tag, and attempt to pull. """
|
||||
credentials = ('devtable', 'password')
|
||||
|
||||
# Push the tags.
|
||||
result = manifest_protocol.push(liveserver_session, 'devtable', 'newrepo', ['one', 'two'],
|
||||
basic_images, credentials=credentials)
|
||||
result = pusher.push(liveserver_session, 'devtable', 'newrepo', ['one', 'two'],
|
||||
basic_images, credentials=credentials)
|
||||
|
||||
# Delete tag `one` by digest.
|
||||
manifest_protocol.delete(liveserver_session, 'devtable', 'newrepo',
|
||||
result.manifests['one'].digest,
|
||||
credentials=credentials)
|
||||
# Delete tag `one` by digest or tag.
|
||||
pusher.delete(liveserver_session, 'devtable', 'newrepo',
|
||||
result.manifests['one'].digest if result.manifests else 'one',
|
||||
credentials=credentials)
|
||||
|
||||
# Attempt to pull tag `one` and ensure it doesn't work.
|
||||
puller.pull(liveserver_session, 'devtable', 'newrepo', 'one', basic_images,
|
||||
|
|
Reference in a new issue