示例#1
0
 def insert_into_queue(self):
     # 创建时间
     created_time = from_now_to_datetime()
     item.setdefault("created_time", created_time)
     
     # 在waitting_t中加入请求
     obj_id = waitting_t.insert(**self.item)
     
     # 请求被排队
     # 日志表里插入created_time,并增加waitting_id
     # waitting_id是在waitting_t中获得的id
     # 用于在RunningPutter线程中更新processed_time
     # NOTICE: 目前使用uuid作为删除实例时更新deleted_time的条件
     # user_id用于查询
     created_time = time.time()
     backup_t.insert(user_id=self.user_id, created_time=created_time, waitting_id=obj_id,
                     instance_data=self.instance_data)
     
     # 将请求加入到等待队列
     # 2013/02/20: 将db的_objectid也压入队列
     # 在waitting_t中删除元素的时候,就根据_objectid删除
     # 而不是user_id
     item['_oid'] = obj_id
     waitting_queue.put(self.item)
     
     LOG.info("put data to waitting queue {0}: {1}".format(self.user_id, self.instance_data))
     result = waitting_t.query(_id=obj_id)
     
     # 返回排队的序号
     for line in result:
         auto_id =  line['auto_id']
         
     self.write(dict(status = auto_id))
     self.finish()
示例#2
0
def rebuild_timer_and_queue():
    '''
    服务器重启时,从mongodb中读取记录并恢复定时器和队列
    启动固定数量的timer
    并将等待的请求放入到等待队列中
    '''
    LOG.info("Rebuild timer and waitting queue")
    running_timer = running_t.query()
    waitters = waitting_t.query()
    for line in running_timer:
        if line.has_key("instance_data"):
            expired_time = line['expired_time']
            seconds = cal_seconds_to(expired_time)
            uuid = line['uuid']
            user_id = line['user_id']
            instance_data = line['instance_data']
            _oid = line['_id']
            # 定时器已经到期,立即删除运行的实例
            if seconds < 0:
                try:
                    nova_api.delete_vm(uuid)
                except:
                    pass
                running_t.delete(uuid=uuid)

                # 更新backup_t中的deleted_time
                deleted_time = time.time()
                backup_t.update(dict(uuid=uuid), deleted_time=deleted_time)
            else:
                # 恢复running_dict和定时器
                item = dict(user_id=user_id, instance_data=instance_data)
                item['uuid'] = uuid
                # 2013/03/01
                # 增加_oid到元素,RunningPutter可以根据此_oid删除waitting_t中的元素
                # 其实从mongodb中取得的记录已包含_id
                # 此处为了加强重点,重复加入
                item['_oid'] = _oid
                insert_vm_in_mem(item)
                timer = Timer(uuid=uuid, seconds=seconds, item=item)
                timer.start()
                timer_list.append(timer)
    for line in waitters:
        if line.has_key("instance_data"):
            LOG.info("insert data to waitting queue: %s" % line)
            user_id = line['user_id']
            item = dict(_oid=line['_id'],
                        user_id=user_id,
                        instance_data=instance_data)
            waitting_queue.put(item)
    LOG.info("Rebuild end")
def rebuild_timer_and_queue():
    '''
    服务器重启时,从mongodb中读取记录并恢复定时器和队列
    启动固定数量的timer
    并将等待的请求放入到等待队列中
    '''
    LOG.info("Rebuild timer and waitting queue")
    running_timer = running_t.query()
    waitters = waitting_t.query()
    for line in running_timer:
        if line.has_key("instance_data"):
            expired_time = line['expired_time']
            seconds = cal_seconds_to(expired_time)
            uuid = line['uuid']
            user_id = line['user_id']
            instance_data = line['instance_data']
            _oid = line['_id']
            # 定时器已经到期,立即删除运行的实例
            if seconds < 0:
                try:
                    nova_api.delete_vm(uuid)
                except:
                    pass
                running_t.delete(uuid=uuid)
                
                # 更新backup_t中的deleted_time
                deleted_time = time.time()
                backup_t.update(dict(uuid=uuid), deleted_time=deleted_time)
            else:
                # 恢复running_dict和定时器
                item = dict(user_id=user_id, instance_data=instance_data)
                item['uuid'] = uuid
                # 2013/03/01
                # 增加_oid到元素,RunningPutter可以根据此_oid删除waitting_t中的元素
                # 其实从mongodb中取得的记录已包含_id
                # 此处为了加强重点,重复加入
                item['_oid'] = _oid
                insert_vm_in_mem(item)
                timer = Timer(uuid=uuid, seconds=seconds, item=item)
                timer.start()
                timer_list.append(timer)
    for line in waitters:
        if line.has_key("instance_data"):
            LOG.info("insert data to waitting queue: %s" % line)
            user_id = line['user_id']
            item = dict(_oid=line['_id'], user_id=user_id,
                        instance_data=instance_data)
            waitting_queue.put(item)
    LOG.info("Rebuild end")
