Example #1
0
def test_parse_hash_with_algorithms_or_throws_bad_algo(mocker):
    mock_hash = mocker.patch("swh.web.common.query.parse_hash")
    mock_hash.return_value = "sha1", "123"

    with pytest.raises(BadInputExc) as e:
        query.parse_hash_with_algorithms_or_throws("sha1:431", ["sha1_git"],
                                                   "Only sha1_git!")
    assert e.match("Only sha1_git!")

    mock_hash.assert_called_once_with("sha1:431")
Example #2
0
def test_parse_hash_with_algorithms_or_throws_bad_query(mocker):
    mock_hash = mocker.patch("swh.web.common.query.parse_hash")
    mock_hash.side_effect = BadInputExc("Error input")

    with pytest.raises(BadInputExc) as e:
        query.parse_hash_with_algorithms_or_throws(
            "sha1:blah", ["sha1"], "useless error message for this use case")
    assert e.match("Error input")

    mock_hash.assert_called_once_with("sha1:blah")
Example #3
0
    def test_parse_hash_with_algorithms_or_throws_bad_algo(self, mock_hash):
        # given
        mock_hash.return_value = 'sha1', '123'

        # when
        with self.assertRaises(BadInputExc) as cm:
            query.parse_hash_with_algorithms_or_throws('sha1:431',
                                                       ['sha1_git'],
                                                       'Only sha1_git!')
        self.assertIn('Only sha1_git!', cm.exception.args[0])

        mock_hash.assert_called_once_with('sha1:431')
Example #4
0
    def test_parse_hash_with_algorithms_or_throws_bad_query(self, mock_hash):
        # given
        mock_hash.side_effect = BadInputExc('Error input')

        # when
        with self.assertRaises(BadInputExc) as cm:
            query.parse_hash_with_algorithms_or_throws(
                'sha1:blah', ['sha1'],
                'useless error message for this use case')
        self.assertIn('Error input', cm.exception.args[0])

        mock_hash.assert_called_once_with('sha1:blah')
Example #5
0
def api_vault_fetch_revision_gitfast(request, rev_id):
    """
    .. http:get:: /api/1/vault/revision/(rev_id)/gitfast/raw/

        Fetch the cooked gitfast archive for a revision.

        See :http:get:`/api/1/vault/revision/(rev_id)/gitfast/` to get more
        details on directory cooking.

        :param string rev_id: the revision's sha1 identifier

        :resheader Content-Type: application/octet-stream

        :statuscode 200: no error
        :statuscode 400: an invalid revision identifier has been provided
        :statuscode 404: requested directory did not receive any cooking
            request yet (in case of GET) or can not be found in the archive
            (in case of POST)
    """
    _, obj_id = query.parse_hash_with_algorithms_or_throws(
        rev_id, ["sha1"], "Only sha1_git is supported."
    )
    res = api_lookup(
        archive.vault_fetch,
        "revision_gitfast",
        obj_id,
        notfound_msg="Cooked archive for revision '{}' not found.".format(rev_id),
        request=request,
    )
    fname = "{}.gitfast.gz".format(rev_id)
    response = HttpResponse(res, content_type="application/gzip")
    response["Content-disposition"] = "attachment; filename={}".format(fname)
    return response
Example #6
0
def _to_sha1_bin(sha1_hex):
    _, sha1_git_bin = query.parse_hash_with_algorithms_or_throws(
        sha1_hex,
        ["sha1"],
        "Only sha1_git is supported."  # HACK: sha1_git really
    )
    return sha1_git_bin
