Пример #1
0
def test_cannot_start_in_midworkflow(sample_data1):
    """Ensures that intermediate fates do not create labors when no labor
    exists.

    Given a Fate C -> D, and intermediate Fate D -> E,
    Throw event D and ensure Labor D is not created since Labor C does not exist.

    """

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    event_type_d = sample_data1.query(EventType).get(4)
    host = sample_data1.query(Host).get(1)

    Event.create(sample_data1, host, "system", event_type_d)

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host
    assert event.event_type == event_type_d

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 0
Пример #2
0
def test_get_labors(sample_data1):
    host = Host.get_host(sample_data1, "example.dropbox.com")
    assert host.id == 1
    assert len(host.labors) == 0

    event_type1 = sample_data1.query(EventType).get(1)
    event_type3 = sample_data1.query(EventType).get(3)
    event_type4 = sample_data1.query(EventType).get(4)

    print "Creating event1"
    Event.create(sample_data1, host, "testman", event_type1)

    print "Creating event2"
    Event.create(sample_data1, host, "testman", event_type3)

    print "Creating event3"
    closing_event = Event.create(sample_data1, host, "testman", event_type4)

    print "Get labor info"
    all_labors = host.get_labors().all()
    open_labors = host.get_open_labors().all()

    assert len(all_labors) == 3
    assert len(host.labors) == 3
    assert len(open_labors) == 1

    assert all_labors[0].completion_time is None
    assert all_labors[0].completion_event is None
    assert all_labors[1].completion_time is not None
    assert all_labors[1].completion_event == closing_event
    assert all_labors[0].creation_event == closing_event
Пример #3
0
def test_lifecycle_simple2(sample_data1):
    """Test another simple lifecycle

    Throw event A, and see that it creates Labor A.
    Throw event D, and see that it closes Labor A and creates no new labors.
    """
    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    host = sample_data1.query(Host).first()
    assert len(host.labors) == 0

    event_a = sample_data1.query(EventType).get(1)
    event_d = sample_data1.query(EventType).get(4)

    # Throw event A
    Event.create(sample_data1, host, "system", event_a)

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host
    assert event.event_type == event_a

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False
    assert len(host.labors) == 1
    assert len(event.created_labors) == 1
    assert len(event.completed_labors) == 0


    # Throw event D
    Event.create(
        sample_data1, host, "system", event_d
    )

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host
    assert event.event_type == event_d

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is not None
    assert labors[0].completion_event == event
    assert labors[0].for_creator is False
    assert len(event.created_labors) == 0
    assert len(event.completed_labors) == 1

    assert len(host.labors) == 1
Пример #4
0
def test_quest_preservation(sample_data1):
    """When a quest has labors that chain together, make sure they stay
    attached to the quest.
    """
    hosts = [
        sample_data1.query(Host).filter(
            Host.hostname == 'example.dropbox.com'
        ).one(),
        sample_data1.query(Host).filter(
            Host.hostname == 'test.dropbox.com'
        ).one(),
    ]

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    creation_event_type = (
        sample_data1.query(EventType)
        .filter(EventType.id == 3).first()
    )

    target_time = datetime.now() + timedelta(days=2)

    Quest.create(
        sample_data1, "testman", hosts, creation_event_type, target_time,
        description="Embark on the long road of maintenance"
    )

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 1
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert len(quests[0].labors) == 2

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 2

    # now we want to throw events that create the subsequent labors
    found_hosts = sample_data1.query(Host).filter(
        Host.hostname.in_(["example.dropbox.com", "test.dropbox.com"])
    ).all()
    assert len(found_hosts) == 2

    completion_event_type1 = sample_data1.query(EventType).get(4)

    Event.create(
        sample_data1, found_hosts[0], "testdude", completion_event_type1
    )
    Event.create(
        sample_data1, found_hosts[1], "testdude", completion_event_type1
    )

    assert len(quests[0].labors) == 4
    assert len(quests[0].get_open_labors().all()) == 2
Пример #5
0
def test_lifecycle1(sample_data1):
    """Test the automatic creation and closing of labors based on Events and Fates

    Throw event A, and see that it creates Labor A.
    Throw event B, and see that it closes Labor A and creates no new Labors.
    """
    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    event_type_a = sample_data1.query(EventType).get(1)
    event_type_b = sample_data1.query(EventType).get(2)
    host = sample_data1.query(Host).first()
    assert len(host.labors) == 0

    # Throw event A
    Event.create(sample_data1, host, "system", event_type_a)

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host
    assert event.event_type == event_type_a

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False
    assert len(host.labors) == 1
    assert len(event.created_labors) == 1
    assert len(event.completed_labors) == 0

    # Throw event B
    Event.create(
        sample_data1, host, "system", event_type_b
    )

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host
    assert event.event_type == event_type_b

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is not None
    assert labors[0].completion_event == event
    assert labors[0].for_creator is False
    assert len(event.created_labors) == 0
    assert len(event.completed_labors) == 1

    assert len(host.labors) == 1
