示例#1
0
class OrderTaker(Staff):
    """
    Job Scheduler Worker

    """

    def __init__(self, queue_name, queue_region, aws_access_key_id, aws_secret_access_key):
        Staff.__init__(self, aws_access_key_id, aws_secret_access_key)
        self.queue = SQSUtils(queue_name, queue_region, aws_access_key_id, aws_secret_access_key)

    def get_order(self):
        self.logger.info("Get order from SQS")
        (message, order) = self.queue.get_message()
        if message:
            self.queue.delete_message(message)
            return order
        return None

    def _check_order(self, message):
        if message:
            body = json.loads(message)
            order = Order(body)
            return order
        return None

    def take_order(self):
        order = self.get_order()
        order_obj = self._check_order(order)
        return order_obj
def main(i):
    order_taker = OrderTaker(order_queue_name, queue_region, aws_access_key_id, aws_secret_access_key)
    cook = Cook(aws_access_key_id, aws_secret_access_key)
    order = order_taker.take_order()
    omelet = cook.do_tasks(order) 
    if omelet:
        sqs = SQSUtils(result_queue_name, queue_region, aws_access_key_id, aws_secret_access_key, logger=None)
        result_set = dict()
        result_set['result'] = omelet
        result_set['ticketId'] = order.get_ticket_id()
        sqs.write_message(json.dumps(result_set))
def main(i):
    order_taker = OrderTaker(order_queue_name, queue_region, aws_access_key_id, aws_secret_access_key)
    cook = Cook(aws_access_key_id, aws_secret_access_key)
    results = list()
    tasks = order_taker.deliver_order()
    if tasks:
        for task in tasks:
            results = cook.do_task(task)   #return a list
        if results:
            #print results
            sqs = SQSUtils(result_queue_name, queue_region, aws_access_key_id, aws_secret_access_key, logger=None)
            result_set = dict()
            result_set['result'] = results
            result_set['ticketId'] = tasks[0]['ticketId']
            sqs.write_message(json.dumps(result_set))
示例#4
0
 def __init__(self, queue_name, queue_region, aws_access_key_id, aws_secret_access_key):
     Staff.__init__(self, aws_access_key_id, aws_secret_access_key)     
     self.queue = SQSUtils(queue_name, queue_region, aws_access_key_id, aws_secret_access_key)
示例#5
0
class OrderServer(Staff):
    
    def __init__(self, queue_name, queue_region, aws_access_key_id, aws_secret_access_key):
        Staff.__init__(self, aws_access_key_id, aws_secret_access_key)     
        self.queue = SQSUtils(queue_name, queue_region, aws_access_key_id, aws_secret_access_key)
    
    def get_order(self):
        self.logger.info("Get order from SQS")
        (message, order) = self.queue.get_message()
        if message:
            self.queue.delete_message(message)
            return order
        return None

    def get_dish(self): 
        self.logger.info("Get order from SQS")
        (message, order) = self.queue.get_message()
        if message:
            self.queue.delete_message(message)
            return order
        return None

    def _check_order(self, message):
        if message:
            body = json.loads(message)
            order = Order(body)
            return order
        return None

    def deliver_dish(self):
        order = self.get_order()
        order_obj = self._check_order(order)
        if order_obj:
            #FIXME: jira table format :-)
            #self.sent_to_jira(order_obj.get_ticket_id(), "*** Omelet provisioning result: \n" + json.dumps(order_obj.get_result()))
            #self.sent_to_jira(order_obj.get_ticket_id(), jira_formatter.to_table(order_obj.get_result()))
            self.sent_to_jira(order_obj.get_ticket_id(), jira_formatter.to_panel(order_obj.get_result()))

    def sent_to_jira(self, ticketId, result):
        """
        send the result to JIRA

        """
        options = {
            'server': jira_server
        }
        jira = JIRA(options, basic_auth=(jira_username, jira_password))

        # Get all projects viewable by anonymous users.
        projects = jira.projects()

        # Sort available project keys, then return the second, third, and fourth keys.
        keys = sorted([project.key for project in projects])[2:5]

        # Get an issue.
        issue = jira.issue(ticketId)

        # Add a comment to the issue.
        jira.add_comment(issue, result)

        # Move the ticket to Provision Completed.
        #print issue.fields.status
        try:    
            jira.transition_issue(issue, transitionId=provision_completed_transition_id, comment='Provision finished')
        except:
            print "Transition Error"
            self.logger.error("Transition Error")
    if os.environ.has_key('AWS_SECRET_KEY') :
        aws_secret_access_key = os.environ['AWS_SECRET_KEY']
    else:
        #for compatible reason
        aws_secret_access_key = parser.get('AWS_credentials', 'aws_secret_access_key')

    order_queue_name = parser.get('SQS_settings', 'order_queue_name') 
    result_queue_name = parser.get('SQS_settings', 'result_queue_name') 
    queue_region = parser.get('SQS_settings', 'queue_region')    
    max_cook_count = parser.get('General_config', 'max_cook_count')    

    #
    # fork workers
    #
    sqs = SQSUtils(order_queue_name, queue_region, aws_access_key_id, aws_secret_access_key, logger=None)
    #print "should have " + str(sqs.get_count())
    if sqs.get_count() > 0:
        thread_list = list()
        while sqs.get_count() > 0:
            if threading.active_count() < int(max_cook_count) + 1:
                thread = threading.Thread(target=main, args=(len(thread_list), )) 
                thread_list.append(thread)
                thread.start()
            else:
                #FIXME: two threads get same task
                time.sleep(random.randrange(1, int(max_cook_count) + 1) * 10)
                sqs = SQSUtils(order_queue_name, queue_region, aws_access_key_id, aws_secret_access_key, logger=None)
        for thread in thread_list:
            thread.join()
    else:
