예제 #1
0
    def commit(self, resource, object, method):
        uuid_str = str(uuid.uuid4())
        time = datetime.now()
        user_id = self.user.user_id

        if self.model == None:
            self.model = BaseModel()

        row = TaskModel(uuid=uuid_str,
                        post_time=time,
                        run_time=0,
                        user_id=user_id,
                        status="init",
                        resource=resource,
                        object=object,
                        method=method,
                        request=self.model.json(),
                        message="queing task")

        res = TaskModel(uuid=uuid_str,
                        post_time=time,
                        run_time=0,
                        user_id=user_id,
                        status="init",
                        resource=resource,
                        object=object,
                        method=method,
                        request=self.model,
                        message="queing task")

        self.db.add(row)
        self.db.commit()

        return res
예제 #2
0
def create_task(request):
    task = TaskModel(status=Status.IN_QUEUE)
    task.save()

    if NEW_TASK_EVENT.is_set():
        NEW_TASK_EVENT.clear()
    NEW_TASK_EVENT.set()
    return JsonResponse({"task_id": task.pk})
예제 #3
0
파일: dev.py 프로젝트: hibiki31/virty
def dev_patch_node_role():
    db = SessionLocal()
    model = TaskModel(request={
        "node_name": "shiori",
        "role_name": "libvirt"
    })
    patch_node_role(db=db, model=model)
예제 #4
0
def change_domain_base(db: Session, model: TaskModel):
    request: DomainPatch = DomainPatch(**model.request)

    try:
        domain: DomainModel = db.query(DomainModel).filter(DomainModel.uuid == request.uuid).one()
    except:
        raise Exception("domain not found")

    try:
        node: NodeModel = db.query(NodeModel).filter(NodeModel.name == domain.node_name).one()
    except:
        raise Exception("node not found")

    manager = virtlib.VirtManager(node_model=node)

    # 電源
    if request.status == "on":
        manager.domain_poweron(uuid=request.uuid)
    elif request.status == "off":
        manager.domain_destroy(uuid=request.uuid)
    
    # CDROM 
    if request.status == "mount":
        manager.domain_cdrom(request.uuid, request.target, request.path)
    elif request.status == "unmount":
        manager.domain_cdrom(request.uuid, request.target)

    update_domain_list(db=db, model=TaskModel())

    return model
예제 #5
0
def exec_task(db, task):
    logger.info(
        f'start tasks: {task.resource}.{task.object}.{task.method} {task.uuid}'
    )
    task.status = "start"
    db.merge(task)
    db.commit()

    # Model to Schemas
    task: TaskSelect = TaskSelect().from_orm(task)

    start_time = time()

    try:
        res = task_swicher(model=task, db=db)
        msg = str(res.message)
        end_time = time()
        task.run_time = end_time - start_time
    except Exception as e:
        db.rollback()
        logger.error(e, exc_info=True)
        task.status = "error"
        task.message = str(e)
    else:
        logger.info(
            f'task finished: {task.resource}.{task.object}.{task.method} {task.uuid} {task.run_time}s'
        )
        task.status = "finish"
        task.message = msg
    logger.debug(task)
    # Schemas to Model
    db.merge(TaskModel(**task.dict()))
    db.commit()
예제 #6
0
class PostTask():
    db = None
    user = None
    model = None
    task_model = TaskModel()

    def __init__(self, db: Session, user: CurrentUser, model: BaseModel):
        self.db = db
        self.user = user
        self.model = model

    def commit(self, resource, object, method):
        uuid_str = str(uuid.uuid4())
        time = datetime.now()
        user_id = self.user.user_id

        if self.model == None:
            self.model = BaseModel()

        row = TaskModel(uuid=uuid_str,
                        post_time=time,
                        run_time=0,
                        user_id=user_id,
                        status="init",
                        resource=resource,
                        object=object,
                        method=method,
                        request=self.model.json(),
                        message="queing task")

        res = TaskModel(uuid=uuid_str,
                        post_time=time,
                        run_time=0,
                        user_id=user_id,
                        status="init",
                        resource=resource,
                        object=object,
                        method=method,
                        request=self.model,
                        message="queing task")

        self.db.add(row)
        self.db.commit()

        return res