Пример #6
0
def test_longer_chain(sample_data2):
    """Test chained labors A->B->C->D"""
    labors = sample_data2.query(Labor).all()
    assert len(labors) == 0

    # system-maintenance audit
    event_type_a = sample_data2.query(EventType).get(1)
    # system-maintenance needed
    event_type_b = sample_data2.query(EventType).get(2)
    # system-maintenance ready
    event_type_c = sample_data2.query(EventType).get(3)
    # system-maintenance completed
    event_type_d = sample_data2.query(EventType).get(4)

    host = sample_data2.query(Host).get(1)

    event_a = Event.create(sample_data2, host, "system", event_type_a)

    # We will aggressively validate the events created only for event A
    event = (
        sample_data2.query(Event)
        .order_by(desc(Event.id)).first()
    )
    assert event == event_a
    assert event.host == host
    assert event.event_type == event_type_a

    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 1
    assert len(host.labors) == 1
    assert labors[0].starting_labor_id is None
    assert labors[0].for_creator is False
    starting_labor_id = labors[0].id

    event_b = Event.create(sample_data2, host, "system", event_type_b)
    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 1
    assert len(host.labors) == 2
    assert labors[0].starting_labor_id == starting_labor_id
    assert labors[0].for_creator is False

    event_c = Event.create(sample_data2, host, "system", event_type_c)
    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 1
    assert len(host.labors) == 3
    assert labors[0].starting_labor_id == starting_labor_id
    assert labors[0].for_creator is True

    # This last event closes the final labor but does not create a new labor
    event_d = Event.create(sample_data2, host, "system", event_type_d)
    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 0
    assert len(host.labors) == 3
Пример #7
0
def test_quest_preservation(sample_data1):
    """When a quest has labors that chain together, make sure they stay
    attached to the quest.
    """
    hosts = [
        sample_data1.query(Host).filter(
            Host.hostname == 'example.dropbox.com').one(),
        sample_data1.query(Host).filter(
            Host.hostname == 'test.dropbox.com').one(),
    ]

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    target_time = datetime.now() + timedelta(days=2)

    fate = (sample_data1.query(Fate).get(4))

    Quest.create(sample_data1,
                 "testman",
                 hosts,
                 target_time,
                 fate_id=fate.id,
                 description="Embark on the long road of maintenance")

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 1
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert len(quests[0].labors) == 2

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 2

    # now we want to throw events that create the subsequent labors
    found_hosts = sample_data1.query(Host).filter(
        Host.hostname.in_(["example.dropbox.com", "test.dropbox.com"])).all()
    assert len(found_hosts) == 2

    completion_event_type1 = sample_data1.query(EventType).get(4)

    Event.create(sample_data1, found_hosts[0], "testdude",
                 completion_event_type1)
    Event.create(sample_data1, found_hosts[1], "testdude",
                 completion_event_type1)

    assert len(quests[0].labors) == 4
    assert len(quests[0].get_open_labors().all()) == 2
Пример #8
0
def test_lifecycle_simple2(sample_data1):
    """Test another simple lifecycle

    Throw event A, and see that it creates Labor A.
    Throw event D, and see that it closes Labor A and creates no new labors.
    """
    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    host = sample_data1.query(Host).first()
    assert len(host.labors) == 0

    event_a = sample_data1.query(EventType).get(1)
    event_d = sample_data1.query(EventType).get(4)

    # Throw event A
    Event.create(sample_data1, host, "system", event_a)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host
    assert event.event_type == event_a

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False
    assert len(host.labors) == 1
    assert len(event.created_labors) == 1
    assert len(event.completed_labors) == 0

    # Throw event D
    Event.create(sample_data1, host, "system", event_d)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host
    assert event.event_type == event_d

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is not None
    assert labors[0].completion_event == event
    assert labors[0].for_creator is False
    assert len(event.created_labors) == 0
    assert len(event.completed_labors) == 1

    assert len(host.labors) == 1
Пример #9
0
def test_longer_chain(sample_data2):
    """Test chained labors A->B->C->D"""
    labors = sample_data2.query(Labor).all()
    assert len(labors) == 0

    # system-maintenance audit
    event_type_a = sample_data2.query(EventType).get(1)
    # system-maintenance needed
    event_type_b = sample_data2.query(EventType).get(2)
    # system-maintenance ready
    event_type_c = sample_data2.query(EventType).get(3)
    # system-maintenance completed
    event_type_d = sample_data2.query(EventType).get(4)

    host = sample_data2.query(Host).get(1)

    event_a = Event.create(sample_data2, host, "system", event_type_a)

    # We will aggressively validate the events created only for event A
    event = (sample_data2.query(Event).order_by(desc(Event.id)).first())
    assert event == event_a
    assert event.host == host
    assert event.event_type == event_type_a

    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 1
    assert len(host.labors) == 1
    assert labors[0].starting_labor_id is None
    assert labors[0].for_creator is False
    starting_labor_id = labors[0].id

    event_b = Event.create(sample_data2, host, "system", event_type_b)
    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 1
    assert len(host.labors) == 2
    assert labors[0].starting_labor_id == starting_labor_id
    assert labors[0].for_creator is False

    event_c = Event.create(sample_data2, host, "system", event_type_c)
    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 1
    assert len(host.labors) == 3
    assert labors[0].starting_labor_id == starting_labor_id
    assert labors[0].for_creator is True

    # This last event closes the final labor but does not create a new labor
    event_d = Event.create(sample_data2, host, "system", event_type_d)
    labors = Labor.get_open_unacknowledged(sample_data2)
    assert len(labors) == 0
    assert len(host.labors) == 3