示例#7
0
 def __init__(self, queue_name, queue_region, aws_access_key_id, aws_secret_access_key):
     Staff.__init__(self, aws_access_key_id, aws_secret_access_key)     
     #Staff.deliver_queue_init(self, queue_name, queue_region, aws_access_key_id, aws_secret_access_key)     
     self.queue = SQSUtils(queue_name, queue_region, aws_access_key_id, aws_secret_access_key)
     self.priority = self._priority_init()
示例#8
0
class OrderTaker(Staff):
    """
    Job Scheduler Worker

    """

    def __init__(self, queue_name, queue_region, aws_access_key_id, aws_secret_access_key):
        Staff.__init__(self, aws_access_key_id, aws_secret_access_key)     
        #Staff.deliver_queue_init(self, queue_name, queue_region, aws_access_key_id, aws_secret_access_key)     
        self.queue = SQSUtils(queue_name, queue_region, aws_access_key_id, aws_secret_access_key)
        self.priority = self._priority_init()

    def get_order(self):
        self.logger.info("Get order from SQS")
        (message, order) = self.queue.get_message()
        if message:
            self.queue.delete_message(message)
            return order
        return None

    def _priority_init(self):
        priority_dict = dict()
        parser = ConfigParser()
        parser.optionxform = str            # preserve case from config
        parser.read('sched_config.ini')  
        section_name = "Task_priority"
        options = parser.options(section_name)
        for option in options:
            try:
                priority_dict[option] = parser.get(section_name, option)
                #priority_dict[parser.get(section_name, option)] = option
            except:
                self.logger.error("Exception when do priority init - %s" % option)
                print "Exception on %s" % option
        return priority_dict

    def _check_order(self, message):
        if message:
            body = json.loads(message)
            order = Order(body)
            return order
        return None
    
    def _get_priority(self, task_type):
        if task_type in self.priority.keys():
            priority = self.priority[task_type]
            return int(priority)
        else:
            self.logger.error("Unspecified priority of task type: %s. Please check the priority in config file" % task_type)
            raise

    def deliver_order(self):
        order = self.get_order()
        order_obj = self._check_order(order)     
        if order_obj:
            #ticket_id = order_set['ticketId']
            #
            # sorted priority for correcting sequence number
            #
            tasks = order_obj.get_tasks()
            for idx, task in enumerate(tasks):
                task['priority'] = self._get_priority(task['taskType'])
                task['taskId'] = str(idx)
                task['ticketId'] = order_obj.get_ticket_id()
            tasks = sorted(tasks, key=operator.itemgetter('priority'))
            print tasks
            return tasks
        return None

    """