Ejemplo n.º 1
0
    def test_root_object(self):
        """
        Check root objects are not removed.
        """
        input_data = from_io({
            "version": self.version,
            "revisions": [
                {
                    "id": "origin:1",
                },
            ],
        })
        expected_output_data = {
            "version": self.version,
            "revisions": input_data["revisions"].copy()
        }
        self.assertEqual(remove_orphans(input_data), expected_output_data)

        input_data = from_io({
            "version":
            self.version,
            "revisions": [
                {
                    "id": "origin:1",
                },
                {
                    "id": "origin:2",
                },
            ],
        })
        expected_output_data = {
            "version": self.version,
            "revisions": input_data["revisions"].copy()
        }
        self.assertEqual(remove_orphans(input_data), expected_output_data)
Ejemplo n.º 2
0
 def test_empty(self):
     """
     Check removing orphans from empty data is a noop.
     """
     empty = {
         "version": self.version,
     }
     print(empty)
     self.assertEqual(remove_orphans(from_io(empty)), from_io(empty))
Ejemplo n.º 3
0
    def test_mixed(self):
        """
        Check mixed orphaned and linked objects are handled correctly.
        """

        input_data = from_io({
            "version": self.version,
            "revisions": [IO_REVISION1,],
            "builds": [
                {"id": "origin:1-1", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:1-2", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:X-1", "origin": "origin",
                 "revision_id": IO_REVISION3["id"]},
                {"id": "origin:X-2", "origin": "origin",
                 "revision_id": IO_REVISION3["id"]},
            ],
            "tests": [
                {"id": "origin:1-1-1", "origin": "origin",
                 "build_id": "origin:1-1"},
                {"id": "origin:1-1-2", "origin": "origin",
                 "build_id": "origin:1-1"},
                {"id": "origin:1-2-1", "origin": "origin",
                 "build_id": "origin:1-2"},
                {"id": "origin:1-2-2", "origin": "origin",
                 "build_id": "origin:1-2"},

                {"id": "origin:X-1-1", "origin": "origin",
                 "build_id": "origin:X-1"},
                {"id": "origin:X-1-2", "origin": "origin",
                 "build_id": "origin:X-1"},

                {"id": "origin:X-X-1", "origin": "origin",
                 "build_id": "origin:X-X"},
                {"id": "origin:X-X-2", "origin": "origin",
                 "build_id": "origin:X-X"},
            ],
        })

        expected_output_data = {
            "version": self.version,
            "revisions": {
                k: v for k, v in input_data["revisions"].items() if "X" not in k
            },
            "builds": {
                k: v for k, v in input_data["builds"].items() if "X" not in k
            },
            "tests": {
                k: v for k, v in input_data["tests"].items() if "X" not in k
            },
        }

        self.assertEqual(remove_orphans(input_data), expected_output_data)
Ejemplo n.º 4
0
def match_new_io(base_io, new_io, match_map=None, copy=True):
    """
    Generate notifications for new I/O data being added to base I/O data.

    Args:
        base_io:    The existing (base) I/O data being added to, and possibly
                    referred to by the arriving (new) I/O data. Will be used
                    to complete the data being notified about. Can already
                    contain the new I/O data, it will be considered "new"
                    regardless.
        new_io:     The arriving (new) I/O data being added to the existing
                    (base) data. Can refer to the existing I/O data. The new
                    I/O data can already be added to the base I/O data,
                    anything in the new data will be considered "new"
                    regardless.
        match_map:  The map of subscription match functions: a dictionary with
                    OO data object list names and a list of tuples, each
                    containing the name of the subscription and a match
                    function.

                    Each function must accept an object from the corresponding
                    object list in OO data, and return an iterable producing
                    kcidb.monitor.output.NotificationMessage objects, or None,
                    which is equivalent to an empty iterable.

                    The default is a dictionary of matching functions from all
                    kcidb.subscriptions.* modules, where each is called
                    "match_<OBJ_NAME>", where "<OBJ_NAME>" is an object list
                    name without the "s" ending.
        copy:       True, if the data should be copied before
                    referencing/modifying. False, if the data could be
                    referenced and modified in-place.
                    Optional, default is True.

    Returns:
        The list of notifications: kcidb.monitor.output.Notification objects.
    """
    assert LIGHT_ASSERTS or io.schema.is_valid(base_io)
    assert LIGHT_ASSERTS or io.schema.is_valid(new_io)

    # Merge the new data into the base (*copy* new data as we'll need it)
    merged_io = io.merge(base_io, [new_io],
                         copy_target=copy,
                         copy_sources=True)
    # Convert both to OO representation
    merged_oo = oo.from_io(merged_io, copy=False)
    new_oo = oo.from_io(new_io, copy=copy)
    # Remove all objects with missing parents from the merged data
    rooted_oo = oo.remove_orphans(merged_oo)
    # Delist everything except loaded or modified objects, but keep references
    masked_oo = oo.apply_mask(rooted_oo, new_oo)
    # Generate notifications
    return match_oo(masked_oo, match_map)
