async def post_service(service: schemas.ServiceCreate, db: databases.Database = Depends(models.get_db)): logger.debug(f"Create serivce with data: {service}") created = None try: logger.debug("Looking for available drivers for backend service") drivers_avail = await drivers.match_drivers(service) if drivers_avail: service.driver = f"{drivers_avail[0].name}-{drivers_avail[0].version}" logger.debug(f"Driver match: {service.driver}") created = await crud.db_create(db=db, table=models.get_table("service"), values=service.dict()) if created and drivers_avail: if not drivers.is_driver_deployed(drivers_avail[0]): driver_deployed = drivers.deploy_driver(drivers_avail[0]) if not driver_deployed: created["driver"] = None await put_service(created["id"], schemas.ServiceCreate(**created), db) except sqlite3.IntegrityError as exc: raise errors.DataException( service, getattr(service, exc.args[0].split('.')[-1]), errors.CONFLICT_ERROR) return created
async def startup(): try: queues.check_api_status() logger.debug("Queuing service already up") except errors.ServiceException: logger.debug("Starting Queuing service") # TODO: Move .env.test to ./async_queue for testing environment os.system( "cd async_queue && docker-compose up --build --force-recreate --detach" ) logger.debug("Queue service up") if config.SVC_CREATE_ON_START: services = await crud.db_list(models.get_db(), models.get_table("service")) client = docker.from_env() for svc in config.INITIAL_SERVICES: logger.debug(f"Checking service {svc['image']}") svc["name"] = f"oca_{svc['image']}" if ":" in svc["name"]: svc["name"] = svc["name"].split(":")[0] try: cont = client.containers.get(svc["name"]) if cont.status == 'exited': cont.start() except docker.errors.NotFound: create_service(svc) if not list(filter(lambda x: x["name"] == svc["name"], services)): # TODO: check if there is an ip:port change await register_service(svc) signal.signal(signal.SIGINT, sigint_event) logger.debug("Frontend Gateway API ready")
async def list_services(skip: int = 0, limit: int = 100, db: databases.Database = Depends(models.get_db)): resp = await crud.db_list(db=db, table=models.get_table("service"), skip=skip, limit=limit) return resp
async def delete_service(service_id: str, db: databases.Database = Depends(models.get_db)): table = models.get_table('service') deleted = await crud.db_delete(db=db, table=table, obj_id=service_id) if not deleted: raise errors.DataException(schemas.Service, service_id, errors.NOTFOUND_ERROR) return deleted
async def get_service(service_id: str, db: databases.Database = Depends(models.get_db)): queried = await crud.db_get(db=db, table=models.get_table("service"), obj_id=service_id) if queried is None: raise errors.DataException(schemas.Service, service_id, errors.NOTFOUND_ERROR) return queried
async def put_service(service_id: str, service: schemas.ServiceUpdate, db: databases.Database = Depends(models.get_db)): updated = None try: updated = await crud.db_update(db=db, table=models.get_table("service"), values=service.dict(exclude_unset=True), obj_id=service_id) except sqlite3.IntegrityError as exc: raise errors.DataException( service, getattr(service, exc.args[0].split('.')[-1]), errors.CONFLICT_ERROR) if not updated: raise errors.DataException(service, service_id, errors.NOTFOUND_ERROR) return updated