Пример #10
0
def test_lifecycle1(sample_data1):
    """Test the automatic creation and closing of labors based on Events and Fates

    Throw event A, and see that it creates Labor A.
    Throw event B, and see that it closes Labor A and creates no new Labors.
    """
    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    event_type_a = sample_data1.query(EventType).get(1)
    event_type_b = sample_data1.query(EventType).get(2)
    host = sample_data1.query(Host).first()
    assert len(host.labors) == 0

    # Throw event A
    Event.create(sample_data1, host, "system", event_type_a)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host
    assert event.event_type == event_type_a

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False
    assert len(host.labors) == 1
    assert len(event.created_labors) == 1
    assert len(event.completed_labors) == 0

    # Throw event B
    Event.create(sample_data1, host, "system", event_type_b)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host
    assert event.event_type == event_type_b

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is not None
    assert labors[0].completion_event == event
    assert labors[0].for_creator is False
    assert len(event.created_labors) == 0
    assert len(event.completed_labors) == 1

    assert len(host.labors) == 1
Пример #11
0
def test_acknowledge(sample_data1):
    """Test to ensure that acknowledgement correctly flags Labors as such"""

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    fate = sample_data1.query(Fate).get(1)
    host = sample_data1.query(Host).get(1)

    Event.create(sample_data1, host, "system", fate.creation_event_type)

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host
    assert event.event_type == fate.creation_event_type

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].ack_time is None
    assert labors[0].ack_user is None
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False

    labors[0].acknowledge("testman")

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].ack_time is not None
    assert labors[0].ack_user == "testman"
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 0
Пример #12
0
def test_acknowledge(sample_data1):
    """Test to ensure that acknowledgement correctly flags Labors as such"""

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    fate = sample_data1.query(Fate).get(1)
    host = sample_data1.query(Host).get(1)

    Event.create(sample_data1, host, "system", fate.creation_event_type)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host
    assert event.event_type == fate.creation_event_type

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].ack_time is None
    assert labors[0].ack_user is None
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False

    labors[0].acknowledge("testman")

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 1
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].ack_time is not None
    assert labors[0].ack_user == "testman"
    assert labors[0].creation_event == event
    assert labors[0].for_creator is False

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 0
Пример #13
0
def test_cannot_start_in_midworkflow(sample_data1):
    """Ensures that intermediate fates do not create labors when no labor
    exists.

    Given a Fate C -> D, and intermediate Fate D -> E,
    Throw event D and ensure Labor D is not created since Labor C does not exist.

    """

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    event_type_d = sample_data1.query(EventType).get(4)
    host = sample_data1.query(Host).get(1)

    Event.create(sample_data1, host, "system", event_type_d)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host
    assert event.event_type == event_type_d

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 0
Пример #14
0
def test_creation(sample_data1):
    hosts = [
        sample_data1.query(Host).filter(
            Host.hostname == 'example.dropbox.com').one(),
        sample_data1.query(Host).filter(
            Host.hostname == 'test.dropbox.com').one(),
    ]

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    fate = (sample_data1.query(Fate).get(1))

    target_time = datetime.now() + timedelta(days=2)

    Quest.create(sample_data1,
                 "testman",
                 hosts,
                 target_time,
                 fate_id=fate.id,
                 description="Embark on the long road of maintenance")

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 1
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert quests[0].target_time == target_time
    assert len(quests[0].labors) == 2

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 2

    # now we want to test the closing of the quest by throwing events
    # that fulfill the labors

    found_hosts = sample_data1.query(Host).filter(
        Host.hostname.in_(["example.dropbox.com", "test.dropbox.com"])).all()

    assert len(found_hosts) == 2

    completion_event_type = (sample_data1.query(EventType).filter(
        EventType.id == 2).first())

    Event.create(sample_data1, found_hosts[0], "testdude",
                 completion_event_type)
    Event.create(sample_data1, found_hosts[1], "testdude",
                 completion_event_type)

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 0

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 1
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is not None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert len(quests[0].labors) == 2
Пример #15
0
def test_lifecycle_complex2(sample_data1):
    """Test the automatic creation and closing of labors based on Events and Fates.
    This version is a bit more complex in that we make sure unaffiliated labors
    are left untouched.

    Throw event A, creates Labor A.
    Throw event C, creates Labor C.
    Throw event B, closes Labor A, but does nothing to Labor C.
    """
    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    fates = sample_data1.query(Fate).all()
    fate1 = fates[0]
    fate2 = fates[1]
    fate4 = fates[3]

    hosts = sample_data1.query(Host).all()
    host1 = hosts[0]
    host2 = hosts[1]

    # Throw event A and C
    Event.create(sample_data1, host1, "system", fate1.creation_event_type)
    Event.create(sample_data1, host2, "system", fate4.creation_event_type)

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host2
    assert event.event_type == fate4.creation_event_type

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 2
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].for_creator is False
    assert labors[1].completion_time is None
    assert labors[1].completion_event is None
    assert labors[1].for_creator is False

    # Throw event B
    Event.create(
        sample_data1, host1, "system", fate2.creation_event_type
    )

    event = (
        sample_data1.query(Event)
        .order_by(desc(Event.id)).first()
    )

    assert event.host == host1
    assert event.event_type == fate2.creation_event_type

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 2
    assert labors[0].completion_time is not None
    assert labors[0].completion_event is not None
    assert labors[0].for_creator is False
    assert labors[1].completion_time is None
    assert labors[1].completion_event is None
    assert labors[1].for_creator is False

    labors = Labor.get_open_labors(sample_data1).all()
    assert len(labors) == 1

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 1
Пример #16
0
def test_lifecycle_complex2(sample_data1):
    """Test the automatic creation and closing of labors based on Events and Fates.
    This version is a bit more complex in that we make sure unaffiliated labors
    are left untouched.

    Throw event A, creates Labor A.
    Throw event C, creates Labor C.
    Throw event B, closes Labor A, but does nothing to Labor C.
    """
    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    fates = sample_data1.query(Fate).all()
    fate1 = fates[0]
    fate2 = fates[1]
    fate4 = fates[3]

    hosts = sample_data1.query(Host).all()
    host1 = hosts[0]
    host2 = hosts[1]

    # Throw event A and C
    Event.create(sample_data1, host1, "system", fate1.creation_event_type)
    Event.create(sample_data1, host2, "system", fate4.creation_event_type)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host2
    assert event.event_type == fate4.creation_event_type

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 2
    assert labors[0].completion_time is None
    assert labors[0].completion_event is None
    assert labors[0].for_creator is False
    assert labors[1].completion_time is None
    assert labors[1].completion_event is None
    assert labors[1].for_creator is False

    # Throw event B
    Event.create(sample_data1, host1, "system", fate2.creation_event_type)

    event = (sample_data1.query(Event).order_by(desc(Event.id)).first())

    assert event.host == host1
    assert event.event_type == fate2.creation_event_type

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 2
    assert labors[0].completion_time is not None
    assert labors[0].completion_event is not None
    assert labors[0].for_creator is False
    assert labors[1].completion_time is None
    assert labors[1].completion_event is None
    assert labors[1].for_creator is False

    labors = Labor.get_open_labors(sample_data1).all()
    assert len(labors) == 1

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 1
Пример #17
0
def test_explicit_chain(sample_data2):
    """This test works on testing some complex chaining of fates:

    ET: sys-audit, sys-needed, sys-ready, sys-complete, reboot-needed,
        reboot-complete, puppet-restart

    Fates:
    1: system-maintenance-audit => system-maintenance-needed
        => system-maintenance-ready => system-maintenance-completed

    9: system-maintenance-audit => system-reboot-completed

    Quests:
    Bravo: fate chain 1
    Charlie: fate chain 9
    """
    event_types = sample_data2.query(EventType).all()
    assert len(event_types) == 7

    fates = sample_data2.query(Fate).all()
    assert len(fates) == 10

    hosts = [sample_data2.query(Host).get(1), sample_data2.query(Host).get(2)]

    target_time1 = datetime.now() + timedelta(days=2)
    target_time2 = datetime.now() + timedelta(days=7)

    print "\nbravo quest"
    bravo_quest = Quest.create(
        sample_data2, "testman", [hosts[0]],
        target_time1,
        fate_id=1,
        description="System maintenance is needed"
    )

    print "\ncharlie quest"
    charlie_quest = Quest.create(
        sample_data2, "testman", [hosts[1]],
        target_time2,
        fate_id=9,
        description="Systems maintenance is needed"
    )
    assert bravo_quest
    assert charlie_quest
    assert len(bravo_quest.labors) == 1
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert len(charlie_quest.labors) == 1
    assert bravo_quest.completion_time is None
    assert charlie_quest.completion_time is None

    assert len(hosts[0].events) == 1
    assert len(hosts[1].events) == 1

    # Now let's look at the fate ID of the labors and make sure they are correct
    assert bravo_quest.get_open_labors().all()[0].fate_id == 1
    assert charlie_quest.get_open_labors().all()[0].fate_id == 9

    # Now progress the bravo quest by throwing the sys-maint needed event
    # and ensure charlie quest didn't move
    print "\nevent 1"
    event1a = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed")
    )
    event1b = Event.create(
        sample_data2, hosts[1], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed")
    )
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1a
    assert bravo_quest.get_open_labors().all()[0].starting_labor_id == hosts[0].events[0].id
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert bravo_quest.completion_time is None
    assert len(bravo_quest.labors) == 2
    assert charlie_quest.completion_time is None
    assert len(charlie_quest.labors) == 1

    # Throw system-reboot completed event for both hosts and ensure it closes
    # charlie quest but does nothing to bravo quest
    print "\nevent 1"
    event2a = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "puppet", "restart")
    )
    event2b = Event.create(
        sample_data2, hosts[1], "system",
        EventType.get_event_type(sample_data2, "puppet", "restart")
    )
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1a
    assert bravo_quest.get_open_labors().all()[0].starting_labor_id == hosts[0].events[0].id
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert bravo_quest.completion_time is None
    assert len(bravo_quest.labors) == 2

    assert charlie_quest.completion_time is not None
    assert len(charlie_quest.labors) == 1
