Improved the event API and added UTs for validation
This commit is contained in:
parent
cabf235343
commit
40ba116a04
|
@ -99,3 +99,7 @@ TESTS_MAP = {
|
||||||
POSSIBLE_STATUSES_KEY: [STATUS_UNEXECUTED, STATUS_CONCLUSIVE, STATUS_POSITIVE]
|
POSSIBLE_STATUSES_KEY: [STATUS_UNEXECUTED, STATUS_CONCLUSIVE, STATUS_POSITIVE]
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
EVENT_TYPE_ISLAND = "island"
|
||||||
|
EVENT_TYPE_MONKEY_NETWORK = "monkey_network"
|
||||||
|
EVENT_TYPE_MONKEY_LOCAL = "monkey_local"
|
||||||
|
EVENT_TYPES = (EVENT_TYPE_MONKEY_LOCAL, EVENT_TYPE_MONKEY_NETWORK, EVENT_TYPE_ISLAND)
|
|
@ -1,6 +1,8 @@
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
from mongoengine import EmbeddedDocument, DateTimeField, StringField
|
from mongoengine import EmbeddedDocument, DateTimeField, StringField
|
||||||
|
|
||||||
EVENT_TYPES = ("monkey_local_action", "monkey_network_action", "island_action")
|
from common.data.zero_trust_consts import EVENT_TYPES
|
||||||
|
|
||||||
|
|
||||||
class Event(EmbeddedDocument):
|
class Event(EmbeddedDocument):
|
||||||
|
@ -8,3 +10,16 @@ class Event(EmbeddedDocument):
|
||||||
title = StringField(required=True)
|
title = StringField(required=True)
|
||||||
message = StringField()
|
message = StringField()
|
||||||
event_type = StringField(required=True, choices=EVENT_TYPES)
|
event_type = StringField(required=True, choices=EVENT_TYPES)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def create_event(title, message, event_type):
|
||||||
|
event = Event(
|
||||||
|
timestamp=datetime.now(),
|
||||||
|
title=title,
|
||||||
|
message=message,
|
||||||
|
event_type=event_type
|
||||||
|
)
|
||||||
|
|
||||||
|
event.validate(clean=True)
|
||||||
|
|
||||||
|
return event
|
||||||
|
|
|
@ -2,14 +2,13 @@
|
||||||
Define a Document Schema for Zero Trust findings.
|
Define a Document Schema for Zero Trust findings.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from mongoengine import Document, StringField, ListField, EmbeddedDocumentField
|
from mongoengine import Document, StringField, EmbeddedDocumentListField
|
||||||
|
|
||||||
|
from common.data.zero_trust_consts import TEST_STATUSES, TESTS, TESTS_MAP, EXPLANATION_KEY, PILLARS_KEY
|
||||||
# Dummy import for mongoengine.
|
# Dummy import for mongoengine.
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
from event import Event
|
from event import Event
|
||||||
|
|
||||||
from common.data.zero_trust_consts import TEST_STATUSES, PILLARS, TESTS, TESTS_MAP, EXPLANATION_KEY, PILLARS_KEY
|
|
||||||
|
|
||||||
|
|
||||||
class Finding(Document):
|
class Finding(Document):
|
||||||
"""
|
"""
|
||||||
|
@ -21,7 +20,7 @@ class Finding(Document):
|
||||||
# SCHEMA
|
# SCHEMA
|
||||||
test = StringField(required=True, choices=TESTS)
|
test = StringField(required=True, choices=TESTS)
|
||||||
status = StringField(required=True, choices=TEST_STATUSES)
|
status = StringField(required=True, choices=TEST_STATUSES)
|
||||||
events = ListField(field=EmbeddedDocumentField('Event'))
|
events = EmbeddedDocumentListField(document_type=Event)
|
||||||
|
|
||||||
# LOGIC
|
# LOGIC
|
||||||
def get_test_explanation(self):
|
def get_test_explanation(self):
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
from mongoengine import ValidationError
|
||||||
|
|
||||||
|
from common.data.zero_trust_consts import EVENT_TYPE_ISLAND
|
||||||
|
from monkey_island.cc.models.event import Event
|
||||||
|
from monkey_island.cc.testing.IslandTestCase import IslandTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestEvent(IslandTestCase):
|
||||||
|
def test_create_event(self):
|
||||||
|
self.fail_if_not_testing_env()
|
||||||
|
self.clean_monkey_db()
|
||||||
|
|
||||||
|
with self.assertRaises(ValidationError):
|
||||||
|
Event.create_event(
|
||||||
|
title=None, # title required
|
||||||
|
message="bla bla",
|
||||||
|
event_type=EVENT_TYPE_ISLAND
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(ValidationError):
|
||||||
|
Event.create_event(
|
||||||
|
title="skjs",
|
||||||
|
message="bla bla",
|
||||||
|
event_type="Unknown" # Unknown event type
|
||||||
|
)
|
||||||
|
|
||||||
|
_ = Event.create_event(
|
||||||
|
title="skjs",
|
||||||
|
message="bla bla",
|
||||||
|
event_type=EVENT_TYPE_ISLAND # Unknown event type
|
||||||
|
)
|
|
@ -2,7 +2,7 @@ from datetime import datetime
|
||||||
|
|
||||||
from mongoengine import ValidationError
|
from mongoengine import ValidationError
|
||||||
|
|
||||||
from common.data.zero_trust_consts import TEST_SEGMENTATION, STATUS_CONCLUSIVE, NETWORKS
|
from common.data.zero_trust_consts import TEST_SEGMENTATION, STATUS_CONCLUSIVE, NETWORKS, EVENT_TYPE_MONKEY_NETWORK
|
||||||
from finding import Finding, UnknownTest
|
from finding import Finding, UnknownTest
|
||||||
from monkey_island.cc.models.event import Event
|
from monkey_island.cc.models.event import Event
|
||||||
|
|
||||||
|
@ -33,7 +33,8 @@ class TestFinding(IslandTestCase):
|
||||||
|
|
||||||
self.assertEquals(len(Finding.objects(test=TEST_SEGMENTATION)), 0)
|
self.assertEquals(len(Finding.objects(test=TEST_SEGMENTATION)), 0)
|
||||||
|
|
||||||
event_example = Event(timestamp=datetime.now(), title="Event Title", message="event message", event_type="monkey_network_action")
|
event_example = Event.create_event(
|
||||||
|
title="Event Title", message="event message", event_type=EVENT_TYPE_MONKEY_NETWORK)
|
||||||
Finding.save_finding(test=TEST_SEGMENTATION, status=STATUS_CONCLUSIVE, events=[event_example])
|
Finding.save_finding(test=TEST_SEGMENTATION, status=STATUS_CONCLUSIVE, events=[event_example])
|
||||||
|
|
||||||
self.assertEquals(len(Finding.objects(test=TEST_SEGMENTATION)), 1)
|
self.assertEquals(len(Finding.objects(test=TEST_SEGMENTATION)), 1)
|
||||||
|
|
Loading…
Reference in New Issue