示例#4
0
 def get(self):
     new_running_list = copy.deepcopy(running_list)
     for item in new_running_list:
         item['_oid'] = repr(item['_oid'])
     running_list_size = len(running_list)
     running_list_content = new_running_list
     timer_list_size = len(timer_list)
     
     auto_id_running = running_t.get_auto_incre()
     running_length = running_t.count()
     
     auto_id_waitting = waitting_t.get_auto_incre()
     waitting_length = waitting_t.count()
     
     # 获取所有用户排队的位置
     user_waitting = list()
     result = waitting_t.query()
     
     auto_id = waitting_t.get_auto_incre() - 1
     waitting = waitting_t.count() - 1
     deleted = auto_id - waitting
     for line in result:
         if line.has_key("instance_data"):
             temp_dic = dict()
             temp_list = list()
             temp_dic[line['user_id']] = line['auto_id'] - deleted
             temp_list.append(temp_dic)
             user_waitting.append(temp_list)
     
     result = dict(
         running_list_size = running_list_size,
         running_list_content = running_list_content,
         timer_list_size = timer_list_size,
         
         auto_id_running = auto_id_running,
         running_length = running_length,
         
         auto_id_waitting = auto_id_waitting,
         waitting_length = waitting_length,
         
         user_waitting = user_waitting
     )
     
     self.write(result)
示例#5
0
    def get(self):
        '''
        根据用户id返回用户排队的序号
        找不到则返回-1
        '''
        return_list = list()
        user_id = self.get_argument("user_id")
        result = waitting_t.query(user_id=user_id)

        # 用户正在排队的位置 = 排队位置 - 被删除的
        # 被删除的 = 计数器 - 正在等待的
        auto_id = waitting_t.get_auto_incre() - 1
        waitting = waitting_t.count() - 1
        deleted = auto_id - waitting
        for line in result:
            temp = dict()
            #temp['request_id'] = line['_id']
            temp['position'] = line['auto_id'] - deleted
            return_list.append(temp)
        if not return_list:
            self.write(dict(status=[]))
            return
        self.write(dict(status=return_list))
        return
 def get(self):
     '''
     根据用户id返回用户排队的序号
     找不到则返回-1
     '''
     return_list = list()
     user_id = self.get_argument("user_id")
     result = waitting_t.query(user_id=user_id)
     
     # 用户正在排队的位置 = 排队位置 - 被删除的
     # 被删除的 = 计数器 - 正在等待的
     auto_id = waitting_t.get_auto_incre() - 1
     waitting = waitting_t.count() - 1
     deleted = auto_id - waitting
     for line in result:
         temp = dict()
         #temp['request_id'] = line['_id']
         temp['position'] = line['auto_id'] - deleted
         return_list.append(temp)
     if not return_list:
         self.write(dict(status=[]))
         return
     self.write(dict(status=return_list))
     return