Пример #18
0
def test_get_latest_events(session):
    event_type1 = EventType.create(session, "foo", "bar", "test type 1")
    event_type2 = EventType.create(session, "foo", "baz", "test type 2")

    host1 = Host.create(session, "server1")
    host2 = Host.create(session, "server2")

    Event.create(session, host1, "testman", event_type1)
    Event.create(session, host1, "testman", event_type2)
    Event.create(session, host2, "testman", event_type1)
    Event.create(session, host1, "testman", event_type1)
    Event.create(session, host1, "testman", event_type2)
    last_type2 = Event.create(session, host2, "testman", event_type2)
    last_type1 = Event.create(session, host2, "testman", event_type1)

    events1 = event_type1.get_latest_events().all()
    events2 = event_type2.get_latest_events().all()

    assert len(events1) == 4
    assert len(events2) == 3

    assert events1[0] == last_type1
    assert events2[0] == last_type2
Пример #19
0
def test_creation(sample_data1):
    hosts = [
        sample_data1.query(Host).filter(
            Host.hostname == 'example.dropbox.com'
        ).one(),
        sample_data1.query(Host).filter(
            Host.hostname == 'test.dropbox.com'
        ).one(),
    ]

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    creation_event_type = (
        sample_data1.query(EventType)
        .filter(EventType.id == 1).first()
    )

    target_time = datetime.now() + timedelta(days=2)

    Quest.create(
        sample_data1, "testman", hosts, creation_event_type, target_time,
        description="Embark on the long road of maintenance"
    )

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 1
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert quests[0].target_time == target_time
    assert len(quests[0].labors) == 2

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 2

    # now we want to test the closing of the quest by throwing events
    # that fulfill the labors

    found_hosts = sample_data1.query(Host).filter(
        Host.hostname.in_(["example.dropbox.com", "test.dropbox.com"])
    ).all()

    assert len(found_hosts) == 2

    completion_event_type = (
        sample_data1.query(EventType)
        .filter(EventType.id == 2).first()
    )

    Event.create(
        sample_data1, found_hosts[0], "testdude", completion_event_type
    )
    Event.create(
        sample_data1, found_hosts[1], "testdude", completion_event_type
    )

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 0

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 1
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is not None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert len(quests[0].labors) == 2
Пример #20
0
def test_complex_chaining1(sample_data2):
    """This test works on testing some complex chainging fates:

    ET: sys-audit, sys-needed, sys-ready, sys-complete, reboot-needed, reboot-complete, puppet-restart

    Fates:
    sys-audit => sys-needed
    sys-needed => sys-ready
    sys-ready => sys-complete
    sys-needed => reboot-complete
    reboot-needed => reboot-complete
    reboot-complete => puppet-restart

    Quests:
    Alpha: servers need sys-audit; on sys-needed event, add only 1 labor for sys-needed and add to quest
    """
    event_types = sample_data2.query(EventType).all()
    assert len(event_types) == 7

    fates = sample_data2.query(Fate).all()
    assert len(fates) == 10

    hosts = [
        sample_data2.query(Host).filter(
            Host.hostname == 'example.dropbox.com').one(),
        sample_data2.query(Host).filter(
            Host.hostname == 'test.dropbox.com').one(),
    ]

    target_time = datetime.now() + timedelta(days=2)

    quest = Quest.create(sample_data2,
                         "testman",
                         hosts,
                         target_time,
                         fate_id=1,
                         description="Servers need audit")

    assert quest
    assert len(quest.get_open_labors().all()) == 2

    # now we fire the system-maintenance needed event
    found_hosts = sample_data2.query(Host).filter(
        Host.hostname.in_(["example.dropbox.com", "test.dropbox.com"])).all()
    assert len(found_hosts) == 2
    event1 = Event.create(
        sample_data2, found_hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed"))
    event2 = Event.create(
        sample_data2, found_hosts[1], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed"))

    assert len(quest.labors) == 4
    assert len(quest.get_open_labors().all()) == 2
    assert quest.completion_time is None

    labor1 = quest.get_open_labors().all()[0]
    labor2 = quest.get_open_labors().all()[1]

    assert labor1.host == hosts[0]
    assert labor2.host == hosts[1]
    assert labor1.for_owner is True
    assert labor1.for_creator is False
    assert labor2.for_owner is True
    assert labor2.for_creator is False
    assert labor1.creation_event == event1
    assert labor2.creation_event == event2
Пример #21
0
def test_get_latest_events(session):
    event_type1 = EventType.create(session, "foo", "bar", "test type 1")
    event_type2 = EventType.create(session, "foo", "baz", "test type 2")

    host1 = Host.create(session, "server1")
    host2 = Host.create(session, "server2")

    Event.create(session, host1, "testman", event_type1)
    Event.create(session, host1, "testman", event_type2)
    Event.create(session, host2, "testman", event_type1)
    Event.create(session, host1, "testman", event_type1)
    Event.create(session, host1, "testman", event_type2)
    last_type2 = Event.create(session, host2, "testman", event_type2)
    last_type1 = Event.create(session, host2, "testman", event_type1)

    events1 = event_type1.get_latest_events().all()
    events2 = event_type2.get_latest_events().all()

    assert len(events1) == 4
    assert len(events2) == 3

    assert events1[0] == last_type1
    assert events2[0] == last_type2
Пример #22
0
def test_complex_chaining3(sample_data2):
    """This test works on testing some complex chaining of fates:

    ET: sys-audit, sys-needed, sys-ready, sys-complete, reboot-needed,
        reboot-complete, puppet-restart

    Fates:
    system-maintenance-audit => system-maintenance-needed
        => system-maintenance-ready => system-maintenance-completed

    system-maintenance-audit => system-maintenance-needed
        => system-reboot-completed

    system-reboot-needed => system-reboot-completed => puppet-restart

    Quests:
    Bravo: servers need sys-needed
    Charlie: servers need reboot-needed
    """
    event_types = sample_data2.query(EventType).all()
    assert len(event_types) == 7

    fates = sample_data2.query(Fate).all()
    assert len(fates) == 10

    hosts = [sample_data2.query(Host).get(1)]

    target_time1 = datetime.now() + timedelta(days=2)
    target_time2 = datetime.now() + timedelta(days=7)

    print "\nbravo quest"
    bravo_quest = Quest.create(sample_data2,
                               "testman",
                               hosts,
                               target_time1,
                               fate_id=1,
                               description="System maintenance is needed")

    print "\ncharlie quest"
    charlie_quest = Quest.create(sample_data2,
                                 "testman",
                                 hosts,
                                 target_time2,
                                 fate_id=6,
                                 description="Systems need a reboot")
    assert bravo_quest
    assert charlie_quest
    assert len(bravo_quest.labors) == 1
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert len(charlie_quest.labors) == 1
    assert bravo_quest.completion_time is None
    assert charlie_quest.completion_time is None

    assert len(hosts[0].events) == 2

    # Now we want to progress the bravo quest by throwing the sys-maint needed event
    print "\nevent 1"
    event1 = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed"))
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1
    assert bravo_quest.get_open_labors().all(
    )[0].starting_labor_id == hosts[0].events[0].id
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert len(bravo_quest.labors) == 2

    # Now we progress the bravo quest again by throwing sys-maint-ready
    print "\nevent 1b"
    event1b = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "ready"))
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1b
    assert bravo_quest.get_open_labors().all(
    )[0].starting_labor_id == hosts[0].events[0].id
    assert bravo_quest.get_open_labors().all()[0].for_owner is False
    assert bravo_quest.get_open_labors().all()[0].for_creator is True
    assert len(bravo_quest.labors) == 3

    # Now we progress the charlie quest with the system-reboot-completed event
    # but bravo quest stays put
    print "\nevent 2"
    event2 = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-reboot", "completed"))
    assert bravo_quest.completion_time is None
    assert len(bravo_quest.labors) == 3
    assert charlie_quest.get_open_labors().all()[0].creation_event == event2
    assert charlie_quest.get_open_labors().all(
    )[0].starting_labor_id == hosts[0].events[1].id
    assert charlie_quest.completion_time is None
    assert len(charlie_quest.labors) == 2

    # since the previous event progressed the workflow, this one below
    # shouldn't create a labor since system-reboot-completed labors are
    # intermediates
    print "\nevent 3"
    event3 = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-reboot", "completed"))

    # we will have a 6th event here due to event3
    assert len(hosts[0].events) == 6

    assert len(charlie_quest.labors) == 2
    assert len(charlie_quest.get_open_labors().all()) == 1

    assert charlie_quest.get_open_labors().all()[0].creation_event == event2
    assert charlie_quest.get_open_labors().all()[0].quest == charlie_quest

    assert len(sample_data2.query(Labor).all()) == 5
