Ejemplo n.º 1
0
def test_publish_update_mappings(fast_poller, requests_mocker, client, caplog):
    """Publish on FileRepository will generate ud_file_release_mappings_2."""

    caplog.set_level(logging.INFO, "pubtools.pulplib")

    repo = FileRepository(
        id="some-repo",
        distributors=[
            Distributor(id="iso_distributor", type_id="iso_distributor")
        ],
    )
    repo.__dict__["_client"] = client

    # Force client to use a small page size so that we're able to verify
    # all pages end up handled.
    client._PAGE_SIZE = 3

    # Arrange for the repo to currently exist with some mappings.
    requests_mocker.get(
        "https://pulp.example.com/pulp/api/v2/repositories/some-repo/",
        json={
            "id": "some-repo",
            "notes": {
                "ud_file_release_mappings_2":
                json.dumps(
                    # Define some mappings so there's a mix of data needing
                    # an update and data needing no update.
                    {
                        "1.0": [{
                            "filename": "file1",
                            "order": 3.0
                        }],
                        "3.0": [{
                            "filename": "file3",
                            "order": 1234
                        }],
                        "4.0": [{
                            "filename": "file4",
                            "order": 0
                        }],
                        "some-other-version": [{
                            "filename": "whatever-file",
                            "order": "abc",
                            "foo": "bar"
                        }],
                    })
            },
        },
    )

    # Make the repo have some units with the mapping-relevant fields. We use
    # two pages here to ensure that the code implements pagination.
    requests_mocker.post(
        "https://pulp.example.com/pulp/api/v2/repositories/some-repo/search/units/",
        [
            {
                # page 1
                "json": [
                    {
                        "metadata": {
                            "_content_type_id": "iso",
                            "name": "file1",
                            "size": 1,
                            "checksum":
                            "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                            "pulp_user_metadata": {
                                "version": "1.0",
                                "display_order": 3.0,
                            },
                        }
                    },
                    {
                        "metadata": {
                            "_content_type_id":
                            "iso",
                            "name":
                            "file2",
                            "size":
                            1,
                            "checksum":
                            "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                        }
                    },
                    {
                        "metadata": {
                            "_content_type_id": "iso",
                            "name": "file3",
                            "size": 1,
                            "checksum":
                            "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                            "pulp_user_metadata": {
                                "version": "3.0"
                            },
                        }
                    },
                ]
            },
            {
                # page 2
                "json": [
                    {
                        "metadata": {
                            "_content_type_id": "iso",
                            "name": "file4",
                            "size": 1,
                            "checksum":
                            "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                            "pulp_user_metadata": {
                                "version": "4.0",
                                "display_order": -2,
                            },
                        }
                    },
                    {
                        "metadata": {
                            "_content_type_id": "iso",
                            "name": "file5",
                            "size": 1,
                            "checksum":
                            "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                            "pulp_user_metadata": {
                                "version": "1.0",
                                "display_order": 4.5,
                            },
                        }
                    },
                    {
                        "metadata": {
                            "_content_type_id": "iso",
                            "name": "file6",
                            "size": 1,
                            "checksum":
                            "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                            "pulp_user_metadata": {
                                "version": "6.0"
                            },
                        }
                    },
                ]
            },
            {
                # page 3: nothing more
                "json": []
            },
        ],
    )

    # Allow for an update to the repository.
    requests_mocker.put(
        "https://pulp.example.com/pulp/api/v2/repositories/some-repo/",
        json={})

    # It should publish as usual.
    requests_mocker.post(
        "https://pulp.example.com/pulp/api/v2/repositories/some-repo/actions/publish/",
        json={"spawned_tasks": [{
            "task_id": "publish-task"
        }]},
    )

    requests_mocker.post(
        "https://pulp.example.com/pulp/api/v2/tasks/search/",
        json=[{
            "task_id": "publish-task",
            "state": "finished"
        }],
    )

    # It should have succeeded, with the publish task as retrieved from pulp
    assert sorted(repo.publish()) == [
        Task(id="publish-task", succeeded=True, completed=True)
    ]

    # Now let's have a look at what it updated.
    # The last operations are (update repo, start publish, await tasks),
    # so the update request should always be the 3rd last.
    req = requests_mocker.request_history[-3]

    # Should have been a PUT to the repo.
    assert req.url == "https://pulp.example.com/pulp/api/v2/repositories/some-repo/"
    assert req.method == "PUT"

    # It should have included this field in the delta...
    mapping_json = req.json()["delta"]["notes"]["ud_file_release_mappings_2"]

    # It should have been valid JSON
    mapping = json.loads(mapping_json)

    # It should be equal to this:
    assert mapping == {
        "1.0": [
            # This file wasn't changed
            {
                "filename": "file1",
                "order": 3.0
            },
            # This was added
            {
                "filename": "file5",
                "order": 4.5
            },
        ],
        # This wasn't touched because, although the repo has the file, it has no
        # defined order
        "3.0": [{
            "filename": "file3",
            "order": 1234
        }],
        # This was updated
        "4.0": [{
            "filename": "file4",
            "order": -2.0
        }],
        # This was added, with the entire version not previously defined.
        # Also, order field is omitted because none was in the data, but
        # the version and file still must be written.
        "6.0": [{
            "filename": "file6"
        }],
        # This is some unrelated junk which should be left alone during the
        # update process.
        "some-other-version": [{
            "filename": "whatever-file",
            "foo": "bar",
            "order": "abc"
        }],
    }

    # It should have logged that this happened
    assert "Updated ud_file_release_mappings_2 in some-repo" in caplog.messages
