dragxd's picture
Update OneApi/deployment/host.py
06c6bf6 verified
from .. import *
import logging
import traceback
import asyncio
import aiofiles
import aiofiles.os
import yaml
async def check_yaml(data):
f = "FileFormatInvalidError:"
if not data.get('language'):
return f'{f} Project language not found in ElevenHost.yaml'
elif not data.get('version'):
return f'{f} Project language version not found in ElevenHost.yaml'
elif not data.get('build'):
return f'{f} Build not found on ElevenHost.yaml'
elif not data.get('packages'):
return f'{f} Packages not found in ElevenHost.yaml'
elif not data.get("start"):
return f'{f} start not found in ElevenHost.yaml'
else: return True
async def create_docker(data):
dockerfile = f"FROM {data.get('language')}:{data.get('version')}\n\n"
dockerfile += ''.join([f"RUN {x}\n\n" for x in data.get('build')])
dockerfile += ''.join([f"RUN apt-get install {x} -y\n\n" for x in data.get('packages')])
dockerfile += f"COPY . /app/\n\nCMD {data.get('start')[0]}\n"
return dockerfile
class Host:
async def host(self, user_id: int, project_id: int):
database = self.database
user = await database.find(user_id)
project = await database.find(f"p{user_id}{project_id}", project=True)
if not user: return 'not exists'
elif not project: return 'Project not found'
repo_id = project.get('repo', 0)
repo = await database.get_repo(user_id, repo_id)
if not repo: return "Repo not found"
installation_id = (await self.cb.find_one({"_id": int(user_id)})).get('installation_id', None)
if not installation_id: return "not exists"
token = await database.gen_token(installation_id)
try:
folder = f"deployment{user_id}"
await database.add_log(user_id, project_id, "Clonning repo from github...")
await run(f"rm -rf {folder}")
await run(f"mkdir {folder}")
ok = await run(f"cd {folder} && git clone https://x-access-token:{token}@github.com/{repo.get('full_name')}/")
repo_folder = f"{folder}/{repo.get('name')}"
if not await aiofiles.os.path.isdir(repo_folder):
await database.add_log(user_id, project_id, f"Error on clonning repo: {ok}")
return 'Failed to host repo'
ls = await run(f"ls {repo_folder}")
file_count = len(ls.split('\n')) if '\n' in ls else 0
await database.add_log(
user_id,
project_id,
f"Successfully clonned repo!, Files found in repo: {file_count}"
)
if not await aiofiles.os.path.isfile(f"{repo_folder}/ElevenHost.yaml"):
await database.add_log(
user_id,
project_id,
"Error:\nCannot find ElevenHost.yaml on your repo"
)
return "ElevenHost.yaml not found"
async with aiofiles.open(f"{repo_folder}/ElevenHost.yaml", mode='r') as mano:
ctx = await mano.read()
data = yaml.safe_load(ctx)
chk = await check_yaml(data)
if not chk is True:
await database.add_log(user_id, project_id, chk)
return chk
return True
except Exception as w:
logging.error(traceback.format_exc())
return f"Error: {w}"