Ejemplo n.º 5
0
    def test_root_object(self):
        """
        Check root objects are not removed.
        """
        input_data = from_io({
            "version": self.version,
            "revisions": [IO_REVISION1,],
        })
        expected_output_data = {
            "version": self.version,
            "revisions": input_data["revisions"].copy()
        }
        self.assertEqual(remove_orphans(input_data), expected_output_data)

        input_data = from_io({
            "version": self.version,
            "revisions": [IO_REVISION1, IO_REVISION2,],
        })
        expected_output_data = {
            "version": self.version,
            "revisions": input_data["revisions"].copy()
        }
        self.assertEqual(remove_orphans(input_data), expected_output_data)
Ejemplo n.º 6
0
    def test_non_root_linked(self):
        """
        Check non-root linked objects are preserved.
        """

        # Builds
        input_data = from_io({
            "version": self.version,
            "revisions": [IO_REVISION1, IO_REVISION2,],
            "builds": [
                {"id": "origin:1-1", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:1-2", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:2-1", "origin": "origin",
                 "revision_id": IO_REVISION2["id"]},
                {"id": "origin:2-2", "origin": "origin",
                 "revision_id": IO_REVISION2["id"]},
            ],
        })

        expected_output_data = {
            "version": self.version,
            "revisions": input_data["revisions"].copy(),
            "builds": input_data["builds"].copy(),
        }

        self.assertEqual(remove_orphans(input_data), expected_output_data)

        # Tests
        input_data = from_io({
            "version": self.version,
            "revisions": [IO_REVISION1, IO_REVISION2,],
            "builds": [
                {"id": "origin:1-1", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:1-2", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:2-1", "origin": "origin",
                 "revision_id": IO_REVISION2["id"]},
                {"id": "origin:2-2", "origin": "origin",
                 "revision_id": IO_REVISION2["id"]},
            ],
            "tests": [
                {"id": "origin:1-1-1", "origin": "origin",
                 "build_id": "origin:1-1"},
                {"id": "origin:1-1-2", "origin": "origin",
                 "build_id": "origin:1-1"},
                {"id": "origin:1-2-1", "origin": "origin",
                 "build_id": "origin:1-2"},
                {"id": "origin:1-2-2", "origin": "origin",
                 "build_id": "origin:1-2"},
                {"id": "origin:2-1-1", "origin": "origin",
                 "build_id": "origin:2-1"},
                {"id": "origin:2-1-2", "origin": "origin",
                 "build_id": "origin:2-1"},
                {"id": "origin:2-2-1", "origin": "origin",
                 "build_id": "origin:2-2"},
                {"id": "origin:2-2-2", "origin": "origin",
                 "build_id": "origin:2-2"},
            ],
        })

        expected_output_data = {
            "version": self.version,
            "revisions": input_data["revisions"].copy(),
            "builds": input_data["builds"].copy(),
            "tests": input_data["tests"].copy(),
        }

        self.assertEqual(remove_orphans(input_data), expected_output_data)
Ejemplo n.º 7
0
    def test_non_root_orphans(self):
        """
        Check non-root orphans are removed.
        """
        # Builds
        expected_output_data = {
            "version": self.version,
            "builds": {}
        }

        # Single build
        input_data = from_io({
            "version": self.version,
            "builds": [
                {"id": "origin:1", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
            ],
        })
        self.assertEqual(remove_orphans(input_data), expected_output_data)

        # Two builds
        input_data = from_io({
            "version": self.version,
            "builds": [
                {"id": "origin:1", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:2", "origin": "origin",
                 "revision_id": IO_REVISION2["id"]},
            ],
        })
        self.assertEqual(remove_orphans(input_data), expected_output_data)

        # Tests
        expected_output_data = {
            "version": self.version,
            "tests": {}
        }

        # Single test
        input_data = from_io({
            "version": self.version,
            "tests": [
                {"id": "origin:1", "origin": "origin",
                 "build_id": "origin:1"},
            ],
        })
        self.assertEqual(remove_orphans(input_data), expected_output_data)

        # Two tests
        input_data = from_io({
            "version": self.version,
            "tests": [
                {"id": "origin:1", "origin": "origin",
                 "build_id": "origin:1"},
                {"id": "origin:2", "origin": "origin",
                 "build_id": "origin:2"},
            ],
        })
        self.assertEqual(remove_orphans(input_data), expected_output_data)

        # Builds and tests
        expected_output_data = {
            "version": self.version,
            "builds": {},
            "tests": {},
        }

        # Disconnected builds and tests
        input_data = from_io({
            "version": self.version,
            "builds": [
                {"id": "origin:1", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:2", "origin": "origin",
                 "revision_id": IO_REVISION2["id"]},
            ],
            "tests": [
                {"id": "origin:1", "origin": "origin",
                 "build_id": "origin:3"},
                {"id": "origin:2", "origin": "origin",
                 "build_id": "origin:4"},
            ],
        })
        self.assertEqual(remove_orphans(input_data), expected_output_data)

        # Connected builds and tests
        input_data = from_io({
            "version": self.version,
            "builds": [
                {"id": "origin:1", "origin": "origin",
                 "revision_id": IO_REVISION1["id"]},
                {"id": "origin:2", "origin": "origin",
                 "revision_id": IO_REVISION2["id"]},
            ],
            "tests": [
                {"id": "origin:1", "origin": "origin",
                 "build_id": "origin:1"},
                {"id": "origin:2", "origin": "origin",
                 "build_id": "origin:2"},
            ],
        })
        self.assertEqual(remove_orphans(input_data), expected_output_data)