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()
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 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)
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 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']