예제 #1
0
    def run(self):
        '''
        暂停指定的时间,到时间后执行一些列动作
        '''
        time.sleep(self.seconds)
        result = running_t.query_one(uuid=self.uuid)
        if result:
            if cond.acquire():
                # 从running_dict中删除用户
                try:
                    del_vm_in_mem(self.uuid)
                    # nginx负载均衡中删除主机
                    del_nginx_host(self.uuid)
                except Exception, e:
                    LOG.exception(e)
                # 从running_t中删除用户
                running_t.delete(uuid=self.uuid)
                # 调用openstack删除主机
                nova_api.delete_vm(self.uuid)

                # 更新backup_t中的deleted_time
                deleted_time = time.time()
                backup_t.update(dict(uuid=self.uuid),
                                deleted_time=deleted_time)

                # 通知排队线程
                cond.notify()
                cond.release()
                return
예제 #2
0
 def run(self):
     '''
     暂停指定的时间,到时间后执行一些列动作
     '''
     time.sleep(self.seconds)
     result = running_t.query_one(uuid=self.uuid)
     if result:
         if cond.acquire():
             # 从running_dict中删除用户
             try:
                 del_vm_in_mem(self.uuid)
                 # nginx负载均衡中删除主机
                 del_nginx_host(self.uuid)
             except Exception, e:
                 LOG.exception(e)
             # 从running_t中删除用户
             running_t.delete(uuid=self.uuid)
             # 调用openstack删除主机
             nova_api.delete_vm(self.uuid)
             
             # 更新backup_t中的deleted_time
             deleted_time = time.time()
             backup_t.update(dict(uuid=self.uuid), deleted_time=deleted_time)
             
             # 通知排队线程
             cond.notify()
             cond.release()
             return
예제 #3
0
    def run(self):
        if cond.acquire():
            while 1:
                if len(running_list) < options.running_dict_size \
                and not waitting_queue.empty():

                    # 从等待队列中获取元素
                    item = waitting_queue.get()

                    try:
                        # 创建实例
                        uuid = nova_api.create_vm(item)
                        item['uuid'] = uuid
                    except Exception, e:
                        waitting_t.delete(_id=item['_oid'])
                    else:

                        # 为实例增加端口映射
                        os = item['instance_data']['os']
                        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=item['user_id'],
                            expired_time=expired_time,
                            instance_data=item['instance_data'])

                        # 从等待的waitting_t中删除对应的记录
                        # 2013/02/20: 根据_id删除,而不是user_id
                        waitting_t.delete(_id=item['_oid'])
                        LOG.info("Get item from waitting_queue: %s" % item)

                        # 排队的请求被处理,根据waitting_id更新processed_time
                        # 并增加running_id,用于删除时例时更新deleted_time
                        # NOTICE: 目前使用uuid更新backup_t中deleted_time的条件
                        processed_time = time.time()
                        backup_t.update(dict(waitting_id=item['_oid']),
                                        processed_time=processed_time,
                                        uuid=uuid,
                                        running_id=obj_id)
                else:
                    cond.wait()
예제 #4
0
 def run(self):
     if cond.acquire():
         while 1:
             if len(running_list) < options.running_dict_size \
             and not waitting_queue.empty():
                 
                 # 从等待队列中获取元素
                 item = waitting_queue.get()
                 
                 try:
                     # 创建实例
                     uuid = nova_api.create_vm(item)
                     item['uuid'] = uuid
                 except Exception, e:
                     waitting_t.delete(_id=item['_oid'])
                 else:
                 
                     # 为实例增加端口映射
                     os = item['instance_data']['os']
                     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=item['user_id'],
                                      expired_time=expired_time,
                                      instance_data=item['instance_data'])
                     
                     # 从等待的waitting_t中删除对应的记录
                     # 2013/02/20: 根据_id删除,而不是user_id
                     waitting_t.delete(_id=item['_oid'])
                     LOG.info("Get item from waitting_queue: %s" % item)
                     
                     # 排队的请求被处理,根据waitting_id更新processed_time
                     # 并增加running_id,用于删除时例时更新deleted_time
                     # NOTICE: 目前使用uuid更新backup_t中deleted_time的条件
                     processed_time = time.time()
                     backup_t.update(dict(waitting_id=item['_oid']),
                                     processed_time=processed_time,
                                     uuid=uuid, running_id=obj_id)
             else:
                 cond.wait()
