def cook_a_recipe(user, org, recipe_id): """ Run recipes via the API. """ r = fetch_by_id_or_field(Recipe, 'slug', recipe_id, org_id=org.id) if not r: raise RequestError( 'Recipe with id/slug {} does not exist.'.format(recipe_id)) # setup kwargs for merlynne kw = dict(org=org.to_dict(incl_auths=True, auths_as_dict=True, settings_as_dict=True, incl_domains=True, incl_users=True), apikey=user.apikey, recipe=r.to_dict(), recipe_obj=r, sous_chef_path=r.sous_chef.runs) # cook recipe merlynne = Merlynne(**kw) try: job_id = merlynne.cook_recipe() except Exception as e: raise RequestError( 'There was a problem initializing the SousChef: {}'.format( e.message)) # # return job status url ret = url_for_job_status(apikey=user.apikey, job_id=job_id, queue='recipe') return jsonify(ret, status=202)
def cook_a_recipe(user, org, recipe_id): """ Run recipes via the API. """ r = fetch_by_id_or_field(Recipe, 'slug', recipe_id, org_id=org.id) if not r: raise RequestError('Recipe with id/slug {} does not exist.' .format(recipe_id)) # setup kwargs for merlynne kw = dict( org=org.to_dict( incl_auths=True, auths_as_dict=True, settings_as_dict=True, incl_domains=True, incl_users=True), apikey=user.apikey, recipe=r.to_dict(), recipe_obj=r, passthrough=arg_bool('passthrough', default=False), sous_chef_path=r.sous_chef.runs ) # initialize merlynne merlynne = Merlynne(**kw) try: resp = merlynne.cook_recipe() except Exception as e: raise RequestError( 'There was a problem initializing the SousChef: {}' .format(e.message)) # queued job if not kw['passthrough']: # set its status as 'queued' r.status = 'queued' db.session.add(r) db.session.commit() # # return job status url ret = url_for_job_status(apikey=user.apikey, job_id=resp, queue='recipe') return jsonify(ret, status=202) # format non-iterables. if isinstance(resp, dict): resp = [resp] # stream results def generate(): for item in resp: yield obj_to_json(item) + "\n" return Response(stream_with_context(generate()))
def cook_a_recipe(user, org, recipe_id): """ Run recipes via the API. """ r = fetch_by_id_or_field(Recipe, 'slug', recipe_id, org_id=org.id) if not r: raise NotFoundError( 'Recipe with id/slug {} does not exist.' .format(recipe_id)) if r.status == 'uninitialized': raise RequestError( 'Recipes must be initialized before cooking.') # determine passthrough from req method passthrough = False if request.method == 'POST': passthrough = True # setup kwargs for merlynne kw = dict( org=org.to_dict( incl_auths=True, auths_as_dict=True, settings_as_dict=True, incl_domains=True, incl_users=True), apikey=user.apikey, recipe=r.to_dict(), recipe_obj=r, passthrough=arg_bool('passthrough'), sous_chef_path=r.sous_chef.runs ) # check for runtme args for passthrough options. if kw['passthrough']: # parse runtime options from params + body. options = { k: v for k, v in dict(request.args.items()).items() if k not in ['apikey', 'org', 'localize', 'passthrough'] } # parse the runtime options. options.update(request_data()) # update the recipe if len(options.keys()): try: recipe = recipe_schema.update( r, options, r.sous_chef.to_dict()) except Exception as e: raise RequestError( 'Error trying to attempt to pass {} to recipe {} at runtime:\n{}' .format(options, recipes.slug, e.message)) kw['recipe']['options'].update(recipe.get('options', {})) # execute merlynne merlynne = Merlynne(**kw) resp = merlynne.cook_recipe() # queued job if not kw['passthrough']: # set its status as 'queued' r.status = 'queued' db.session.add(r) db.session.commit() # # return job status url ret = url_for_job_status(apikey=user.apikey, job_id=resp, queue='recipe') return jsonify(ret, status=202) # format non-iterables. if isinstance(resp, dict): resp = [resp] # stream results def generate(): for item in resp: yield obj_to_json(item) + "\n" return Response(stream_with_context(generate()))
def cook_a_recipe(user, org, recipe_id): """ Run recipes via the API. """ r = fetch_by_id_or_field(Recipe, 'slug', recipe_id, org_id=org.id) if not r: raise NotFoundError( 'Recipe with id/slug {} does not exist.'.format(recipe_id)) if r.status == 'uninitialized': raise RequestError('Recipes must be initialized before cooking.') # determine passthrough from req method passthrough = False if request.method == 'POST': passthrough = True # setup kwargs for merlynne kw = dict(org=org.to_dict(incl_auths=True, auths_as_dict=True, settings_as_dict=True, incl_domains=True, incl_users=True), apikey=user.apikey, recipe=r.to_dict(), recipe_obj=r, passthrough=arg_bool('passthrough'), sous_chef_path=r.sous_chef.runs) # check for runtme args for passthrough options. if kw['passthrough']: # parse runtime options from params + body. options = { k: v for k, v in dict(request.args.items()).items() if k not in ['apikey', 'org', 'localize', 'passthrough'] } # parse the runtime options. options.update(request_data()) # update the recipe if len(options.keys()): try: recipe = recipe_schema.update(r, options, r.sous_chef.to_dict()) except Exception as e: raise RequestError( 'Error trying to attempt to pass {} to recipe {} at runtime:\n{}' .format(options, recipes.slug, e.message)) kw['recipe']['options'].update(recipe.get('options', {})) # execute merlynne merlynne = Merlynne(**kw) resp = merlynne.cook_recipe() # queued job if not kw['passthrough']: # set its status as 'queued' r.status = 'queued' db.session.add(r) db.session.commit() # # return job status url ret = url_for_job_status(apikey=user.apikey, job_id=resp, queue='recipe') return jsonify(ret, status=202) # format non-iterables. if isinstance(resp, dict): resp = [resp] # stream results def generate(): for item in resp: yield obj_to_json(item) + "\n" return Response(stream_with_context(generate()))