pai/api/api_container.py (163 lines of code) (raw):
# Copyright 2023 Alibaba, Inc. or its affiliates.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Optional, Union
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_sts20150401.client import Client as StsClient
from ..common.consts import DEFAULT_NETWORK_TYPE, PAI_VPC_ENDPOINT, Network
from ..common.utils import is_domain_connectable
from ..libs.alibabacloud_pai_dsw20220101.client import Client as DswClient
from .algorithm import AlgorithmAPI
from .base import PAIRestResourceTypes, ServiceName, WorkspaceScopedResourceAPI
from .client_factory import ClientFactory
from .code_source import CodeSourceAPI
from .dataset import DatasetAPI
from .experiment import ExperimentAPI
from .image import ImageAPI
from .job import JobAPI
from .model import ModelAPI
from .pipeline import PipelineAPI
from .pipeline_run import PipelineRunAPI
from .service import ServiceAPI
from .tensorboard import TensorBoardAPI
from .training_job import TrainingJobAPI
from .workspace import WorkspaceAPI
_RESOURCE_API_MAPPING = {
PAIRestResourceTypes.DlcJob: JobAPI,
PAIRestResourceTypes.CodeSource: CodeSourceAPI,
PAIRestResourceTypes.Dataset: DatasetAPI,
PAIRestResourceTypes.Image: ImageAPI,
PAIRestResourceTypes.Service: ServiceAPI,
PAIRestResourceTypes.Model: ModelAPI,
PAIRestResourceTypes.Workspace: WorkspaceAPI,
PAIRestResourceTypes.Algorithm: AlgorithmAPI,
PAIRestResourceTypes.TrainingJob: TrainingJobAPI,
PAIRestResourceTypes.Pipeline: PipelineAPI,
PAIRestResourceTypes.PipelineRun: PipelineRunAPI,
PAIRestResourceTypes.TensorBoard: TensorBoardAPI,
PAIRestResourceTypes.Experiment: ExperimentAPI,
}
class ResourceAPIsContainerMixin(object):
"""ResourceAPIsContainerMixin provides Resource Operation APIs."""
_credential_client = None
_credential_config = None
_region_id = None
_workspace_id = None
def __init__(
self, header=None, runtime=None, network: Optional[Union[str, Network]] = None
):
"""Initialize ResourceAPIsContainerMixin.
Args:
header: Header for API request.
runtime: Runtime for API request.
network: Network type used to connect to PAI services.
"""
self.header = header
self.runtime = runtime
self.api_container = dict()
self.acs_client_container = dict()
if network:
self.network = (
Network.from_string(network) if isinstance(network, str) else network
)
elif DEFAULT_NETWORK_TYPE:
self.network = Network.from_string(DEFAULT_NETWORK_TYPE)
else:
self.network = (
Network.VPC
if is_domain_connectable(PAI_VPC_ENDPOINT.format(self._region_id))
else Network.PUBLIC
)
def _acs_credential_client(self):
if self._credential_client:
return self._credential_client
self._credential_client = CredentialClient(config=self._credential_config)
return self._credential_client
def _get_acs_client(self, service_name):
if service_name in self.acs_client_container:
return self.acs_client_container[service_name]
acs_client = ClientFactory.create_client(
service_name=service_name,
credential_client=self._acs_credential_client(),
region_id=self._region_id,
network=self.network,
)
self.acs_client_container[service_name] = acs_client
return acs_client
@property
def _acs_workspace_client(self):
return self._get_acs_client(ServiceName.PAI_WORKSPACE)
@property
def _acs_dlc_client(self):
return self._get_acs_client(ServiceName.PAI_DLC)
@property
def _acs_paiflow_client(self):
return self._get_acs_client(ServiceName.PAIFLOW)
@property
def _acs_eas_client(self):
return self._get_acs_client(ServiceName.PAI_EAS)
@property
def _acs_training_client(self):
return self._get_acs_client(ServiceName.PAI_STUDIO)
@property
def _acs_sts_client(self) -> StsClient:
return self._get_acs_client(ServiceName.STS)
@property
def _acs_dsw_client(self) -> DswClient:
return self._get_acs_client(ServiceName.PAI_DSW)
def get_api_by_resource(self, resource_type):
if resource_type in self.api_container:
return self.api_container[resource_type]
api_cls = _RESOURCE_API_MAPPING[resource_type]
acs_client = self._get_acs_client(api_cls.BACKEND_SERVICE_NAME)
if issubclass(api_cls, WorkspaceScopedResourceAPI):
api = api_cls(
workspace_id=self._workspace_id,
acs_client=acs_client,
header=self.header,
runtime=self.runtime,
)
elif api_cls == ServiceAPI:
# for PAI-EAS service api, we need to pass region_id.
api = api_cls(
acs_client=acs_client,
region_id=self._region_id,
header=self.header,
runtime=self.runtime,
)
else:
api = api_cls(
acs_client=acs_client,
header=self.header,
runtime=self.runtime,
)
self.api_container[resource_type] = api
return api
@property
def job_api(self) -> JobAPI:
"""Returns JobAPI for job operation."""
return self.get_api_by_resource(PAIRestResourceTypes.DlcJob)
@property
def tensorboard_api(self) -> TensorBoardAPI:
return self.get_api_by_resource(PAIRestResourceTypes.TensorBoard)
@property
def code_source_api(self) -> CodeSourceAPI:
"""Return CodeSource API for code_source operation"""
return self.get_api_by_resource(PAIRestResourceTypes.CodeSource)
@property
def dataset_api(self) -> DatasetAPI:
"""Return Dataset API for dataset operation"""
return self.get_api_by_resource(PAIRestResourceTypes.Dataset)
@property
def image_api(self) -> ImageAPI:
return self.get_api_by_resource(PAIRestResourceTypes.Image)
@property
def model_api(self) -> ModelAPI:
return self.get_api_by_resource(PAIRestResourceTypes.Model)
@property
def service_api(self) -> ServiceAPI:
return self.get_api_by_resource(PAIRestResourceTypes.Service)
@property
def workspace_api(self) -> WorkspaceAPI:
return self.get_api_by_resource(PAIRestResourceTypes.Workspace)
@property
def algorithm_api(self) -> AlgorithmAPI:
return self.get_api_by_resource(PAIRestResourceTypes.Algorithm)
@property
def training_job_api(self) -> TrainingJobAPI:
return self.get_api_by_resource(PAIRestResourceTypes.TrainingJob)
@property
def pipeline_api(self) -> PipelineAPI:
return self.get_api_by_resource(PAIRestResourceTypes.Pipeline)
@property
def pipeline_run_api(self) -> PipelineRunAPI:
return self.get_api_by_resource(PAIRestResourceTypes.PipelineRun)
@property
def experiment_api(self) -> ExperimentAPI:
return self.get_api_by_resource(PAIRestResourceTypes.Experiment)