Example #1
0
def _bento_orm_obj_to_pb(bento_obj, labels=None):
    # Backwards compatible support loading saved bundle created before 0.8.0
    if ('apis' in bento_obj.bento_service_metadata
            and bento_obj.bento_service_metadata['apis']):
        for api in bento_obj.bento_service_metadata['apis']:
            if 'handler_type' in api:
                api['input_type'] = api['handler_type']
                del api['handler_type']
            if 'handler_config' in api:
                api['input_config'] = api['handler_config']
                del api['handler_config']
            if 'output_type' not in api:
                api['output_type'] = 'DefaultOutput'

    bento_service_metadata_pb = ParseDict(bento_obj.bento_service_metadata,
                                          BentoServiceMetadata())
    bento_uri = BentoUri(uri=bento_obj.uri,
                         type=BentoUri.StorageType.Value(bento_obj.uri_type))
    if not bento_obj.upload_status:
        upload_status = DEFAULT_UPLOAD_STATUS
    else:
        upload_status = UploadStatus(status=UploadStatus.Status.Value(
            bento_obj.upload_status['status']))
    if labels is not None:
        bento_service_metadata_pb.labels.update(labels)
    return BentoPB(
        name=bento_obj.name,
        version=bento_obj.version,
        uri=bento_uri,
        bento_service_metadata=bento_service_metadata_pb,
        status=upload_status,
    )
 def _update_bento_upload_progress(
     self, bento_service_metadata, status=UploadStatus.DONE, percentage=None
 ):
     upload_status = UploadStatus(status=status, percentage=percentage)
     upload_status.updated_at.GetCurrentTime()
     update_bento_req = UpdateBentoRequest(
         bento_name=bento_service_metadata.name,
         bento_version=bento_service_metadata.version,
         upload_status=upload_status,
         service_metadata=bento_service_metadata,
     )
     self.yatai_service.UpdateBento(update_bento_req)
from google.protobuf.json_format import ParseDict

from bentoml.utils import ProtoMessageToDict
from bentoml.exceptions import YataiRepositoryException
from bentoml.yatai.db import Base, create_session
from bentoml.yatai.proto.repository_pb2 import (
    UploadStatus,
    BentoUri,
    BentoServiceMetadata,
    Bento as BentoPB,
    ListBentoRequest,
)

logger = logging.getLogger(__name__)

DEFAULT_UPLOAD_STATUS = UploadStatus(status=UploadStatus.UNINITIALIZED)


class Bento(Base):
    __tablename__ = 'bentos'
    __table_args__ = tuple(
        UniqueConstraint('name', 'version', name='_name_version_uc'))

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    version = Column(String, nullable=False)

    # Storage URI for this Bento
    uri = Column(String, nullable=False)

    # Name is is required for PostgreSQL and any future supported database which
Example #4
0
 def UploadBento(self, request_iterator, context=None):
     if not is_file_system_repo(self.repo):
         logger.error(
             "UploadBento RPC only works with File System based repository, "
             "for other types of repositories(s3, gcs, minio), "
             "use pre-signed URL for upload")
         return UploadBentoResponse(status=Status.INTERNAL(''))
     try:
         with self.db.create_session() as sess:
             lock_obj = None
             bento_pb = None
             with TempDirectory() as temp_dir:
                 temp_tar_path = os.path.join(
                     temp_dir, f'{uuid.uuid4().hex[:12]}.tar')
                 file = open(temp_tar_path, 'wb+')
                 for request in request_iterator:
                     # Initial request is without bundle
                     if not request.bento_bundle:
                         bento_name = request.bento_name
                         bento_version = request.bento_version
                         bento_pb = self.db.metadata_store.get(
                             sess, bento_name, bento_version)
                         if not bento_pb:
                             result_status = Status.NOT_FOUND(
                                 "BentoService `{}:{}` is not found".
                                 format(bento_name, bento_version))
                             return UploadBentoResponse(
                                 status=result_status)
                         if bento_pb.status:
                             if bento_pb.status.status == UploadStatus.DONE:
                                 return UploadBentoResponse(
                                     status=Status.CANCELLED(
                                         f"Bento bundle `{bento_name}:"
                                         f"{bento_version}` is uploaded"
                                     ))
                             if bento_pb.status.status == UploadStatus.UPLOADING:
                                 return UploadBentoResponse(
                                     status=Status.CANCELLED(
                                         f"Bento bundle `{bento_name}:"
                                         f"{bento_version}` is currently "
                                         f"uploading"))
                         if lock_obj is None:
                             lock_obj = LockStore.acquire(
                                 sess=sess,
                                 lock_type=LockType.WRITE,
                                 resource_id=
                                 f'{bento_name}_{bento_version}',
                                 ttl_min=DEFAULT_TTL_MIN,
                             )
                     else:
                         if (bento_name == request.bento_name
                                 and bento_version
                                 == request.bento_version):
                             file.write(request.bento_bundle)
                         else:
                             lock_obj.release(sess)
                             raise BadInput(
                                 f"Incoming stream request doesn't match "
                                 f"with initial request info "
                                 f"{bento_name}:{bento_version} - "
                                 f"{request.bento_name}:"
                                 f"{request.bento_version}")
                 file.seek(0)
                 with tarfile.open(fileobj=file, mode='r') as tar:
                     tar.extractall(path=bento_pb.uri.uri)
                 upload_status = UploadStatus(status=UploadStatus.DONE)
                 upload_status.updated_at.GetCurrentTime()
                 self.db.metadata_store.update_upload_status(
                     sess, bento_name, bento_version, upload_status)
                 lock_obj.release(sess)
                 return UploadBentoResponse(status=Status.OK())
     except BentoMLException as e:
         logger.error("RPC ERROR UploadBento: %s", e)
         return UploadBentoResponse(status=e.status_proto)
     except Exception as e:  # pylint: disable=broad-except
         logger.error("RPC ERROR UploadBento: %s", e)
         return UploadBentoResponse(status=Status.INTERNAL())
     finally:
         if file is not None:
             file.close()