Пример #23
0
def test_complex_chaining1(sample_data2):
    """This test works on testing some complex chainging fates:

    ET: sys-audit, sys-needed, sys-ready, sys-complete, reboot-needed, reboot-complete, puppet-restart

    Fates:
    sys-audit => sys-needed
    sys-needed => sys-ready
    sys-ready => sys-complete
    sys-needed => reboot-complete
    reboot-needed => reboot-complete
    reboot-complete => puppet-restart

    Quests:
    Alpha: servers need sys-audit; on sys-needed event, add only 1 labor for sys-needed and add to quest
    """
    event_types = sample_data2.query(EventType).all()
    assert len(event_types) == 7

    fates = sample_data2.query(Fate).all()
    assert len(fates) == 6

    hosts = [
        sample_data2.query(Host).filter(
            Host.hostname == 'example.dropbox.com'
        ).one(),
        sample_data2.query(Host).filter(
            Host.hostname == 'test.dropbox.com'
        ).one(),
    ]

    target_time = datetime.now() + timedelta(days=2)

    quest = Quest.create(
        sample_data2, "testman", hosts,
        EventType.get_event_type(sample_data2, "system-maintenance", "audit"),
        target_time,
        description="Servers need audit"
    )

    assert quest
    assert len(quest.get_open_labors().all()) == 2

    # now we fire the system-maintenance needed event
    found_hosts = sample_data2.query(Host).filter(
        Host.hostname.in_(["example.dropbox.com", "test.dropbox.com"])
    ).all()
    assert len(found_hosts) == 2
    event1 = Event.create(
        sample_data2, found_hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed")
    )
    event2 = Event.create(
        sample_data2, found_hosts[1], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed")
    )

    assert len(quest.labors) == 4
    assert len(quest.get_open_labors().all()) == 2
    assert quest.completion_time is None

    labor1 = quest.get_open_labors().all()[0]
    labor2 = quest.get_open_labors().all()[1]

    assert labor1.host == hosts[0]
    assert labor2.host == hosts[1]
    assert labor1.creation_event == event1
    assert labor2.creation_event == event2
