# This code is a Qiskit project.## (C) Copyright IBM 2022.## This code is licensed under the Apache License, Version 2.0. You may# obtain a copy of this license in the LICENSE.txt file in the root directory# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.## Any modifications or derivative works of this code must retain this# copyright notice, and modified files need to carry a notice indicating# that they have been altered from the originals."""=================================================Provider (:mod:`qiskit_serverless.core.function`)=================================================.. currentmodule:: qiskit_serverless.core.functionQiskit Serverless function==========================.. autosummary:: :toctree: ../stubs/ QiskitFunction"""importdataclassesimportwarningsfromdataclassesimportdataclassfromtypingimportOptional,Dict,List,Any,Tuple
[docs]@dataclassclassQiskitFunction:# pylint: disable=too-many-instance-attributes"""Serverless QiskitPattern. Args: title: program name provider: Qiskit Function provider reference entrypoint: is a script that will be executed as a job ex: job.py env_vars: env vars dependencies: list of python dependencies to execute a program working_dir: directory where entrypoint file is located (max size 50MB) description: description of a program version: version of a program """title:strprovider:Optional[str]=Noneentrypoint:Optional[str]=Noneworking_dir:Optional[str]="./"env_vars:Optional[Dict[str,str]]=Nonedependencies:Optional[List[str]]=Nonedescription:Optional[str]=Noneversion:Optional[str]=Nonetags:Optional[List[str]]=Noneraw_data:Optional[Dict[str,Any]]=Nonejob_client:Optional[Any]=Noneimage:Optional[str]=Nonevalidate:bool=Trueschema:Optional[str]=Nonedef__post_init__(self):title_has_provider="/"inself.titleiftitle_has_provider:title_split=self.title.split("/")iflen(title_split)>2:raiseValueError("Invalid title: it can only contain one slash.")ifself.provider!=title_split[0]andself.providerisnotNone:raiseValueError("Invalid provider: you provided two different "+f"providers [{self.provider}] and [{title_split[0]}].")self.provider=title_split[0]self.title=title_split[1]@classmethoddeffrom_json(cls,data:Dict[str,Any]):"""Reconstructs QiskitPattern from dictionary."""field_names=set(f.nameforfindataclasses.fields(QiskitFunction))returnQiskitFunction(**{k:vfork,vindata.items()ifkinfield_names})def__str__(self):ifself.providerisnotNone:returnf"QiskitFunction({self.provider}/{self.title})"returnf"QiskitFunction({self.title})"def__repr__(self):returnself.__str__()defrun(self,**kwargs):"""Run function Raises: QiskitServerlessException: validation exception Returns: Job: job handler for function execution """ifself.job_clientisNone:raiseValueError("No clients specified for a function.")ifself.validate:is_valid,validation_errors=self._validate_function()ifnotis_valid:error_string="\n".join(validation_errors)raiseValueError(f"Function validation failed. Validation errors:\n{error_string}",)config=kwargs.pop("config",None)returnself.job_client.run(program=self.title,provider=self.provider,arguments=kwargs,config=config,)defget_jobs(self):"""List of jobs created in this function. Raises: QiskitServerlessException: validation exception Returns: [Job] : list of jobs """warnings.warn("`get_jobs` method has been deprecated. ""And will be removed in future releases. ""Please, use `jobs` instead.",DeprecationWarning,)returnself.jobs()defjobs(self):"""List of jobs created in this function. Raises: QiskitServerlessException: validation exception Returns: [Job] : list of jobs """fromqiskit_serverless.core.jobimport(# pylint: disable=import-outside-toplevelJob,)ifself.job_clientisNone:raiseValueError("No clients specified for a function.")ifself.validate:is_valid,validation_errors=self._validate_function()ifnotis_valid:error_string="\n".join(validation_errors)raiseValueError(f"Function validation failed. Validation errors:\n{error_string}",)response=self.job_client.get_jobs(title=self.title,provider=self.provider,)jobs=[Job(job_id=job.get("id"),job_client=self.job_client,raw_data=job)forjobinresponse]returnjobsdef_validate_function(self)->Tuple[bool,List[str]]:"""Validate function arguments using schema provided. Returns: Tuple[bool, List[str]]: boolean specifiying if function arguments are valid list of validation errors, if any """returnTrue,[]
# pylint: disable=abstract-method
[docs]classQiskitPattern(QiskitFunction):""" [Deprecated since version 0.10.0] Use :class:`.QiskitFunction` instead. A provider for connecting to a ray head node. This class has been renamed to :class:`.QiskitFunction`. """