async def KillTask(request): task_id = request.match_info.get("task_id", "Wrong Task ID") logger.debug("KillTask: task id check = {}".format(task_id)) try: ObjectId(task_id) except: logger.debug("Task ID invalid = {}".format(str(task_id))) return web.Response(status=404, body={ "error": 404, "reason": "Invalid Task ID", "description": "" }) DBoperation = MongoDB.MonoDBOperation() query_result = await DBoperation.QueryDB({"_id": ObjectId(task_id)}) if not len(query_result["data"]): return web.Response(status=404, body={ "error": 404, "description": "", "reason": "the task doesn't exist" }) task_doc = query_result["data"][0] # check task status if task_doc["status"] == "DEPLOYING" or task_doc["status"] == "RUNNING": # modify task status to KILLING task_doc["status"] = "KILLING" logger.debug("check updated task doc = {}".format(task_doc)) update_result = await DBoperation.UpdateDBbyReplace( {"_id": ObjectId(task_id)}, task_doc) # return response to client task_doc = update_result["data"] logger.debug("check update result = {}".format(task_doc)) task_doc["id"] = str(task_doc["_id"]) task_doc.pop("_id") response = web.Response(status=200, body=json.dumps(task_doc)) await response.prepare(request) await response.write_eof() # submit kill request to marathon marathon_request = DataTransformer.TaskDoc2MarathonRequest( task_doc, task_id) marathon_response = requests.delete( Configs.Marathon_ADDRESS + "/v2/apps/{app_id}".format(app_id="mlge1." + task_id), ) status = marathon_response.status_code marathon_response = marathon_response.json() logger.debug("kill request commit successfully") if status >= 400: # marathon cannot kill task logger.error( "marathon kill task failed , status = {} and response = {}". format(status, marathon_response)) return web.Response( status=409, body=json.dumps({ "error": 409, "reason": "marathon failure, task status: {}".format(status), "description": "" })) # update task doc query_result = await DBoperation.QueryDB({"_id": ObjectId(task_id)}) task_doc = query_result["data"][0] task_doc["status"] = "KILLED" # check task status logger.debug("check updated task doc = {}".format(task_doc)) result = await DBoperation.UpdateDBbyReplace( {"_id": ObjectId(task_id)}, task_doc) if result["status"] != 200: logger.error( "update task doc error, update doc = {}".format(task_doc)) logger.debug("task doc DB update successfully") return response else: return web.Response(status=409, body=json.dumps( { "error": 409, "reason": "status failure, task status: {}".format( task_doc["status"]), "description": "" }, ))
async def LaunchTask(request): # 1. check task id validation task_id = request.match_info.get("task_id", "Wrong Task ID") task_request = json.loads(await request.json()) logger.debug("launchtask task id check = {}".format(task_id)) try: ObjectId(task_id) except: logger.debug("Task ID invalid = {}".format(str(task_id))) return web.Response(status=404, body={ "error": 404, "reason": "Invalid Task ID", "description": "" }) # 2. query task doc info DBoperation = MongoDB.MonoDBOperation() query_result = await DBoperation.QueryDB({"_id": ObjectId(task_id)}) if len(query_result["data"]) == 0: return web.Response(status=404, body={ "error": 404, "reason": "Invalid Task ID", "description": "" }) # 3. update task doc info task_doc = query_result["data"][0] task_doc["status"] = "WAITING" logger.debug("check updated task doc = {}".format(task_doc)) update_result = await DBoperation.UpdateDBbyReplace( {"_id": ObjectId(task_id)}, task_doc) # 4. return response to client task_doc = update_result["data"] logger.debug("check update result = {}".format(task_doc)) task_doc["id"] = str(task_doc["_id"]) task_doc.pop("_id") response = web.Response(status=200, body=json.dumps(task_doc)) await response.prepare(request) await response.write_eof() # submit task to marathon marathon_request = DataTransformer.TaskDoc2MarathonRequest( task_doc, task_id) # marathon_response, status = await MarathonLayer.MarathonPost( # "http://192.168.64.57:8080/v2/apps", json_data=marathon_request) marathon_response = requests.post(Configs.Marathon_ADDRESS + "/v2/apps", json=marathon_request) status = marathon_response.status_code marathon_response = marathon_response.json() logger.debug("marathon task commit successfully") if status >= 400: logger.error( "marathon create task failed , status = {} and response = {}". format(status, marathon_response)) # update task doc update_task_doc = DataTransformer.MarathonResponse2TaskDoc( marathon_response) result = await DBoperation.UpdateDBbyReplace({"_id": ObjectId(task_id)}, update_task_doc) if result["status"] != 200: logger.error( "update task doc error, update doc = {}".format(update_task_doc)) logger.debug("task doc DB update successfully") return response