예제 #5
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")
예제 #6
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")
예제 #7
0
 def run(self):
     if cond.acquire():
         del_vm_in_mem(self.uuid)
         # 当调用cloudopen接口处理失败时,调用tornado返回500
         try:
             nova_api.delete_vm(self.uuid)
         except Exception, e:
             LOG.exception(e)
             running_t.delete(uuid=self.uuid)
             
             # 更新backup_t中的deleted_time
             deleted_time = time.time()
             backup_t.update(dict(uuid=self.uuid), deleted_time=deleted_time)
             
             self.obj.send_error(500)
             return
         else:
             try:
                 del_nginx_host(self.uuid)
             except Exception, e:
                 LOG.exception(e)
예제 #8
0
    def run(self):
        if cond.acquire():
            del_vm_in_mem(self.uuid)
            # 当调用cloudopen接口处理失败时,调用tornado返回404
            try:
                del_nginx_host(self.uuid)
                nova_api.delete_vm(self.uuid)
            except Exception, e:
                LOG.exception(e)
                self.obj.send_error(500)
            running_t.delete(uuid=self.uuid)

            # 更新backup_t中的deleted_time
            deleted_time = time.time()
            backup_t.update(dict(uuid=self.uuid), deleted_time=deleted_time)

            # 当全部处理成功后,调用tornado返回成功状态
            self.obj.write({"status": 0})
            tornado.ioloop.IOLoop.instance().add_callback(self.obj.on_write)

            cond.notify()
            cond.release()
            return
 def run(self):
     if cond.acquire():
         del_vm_in_mem(self.uuid)
         # 当调用cloudopen接口处理失败时,调用tornado返回404
         try:
             del_nginx_host(self.uuid)
             nova_api.delete_vm(self.uuid)
         except Exception, e:
             LOG.exception(e)
             self.obj.send_error(500)
         running_t.delete(uuid=self.uuid)
         
         # 更新backup_t中的deleted_time
         deleted_time = time.time()
         backup_t.update(dict(uuid=self.uuid), deleted_time=deleted_time)
         
         # 当全部处理成功后,调用tornado返回成功状态
         self.obj.write({"status": 0})
         tornado.ioloop.IOLoop.instance().add_callback(self.obj.on_write)
         
         cond.notify()
         cond.release()
         return
예제 #10
0
class Deleter(threading.Thread):
    def __init__(self, uuid=None, obj=None):
        super(Deleter, self).__init__()
        self.uuid = uuid
        self.obj = obj
    
    def run(self):
        if cond.acquire():
            del_vm_in_mem(self.uuid)
            # 当调用cloudopen接口处理失败时,调用tornado返回500
            try:
                nova_api.delete_vm(self.uuid)
            except Exception, e:
                LOG.exception(e)
                running_t.delete(uuid=self.uuid)
                
                # 更新backup_t中的deleted_time
                deleted_time = time.time()
                backup_t.update(dict(uuid=self.uuid), deleted_time=deleted_time)
                
                self.obj.send_error(500)
                return
            else:
                try:
                    del_nginx_host(self.uuid)
                except Exception, e:
                    LOG.exception(e)
            
            running_t.delete(uuid=self.uuid)
            
            # 更新backup_t中的deleted_time
            deleted_time = time.time()
            backup_t.update(dict(uuid=self.uuid), deleted_time=deleted_time)
            
            # 当全部处理成功后,调用tornado返回成功状态
            self.obj.write({"status": 0})
            tornado.ioloop.IOLoop.instance().add_callback(self.obj.on_write)
            
            cond.notify()
            cond.release()
            return