Ejemplo n.º 2
0
def test_publish_update_mappings_noop(fast_poller, requests_mocker, client):
    """Publish on FileRepository does not do unnecessary repo updates."""
    repo = FileRepository(
        id="some-repo",
        distributors=[
            Distributor(id="iso_distributor", type_id="iso_distributor")
        ],
    )
    repo.__dict__["_client"] = client

    # Arrange for the repo to currently exist with up-to-date mappings.
    requests_mocker.get(
        "https://pulp.example.com/pulp/api/v2/repositories/some-repo/",
        json={
            "id": "some-repo",
            "notes": {
                "ud_file_release_mappings_2":
                json.dumps({
                    "1.0": [
                        {
                            "filename": "file1",
                            "order": 3.0
                        },
                        {
                            "filename": "file2",
                            "order": 6.0
                        },
                    ],
                    "other": ["whatever"],
                })
            },
        },
    )

    # Make the repo have some units with the mapping-relevant fields.
    requests_mocker.post(
        "https://pulp.example.com/pulp/api/v2/repositories/some-repo/search/units/",
        json=[
            {
                "metadata": {
                    "_content_type_id": "iso",
                    "name": "file1",
                    "size": 1,
                    "checksum":
                    "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                    "pulp_user_metadata": {
                        "version": "1.0",
                        "display_order": 3.0
                    },
                }
            },
            {
                "metadata": {
                    "_content_type_id": "iso",
                    "name": "file2",
                    "size": 1,
                    "checksum":
                    "cd293be6cea034bd45a0352775a219ef5dc7825ce55d1f7dae9762d80ce64411",
                    "pulp_user_metadata": {
                        "version": "1.0"
                    },
                }
            },
        ],
    )

    # It should NOT update the repository, so we don't register any PUT.

    # It should publish as usual.
    requests_mocker.post(
        "https://pulp.example.com/pulp/api/v2/repositories/some-repo/actions/publish/",
        json={"spawned_tasks": [{
            "task_id": "publish-task"
        }]},
    )

    requests_mocker.post(
        "https://pulp.example.com/pulp/api/v2/tasks/search/",
        json=[{
            "task_id": "publish-task",
            "state": "finished"
        }],
    )

    # It should have succeeded, with the tasks as retrieved from Pulp
    assert sorted(repo.publish()) == [
        Task(id="publish-task", succeeded=True, completed=True)
    ]