예제 #7
0
def endless_eight():
    logger.info("Worker起動")
    db = SessionLocal()
    while True:
        query = db.query(TaskModel)
        query = query.filter(TaskModel.status == "init")
        query = query.order_by(desc(TaskModel.post_time))
        tasks = query.all()
        if tasks == []:
            sleep(3)
            continue

        # 開始処理
        task: TaskModel = tasks[0]
        logger.info(
            f'タスク開始: {task.resource}.{task.object}.{task.method} {task.uuid}')
        task.status = "start"
        db.merge(task)
        db.commit()

        # Model to Schemas
        task: TaskSelect = TaskSelect().from_orm(task)

        start_time = time()

        try:
            task_swicher(model=task, db=db)
        except Exception as e:
            logger.error(e, exc_info=True)
            task.status = "error"
            task.message = str(e)
        else:
            task.status = "finish"
            task.message = "finish"

        end_time = time()
        task.run_time = end_time - start_time

        logger.info(
            f'タスク終了: {task.resource}.{task.object}.{task.method} {task.uuid} {task.run_time}s'
        )

        # Schemas to Model
        db.merge(TaskModel(**task.dict()))
        db.commit()
예제 #8
0
def delete_domain_base(db: Session, model: TaskModel):
    request: DomainInsert = DomainDelete(**model.request)

    try:
        domain: DomainModel = db.query(DomainModel).filter(DomainModel.uuid == request.uuid).one()
    except:
        raise Exception("domain not found")

    try:
        node: NodeModel = db.query(NodeModel).filter(NodeModel.name == domain.node_name).one()
    except:
        raise Exception("node not found")

    manager = virtlib.VirtManager(node_model=node)
    manager.domain_undefine(request.uuid)

    update_domain_list(db=db, model=TaskModel())

    return model
예제 #9
0
def change_domain_network(db: Session, model: TaskModel):
    request: DomainNetworkChange = DomainNetworkChange(**model.request)

    try:
        domain: DomainModel = db.query(DomainModel).filter(DomainModel.uuid == request.uuid).one()
    except:
        raise Exception("domain not found")

    try:
        node: NodeModel = db.query(NodeModel).filter(NodeModel.name == domain.node_name).one()
    except:
        raise Exception("node not found")

    manager = virtlib.VirtManager(node_model=node)
    manager.domain_network(uuid=request.uuid, network=request.network_name, port=request.port, mac=request.mac)

    update_domain_list(db=db, model=TaskModel())

    return model
예제 #10
0
파일: tasks.py 프로젝트: WZQ1397/virty
def add_storage_base(db: Session, model: TaskModel):
    request: StorageInsert = StorageInsert(**model.request)

    try:
        node: NodeModel = db.query(NodeModel).filter(
            NodeModel.name == request.node_name).one()
    except:
        raise Exception("node not found")

    # XMLを定義、設定
    editor = xmllib.XmlEditor("static", "storage_dir")
    editor.storage_base_edit(name=request.name, path=request.path)

    # ソイや!
    manager = virtlib.VirtManager(node_model=node)
    manager.storage_define(xml_str=editor.dump_str())

    update_storage_list(db=db, model=TaskModel())

    return model
예제 #11
0
def delete_network_base(db: Session, model: TaskModel):
    request: NetworkDelete = NetworkDelete(**model.request)

    try:
        network: NetworkModel = db.query(NetworkModel).filter(
            NetworkModel.uuid == request.uuid).one()
    except:
        raise Exception("network not found")

    try:
        node: NodeModel = db.query(NodeModel).filter(
            NodeModel.name == network.node_name).one()
    except:
        raise Exception("node not found")

    manager = virtlib.VirtManager(node_model=node)
    manager.network_undefine(request.uuid)

    update_network_list(db=db, model=TaskModel())

    return model
예제 #12
0
def add_network_base(db: Session, model: TaskModel):
    request: NetworkInsert = NetworkInsert(**model.request)

    try:
        node: NodeModel = db.query(NodeModel).filter(
            NodeModel.name == request.node_name).one()
    except:
        raise Exception("node not found")

    if request.type == "bridge":
        # XMLを定義、設定
        editor = xmllib.XmlEditor("static", "net_bridge")
        editor.network_bridge_edit(name=request.name,
                                   bridge=request.bridge_device)
        xml = editor.dump_str()
    elif request.type == "ovs":
        xml = f'''
        <network>
            <name>{request.name}</name>
            <forward mode="bridge" />
            <bridge name="{request.bridge_device}" />
            <virtualport type="openvswitch" />
            <portgroup name="untag" default="yes">
            </portgroup>
        </network>
        '''
    else:
        raise Exception("Type is incorrect")

    # ソイや!
    manager = virtlib.VirtManager(node_model=node)
    manager.network_define(xml_str=xml)

    update_network_list(db=db, model=TaskModel())

    return model
예제 #13
0
def dev_domain_define():
    db = SessionLocal()
    update_network_list(db=db, model=TaskModel())
