Exemplo n.º 1
0
class Ticket(BaseClass):

    FIELDS_KEY = 'fields'
    PROJECT_KEY = 'project'
    SUMMARY_KEY = 'summary'
    DESCRIPTION_KEY = 'description'
    ISSUETYPE_KEY = 'issuetype'
    LABELS_KEY = 'labels'
    CONFIGS = Configs.get()

    def __init__(self, data, is_lambda):
        self.incident_number = self.get_incident_number(data)
        self.summary = self.get_summary(data)
        self.ticket_data = {self.FIELDS_KEY: {}}
        self.jira_auth = self.get_jira_auth()
        self.ticket_url = None
        self.pager_duty_link = self.get_pager_duty_link(data)
        super(Ticket, self).__init__(is_lambda)
        self.set_ticket_data()

    def set_ticket_data(self):
        self.update_ticket(self.get_project_field())
        self.update_ticket(self.get_summary_field())
        self.update_ticket(self.get_description_field())
        self.update_ticket(self.get_issuetype_field())
        self.update_ticket(self.get_labels_field())
        self.set_custom_fields()

    def create(self):
        try:
            headers = {'Content-Type': 'application/json'}
            create_ticket_url = '{0}/rest/api/2/issue/'.format(
                self.CONFIGS['jira_url'])
            request = requests.post(create_ticket_url,
                                    headers=headers,
                                    auth=self.jira_auth,
                                    data=json.dumps(self.ticket_data))
            # Printing below will help determine why ticket creation failed. e.g. "custom_fields" your ticket requires
            print request.text
            self.ticket_url = request.json()['key']
        except Exception as e:
            super(Ticket,
                  self).print_error('Error occurred while creating ticket', e)

    @classmethod
    def exists(_self, data):
        try:
            incident_number = _self.get_incident_number(data)
            jira_url = _self.CONFIGS['jira_url']
            project = _self.CONFIGS['jira_project']
            search_ticket_url = "{0}/rest/api/2/search?jql=project={1}+and+text~'pagerduty+{2}'".format(
                jira_url, project, incident_number)
            request = requests.get(search_ticket_url,
                                   auth=_self.get_jira_auth())
            total_tickets = request.json()['total']
            if total_tickets > 0:
                print 'A ticket for incident #{0} already exists in JIRA'.format(
                    incident_number)
                return True
            return False
        except Exception as e:
            print 'Failed to determine if ticket exists in JIRA. {0}'.format(e)
            return True

    def set_custom_fields(self):
        try:
            custom_fields = self.CONFIGS['custom_fields']
            if custom_fields:
                for custom_field, value in custom_fields.iteritems():
                    self.update_ticket({custom_field: value})
        except Exception as e:
            super(Ticket, self).print_error(
                'Could not set custom fields. Please refer to documentation',
                e)

    def get_issuetype_field(self):
        return {self.ISSUETYPE_KEY: {'name': self.CONFIGS['issuetype']}}

    def get_project_field(self):
        return {self.PROJECT_KEY: {'key': self.CONFIGS['jira_project']}}

    def get_labels_field(self):
        return {self.LABELS_KEY: self.CONFIGS['labels']}

    def get_summary_field(self):
        return {
            self.SUMMARY_KEY:
            "[PagerDuty] {0}: {1}".format(self.incident_number, self.summary)
        }

    def get_description_field(self):
        return {
            self.DESCRIPTION_KEY:
            "*CURRENTLY*\nPagerDuty has triggered an alert\n{0}\n\n*PROBLEM*\n{1}\n\n*SOLUTION*\n* Investigate the alert.\n* Resolve the PagerDuty ticket\n* Create future tickets as necessary"
            .format(self.pager_duty_link, self.summary)
        }

    def update_ticket(self, data):
        self.ticket_data[self.FIELDS_KEY].update(data)

    @classmethod
    def get_incident_number(_self, data):
        return data['incident']['incident_number']

    def get_summary(self, data):
        return data['incident']['trigger_summary_data']['subject']

    def get_pager_duty_link(self, data):
        return data['incident']['html_url']

    @classmethod
    def get_jira_auth(_self):
        return HTTPBasicAuth(_self.CONFIGS['jira_username'],
                             _self.CONFIGS['jira_password'])
