def handle_gc_trigger_incidents(self):
        """
        GCs incidents.
        First, find all expired incidents.
        Second, use expired incidents to delete expired gridfs data.
        Third, remove expired incidents.
        """
        self.debug("gc_trigger incidents")
        now = timestamp_s()
        incidents = self.mongo_client.incidents_collection.find(
            {"expire_at": {
                "$lt": now
            }},
            projection={
                "expire_at": True,
                "gridfs_filename": True
            })
        filenames = list(
            map(lambda incident: incident["gridfs_filename"], incidents))
        for filename in filenames:
            self.mongo_client.delete_gridfs(filename)

        delete_result = self.mongo_client.incidents_collection.delete_many(
            {"expire_at": {
                "$lt": now
            }})
        self.produce(
            Routes.gc_stat,
            util_pb2.build_gc_stat(self.NAME, mauka_pb2.INCIDENTS,
                                   delete_result.deleted_count))
        self.debug(
            "Garbage collected %d incidents and associated gridfs data" %
            delete_result.deleted_count)
 def test_which_message_oneof(self):
     payload = pb_util.build_payload("", 0, "", pb_util.mauka_pb2.MEASUREMENTS, [], 0, 0)
     self.assertEqual(pb_util.which_message_oneof(payload), pb_util.PAYLOAD)
     heartbeat = pb_util.build_heartbeat("", 0, 0, "", "")
     self.assertEqual(pb_util.which_message_oneof(heartbeat), pb_util.HEARTBEAT)
     makai_event = pb_util.build_makai_event("", 0)
     self.assertEqual(pb_util.which_message_oneof(makai_event), pb_util.MAKAI_EVENT)
     measurement = pb_util.build_measurement("", "", 0, 0, 0, 0)
     self.assertEqual(pb_util.which_message_oneof(measurement), pb_util.MEASUREMENT)
     makai_trigger = pb_util.build_makai_trigger("", 0, 0, "", 0, "")
     self.assertEqual(pb_util.which_message_oneof(makai_trigger), pb_util.MAKAI_TRIGGER)
     laha_ttl = pb_util.build_ttl("", "", 0)
     self.assertEqual(pb_util.which_message_oneof(laha_ttl), pb_util.LAHA)
     laha_gc_trigger = pb_util.build_gc_trigger("", [])
     self.assertEqual(pb_util.which_message_oneof(laha_gc_trigger), pb_util.LAHA)
     laha_gc_update = pb_util.build_gc_update("", pb_util.mauka_pb2.MEASUREMENTS, 0)
     self.assertEqual(pb_util.which_message_oneof(laha_gc_update), pb_util.LAHA)
     laha_gc_stat = pb_util.build_gc_stat("", pb_util.mauka_pb2.MEASUREMENTS, 0)
     self.assertEqual(pb_util.which_message_oneof(laha_gc_stat), pb_util.LAHA)
     trigger_request = pb_util.build_trigger_request("", 0, 0, [], 0)
     self.assertEqual(pb_util.which_message_oneof(trigger_request), pb_util.TRIGGER_REQUEST)
     triggered_event = pb_util.build_triggered_event("", [], 0, "", 0, 0)
     self.assertEqual(pb_util.which_message_oneof(triggered_event), pb_util.TRIGGERED_EVENT)
     threshold_optimization_request = pb_util.build_threshold_optimization_request("")
     self.assertEqual(pb_util.which_message_oneof(threshold_optimization_request), pb_util.THRESHOLD_OPTIMIZATION_REQUEST)
     box_optimization_request = pb_util.build_box_optimization_request("", [], 0)
     self.assertEqual(pb_util.which_message_oneof(box_optimization_request), pb_util.BOX_OPTIMIZATION_REQUEST)
 def test_build_gc_stat(self):
     mauka_message = pb_util.build_gc_stat("test",
                                           pb_util.mauka_pb2.TRENDS,
                                           1)
     self.assertTrue(isinstance(mauka_message, pb_util.mauka_pb2.MaukaMessage))
     self.assertTrue(pb_util.is_gc_stat(mauka_message))
     self.assertEqual(mauka_message.source, "test")
     self.assertEqual(mauka_message.laha.gc_stat.gc_domain, pb_util.mauka_pb2.TRENDS)
     self.assertEqual(mauka_message.laha.gc_stat.gc_cnt, 1)
 def handle_gc_trigger_trends(self):
     """
     GCs trends by removing trends older than their expire_at field.
     """
     self.debug("gc_trigger trends")
     now = timestamp_s()
     delete_result = self.mongo_client.trends_collection.delete_many(
         {"expire_at": {
             "$lt": now
         }})
     self.produce(
         Routes.gc_stat,
         util_pb2.build_gc_stat(self.NAME, mauka_pb2.TRENDS,
                                delete_result.deleted_count))
     self.debug("Garbage collected %d trends" % delete_result.deleted_count)
    def test_is_laha_and_related(self):
        laha_ttl = pb_util.build_ttl("", "", 0)
        laha_gc_trigger = pb_util.build_gc_trigger("", [])
        laha_gc_update = pb_util.build_gc_update("", pb_util.mauka_pb2.MEASUREMENTS, 0)
        laha_gc_stat = pb_util.build_gc_stat("", pb_util.mauka_pb2.MEASUREMENTS, 0)

        laha_messages = [laha_ttl, laha_gc_trigger, laha_gc_update, laha_gc_stat]
        for message in laha_messages:
            self.assertTrue(pb_util.is_laha(message))

        self.assertTrue(pb_util.is_ttl(laha_ttl))
        self.assertFalse(pb_util.is_ttl(laha_gc_stat))
        self.assertTrue(pb_util.is_gc_trigger(laha_gc_trigger))
        self.assertTrue(pb_util.is_gc_update(laha_gc_update))
        self.assertTrue(pb_util.is_gc_stat(laha_gc_stat))
 def handle_gc_trigger_measurements(self):
     """
     GCs measurements by removing measurements older than their expire_at field.
     """
     self.debug("gc_trigger measurements")
     now = timestamp_s()
     delete_result = self.mongo_client.measurements_collection.delete_many(
         {"expire_at": {
             "$lt": now
         }})
     self.produce(
         Routes.gc_stat,
         util_pb2.build_gc_stat(self.NAME, mauka_pb2.MEASUREMENTS,
                                delete_result.deleted_count))
     self.debug("Garbage collected %d measurements" %
                delete_result.deleted_count)
    def handle_gc_trigger_events(self):
        """
        GCs events.

        First, find all events whose expire_at field is older than now.
        Second, find corresponding box_events.
        Third, from box_events, delete expired gridfs files
        Fourth, delete all expired box_events
        Fifth, delete all expired events
        """
        self.debug("gc_trigger events")
        now = timestamp_s()
        events = self.mongo_client.events_collection.find(
            {"expire_at": {
                "$lt": now
            }},
            projection={
                "_id": True,
                "expire_at": True,
                "event_id": True,
                "boxes_received": True
            })

        # Find corresponding box events
        box_events = []
        for event in events:
            for box_triggered in event["boxes_received"]:
                box_event = self.mongo_client.box_events_collection.find_one(
                    {
                        "event_id": event["event_id"],
                        "box_id": box_triggered
                    },
                    projection={
                        "_id": True,
                        "event_id": True,
                        "box_id": True,
                        "data_fs_filename": True
                    })

                if box_event is not None:
                    box_events.append(box_event)

        # Cleanup gridfs files and box_events
        for box_event in box_events:
            self.mongo_client.delete_gridfs(box_event["data_fs_filename"])
            self.mongo_client.box_events_collection.delete_one(
                {"_id": box_event["_id"]})

        self.debug(
            "Garbage collected %d box_events and corresponding gridfs data" %
            len(box_events))

        # Cleanup events
        delete_result = self.mongo_client.events_collection.delete_many(
            {"expire_at": {
                "$lt": now
            }})
        self.produce(
            Routes.gc_stat,
            util_pb2.build_gc_stat(self.NAME, mauka_pb2.EVENTS,
                                   delete_result.deleted_count))
        self.debug("Garbage collected %d events" % delete_result.deleted_count)