Example #7
0
def api_vault_fetch_directory(request, dir_id):
    """
    .. http:get:: /api/1/vault/directory/(dir_id)/raw/

        Fetch the cooked archive for a directory.

        See :http:get:`/api/1/vault/directory/(dir_id)/` to get more
        details on directory cooking.

        :param string dir_id: the directory's sha1 identifier

        :resheader Content-Type: application/octet-stream

        **Allowed HTTP Methods:** :http:method:`get`, :http:method:`head`, :http:method:`options`

        :statuscode 200: no error
        :statuscode 400: an invalid directory identifier has been provided
        :statuscode 404: requested directory can not be found in the archive
    """ # noqa
    _, obj_id = query.parse_hash_with_algorithms_or_throws(
        dir_id, ['sha1'], 'Only sha1_git is supported.')
    res = api_lookup(
        service.vault_fetch,
        'directory',
        obj_id,
        notfound_msg="Directory with ID '{}' not found.".format(dir_id))
    fname = '{}.tar.gz'.format(dir_id)
    response = HttpResponse(res, content_type='application/gzip')
    response['Content-disposition'] = 'attachment; filename={}'.format(fname)
    return response
Example #8
0
def api_vault_cook_revision_gitfast(request, rev_id):
    """
    .. http:get:: /api/1/vault/revision/(rev_id)/gitfast/
    .. http:post:: /api/1/vault/revision/(rev_id)/gitfast/

        Request the cooking of a gitfast archive for a revision or check
        its cooking status.

        That endpoint enables to create a vault cooking task for a revision
        through a POST request or check the status of a previously created one
        through a GET request.

        Once the cooking task has been executed, the resulting gitfast archive
        can be downloaded using the dedicated endpoint
        :http:get:`/api/1/vault/revision/(rev_id)/gitfast/raw/`.

        Then to import the revision in the current directory, use::

            $ git init
            $ zcat path/to/revision.gitfast.gz | git fast-import
            $ git checkout HEAD

        :param string rev_id: the revision's sha1 identifier

        :query string email: e-mail to notify when the gitfast archive is ready

        {common_headers}

        :>json string fetch_url: the url from which to download the archive
            once it has been cooked
            (see :http:get:`/api/1/vault/revision/(rev_id)/gitfast/raw/`)
        :>json string obj_type: the type of object to cook
            (directory or revision)
        :>json string progress_message: message describing the cooking task
            progress
        :>json number id: the cooking task id
        :>json string status: the cooking task status (new/pending/done/failed)
        :>json string obj_id: the identifier of the object to cook

        :statuscode 200: no error
        :statuscode 400: an invalid revision identifier has been provided
        :statuscode 404: requested directory did not receive any cooking
            request yet (in case of GET) or can not be found in the archive
            (in case of POST)
    """
    _, obj_id = query.parse_hash_with_algorithms_or_throws(
        rev_id, ["sha1"], "Only sha1_git is supported."
    )

    res = _dispatch_cook_progress(request, "revision_gitfast", obj_id)
    res["fetch_url"] = reverse(
        "api-1-vault-fetch-revision_gitfast",
        url_args={"rev_id": rev_id},
        request=request,
    )
    return _vault_response(res)
Example #9
0
def api_vault_cook_directory(request, dir_id):
    """
    .. http:get:: /api/1/vault/directory/(dir_id)/
    .. http:post:: /api/1/vault/directory/(dir_id)/

        Request the cooking of an archive for a directory or check
        its cooking status.

        That endpoint enables to create a vault cooking task for a directory
        through a POST request or check the status of a previously created one
        through a GET request.

        Once the cooking task has been executed, the resulting archive can
        be downloaded using the dedicated endpoint
        :http:get:`/api/1/vault/directory/(dir_id)/raw/`.

        Then to extract the cooked directory in the current one, use::

            $ tar xvf path/to/directory.tar.gz

        :param string dir_id: the directory's sha1 identifier

        :query string email: e-mail to notify when the archive is ready

        {common_headers}

        :>json string fetch_url: the url from which to download the archive
            once it has been cooked
            (see :http:get:`/api/1/vault/directory/(dir_id)/raw/`)
        :>json string obj_type: the type of object to cook
            (directory or revision)
        :>json string progress_message: message describing the cooking task
            progress
        :>json number id: the cooking task id
        :>json string status: the cooking task status
            (either **new**, **pending**, **done** or **failed**)
        :>json string obj_id: the identifier of the object to cook

        :statuscode 200: no error
        :statuscode 400: an invalid directory identifier has been provided
        :statuscode 404: requested directory did not receive any cooking
            request yet (in case of GET) or can not be found in the archive
            (in case of POST)
    """
    _, obj_id = query.parse_hash_with_algorithms_or_throws(
        dir_id, ["sha1"], "Only sha1_git is supported."
    )

    res = _dispatch_cook_progress(request, "directory", obj_id)
    res["fetch_url"] = reverse(
        "api-1-vault-fetch-directory", url_args={"dir_id": dir_id}, request=request,
    )
    return _vault_response(res)