Exemplo n.º 2
0
class Ticket(BaseClass):
    FIELDS_KEY = 'fields'
    PROJECT_KEY = 'project'
    SUMMARY_KEY = 'summary'
    DESCRIPTION_KEY = 'description'
    ISSUETYPE_KEY = 'issuetype'
    LABELS_KEY = 'labels'
    CONFIGS = Configs.get()

    def __init__(self, data, is_lambda):
        self.data = data
        if 'subject' in data:
            self.summary = self.get_summary(data)
        self.ticket_data = {self.FIELDS_KEY: {}}
        self.jira_auth = self.get_jira_auth()
        self.ticket_url = None
        super(Ticket, self).__init__(is_lambda)
        if 'key' in data:
            self._load_ticket_from_key(data['key'])
        else:
            self.set_ticket_data()

    def _load_ticket_from_key(self, key):
        try:

            find_ticket_url = '{0}/rest/api/2/issue/{1}'.format(
                self.CONFIGS['jira_url'], key)
            headers = {'Content-Type': 'application/json'}
            request = requests.get(find_ticket_url,
                                   headers=headers,
                                   auth=self.jira_auth)
            if request.status_code == 200:
                self.load_ticket(request.json())
        except Exception as e:
            super(Ticket,
                  self).print_error('Error occurred while creating ticket', e)

    def load_ticket(self, ticket_data):

        self.key = ticket_data['key']
        self.ticket_type = ticket_data['fields']['issuetype']
        self.fixVersions = ticket_data['fields']['fixVersions']
        self.created = ticket_data['fields']['created']
        self.priority = ticket_data['fields']['priority']
        self.labels = ticket_data['fields']['labels']
        self.assignee = ticket_data['fields']['assignee']
        self.updated = ticket_data['fields']['updated']
        self.status = ticket_data['fields']['status']
        self.description = ticket_data['fields']['description']
        self.creator = ticket_data['fields']['creator']
        self.project = ticket_data['fields']['project']
        self.subject = ticket_data['fields']['summary']

    def set_ticket_data(self):
        self.update_ticket(self.get_project_field())
        self.update_ticket(self.get_summary_field())
        self.update_ticket(self.get_description_field())
        self.update_ticket(self.get_issuetype_field())
        self.update_ticket(self.get_labels_field())
        self.set_custom_fields()

    def create(self):
        try:
            headers = {'Content-Type': 'application/json'}
            create_ticket_url = '{0}/rest/api/2/issue/'.format(
                self.CONFIGS['jira_url'])
            request = requests.post(create_ticket_url,
                                    headers=headers,
                                    auth=self.jira_auth,
                                    data=json.dumps(self.ticket_data))
            # Printing below will help determine why ticket creation failed. e.g. "custom_fields" your ticket requires
            self._load_ticket_from_key(request.json()['key'])
        except Exception as e:
            super(Ticket,
                  self).print_error('Error occurred while creating ticket', e)

    def update(self):
        pass
        #todo

    def move_to_sprint(self, sprint_id):
        try:
            headers = {'Content-Type': 'application/json'}
            create_ticket_url = '{0}/rest/api/2/issue/{1}'.format(
                self.CONFIGS['jira_url'], self.key)

            body = {"update": {"customfield_10010": [{"set": sprint_id}]}}
            request = requests.put(create_ticket_url,
                                   headers=headers,
                                   auth=self.jira_auth,
                                   data=json.dumps(body))
            # Printing below will help determine why ticket creation failed. e.g. "custom_fields" your ticket requires
            self.load_ticket(request.json())
        except Exception as e:
            super(Ticket,
                  self).print_error('Error occurred while creating ticket', e)

    def change_status(self, status):
        try:

            headers = {'Content-Type': 'application/json'}

            status_change_ticket_url = '{0}/rest/api/2/issue/{1}/transitions'.format(
                self.CONFIGS['jira_url'], self.key)
            status = status.lower()
            status_hash = {"todo": "11", "in_progress": "21", "done": "31"}
            if status not in status_hash:
                return False
            body = {"transition": {"id": status_hash[status]}}
            request = requests.post(status_change_ticket_url,
                                    headers=headers,
                                    auth=self.jira_auth,
                                    data=json.dumps(body))
            print request
            # Printing below will help determine why ticket creation failed. e.g. "custom_fields" your ticket requires
            self.load_ticket(request.json())
        except Exception as e:
            super(Ticket,
                  self).print_error('Error occurred while creating ticket', e)

    def set_custom_fields(self):
        try:
            custom_fields = self.CONFIGS['custom_fields']
            if custom_fields:
                for custom_field, value in custom_fields.iteritems():
                    self.update_ticket({custom_field: value})
        except Exception as e:
            super(Ticket, self).print_error(
                'Could not set custom fields. Please refer to documentation',
                e)

    def get_issuetype_field(self):
        issue_type = self.data.get(self.ISSUETYPE_KEY,
                                   self.CONFIGS['issuetype'])
        if issue_type.lower() == "bug":
            issue_type = "Bug"
        elif issue_type.lower() == "story":
            issue_type = "Story"

        return {self.ISSUETYPE_KEY: {'name': issue_type}}

    def get_project_field(self):
        return {self.PROJECT_KEY: {'key': self.CONFIGS['jira_project']}}

    def get_labels_field(self):
        return {self.LABELS_KEY: self.data.get(self.LABELS_KEY, None)}

    def get_summary_field(self):
        return {self.SUMMARY_KEY: self.summary}

    def get_description_field(self):
        return {self.DESCRIPTION_KEY: "Ticket created by Alexa"}

    def update_ticket(self, data):
        if data is not None:
            self.ticket_data[self.FIELDS_KEY].update(data)

    def get_summary(self, data):
        return data['subject']

    @classmethod
    def get_jira_auth(_self):
        return HTTPBasicAuth(_self.CONFIGS['jira_username'],
                             _self.CONFIGS['jira_password'])

    def to_hash(self):
        return {
            'key': self.key,
            'type': self.ticket_type['name'],
            'project': self.project['key'],
            'description': self.description,
            'subject': self.summary,
            'priority': self.priority['name']
        }
Exemplo n.º 3
0
flag_raspberry = args["raspberry"]
flag_send = args["send"]

# Raspberry pi mode initialization
if flag_raspberry > 0:
    from pivideostream import PiVideoStream
    from picamera.array import PiRGBArray
    from picamera import PiCamera

# Configure file JSON path
configs = Configs(os.path.dirname(os.path.realpath(__file__))+'/Configs.json')

# Socket initialization
if flag_send > 0:
    import socket
    HOST = configs.get("host")
    PORT = configs.get("port")
    tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    dest = (HOST, PORT)
    tcp.settimeout(0.0)
    print "Sending commands to "+str(dest)
    try:
        tcp.connect(dest)
    except socket.error as msg:
        if msg[0] != 115:
            print "Socket Error "+str(msg[0])
            print "Abort operation, try again later."
            raise SystemExit

# Global variables
plotWidth = configs.get("cameraRes")[0]