Пример #24
0
def test_explicit_chain(sample_data2):
    """This test works on testing some complex chaining of fates:

    ET: sys-audit, sys-needed, sys-ready, sys-complete, reboot-needed,
        reboot-complete, puppet-restart

    Fates:
    1: system-maintenance-audit => system-maintenance-needed
        => system-maintenance-ready => system-maintenance-completed

    9: system-maintenance-audit => system-reboot-completed

    Quests:
    Bravo: fate chain 1
    Charlie: fate chain 9
    """
    event_types = sample_data2.query(EventType).all()
    assert len(event_types) == 7

    fates = sample_data2.query(Fate).all()
    assert len(fates) == 10

    hosts = [sample_data2.query(Host).get(1), sample_data2.query(Host).get(2)]

    target_time1 = datetime.now() + timedelta(days=2)
    target_time2 = datetime.now() + timedelta(days=7)

    print "\nbravo quest"
    bravo_quest = Quest.create(sample_data2,
                               "testman", [hosts[0]],
                               target_time1,
                               fate_id=1,
                               description="System maintenance is needed")

    print "\ncharlie quest"
    charlie_quest = Quest.create(sample_data2,
                                 "testman", [hosts[1]],
                                 target_time2,
                                 fate_id=9,
                                 description="Systems maintenance is needed")
    assert bravo_quest
    assert charlie_quest
    assert len(bravo_quest.labors) == 1
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert len(charlie_quest.labors) == 1
    assert bravo_quest.completion_time is None
    assert charlie_quest.completion_time is None

    assert len(hosts[0].events) == 1
    assert len(hosts[1].events) == 1

    # Now let's look at the fate ID of the labors and make sure they are correct
    assert bravo_quest.get_open_labors().all()[0].fate_id == 1
    assert charlie_quest.get_open_labors().all()[0].fate_id == 9

    # Now progress the bravo quest by throwing the sys-maint needed event
    # and ensure charlie quest didn't move
    print "\nevent 1"
    event1a = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed"))
    event1b = Event.create(
        sample_data2, hosts[1], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed"))
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1a
    assert bravo_quest.get_open_labors().all(
    )[0].starting_labor_id == hosts[0].events[0].id
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert bravo_quest.completion_time is None
    assert len(bravo_quest.labors) == 2
    assert charlie_quest.completion_time is None
    assert len(charlie_quest.labors) == 1

    # Throw system-reboot completed event for both hosts and ensure it closes
    # charlie quest but does nothing to bravo quest
    print "\nevent 1"
    event2a = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "puppet", "restart"))
    event2b = Event.create(
        sample_data2, hosts[1], "system",
        EventType.get_event_type(sample_data2, "puppet", "restart"))
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1a
    assert bravo_quest.get_open_labors().all(
    )[0].starting_labor_id == hosts[0].events[0].id
    assert bravo_quest.get_open_labors().all()[0].for_owner is True
    assert bravo_quest.get_open_labors().all()[0].for_creator is False
    assert bravo_quest.completion_time is None
    assert len(bravo_quest.labors) == 2

    assert charlie_quest.completion_time is not None
    assert len(charlie_quest.labors) == 1
