def create_endpoint(parameters: dict, namespace: str, id_token: str):
    if not tenant_exists(namespace, id_token=id_token):
        raise TenantDoesNotExistException(tenant_name=namespace)

    metadata = {"name": parameters['endpointName']}
    body = {"apiVersion": CRD_API_VERSION, "kind": CRD_KIND,
            "spec": parameters, "metadata": metadata}
    api_instance = get_k8s_api_client(id_token)
    if 'resources' in parameters:
        validate_quota_compliance(api_instance, namespace=namespace,
                                  endpoint_quota=parameters['resources'])
        parameters['resources'] = transform_quota(parameters['resources'])

    apps_api_instance = get_k8s_apps_api_client(id_token)
    verify_endpoint_amount(api_instance, apps_api_instance, namespace)

    custom_obj_api_instance = get_k8s_api_custom_client(id_token)
    try:
        custom_obj_api_instance.create_namespaced_custom_object(CRD_GROUP, CRD_VERSION, namespace,
                                                                CRD_PLURAL, body)
    except ApiException as apiException:
        raise KubernetesCreateException('endpoint', apiException)
    endpoint_url = create_url_to_service(parameters['endpointName'], namespace)
    logger.info('Endpoint {} created\n'.format(endpoint_url))
    return endpoint_url
Beispiel #2
0
def delete_model(parameters: dict, namespace: str, id_token):
    if not tenant_exists(namespace, id_token):
        raise TenantDoesNotExistException(namespace)

    model_path = f"{parameters['modelName']}-{parameters['modelVersion']}"
    bucket = minio_resource.Bucket(name=namespace)
    model_in_bucket = bucket.objects.filter(Prefix=model_path)

    if not model_exists(model_in_bucket):
        raise ModelDoesNotExistException(model_path)

    apps_api_client = get_k8s_apps_api_client(id_token)
    try:
        deployments = apps_api_client.list_namespaced_deployment(namespace)
    except ApiException as apiException:
        raise KubernetesGetException('deployment', apiException)

    endpoint_names = endpoints_using_model(deployments, model_path)
    if endpoint_names:
        raise ModelDeleteException(
            f'model is used by endpoints: {endpoint_names}')

    for key in model_in_bucket:
        key.delete()

    return model_path
def view_endpoint(endpoint_name: str, namespace: str, id_token: str):
    if not tenant_exists(namespace, id_token=id_token):
        raise TenantDoesNotExistException(tenant_name=namespace)
    if not endpoint_exists(endpoint_name, namespace, id_token):
        raise EndpointDoesNotExistException(endpoint_name=endpoint_name)
    custom_api_instance = get_k8s_api_custom_client(id_token)
    api_instance = get_k8s_api_client(id_token)
    apps_api_instance = get_k8s_apps_api_client(id_token)

    endpoint_status = get_endpoint_status(api_instance=api_instance, namespace=namespace,
                                          endpoint_name=endpoint_name)
    model_path = create_url_to_service(endpoint_name, namespace)
    subject_name, resources = get_crd_subject_name_and_resources(
        custom_api_instance=custom_api_instance, namespace=namespace, endpoint_name=endpoint_name)
    replicas = get_replicas(apps_api_instance=apps_api_instance, namespace=namespace,
                            endpoint_name=endpoint_name)

    view_dict = {'Endpoint status': endpoint_status,
                 'Model path': model_path,
                 'Subject name': subject_name,
                 'Resources': resources,
                 'Replicas': replicas,
                 }
    message = f"Endpoint {endpoint_name} in {namespace} tenant: {view_dict}\n"
    logger.info(message)
    return message
Beispiel #4
0
def list_models(namespace: str, id_token):
    if not tenant_exists(namespace, id_token):
        raise TenantDoesNotExistException(namespace)

    apps_api_client = get_k8s_apps_api_client(id_token)
    try:
        deployments = apps_api_client.list_namespaced_deployment(namespace)
    except ApiException as apiException:
        raise KubernetesGetException('deployment', apiException)

    try:
        bucket = minio_resource.Bucket(name=namespace)
    except ClientError as clientError:
        raise MinioCallException(
            f'An error occurred during bucket reading: {clientError}')

    models = []
    for object in bucket.objects.all():
        if object.size > 0:
            model_path = object.key.split('/')[0].rsplit('-', 1)
            model_name = model_path[0]
            model_version = model_path[-1]
            model_size = object.size
            deployment_count = len(
                endpoints_using_model(deployments, model_path))
            models.append(
                (model_name, model_version, model_size, deployment_count))

    if not models:
        return f"There are no models present in {namespace} tenant\n"
    else:
        return f'Models in {namespace} tenant ' \
               f'(model name, model version, model size, deployed count): {models}\n'
def list_endpoints(namespace: str, id_token: str):
    if not tenant_exists(namespace, id_token=id_token):
        raise TenantDoesNotExistException(tenant_name=namespace)
    apps_api_instance = get_k8s_apps_api_client(id_token)
    try:
        deployments = apps_api_instance.list_namespaced_deployment(namespace)
    except ApiException as apiException:
        raise KubernetesGetException('endpoint', apiException)
    endpoints_name_status = get_endpoints_name_status(deployments, namespace)
    logger.info(endpoints_name_status)
    return endpoints_name_status