def test_get_redmine_ticket_for_notification(self): # Create a redmine ticket and query headers = self.get_api_headers('admin', 'test') tmp = dt.datetime.now() + dt.timedelta(days=2) due_date = dt.datetime.strftime(tmp, "%Y-%m-%d") project = 'ocean-observatory' subject = 'Redmine API - Test Issue' description = 'Get this work done ASAP' priority = 1 assigned_id = 1 ticket_id = create_redmine_ticket_for_notification(project, subject, description, priority, assigned_id) self.assertTrue(ticket_id is not None) self.assertTrue(isinstance(ticket_id, int)) self.assertTrue(ticket_id > 0) result = get_redmine_ticket_for_notification(ticket_id) self.assertTrue('id' in result) self.assertTrue('project' in result) self.assertTrue('subject' in result) self.assertTrue('description' in result) self.assertTrue('status' in result) self.assertTrue('assigned_to' in result) self.assertTrue('priority' in result) # Prepare for redmine priority, status and assigned_ti assigned_to = 'Redmine Admin' status = 'New' redmine_priority = None if priority == 1: redmine_priority = 'Low' # Validate result values returned from redmine self.assertTrue(project != result['project']) self.assertEquals(result['subject'], subject) self.assertEquals(result['description'], description) self.assertEquals(result['status'], status) self.assertEquals(result['assigned_to'], assigned_to) self.assertEquals(result['priority'], redmine_priority) project = 'foo' subject = 'Redmine API - Negative Test' description = 'This should fail.' priority = 1 assigned_id = None result = create_redmine_ticket_for_notification(project, subject, description, priority, assigned_id) self.assertTrue(result is None) result = get_redmine_ticket_for_notification(-1) self.assertTrue(result is None) result = get_redmine_ticket_for_notification(ticket_id) project = None subject = None assigned_id = None result = update_redmine_ticket_for_notification(ticket_id, project, subject, description, priority, assigned_id) self.assertTrue(result is None)
def reissue_notification_redmine(alert, definition, notification): """ Create another (re-issue) redmine ticket as a part of notification process (for alerts only). """ result = None try: # Populate required fields to create a redmine ticket and get current redmine ticket project = current_app.config['REDMINE_PROJECT_ID'] redmine_ticket = get_redmine_ticket_for_notification(alert.ticket_id) # Set new notification assigned_id to be same user assigned in alert.ticket_id if 'assigned_to' in redmine_ticket: assigned_id = redmine_ticket['assigned_to'] else: # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: message = 'Invalid User ID, User record not found.' current_app.logger.info(message) raise exception(message) assigned_id = redmine_id # Update description to indicate previously issued ticket id for this alert. update_info = '\n* Associated with previously issued ticket: %d' % alert.ticket_id # Create new redmine ticket; on error, log info and return None prefix = (alert.event_type).upper() + '*: ' subject = prefix + alert.event_response description = alert.event_response + update_info priority = definition.severity ticket_id = create_redmine_ticket_for_notification(project, subject, description, priority, assigned_id) if ticket_id is None: message = 'Failed to reissue (create another)_redmine_ticket.' current_app.logger.info('[reissue_redmine_notification_ticket] %s ' % message) return result result = ticket_id return result except Exception as err: message = '[reissue_redmine_notification_ticket] message: %s' % err.message current_app.logger.info(message) return result
def test_get_redmine_ticket_for_notification(self): # Create a redmine ticket and query headers = self.get_api_headers('admin', 'test') tmp = dt.datetime.now() + dt.timedelta(days=2) due_date = dt.datetime.strftime(tmp, "%Y-%m-%d") project = 'ocean-observatory' subject = 'Redmine API - Test Issue' description = 'Get this work done ASAP' priority = 1 assigned_id = 1 ticket_id = create_redmine_ticket_for_notification( project, subject, description, priority, assigned_id) self.assertTrue(ticket_id is not None) self.assertTrue(isinstance(ticket_id, int)) self.assertTrue(ticket_id > 0) result = get_redmine_ticket_for_notification(ticket_id) self.assertTrue('id' in result) self.assertTrue('project' in result) self.assertTrue('subject' in result) self.assertTrue('description' in result) self.assertTrue('status' in result) self.assertTrue('assigned_to' in result) self.assertTrue('priority' in result) # Prepare for redmine priority, status and assigned_ti assigned_to = 'Redmine Admin' status = 'New' redmine_priority = None if priority == 1: redmine_priority = 'Low' # Validate result values returned from redmine self.assertTrue(project != result['project']) self.assertEquals(result['subject'], subject) self.assertEquals(result['description'], description) self.assertEquals(result['status'], status) self.assertEquals(result['assigned_to'], assigned_to) self.assertEquals(result['priority'], redmine_priority)
def update_notification_redmine(alert, definition, notification): """ Update redmine ticket as a part of alert notification process. """ result = None try: # Get alert ticket id ticket_id = alert.ticket_id # Populate required fields to update a redmine ticket project = current_app.config['REDMINE_PROJECT_ID'] # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: message = 'Invalid User ID, User record not found.' current_app.logger.info(message) raise Exception(message) assigned_id = redmine_id ts_updated = dt.datetime.strftime(dt.datetime.now(), "%Y-%m-%dT%H:%M:%S") update_info = '\nUpdated: %s ' % ts_updated # If no previous ticket_id associated (case where 'use_redmine' was enabled AFter alert has escalated) if ticket_id == 0: # Create redmine ticket prefix = (alert.event_type).upper() + ': ' subject = prefix + alert.event_response description = alert.event_response priority = definition.severity ticket_id = create_redmine_ticket_for_notification(project, subject, description, priority, redmine_id) if ticket_id is None: message = 'Failed to create base redmine ticket (on update) for alert notification (id:%d).' % alert.id current_app.logger.info(message) raise Exception(message) # Update escalate fields. if ticket_id is not None: escalated = True ts_escalated = dt.datetime.strftime(dt.datetime.now(), "%Y-%m-%dT%H:%M:%S") SystemEvent.update_alert_alarm_escalation(id=alert.id, ticket_id=ticket_id, escalated=escalated, ts_escalated=ts_escalated) # Get existing redmine ticket redmine_ticket = get_redmine_ticket_for_notification(ticket_id) # Set fields for update project = redmine_ticket['project'] subject = redmine_ticket['subject'] description = redmine_ticket['description'] priority = redmine_ticket['priority'] if 'assigned_to' in redmine_ticket: assigned_id = redmine_ticket['assigned_to'] # Update subject for recent receipt of alert (not past escalate boundary yet) description += update_info result = update_redmine_ticket_for_notification(ticket_id, project, subject, description, priority, assigned_id) if result is None: message = 'Failed to update redmine ticket (ticket_id: %d)' % ticket_id current_app.logger.info(message) raise Exception(message) return ticket_id except Exception as err: message = '[update_redmine_notification_ticket] %s ' % str(err.message) current_app.logger.info(message) return result
def reissue_notification_ticket(id): """ Create another (re-issue) redmine ticket as a part of notification process (for alerts only) """ debug = False # development debug #log = False # used in except blocks result = None try: if debug: print '\n \t(debug) entered reissue_notification_ticket, id: ', id # Get alert, definition and notification to update redmine ticket alert, definition, notification = get_redmine_info_from_alert(id) if alert is None or definition is None or notification is None: message = 'Failed to retrieve alert, definition or notification for update_notification_ticket. (id: %d)' % id current_app.logger.exception('[update_notification_ticket] %s ' % message) raise Exception(message) # Populate required fields to create a redmine ticket project = current_app.config['REDMINE_PROJECT_ID'] if debug: print '\n \t(debug) -- Reissue redmine ticket (project: %s), get ticket_id...' % project print '\n \t(debug) -- Current ticket id: ', alert.ticket_id # Get current redmine ticket redmine_ticket = get_redmine_ticket_for_notification(alert.ticket_id) if debug: print '\n \t(debug) -- Current redmine ticket: ', redmine_ticket # Set assigned id to reflect update to user currently assigned to alert.ticket_id #assigned_id = redmine_ticket['assigned_to'] if 'assigned_to' in redmine_ticket: assigned_id = redmine_ticket['assigned_to'] else: # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 name = None assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: # todo issue - assigned_user is None message = "Invalid User ID, User record not found." #if log: print '\n message: ', message return bad_request(message) assigned_id = redmine_id # Update description to indicate previously issued ticket id for this alert. update_info = '\n* Associated with previously issued ticket: %d' % alert.ticket_id if debug: print '\n \t(debug) -- New reissued ticket update_info: ', update_info # Create new redmine ticket prefix = (alert.event_type).upper() + '*: ' subject = prefix + alert.event_response description = alert.event_response + update_info priority = definition.severity if debug: print '\n \t(debug) New ticket subject: ', subject if debug: print '\n \t(debug) New ticket description: ', description ticket_id = create_redmine_ticket_for_notification( project, subject, description, priority, assigned_id) if ticket_id is None: message = 'Failed to reissue (create another new)_redmine_ticket.' current_app.logger.exception('[reissue_notification_ticket] %s ' % message) return result # update escalate fields if successful creating the redmine ticket escalated = True ts_escalated = dt.datetime.strftime( dt.datetime.now(), "%Y-%m-%dT%H:%M:%S") # should this be event_time? SystemEvent.update_alert_alarm_escalation(id=alert.id, ticket_id=ticket_id, escalated=escalated, ts_escalated=ts_escalated) if debug: print '\n \t(debug) reissue_notification_ticket -- updated alert_alarm: ', alert.to_json( ) ticket_link_id = TicketSystemEventLink.insert_ticket_link( system_event_id=alert.id, ticket_id=ticket_id) if debug: print '\n \t(debug) -- (notifications) ticket_link_id: ', ticket_link_id ''' # debug - view contents of alert_alarm escalation fields; verify changes have been persisted escalated_alert_alarm = SystemEvent.query.get(alert_alarm.id) print '\n (debug) *** escalated alert_alarm.to_json(): ', escalated_alert_alarm.to_json() ''' result = ticket_id if debug: print '\n \treissue_notification_ticket - ticket_id: ', ticket_id except Exception as err: message = err.message current_app.logger.exception('[reissue_notification_ticket] %s ' % message) finally: return result
def update_notification_ticket(id): """ Update redmine ticket as a part of notification process (for alerts only) """ debug = False #log = False result = None try: # Get alert, definition and notification to update redmine ticket alert, definition, notification = get_redmine_info_from_alert(id) if alert is None or definition is None or notification is None: message = 'Failed to retrieve alert, definition or notification for update_notification_ticket. (id: %d)' % id raise Exception(message) # Populate required fields to create a redmine ticket project = current_app.config['REDMINE_PROJECT_ID'] # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 name = None assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: # todo issue - assigned_user is None message = "Invalid User ID, User record not found." #if log: print '\n message: ', message return bad_request(message) # Get alert ticket id ticket_id = alert.ticket_id #if debug: print '\n (debug) update_notification_ticket id: ', ticket_id ts_updated = dt.datetime.strftime(dt.datetime.now(), "%Y-%m-%dT%H:%M:%S") update_info = '\nUpdated: %s ' % ts_updated # Get current redmine ticket redmine_ticket = get_redmine_ticket_for_notification(ticket_id) # Set fields for update project = redmine_ticket['project'] subject = redmine_ticket['subject'] description = redmine_ticket['description'] priority = redmine_ticket['priority'] if 'assigned_to' in redmine_ticket: assigned_id = redmine_ticket['assigned_to'] else: # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 name = None assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: # todo issue - assigned_user is None message = "Invalid User ID, User record not found." #if log: print '\n message: ', message return bad_request(message) assigned_id = redmine_id # Update subject for recent receipt of alert (not past escalate boundary yet) description += update_info result = update_redmine_ticket_for_notification( ticket_id, project, subject, description, priority, assigned_id) if result is None: message = 'Failed to update redmine ticket (ticket_id: %d' % ticket_id raise Exception(message) if debug: print '\n \tupdate_notification_ticket - ticket_id: ', ticket_id return ticket_id except Exception as err: message = err.message current_app.logger.exception('[update_notification_ticket] %s ' % message) return result
def reissue_notification_ticket(id): """ Create another (re-issue) redmine ticket as a part of notification process (for alerts only) """ debug = False # development debug #log = False # used in except blocks result = None try: if debug: print '\n \t(debug) entered reissue_notification_ticket, id: ', id # Get alert, definition and notification to update redmine ticket alert, definition, notification = get_redmine_info_from_alert(id) if alert is None or definition is None or notification is None: message = 'Failed to retrieve alert, definition or notification for update_notification_ticket. (id: %d)' % id current_app.logger.exception('[update_notification_ticket] %s ' % message) raise Exception(message) # Populate required fields to create a redmine ticket project = current_app.config['REDMINE_PROJECT_ID'] if debug: print '\n \t(debug) -- Reissue redmine ticket (project: %s), get ticket_id...' % project print'\n \t(debug) -- Current ticket id: ', alert.ticket_id # Get current redmine ticket redmine_ticket = get_redmine_ticket_for_notification(alert.ticket_id) if debug: print '\n \t(debug) -- Current redmine ticket: ', redmine_ticket # Set assigned id to reflect update to user currently assigned to alert.ticket_id #assigned_id = redmine_ticket['assigned_to'] if 'assigned_to' in redmine_ticket: assigned_id = redmine_ticket['assigned_to'] else: # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 name = None assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: # todo issue - assigned_user is None message = "Invalid User ID, User record not found." #if log: print '\n message: ', message return bad_request(message) assigned_id = redmine_id # Update description to indicate previously issued ticket id for this alert. update_info = '\n* Associated with previously issued ticket: %d' % alert.ticket_id if debug: print '\n \t(debug) -- New reissued ticket update_info: ', update_info # Create new redmine ticket prefix = (alert.event_type).upper() + '*: ' subject = prefix + alert.event_response description = alert.event_response + update_info priority = definition.severity if debug: print '\n \t(debug) New ticket subject: ', subject if debug: print '\n \t(debug) New ticket description: ', description ticket_id = create_redmine_ticket_for_notification(project, subject, description, priority, assigned_id) if ticket_id is None: message = 'Failed to reissue (create another new)_redmine_ticket.' current_app.logger.exception('[reissue_notification_ticket] %s ' % message) return result # update escalate fields if successful creating the redmine ticket escalated = True ts_escalated = dt.datetime.strftime(dt.datetime.now(), "%Y-%m-%dT%H:%M:%S") # should this be event_time? SystemEvent.update_alert_alarm_escalation(id=alert.id, ticket_id=ticket_id, escalated=escalated, ts_escalated=ts_escalated) if debug: print '\n \t(debug) reissue_notification_ticket -- updated alert_alarm: ', alert.to_json() ticket_link_id = TicketSystemEventLink.insert_ticket_link(system_event_id=alert.id, ticket_id=ticket_id) if debug: print '\n \t(debug) -- (notifications) ticket_link_id: ', ticket_link_id ''' # debug - view contents of alert_alarm escalation fields; verify changes have been persisted escalated_alert_alarm = SystemEvent.query.get(alert_alarm.id) print '\n (debug) *** escalated alert_alarm.to_json(): ', escalated_alert_alarm.to_json() ''' result = ticket_id if debug: print '\n \treissue_notification_ticket - ticket_id: ', ticket_id except Exception as err: message = err.message current_app.logger.exception('[reissue_notification_ticket] %s ' % message) finally: return result
def update_notification_ticket(id): """ Update redmine ticket as a part of notification process (for alerts only) """ debug = False #log = False result = None try: # Get alert, definition and notification to update redmine ticket alert, definition, notification = get_redmine_info_from_alert(id) if alert is None or definition is None or notification is None: message = 'Failed to retrieve alert, definition or notification for update_notification_ticket. (id: %d)' % id raise Exception(message) # Populate required fields to create a redmine ticket project = current_app.config['REDMINE_PROJECT_ID'] # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 name = None assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: # todo issue - assigned_user is None message = "Invalid User ID, User record not found." #if log: print '\n message: ', message return bad_request(message) # Get alert ticket id ticket_id = alert.ticket_id #if debug: print '\n (debug) update_notification_ticket id: ', ticket_id ts_updated = dt.datetime.strftime(dt.datetime.now(), "%Y-%m-%dT%H:%M:%S") update_info = '\nUpdated: %s ' % ts_updated # Get current redmine ticket redmine_ticket = get_redmine_ticket_for_notification(ticket_id) # Set fields for update project = redmine_ticket['project'] subject = redmine_ticket['subject'] description = redmine_ticket['description'] priority = redmine_ticket['priority'] if 'assigned_to' in redmine_ticket: assigned_id = redmine_ticket['assigned_to'] else: # Use user_event_notification for determining assigned user's redmine id redmine_id = 1 name = None assigned_user = User.query.get(notification.user_id) if assigned_user is not None: name = assigned_user.first_name + ' ' + assigned_user.last_name tmp_id = get_user_redmine_id(project, name) if tmp_id is not None: redmine_id = tmp_id else: # todo issue - assigned_user is None message = "Invalid User ID, User record not found." #if log: print '\n message: ', message return bad_request(message) assigned_id = redmine_id # Update subject for recent receipt of alert (not past escalate boundary yet) description += update_info result = update_redmine_ticket_for_notification(ticket_id, project, subject, description, priority, assigned_id) if result is None: message = 'Failed to update redmine ticket (ticket_id: %d' % ticket_id raise Exception(message) if debug: print '\n \tupdate_notification_ticket - ticket_id: ', ticket_id return ticket_id except Exception as err: message = err.message current_app.logger.exception('[update_notification_ticket] %s ' % message) return result