예제 #14
0
def dev_update_network_list():
    db = SessionLocal()
    update_network_list(db=db, model=TaskModel())
예제 #15
0
def dev_update_storage_list():
    db = SessionLocal()
    update_storage_list(db=db, model=TaskModel())
예제 #16
0
def add_domain_base(db: Session, model: TaskModel):
    # 受け取ったデータをモデルに型付け
    task_model:TaskModel = model
    model: DomainInsert = DomainInsert(**task_model.request)

    # データベースから情報とってきて確認も行う
    domains: DomainModel = db.query(DomainModel).filter(DomainModel.name==model.name).all()
    try:
        node: NodeModel = db.query(NodeModel).filter(NodeModel.name==model.node_name).one()
    except:
        raise Exception("node not found")

    if domains != []:
        raise Exception("domain name is duplicated")


    # XMLのベース読み込んで編集開始
    editor = xmllib.XmlEditor("static","domain_base")

    editor.domain_emulator_edit(node.os_like)
    editor.domain_base_edit(
        domain_name=model.name,
        memory_mega_byte=model.memory_mega_byte,
        core=model.cpu,
        vnc_port=0,
        vnc_passwd=None
    )

    domain_uuid = editor.domain_uuid_generate()
    
    # ネットワークインターフェイス
    for interface in model.interface:
        interface: DomainInsertInterface
        editor.domain_interface_add(
            network_name=interface.network_name, 
            mac_address=None, 
            port=interface.port
        )

    img_device_names = ["vda","vdb","vdc"]
    
    # ブロックデバイス
    for device, device_name in zip(model.disks, img_device_names):
        # 型定義
        device: DomainInsertDisk
        # 作成先のプールを参照
        try:
            new_pool: StorageModel = db.query(StorageModel).filter(StorageModel.uuid==device.save_pool_uuid).one()
        except:
            raise Exception("request storage pool uuid not found")
        # ファイル名決めてる
        create_image_path = new_pool.path +"/"+ model.name + "_" + device_name + '.img'
        # XMLに追加
        editor.domain_device_image_add(image_path=create_image_path, target_device=device_name)

        # 新規ディスクの場合
        if device.type == "empty":
            # 空のディスク作成
            ssh_manager = sshlib.SSHManager(user=node.user_name, domain=node.domain, port=node.port)
            ssh_manager.qemu_create(
                size_giga_byte=device.size_giga_byte,
                path=create_image_path
            )
        # 既存ディスクのコピー
        elif device.type == "copy":
            # コピー元のプール情報参照
            try:
                pool_model:StorageModel = db.query(StorageModel).filter(StorageModel.uuid==device.original_pool_uuid).one()
            except:
                raise Exception("request src pool uuid not found")
            pool_path = pool_model.path
            file_name = device.original_name
            from_image_path = pool_path + '/' + file_name

            logger.info(f'{from_image_path}を{create_image_path}へコピーします')
            ssh_manager = sshlib.SSHManager(user=node.user_name, domain=node.domain, port=node.port)
            ssh_manager.file_copy(
                from_path=from_image_path,
                to_path=create_image_path
            )

    # Cloud-init
    if model.cloud_init != None:
        # iso作成
        cloudinit_manager = cloudinitlib.CloudInitManager(domain_uuid,model.cloud_init.hostname)
        cloudinit_manager.custom_user_data(model.cloud_init.userData)
        iso_path = cloudinit_manager.make_iso()

        # cloud-initのisoを保存するpoolを探す
        try:
            query = db.query(StorageModel).join(NodeModel).outerjoin(StorageMetadataModel)
            query = query.filter(NodeModel.name==node.name).filter(StorageMetadataModel.rool=="init-iso")
            init_pool_model:StorageModel = query.one()
        except:
            raise Exception("cloud-init pool not found")

        # 生成したisoをノードに転送
        send_path = f"{init_pool_model.path}/{domain_uuid}.iso"
        ansible_manager = ansiblelib.AnsibleManager(user=node.user_name, domain=node.domain)
        ansible_manager.file_copy_to_node(src=iso_path,dest=send_path)
        editor.domain_cdrom(target=None,path=send_path)


    # ノードに接続してlibvirtでXMLを登録
    node = virtlib.VirtManager(node_model=node)
    node.domain_define(xml_str=editor.dump_str())

    # 情報の更新
    update_domain_list(db=db, model=TaskModel())

    domain = db.query(DomainModel).filter(DomainModel.uuid==domain_uuid).one()
    domain.owner_user_id = task_model.user_id
    db.commit()

    return task_model