def _ShowAlertsForKeys(self, keys): """Show alerts for |keys|. Query for anomalies with overlapping revision. The |keys| parameter for group_report is a comma-separated list of urlsafe strings for Keys for Anomaly entities. (Each key corresponds to an alert) Args: keys: Comma-separated list of urlsafe strings for Anomaly keys. """ urlsafe_keys = keys.split(',') try: keys = [ndb.Key(urlsafe=k) for k in urlsafe_keys] # Errors that can be thrown here include ProtocolBufferDecodeError # in google.net.proto.ProtocolBuffer. We want to catch any errors here # because they're almost certainly urlsafe key decoding errors. except Exception: raise request_handler.InvalidInputError( 'Invalid Anomaly key given.') requested_anomalies = utils.GetMulti(keys) for i, anomaly_entity in enumerate(requested_anomalies): if anomaly_entity is None: raise request_handler.InvalidInputError( 'No Anomaly found for key %s.' % urlsafe_keys[i]) if not requested_anomalies: raise request_handler.InvalidInputError('No anomalies found.') sheriff_key = requested_anomalies[0].sheriff min_range = utils.MinimumAlertRange(requested_anomalies) if min_range: query = anomaly.Anomaly.query( anomaly.Anomaly.sheriff == sheriff_key) query = query.order(-anomaly.Anomaly.timestamp) anomalies = query.fetch(limit=_QUERY_LIMIT) # Filter out anomalies that have been marked as invalid or ignore. # Include all anomalies with an overlapping revision range that have # been associated with a bug, or are not yet triaged. anomalies = [ a for a in anomalies if a.bug_id is None or a.bug_id > 0 ] anomalies = _GetOverlaps(anomalies, min_range[0], min_range[1]) # Make sure alerts in specified param "keys" are included. key_set = {a.key for a in anomalies} for anomaly_entity in requested_anomalies: if anomaly_entity.key not in key_set: anomalies.append(anomaly_entity) else: anomalies = requested_anomalies self._ShowAlerts(anomalies)
def _GetKeyToTestDict(anomalies): """Returns a map of Test keys to entities for the given anomalies.""" test_keys = {a.test for a in anomalies} tests = utils.GetMulti(test_keys) return {t.key: t for t in tests}
def testGetMulti_NotLoggedIn_ReturnsSomeEntities(self): keys = self._PutEntitiesHalfInternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys) / 2, len(utils.GetMulti(keys)))
def testGetMulti_LoggedIn_ReturnsAllEntities(self): keys = self._PutEntitiesHalfInternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys), len(utils.GetMulti(keys)))
def testGetMulti_AllExternal_ReturnsAllEntities(self): keys = self._PutEntitiesAllExternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys), len(utils.GetMulti(keys)))
def testGetMulti_LoggedIn(self): """Tests that GetMulti gets all of the entities when logged in.""" keys = self._PutEntitiesHalfInternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys), len(utils.GetMulti(keys)))
def testGetMulti_NotLoggedIn_OnlySome(self): """Tests that GetMulti gets some of the entities when not logged in.""" keys = self._PutEntitiesHalfInternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys) / 2, len(utils.GetMulti(keys)))
def testGetMulti_AllExternal(self): """Tests that GetMulti gets all of the entities when logged in.""" keys = self._PutEntitiesAllExternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys), len(utils.GetMulti(keys)))
def testGetMulti_ExternalUser_ReturnsSomeEntities(self): keys = self._PutEntitiesHalfInternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys) / 2, len(utils.GetMulti(keys)))
def testGetMulti_AllExternalEntities_ReturnsAllEntities(self): keys = self._PutEntitiesAllExternal() self.SetCurrentUser('*****@*****.**') self.assertEqual(len(keys), len(utils.GetMulti(keys)))