Пример #25
0
def test_complex_chaining3(sample_data2):
    """This test works on testing some complex chaining of fates:

    ET: sys-audit, sys-needed, sys-ready, sys-complete, reboot-needed,
        reboot-complete, puppet-restart

    Fates:
    system-maintenance-audit => system-maintenance-needed
        => system-maintenance-ready => system-maintenance-completed

    system-maintenance-audit => system-maintenance-needed
        => system-reboot-completed

    system-reboot-needed => system-reboot-completed => puppet-restart

    Quests:
    Bravo: servers need sys-needed
    Charlie: servers need reboot-needed
    """
    event_types = sample_data2.query(EventType).all()
    assert len(event_types) == 7

    fates = sample_data2.query(Fate).all()
    assert len(fates) == 6

    hosts = [sample_data2.query(Host).get(1)]

    target_time1 = datetime.now() + timedelta(days=2)
    target_time2 = datetime.now() + timedelta(days=7)

    print "\nbravo quest"
    bravo_quest = Quest.create(
        sample_data2, "testman", hosts,
        EventType.get_event_type(sample_data2, "system-maintenance", "audit"),
        target_time1,
        description="System maintenance is needed"
    )

    print "\ncharlie quest"
    charlie_quest = Quest.create(
        sample_data2, "testman", hosts,
        EventType.get_event_type(sample_data2, "system-reboot", "needed"),
        target_time2,
        description="Systems need a reboot"
    )
    assert bravo_quest
    assert charlie_quest
    assert len(bravo_quest.labors) == 1
    assert len(charlie_quest.labors) == 1
    assert bravo_quest.completion_time is None
    assert charlie_quest.completion_time is None

    assert len(hosts[0].events) == 2

    # Now we want to progress the bravo quest by throwing the sys-maint needed event
    print "\nevent 1"
    event1 = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "needed")
    )
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1
    assert bravo_quest.get_open_labors().all()[0].starting_labor_id == hosts[0].events[0].id
    assert len(bravo_quest.labors) == 2

    # Now we progress the bravo quest again by throwing sys-maint-ready
    print "\nevent 1b"
    event1b = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-maintenance", "ready")
    )
    assert bravo_quest.get_open_labors().all()[0].creation_event == event1b
    assert bravo_quest.get_open_labors().all()[0].starting_labor_id == hosts[0].events[0].id
    assert len(bravo_quest.labors) == 3

    # Now we progress the charlie quest with the system-reboot-completed event
    # but bravo quest stays put
    print "\nevent 2"
    event2 = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-reboot", "completed")
    )
    assert bravo_quest.completion_time is None
    assert len(bravo_quest.labors) == 3
    assert charlie_quest.get_open_labors().all()[0].creation_event == event2
    assert charlie_quest.get_open_labors().all()[0].starting_labor_id == hosts[0].events[1].id
    assert charlie_quest.completion_time is None
    assert len(charlie_quest.labors) == 2

    # since the previous event progressed the workflow, this one below
    # shouldn't create a labor since system-reboot-completed labors are
    # intermediates
    print "\nevent 3"
    event3 = Event.create(
        sample_data2, hosts[0], "system",
        EventType.get_event_type(sample_data2, "system-reboot", "completed")
    )

    # we will have a 6th event here due to event3
    assert len(hosts[0].events) == 6

    assert len(charlie_quest.labors) == 2
    assert len(charlie_quest.get_open_labors().all()) == 1

    assert charlie_quest.get_open_labors().all()[0].creation_event == event2
    assert charlie_quest.get_open_labors().all()[0].quest == charlie_quest

    assert len(sample_data2.query(Labor).all()) == 5
