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)
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)
Exemplo n.º 3
0
 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
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
    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')
Exemplo n.º 8
0
)  #, 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')
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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'])
                                  )
Exemplo n.º 12
0
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']))