示例#7
0
def process_request(user_id, instance_data):
    '''
    处理用户的请求
    如果运行队列未满,则创建虚拟机实例、启动定时器、在running_t中插入记录
    否则将请求投入排队的队列中,并在waitting_t中插入记录
    '''
    item = dict(user_id=user_id, instance_data=instance_data)
    os = instance_data['os']

    # 如果运行队列未满
    if len(running_list) < options.running_dict_size:
        # 创建实例
        uuid = nova_api.create_vm(item)
        item['uuid'] = uuid

        # 为实例增加端口映射
        balancer = addNginxHost(uuid, os)
        balancer.start()

        # 实例加入到running_dict中
        insert_vm_in_mem(item)

        # 实例的到期时间
        expired_time = from_now_to_datetime(seconds=seconds)

        # 启动定时器
        timer = Timer(uuid=uuid,
                      item=item,
                      seconds=cal_seconds_to(expired_time))
        timer.start()
        timer_list.append(timer)

        # 在running_t中插入一条记录
        obj_id = running_t.insert(uuid=uuid,
                                  user_id=user_id,
                                  expired_time=expired_time,
                                  instance_data=instance_data)

        # 请求被立即处理
        # 日志表里插入created_time和processed_time
        # 并增加running_id,用于删除实例时更新deleted_time
        # user_id用于查询用
        processed_time = time.time()
        backup_t.insert(user_id=user_id,
                        created_time=processed_time,
                        processed_time=processed_time,
                        instance_data=instance_data,
                        running_id=obj_id,
                        uuid=uuid)
        LOG.info("Start timer for {0}: {1}".format(user_id, instance_data))
        # 返回0
        return 0
    else:
        # 创建时间
        created_time = from_now_to_datetime()
        item.setdefault("created_time", created_time)

        # 在waitting_t中加入请求
        obj_id = waitting_t.insert(**item)

        # 请求被排队
        # 日志表里插入created_time,并增加waitting_id
        # waitting_id是在waitting_t中获得的id
        # 用于在RunningPutter线程中更新processed_time
        # NOTICE: 目前使用uuid作为删除实例时更新deleted_time的条件
        # user_id用于查询
        created_time = time.time()
        backup_t.insert(user_id=user_id,
                        created_time=created_time,
                        waitting_id=obj_id,
                        instance_data=instance_data)

        # 将请求加入到等待队列
        # 2013/02/20: 将db的_objectid也压入队列
        # 在waitting_t中删除元素的时候,就根据_objectid删除
        # 而不是user_id
        item['_oid'] = obj_id
        waitting_queue.put(item)

        LOG.info("put data to waitting queue {0}: {1}".format(
            user_id, instance_data))
        result = waitting_t.query(_id=obj_id)

        # 返回排队的序号
        for line in result:
            return line['auto_id']
def process_request(user_id, instance_data):
    '''
    处理用户的请求
    如果运行队列未满,则创建虚拟机实例、启动定时器、在running_t中插入记录
    否则将请求投入排队的队列中,并在waitting_t中插入记录
    '''
    item = dict(user_id=user_id, instance_data=instance_data)
    os = instance_data['os']
    
    # 如果运行队列未满
    if len(running_list) < options.running_dict_size:
        # 创建实例
        uuid = nova_api.create_vm(item)
        item['uuid'] = uuid
        
        # 为实例增加端口映射
        balancer = addNginxHost(uuid, os)
        balancer.start()
        
        # 实例加入到running_dict中
        insert_vm_in_mem(item)
        
        # 实例的到期时间
        expired_time = from_now_to_datetime(seconds=seconds)
        
        # 启动定时器
        timer = Timer(uuid=uuid, item=item,
                      seconds=cal_seconds_to(expired_time))
        timer.start()
        timer_list.append(timer)
        
        # 在running_t中插入一条记录
        obj_id = running_t.insert(uuid=uuid, user_id=user_id,
                         expired_time=expired_time, instance_data=instance_data)
        
        # 请求被立即处理
        # 日志表里插入created_time和processed_time
        # 并增加running_id,用于删除实例时更新deleted_time
        # user_id用于查询用
        processed_time = time.time()
        backup_t.insert(user_id=user_id, created_time=processed_time, processed_time=processed_time,
                        instance_data=instance_data, running_id=obj_id, uuid=uuid)
        LOG.info("Start timer for {0}: {1}".format(user_id, instance_data))
        # 返回0
        return 0
    else:
        # 创建时间
        created_time = from_now_to_datetime()
        item.setdefault("created_time", created_time)
        
        # 在waitting_t中加入请求
        obj_id = waitting_t.insert(**item)
        
        # 请求被排队
        # 日志表里插入created_time,并增加waitting_id
        # waitting_id是在waitting_t中获得的id
        # 用于在RunningPutter线程中更新processed_time
        # NOTICE: 目前使用uuid作为删除实例时更新deleted_time的条件
        # user_id用于查询
        created_time = time.time()
        backup_t.insert(user_id=user_id, created_time=created_time, waitting_id=obj_id,
                        instance_data=instance_data)
        
        # 将请求加入到等待队列
        # 2013/02/20: 将db的_objectid也压入队列
        # 在waitting_t中删除元素的时候,就根据_objectid删除
        # 而不是user_id
        item['_oid'] = obj_id
        waitting_queue.put(item)
        
        LOG.info("put data to waitting queue {0}: {1}".format(user_id, instance_data))
        result = waitting_t.query(_id=obj_id)
        
        # 返回排队的序号
        for line in result:
            return line['auto_id']