Пример #26
0
def test_mass_creation(sample_data1):
    hosts = [
        sample_data1.query(Host).filter(
            Host.hostname == 'example.dropbox.com'
        ).one(),
        sample_data1.query(Host).filter(
            Host.hostname == 'test.dropbox.com'
        ).one(),
    ]

    labors = sample_data1.query(Labor).all()
    assert len(labors) == 0

    fate = (
        sample_data1.query(Fate).get(1)
    )

    creation_event_type1 = fate.creation_event_type


    target_time1 = datetime.now() + timedelta(days=7)
    target_time2 = datetime.now() + timedelta(days=10)
    target_time3 = datetime.now() + timedelta(days=14)

    Quest.create(
        sample_data1, "testman", hosts, target_time1, fate_id=fate.id,
        description="Embark on the long road of maintenance"
    )
    Quest.create(
        sample_data1, "testman", hosts, target_time2, fate_id=fate.id,
        description="Embark on the longer road of maintenance"
    )
    Quest.create(
        sample_data1, "testman", hosts, target_time3, fate_id=fate.id,
        description="WHEN WILL IT END!!"
    )

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 3
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert quests[1].embark_time is not None
    assert quests[1].completion_time is None
    assert quests[2].embark_time is not None
    assert quests[2].completion_time is None
    assert len(quests[0].labors) == 2
    assert len(quests[1].labors) == 2
    assert len(quests[2].labors) == 2

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 6

    # now we want to test the closing of the quest by throwing events
    # that fulfill the labors

    found_hosts = sample_data1.query(Host).filter(
        Host.hostname.in_(["example.dropbox.com", "test.dropbox.com"])
    ).all()

    assert len(found_hosts) == 2

    completion_event_type1 = (
        sample_data1.query(EventType)
        .filter(EventType.id == 2).first()
    )

    Event.create(
        sample_data1, found_hosts[0], "testdude", completion_event_type1
    )
    Event.create(
        sample_data1, found_hosts[1], "testdude", completion_event_type1
    )

    labors = Labor.get_open_unacknowledged(sample_data1)
    assert len(labors) == 0

    quests = sample_data1.query(Quest).all()

    assert len(quests) == 3
    assert quests[0].embark_time is not None
    assert quests[0].completion_time is not None
    assert quests[1].embark_time is not None
    assert quests[1].completion_time is not None
    assert quests[2].embark_time is not None
    assert quests[2].completion_time is not None
    assert quests[0].description == "Embark on the long road of maintenance"
    assert quests[0].creator == "testman"
    assert len(quests[0].labors) == 2