Example #10
0
def test_parse_hash_with_algorithms(mocker):
    mock_hash = mocker.patch("swh.web.common.query.parse_hash")
    mock_hash.return_value = ("sha256", b"123")

    algo, sha = query.parse_hash_with_algorithms_or_throws(
        "sha256:123", ["sha256", "sha1_git"],
        "useless error message for this use case")

    assert algo == "sha256"
    assert sha == b"123"

    mock_hash.assert_called_once_with("sha256:123")
Example #11
0
    def test_parse_hash_with_algorithms(self, mock_hash):
        # given
        mock_hash.return_value = ('sha256', b'123')

        # when
        algo, sha = query.parse_hash_with_algorithms_or_throws(
            'sha256:123', ['sha256', 'sha1_git'],
            'useless error message for this use case')

        self.assertEqual(algo, 'sha256')
        self.assertEqual(sha, b'123')

        mock_hash.assert_called_once_with('sha256:123')
Example #12
0
def api_vault_cook_revision_gitfast(request, rev_id):
    """
    .. http:get:: /api/1/vault/revision/(rev_id)/gitfast/
    .. http:post:: /api/1/vault/revision/(rev_id)/gitfast/

        Request the cooking of a gitfast archive for a revision or check
        its cooking status.

        That endpoint enables to create a vault cooking task for a revision
        through a POST request or check the status of a previously created one
        through a GET request.

        Once the cooking task has been executed, the resulting gitfast archive can
        be downloaded using the dedicated endpoint :http:get:`/api/1/vault/revision/(rev_id)/gitfast/raw/`.

        Then to import the revision in the current directory, use::

            $ git init
            $ zcat path/to/revision.gitfast.gz | git fast-import
            $ git checkout HEAD

        :param string rev_id: the revision's sha1 identifier

        :query string email: e-mail to notify when the gitfast archive is ready

        :reqheader Accept: the requested response content type,
            either ``application/json`` (default) or ``application/yaml``
        :resheader Content-Type: this depends on :http:header:`Accept` header of request

        :>json string fetch_url: the url from which to download the archive once it has been cooked
            (see :http:get:`/api/1/vault/revision/(rev_id)/gitfast/raw/`)
        :>json string obj_type: the type of object to cook (directory or revision)
        :>json string progress_message: message describing the cooking task progress
        :>json number id: the cooking task id
        :>json string status: the cooking task status (new/pending/done/failed)
        :>json string obj_id: the identifier of the object to cook

        **Allowed HTTP Methods:** :http:method:`get`, :http:method:`post`, :http:method:`head`, :http:method:`options`

        :statuscode 200: no error
        :statuscode 400: an invalid revision identifier has been provided
        :statuscode 404: requested revision can not be found in the archive
    """ # noqa
    _, obj_id = query.parse_hash_with_algorithms_or_throws(
        rev_id, ['sha1'], 'Only sha1_git is supported.')

    res = _dispatch_cook_progress(request, 'revision_gitfast', obj_id)
    res['fetch_url'] = reverse('api-vault-fetch-revision_gitfast',
                               url_args={'rev_id': rev_id})
    return res
Example #13
0
def _to_sha1_bin(sha1_hex):
    _, sha1_git_bin = query.parse_hash_with_algorithms_or_throws(
        sha1_hex,
        ['sha1'],  # HACK: sha1_git really
        'Only sha1_git is supported.')
    return sha1_git_bin