class ConnectionTest(unittest.TestCase): def setUp(self): #self.con = Connection('http://teamsys.intellij.net', 'resttest', 'resttest') self.con = Connection("http://localhost:8081", "root", "root") def test_getProject(self): p = self.con.getProject('SB') self.assertEqual(p.id, 'SB') self.assertEqual(p.name, 'Sandbox') def test_getSubsystems(self): subsystems = self.con.getSubsystems('SB') default = [s for s in subsystems if s.isDefault][0] self.assertTrue(default is not None) def test_getIssue(self): i = self.con.getIssue('SB-1') self.assertEqual(i.id, 'SB-1') self.assertEqual(i.numberInProject, '1') self.assertEqual(i.projectShortName, 'SB') def test_createIssue(self): i = self.con.createIssue('SB', 'resttest', 'Test issue', 'Test description', '2', 'Bug', 'First', 'Open', '', '', '') self.assertEqual(i.projectShortName, 'SB') self.assertEqual(i.priority, '2') self.assertEqual(i.type, 'Bug') self.assertEqual(i.subsystem, 'First') def test_createIssueAttachment(self): i = self.con.createIssue('SB', 'resttest', 'For attachmkents test', 'Test description', '2', 'Bug', 'First', 'Open', '', '', '') fname = 'connection_test.py' content = open(fname) self.con.createAttachment(i.id, fname, content) self.assertEqual(fname, self.con.getAttachments(i.id)[0].name) def test_createAndDeleteSubsystem(self): name = 'Test Subsystem [' + str(random.random()) + "]" self.con.createSubsystemDetailed('SB', name, False, 'resttest') s = self.con.getSubsystem('SB', name) self.assertEqual(s.name, name) self.assertEqual(s.isDefault, 'false') #todo: uncomment when fix deployed to teamsys #self.assertEqual(s.defaultAssignee, 'resttest') self.con.deleteSubsystem('SB', name) def test_importIssues(self): issues = self.con.getIssues("A", "", 0, 10) for issue in issues: if hasattr(issue, "Assignee"): issue["assigneeName"] = issue["Assignee"] del issue.Assignee self.con.importIssues("B", "assignees", issues)
def submit(self): try: connection = Connection(settings.YOUTRACK_URL, settings.YOUTRACK_LOGIN, settings.YOUTRACK_PASSWORD) response, content = connection.createIssue(self.project, assignee=None, summary=u'Issue from feedback form', description=self.cleaned_data['description']) print response issue_id = response['location'].split('/')[-1] connection.executeCommand(issue_id, 'Customer email ' + self.cleaned_data['email']) return True except YouTrackException: return False
def submit(self): try: connection = Connection(settings.YOUTRACK_URL, settings.YOUTRACK_LOGIN, settings.YOUTRACK_PASSWORD) response, content = connection.createIssue(self.project, assignee=None, summary=self.get_summary().encode('utf-8'), description=self.cleaned_data['description'].encode('utf-8')) issue_id = response['location'].split('/')[-1] commands = '' if self.subsystem is not None: commands += ' Subsystem %s' % self.subsystem commands += ' Customer email ' + self.cleaned_data['email'] connection.executeCommand(issue_id, commands) return True except YouTrackException: return False
def submit(self): try: connection = Connection(settings.YOUTRACK_URL, settings.YOUTRACK_LOGIN, settings.YOUTRACK_PASSWORD) response, content = connection.createIssue( self.project, assignee=None, summary=u'Issue from feedback form', description=self.cleaned_data['description']) print response issue_id = response['location'].split('/')[-1] connection.executeCommand( issue_id, 'Customer email ' + self.cleaned_data['email']) return True except YouTrackException: return False
def post(self, request, format=None): serializer = self.get_serializer_class() log.debug(type(request.DATA)) if isinstance(request.DATA, QueryDict): data = request.DATA.dict() user = request.user elif isinstance(request.DATA, dict): data = request.DATA user = request.user else: data = request.DATA log.debug(data) try: if len(settings.REDMINE_ADDRESS): serializer = serializer(data=data) if serializer.is_valid(): obj = serializer.save() try: ret = request_redmine('issues', data=obj.to_json(), method='POST') except urllib2.HTTPError as ex: log.debug("HTTPError") return Response(data={ 'code': ex.code, 'message': ex.reason }, status=status.HTTP_400_BAD_REQUEST) except urllib2.URLError as ex: log.debug("URLError") return Response(data={'reason': ex.reason[1]}, status=status.HTTP_400_BAD_REQUEST) log.debug(ret) return Response(serializer.data, status=status.HTTP_201_CREATED) else: log.debug("Serializer is invalid") else: log.debug("No redmine address") except AttributeError: log.debug("Redmine address not set.") try: if len(settings.YOUTRACK_ADDRESS): log.debug("YouTrack address is set") conn = YTConnection(settings.YOUTRACK_ADDRESS, settings.YOUTRACK_USER, settings.YOUTRACK_PASSWORD) serializer = YouTrackIssueSerializer(data=data) if serializer.is_valid(): obj = serializer.save() description = obj.description ret = conn.createIssue(obj.project_id, assignee=None, summary=obj.subject, description=description, priority=obj.priority, type=obj.type, subsystem=obj.subsystem) log.debug(ret) ret_dict = obj.to_dict() try: del (ret_dict['project_id']) except KeyError: pass return Response(ret_dict, status=status.HTTP_201_CREATED) except AttributeError: log.debug("YouTrack address not set.") return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
yt = Connection('http://teamsys.intellij.net', 'resttest', 'resttest')#, proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8888)) #yt = Connection('http://localhost:8080', 'root', 'root') #yt = Connection('http://v-rot-mne-nogi.myjetbrains.com/youtrack', 'root', 'root') #, proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8888)) print 'connected' # create subsystem #print yt.createSubsystemDetailed('ADM', 'ss' + str(random.random()), False, 'root') # get issue #i = yt.getIssue('SB-4950') #print i print yt.createIssue('SB', 'resttest', 'test', 'test', '1', 'Bug', 'Unknown', 'Open', '', '', '') #print i.getAttachments() #a = i.getAttachments()[0] #print a # #content = open('socks.py') #print yt2.createAttachment('ADM-1', a.name, content, 'root', contentLength=int(content.headers.dict['content-length']), contentType=content.info().type) #i = yt.getIssues('ADM', 'tut', 0, 100) #print i #print i[0].getLinks() #print i[0].getAttachments() #print i[0].getComments() #print yt.getSubsystems('JT') #print yt.getIssue('JT-4832')
) #, proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8888)) #yt = Connection('http://localhost:8080', 'root', 'root') #yt = Connection('http://v-rot-mne-nogi.myjetbrains.com/youtrack', 'root', 'root') #, proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8888)) print 'connected' # create subsystem #print yt.createSubsystemDetailed('ADM', 'ss' + str(random.random()), False, 'root') # get issue #i = yt.getIssue('SB-4950') #print i print yt.createIssue('SB', 'resttest', 'test', 'test', '1', 'Bug', 'Unknown', 'Open', '', '', '') #print i.getAttachments() #a = i.getAttachments()[0] #print a # #content = open('socks.py') #print yt2.createAttachment('ADM-1', a.name, content, 'root', contentLength=int(content.headers.dict['content-length']), contentType=content.info().type) #i = yt.getIssues('ADM', 'tut', 0, 100) #print i #print i[0].getLinks() #print i[0].getAttachments() #print i[0].getComments() #print yt.getSubsystems('JT') #print yt.getIssue('JT-4832')
def post(self, request, format=None): serializer = self.get_serializer_class() log.debug(type(request.DATA)) if isinstance(request.DATA, QueryDict): data = request.DATA.dict() new_extra = OrderedDict() to_del = [] for key, value in data.iteritems(): if key.startswith('extra') and not key.endswith('extra'): log.debug(key) new_key = key.split('[')[1][:-1] new_extra[new_key] = value to_del.append(key) for element in to_del: del (data[element]) user = request.user if not 'user' in new_extra: new_extra['user'] = u"%s (%s) - %s" % (user.username, user.get_full_name(), user.email) if not 'user-agent' in new_extra: new_extra['user-agent'] = request.META.get('HTTP_USER_AGENT', None) if not 'referer' in new_extra: new_extra['referer'] = request.META.get('HTTP_REFERER', None) if not 'ip' in new_extra: new_extra['ip'] = ip.get_ip(request) if not 'tenant' in new_extra: new_extra['tenant'] = request.META.get('HTTP_HOST', None) data['extra'] = new_extra elif isinstance(request.DATA, dict): data = request.DATA try: extra = data['extra'] except KeyError: extra = {} new_extra = OrderedDict(extra) user = request.user if not 'user' in new_extra: new_extra['user'] = u"%s (%s) - %s" % (user.username, user.get_full_name(), user.email) if not 'user-agent' in new_extra: new_extra['user-agent'] = request.META.get('HTTP_USER_AGENT', None) if not 'referer' in new_extra: new_extra['referer'] = request.META.get('HTTP_REFERER', None) if not 'ip' in new_extra: new_extra['ip'] = ip.get_ip(request) if not 'tenant' in new_extra: new_extra['tenant'] = request.META.get('HTTP_HOST', None) data['extra'] = new_extra else: data = request.DATA log.debug(data) try: if len(settings.REDMINE_ADDRESS): serializer = serializer(data=data) if serializer.is_valid(): obj = serializer.save() try: ret = request_redmine('issues', data=obj.to_json(), method='POST') except urllib2.HTTPError as ex: log.debug("HTTPError") return Response(data={'code': ex.code, 'message': ex.reason}, status=status.HTTP_400_BAD_REQUEST) except urllib2.URLError as ex: log.debug("URLError") return Response(data={'reason': ex.reason[1]}, status=status.HTTP_400_BAD_REQUEST) log.debug(ret) return Response(serializer.data, status=status.HTTP_201_CREATED) else: log.debug("Serializer is invalid") else: log.debug("No redmine address") except AttributeError: log.debug("Redmine address not set.") try: if len(settings.YOUTRACK_ADDRESS): log.debug("YouTrack address is set") conn = YTConnection(settings.YOUTRACK_ADDRESS, settings.YOUTRACK_USER, settings.YOUTRACK_PASSWORD) serializer = YouTrackIssueSerializer(data=data) if serializer.is_valid(): obj = serializer.save() if obj.extra: context = { 'description': obj.description, 'extra': obj.extra, } template = get_template(obj.template_name) context = Context(context) description = template.render(context) else: description = obj.description ret = conn.createIssue(obj.project_id, assignee=None, summary=obj.subject, description=description, priority=obj.priority, type=obj.type, subsystem=obj.subsystem) log.debug(ret) ret_dict = obj.to_dict() try: del(ret_dict['project_id']) except KeyError: pass return Response(ret_dict, status=status.HTTP_201_CREATED) except AttributeError: log.debug("YouTrack address not set.") return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def post(self, request, format=None): serializer = self.get_serializer_class() log.debug(type(request.DATA)) if isinstance(request.DATA, QueryDict): data = request.DATA.dict() user = request.user elif isinstance(request.DATA, dict): data = request.DATA user = request.user else: data = request.DATA log.debug(data) try: if len(settings.REDMINE_ADDRESS): serializer = serializer(data=data) if serializer.is_valid(): obj = serializer.save() try: ret = request_redmine('issues', data=obj.to_json(), method='POST') except urllib2.HTTPError as ex: log.debug("HTTPError") return Response(data={'code': ex.code, 'message': ex.reason}, status=status.HTTP_400_BAD_REQUEST) except urllib2.URLError as ex: log.debug("URLError") return Response(data={'reason': ex.reason[1]}, status=status.HTTP_400_BAD_REQUEST) log.debug(ret) return Response(serializer.data, status=status.HTTP_201_CREATED) else: log.debug("Serializer is invalid") else: log.debug("No redmine address") except AttributeError: log.debug("Redmine address not set.") try: if len(settings.YOUTRACK_ADDRESS): log.debug("YouTrack address is set") conn = YTConnection(settings.YOUTRACK_ADDRESS, settings.YOUTRACK_USER, settings.YOUTRACK_PASSWORD) serializer = YouTrackIssueSerializer(data=data) if serializer.is_valid(): obj = serializer.save() description = obj.description ret = conn.createIssue(obj.project_id, assignee=None, summary=obj.subject, description=description, priority=obj.priority, type=obj.type, subsystem=obj.subsystem) log.debug(ret) ret_dict = obj.to_dict() try: del(ret_dict['project_id']) except KeyError: pass return Response(ret_dict, status=status.HTTP_201_CREATED) except AttributeError: log.debug("YouTrack address not set.") return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def Main(sendTo, subject, yamlMessage): """ Workflow Zabbix-YouTrack :param sendTo: URL to Youtrack (ex. https://youtrack.example.com) :param subject: subject from Zabbix Action :param yamlMessage: message from Zabbix Action :return: """ # ----- Use below example yamlMessage to debug ----- # yamlMessage = """Name: 'Test Zabbix-YT workflow, ignore it' # Text: 'Agent ping (server:agent.ping()): DOWN (1) ' # Hostname: 'server.exmpale.ru' # Status: "OK" # Severity: "High" # EventID: "96976" # TriggerID: "123456789012" """ messages = yaml.load(yamlMessage) # ----- START Issue parameters ----- # Correspondence between the YouTrackPriority and ZabbixSeverity # Critical >= High # Normal < High ytPriority = 'Normal' if messages['Severity'] == 'Disaster' or messages['Severity'] == 'High': ytPriority = 'Critical' ytName = "{} ZabbixTriggerID::{}".format(messages['Name'], messages['TriggerID']) # ----- END Issue parameters ----- # ----- START Youtrack Issue description ----- # Search link to other issue searchString = "Hostname: '{}'".format(messages['Hostname']) linkToHostIssue = "{youtrack}/issues/{projectname}?q={query}".format( youtrack=sendTo, projectname=YT_PROJECT_NAME, query=urllib.parse.quote(searchString, safe='') ) issueDescription = """ {ytName} ----- {yamlMessage} ----- - [https://zabbix.example.com/zabbix.php?action=dashboard.view Zabbix Dashboard] - Show [{linkToHostIssue} all issue for *this host*] """.format( ytName=ytName, yamlMessage=yamlMessage, linkToHostIssue=linkToHostIssue, ) # ----- END Youtrack Issue description ----- # ----- START Youtrack current week ----- # Create connect to Youtrack API connection = Connection(sendTo, YT_USER, YT_PASSWORD) # Get current week in YT format (Sprint planned) version = connection.getAllBundles('version') for fixVersion in version[0].values: if fixVersion['archived'] == False and fixVersion['released'] == False: fixVersionWeek = fixVersion['name'] break # ----- END Youtrack current week ----- # ----- START Youtrack get or create issue ----- # Get issue if exist # Search for TriggerID createNewIssue = False logger.debug("Get issue with text '{}'".format(messages['TriggerID'])) issue = connection.getIssues(YT_PROJECT_NAME, "ZabbixTriggerID::{}".format(messages['TriggerID']), 0, 1) if len(issue) == 0: createNewIssue = True else: # if issue contains TriggerID in summary, then it's good issue # else create new issue, this is bad issue, not from Zabbix if "ZabbixTriggerID::{}".format(messages['TriggerID']) in issue[0]['summary']: issueId = issue[0]['id'] issue = connection.getIssue(issueId) else: createNewIssue = True # Create new issue if createNewIssue: logger.debug("Create new issue because it is not exist") issue = connection.createIssue(YT_PROJECT_NAME, 'Unassigned', ytName, issueDescription, priority=ytPriority, subsystem=YT_SUBSYSTEM, type=YT_TYPE, ) time.sleep(3) # Parse ID for new issue result = re.search(r'(CM-\d*)', issue[0]['location']) issueId = result.group(0) issue = connection.getIssue(issueId) logger.debug("Issue have id={}".format(issueId)) # Set issue service ExecAndLog(connection, issueId, "Service {}".format(YT_SERVICE)) # Update priority ExecAndLog(connection, issueId, "Priority {}".format(ytPriority)) # ----- END Youtrack get or create issue ----- # ----- START PROBLEM block ------ if messages['Status'] == "PROBLEM": # Issue exist and NOT Hold on, Unnassigned and Estimated time set if issue['State'] != 'Hold on': # Estimated time ExecAndLog(connection, issueId, "Estimated time {}".format(YT_TIME)) # Update fix version ExecAndLog(connection=connection, issueId=issueId, command="Sprint planned {}".format(fixVersionWeek)) # Reopen if Fixed or Verified or Canceled if issue['State'] == 'Fixed' or issue['State'] == 'Verified' or issue['State'] == 'Canceled': # Reopen Issue ExecAndLog(connection, issueId, "State reopen") # Assignee issue ExecAndLog(connection, issueId, command="Assignee Unassigned") # Update summary and description for issue logger.debug("Run command in {issueId}: {command}".format(issueId=issueId, command="""Update summary and description with connection.updateIssue method""" )) connection.updateIssue(issueId=issueId, summary=ytName, description=issueDescription) # Add comment logger.debug("Run command in {issueId}: {command}".format(issueId=issueId, command="""Now is PROBLEM {}""".format( messages['Text']) )) connection.executeCommand(issueId=issueId, command="", comment=YT_COMMENT.format( status=messages['Status'], text=messages['Text']) ) # Send ID to Zabbix: logger.debug("ZABBIX-API: Send Youtrack ID to {}".format(messages['EventID'])) Zbx.event.acknowledge(eventids=messages['EventID'], message="Create Youtrack task") Zbx.event.acknowledge(eventids=messages['EventID'], message="https://youtrack.example.com/issue/{}".format(issueId)) # ----- End PROBLEM block ------ # ----- Start OK block ----- if messages['Status'] == "OK": if issue['State'] == 'Hold on' or issue['State'] == 'Registered': # Cancel if not in work ExecAndLog(connection, issueId, command="State Cancel") # Assignee issue ExecAndLog(connection, issueId, command="Assignee {}".format(YT_ASSIGNEE)) if issue['State'] == 'Fixed': # Verify if Fixed ExecAndLog(connection, issueId, command="State verify") logger.debug("Run command in {issueId}: {command}".format(issueId=issueId, command="""Now is OK {}""".format(messages['Text']) )) connection.executeCommand(issueId=issueId, command="", comment=YT_COMMENT.format( status=messages['Status'], text=messages['Text']) )
def Main(sendTo, subject, yamlMessage): """ Workflow Zabbix-YouTrack :param sendTo: URL to Youtrack (ex. https://youtrack.example.com) :param subject: subject from Zabbix Action :param yamlMessage: message from Zabbix Action :return: """ # ----- Use below example yamlMessage to debug ----- # yamlMessage = """Name: 'Test Zabbix-YT workflow, ignore it' # Text: 'Agent ping (server:agent.ping()): DOWN (1) ' # Hostname: 'server.exmpale.ru' # Status: "OK" # Severity: "High" # EventID: "96976" # TriggerID: "123456789012" """ messages = yaml.load(yamlMessage) # ----- START Issue parameters ----- # Correspondence between the YouTrackPriority and ZabbixSeverity # Critical >= High # Normal < High ytPriority = 'Normal' if messages['Severity'] == 'Disaster' or messages['Severity'] == 'High': ytPriority = 'Critical' ytName = "{} ZabbixTriggerID::{}".format(messages['Name'], messages['TriggerID']) # ----- END Issue parameters ----- # ----- START Youtrack Issue description ----- # Search link to other issue searchString = "Hostname: '{}'".format(messages['Hostname']) linkToHostIssue = "{youtrack}/issues/{projectname}?q={query}".format( youtrack=sendTo, projectname=YT_PROJECT_NAME, query=urllib.parse.quote(searchString, safe='')) issueDescription = """ {ytName} ----- {yamlMessage} ----- - [https://zabbix.example.com/zabbix.php?action=dashboard.view Zabbix Dashboard] - Show [{linkToHostIssue} all issue for *this host*] """.format( ytName=ytName, yamlMessage=yamlMessage, linkToHostIssue=linkToHostIssue, ) # ----- END Youtrack Issue description ----- # ----- START Youtrack current week ----- # Create connect to Youtrack API connection = Connection(sendTo, YT_USER, YT_PASSWORD) # Get current week in YT format (Sprint planned) version = connection.getAllBundles('version') for fixVersion in version[0].values: if fixVersion['archived'] == False and fixVersion['released'] == False: fixVersionWeek = fixVersion['name'] break # ----- END Youtrack current week ----- # ----- START Youtrack get or create issue ----- # Get issue if exist # Search for TriggerID createNewIssue = False logger.debug("Get issue with text '{}'".format(messages['TriggerID'])) issue = connection.getIssues( YT_PROJECT_NAME, "ZabbixTriggerID::{}".format(messages['TriggerID']), 0, 1) if len(issue) == 0: createNewIssue = True else: # if issue contains TriggerID in summary, then it's good issue # else create new issue, this is bad issue, not from Zabbix if "ZabbixTriggerID::{}".format( messages['TriggerID']) in issue[0]['summary']: issueId = issue[0]['id'] issue = connection.getIssue(issueId) else: createNewIssue = True # Create new issue if createNewIssue: logger.debug("Create new issue because it is not exist") issue = connection.createIssue( YT_PROJECT_NAME, 'Unassigned', ytName, issueDescription, priority=ytPriority, subsystem=YT_SUBSYSTEM, type=YT_TYPE, ) time.sleep(3) # Parse ID for new issue result = re.search(r'(CM-\d*)', issue[0]['location']) issueId = result.group(0) issue = connection.getIssue(issueId) logger.debug("Issue have id={}".format(issueId)) # Set issue service ExecAndLog(connection, issueId, "Service {}".format(YT_SERVICE)) # Update priority ExecAndLog(connection, issueId, "Priority {}".format(ytPriority)) # ----- END Youtrack get or create issue ----- # ----- START PROBLEM block ------ if messages['Status'] == "PROBLEM": # Issue exist and NOT Hold on, Unnassigned and Estimated time set if issue['State'] != 'Hold on': # Estimated time ExecAndLog(connection, issueId, "Estimated time {}".format(YT_TIME)) # Update fix version ExecAndLog(connection=connection, issueId=issueId, command="Sprint planned {}".format(fixVersionWeek)) # Reopen if Fixed or Verified or Canceled if issue['State'] == 'Fixed' or issue['State'] == 'Verified' or issue[ 'State'] == 'Canceled': # Reopen Issue ExecAndLog(connection, issueId, "State reopen") # Assignee issue ExecAndLog(connection, issueId, command="Assignee Unassigned") # Update summary and description for issue logger.debug("Run command in {issueId}: {command}".format( issueId=issueId, command= """Update summary and description with connection.updateIssue method""" )) connection.updateIssue(issueId=issueId, summary=ytName, description=issueDescription) # Add comment logger.debug("Run command in {issueId}: {command}".format( issueId=issueId, command="""Now is PROBLEM {}""".format(messages['Text']))) connection.executeCommand(issueId=issueId, command="", comment=YT_COMMENT.format( status=messages['Status'], text=messages['Text'])) # Send ID to Zabbix: logger.debug("ZABBIX-API: Send Youtrack ID to {}".format( messages['EventID'])) Zbx.event.acknowledge(eventids=messages['EventID'], message="Create Youtrack task") Zbx.event.acknowledge( eventids=messages['EventID'], message="https://youtrack.example.com/issue/{}".format(issueId)) # ----- End PROBLEM block ------ # ----- Start OK block ----- if messages['Status'] == "OK": if issue['State'] == 'Hold on' or issue['State'] == 'Registered': # Cancel if not in work ExecAndLog(connection, issueId, command="State Cancel") # Assignee issue ExecAndLog(connection, issueId, command="Assignee {}".format(YT_ASSIGNEE)) if issue['State'] == 'Fixed': # Verify if Fixed ExecAndLog(connection, issueId, command="State verify") logger.debug("Run command in {issueId}: {command}".format( issueId=issueId, command="""Now is OK {}""".format(messages['Text']))) connection.executeCommand(issueId=issueId, command="", comment=YT_COMMENT.format( status=messages['Status'], text=messages['Text']))