def public_url(self): """ Generate a publicly visible URL for this artifact. """ return create_url( f"{self.pipeline_run.pipeline.uuid}/{self.pipeline_run.uuid}/{self.uuid}-{quote(self.name)}", self.name, )
def fetch_pipeline_run( organization_uuid, organization_pipeline_uuid, organization_pipeline_run_uuid ): """Find an OrganizationPipelineRun for a pipline.""" org_pipeline = find_organization_pipeline( organization_uuid, organization_pipeline_uuid ) org_pipeline_run = next( filter( lambda r: r.uuid == organization_pipeline_run_uuid, org_pipeline.organization_pipeline_runs ) ) response = requests.get( f"{current_app.config[WORKFLOW_HOSTNAME]}/v1/pipelines/{org_pipeline.pipeline_uuid}/runs/{org_pipeline_run.pipeline_run_uuid}", headers={ "Content-Type": "application/json", ROLES_KEY: current_app.config[WORKFLOW_API_TOKEN], }, ) try: pipeline_run = response.json() response.raise_for_status() # update with org uuid opr = find_organization_pipeline_run( org_pipeline.id, str(pipeline_run.get("uuid")) ) pipeline_run["uuid"] = opr.uuid org_pipeline_input_files = find_organization_pipeline_input_files( org_pipeline.id ) inputs = [] # generate download urls and add uuid for opf in org_pipeline_input_files: if opf.organization_pipeline_run_id == opr.id: sname = quote(opf.name) url = create_url( f"{organization_pipeline_uuid}/{opf.uuid}-{sname}", sname ) inputs.append({"url": url, "name": opf.name, "uuid": opf.uuid}) pipeline_run["inputs"] = inputs return pipeline_run except ValueError as value_error: raise HTTPError("Non JSON payload returned") from value_error except HTTPError as http_error: raise ValueError(pipeline_run) from http_error
def create_pipeline_run(organization_uuid, pipeline_uuid, request_json): """Creates OrganizationPipelineRuns for a pipline.""" org_pipeline = find_organization_pipeline(organization_uuid, pipeline_uuid) input_file_uuids = request_json.get("inputs", []) if not org_pipeline: raise ValueError({"message": "organizational_pipeline_uuid not found"}) org_pipeline_input_files = search_organization_pipeline_input_files( org_pipeline.id, input_file_uuids ) new_pipeline_run = OrganizationPipelineRun( organization_pipeline_id=org_pipeline.id, status_update_token=uuid.uuid4().hex, status_update_token_expires_at=datetime.now() + timedelta(days=7), share_token=uuid.uuid4().hex, share_password_hash=None, share_password_salt=None, ) db.session.add(new_pipeline_run) db.session.flush() new_pipeline = {"inputs": []} for opf in org_pipeline_input_files: sname = quote(opf.name) url = create_url(f"{pipeline_uuid}/{opf.uuid}-{sname}", sname) new_pipeline["inputs"].append({"url": url, "name": opf.name}) response = requests.post( f"{current_app.config[WORKFLOW_HOSTNAME]}/v1/pipelines/{org_pipeline.pipeline_uuid}/runs", headers={ "Content-Type": "application/json", ROLES_KEY: current_app.config[WORKFLOW_API_TOKEN], }, json=new_pipeline, ) try: created_pipeline = response.json() response.raise_for_status() new_pipeline_run.uuid = ( new_pipeline_run.pipeline_run_uuid ) = created_pipeline.get("uuid") db.session.add(new_pipeline_run) for opf in org_pipeline_input_files: opf.organization_pipeline_run_id = new_pipeline_run.id db.session.add(opf) db.session.commit() created_pipeline.update( { "uuid": new_pipeline_run.uuid, } ) return created_pipeline except ValueError as value_error: raise HTTPError("Non JSON payload returned") from value_error except HTTPError as http_error: raise ValueError(created_pipeline) from http_error