From cd6471653908f7a28dcaba81f3ac9c28c0caa645 Mon Sep 17 00:00:00 2001 From: Dan Wolfson Date: Fri, 19 Jul 2024 16:17:13 -0500 Subject: [PATCH] Updates to make the widgets easier to use and provide alternate python environments. Signed-off-by: Dan Wolfson --- README.md | 5 +- .../Dockerfile-jupyter | 52 +- .../before-notebook.d/config-coco.sh | 2 +- .../egeria-platform-jupyter-compose.yaml | 8 +- .../z-egeria-platform-jupyter-compose.yaml | 95 +++ .../UnityCatalog-demo-cataloguing-uc.http | 379 +++++++++ workspaces/Untitled.ipynb | 8 +- workspaces/Untitled1.ipynb | 258 +++++++ workspaces/Untitled2.ipynb | 107 +++ workspaces/experiments.ipynb | 723 +++--------------- workspaces/uc-demo.jupyterlab-workspace | 1 + 11 files changed, 986 insertions(+), 652 deletions(-) create mode 100644 egeria-platform-jupyter-compose/z-egeria-platform-jupyter-compose.yaml create mode 100644 workspaces/UnityCatalog-demo-cataloguing-uc.http create mode 100644 workspaces/Untitled1.ipynb create mode 100644 workspaces/Untitled2.ipynb create mode 100644 workspaces/uc-demo.jupyterlab-workspace diff --git a/README.md b/README.md index c0f837c..ccf513a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,10 @@ Please feel free to engage with the community on our slack channel - we'd love y For a quick and simple environment to explore some of Egeria's base capabilities, the **egeria-platform.yml** Docker Compose deployment may be a good starting point. Once this script executes successfully, you will have two docker containers running. One for the Egeria platform and one for Kafka. With this running configuration, you can work with any of Egeria's standard interfaces - java APIs, python APIs, or just plain RESTful http calls - and of course, to make use of tools and interfaces that have been built using these APIs. -The set of **Docker Compose** configurations will grow and evolve over time to cover additional scenarios. +If you are a data scientist or just want to work within a Jupyter Notebook environment, the `egeria-platform-jupyter-compose` script +adds a Jupyter server pre-configured with the Egeria Python client, **pyegeria** for you to use. +The set of **Docker Compose** configurations will continue to grow and evolve over time to cover additional scenarios based on +community feedback. # Contents diff --git a/egeria-platform-jupyter-compose/Dockerfile-jupyter b/egeria-platform-jupyter-compose/Dockerfile-jupyter index 3472451..b249350 100644 --- a/egeria-platform-jupyter-compose/Dockerfile-jupyter +++ b/egeria-platform-jupyter-compose/Dockerfile-jupyter @@ -7,21 +7,53 @@ # The published image tag is taken from the numerical version of # our base image, and appended with the contents of .tag-append (file) FROM quay.io/jupyter/scipy-notebook +ARG env_name=python312 +ARG py_ver=3.12 -RUN pip install --no-cache-dir 'pyegeria>=0.5.5.13' -RUN pip install --no-cache-dir 'rich' -RUN pip install --no-cache-dir 'unitycatalog' -RUN pip install --no-cache-dir 'pipx' -RUN pipx ensurepath -RUN pipx install pyegeria -RUN pipx ensurepath +# Experimenting moving to latest python +RUN mamba create --yes -p "${CONDA_DIR}/envs/${env_name}" \ + python=${py_ver} \ + 'ipykernel' \ + 'jupyterlab' && \ + mamba clean --all -f -y -RUN alias view_integ='view_integ_daemon_status --integ_url https://host.docker.internal:9443 --view_url https://host.docker.internal:9443' -RUN alias view_plat='view_platform_status --url https://host.docker.internal:9443' +#COPY --chown=${NB_UID}:${NB_GID} environment.yml /tmp/ +#RUN mamba env create -p "${CONDA_DIR}/envs/${env_name}" -f /tmp/environment.yml && \ +# mamba clean --all -f -y + + +RUN "${CONDA_DIR}/envs/${env_name}/bin/python" -m ipykernel install --user --name="${env_name}" && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +RUN "${CONDA_DIR}/envs/${env_name}/bin/pip3" install --no-cache-dir 'pyegeria>=0.5.5.16' +RUN "${CONDA_DIR}/envs/${env_name}/bin/pip3" install --no-cache-dir 'rich' +RUN "${CONDA_DIR}/envs/${env_name}/bin/pip3" install --no-cache-dir 'unitycatalog' +RUN "${CONDA_DIR}/envs/${env_name}/bin/pip3" install --no-cache-dir 'pipx' +RUN "${CONDA_DIR}/envs/${env_name}/bin/pipx" install pyegeria +RUN "${CONDA_DIR}/envs/${env_name}/bin/pipx" ensurepath + +USER root +RUN \ + # This changes a startup hook, which will activate the custom environment for the process + echo conda activate "${env_name}" >> /usr/local/bin/before-notebook.d/10activate-conda-env.sh && \ + # This makes the custom environment default in Jupyter Terminals for all users which might be created later + echo conda activate "${env_name}" >> /etc/skel/.bashrc && \ + # This makes the custom environment default in Jupyter Terminals for already existing NB_USER + echo conda activate "${env_name}" >> "/home/${NB_USER}/.bashrc" + +USER ${NB_UID} +#RUN pip install --no-cache-dir 'pyegeria>=0.5.5.15' +#RUN pip install --no-cache-dir 'rich' +#RUN pip install --no-cache-dir 'unitycatalog' +#RUN pip install --no-cache-dir 'pipx' +#RUN pipx ensurepath +#RUN pipx install pyegeria +#RUN pipx ensurepath RUN mkdir -p /home/jovyan/workspaces RUN chmod +xrw /home/jovyan/workspaces -copy ../Start-Here.md /home/jovyan +COPY ../Start-Here.md /home/jovyan # && \ # fix-permissions "${CONDA_DIR}" && \ # fix-permissions "/home/${NB_USER}" \ diff --git a/egeria-platform-jupyter-compose/before-notebook.d/config-coco.sh b/egeria-platform-jupyter-compose/before-notebook.d/config-coco.sh index 75423c8..606c851 100755 --- a/egeria-platform-jupyter-compose/before-notebook.d/config-coco.sh +++ b/egeria-platform-jupyter-compose/before-notebook.d/config-coco.sh @@ -15,4 +15,4 @@ #python3 /home/jovyan/egeria-labs/common/config_coco_development.py #echo "Launching Jupyter notebook server.." - +/opt/conda/bin/activate python312 diff --git a/egeria-platform-jupyter-compose/egeria-platform-jupyter-compose.yaml b/egeria-platform-jupyter-compose/egeria-platform-jupyter-compose.yaml index 36ed8bd..24a735a 100644 --- a/egeria-platform-jupyter-compose/egeria-platform-jupyter-compose.yaml +++ b/egeria-platform-jupyter-compose/egeria-platform-jupyter-compose.yaml @@ -52,8 +52,6 @@ services: - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - - egeria-main: depends_on: @@ -77,8 +75,10 @@ services: start_interval: 5s volumes: - - ../landing_area:/deployments/landing-area - - ../logs:/deployments/logs + - ../landing-area:/deployments/landing-area + - ../distribution-hub:/deployments/distribution-hub + - ../distribution-hub/surveys:/deployments/surveys + - ../distribution-hub/logs:/deployments/logs # - "YOUR EXTRA LIBRARY DIRECTORY"/extra:/deployments/extra # - "ANOTHER DIRECTOR TO MOUNT"/:/deployments/user_mount diff --git a/egeria-platform-jupyter-compose/z-egeria-platform-jupyter-compose.yaml b/egeria-platform-jupyter-compose/z-egeria-platform-jupyter-compose.yaml new file mode 100644 index 0000000..36ed8bd --- /dev/null +++ b/egeria-platform-jupyter-compose/z-egeria-platform-jupyter-compose.yaml @@ -0,0 +1,95 @@ +--- +# SPDX-License-Identifier: Apache-2.0 +# Copyright Contributors to the Egeria project + + +# To run +# * Ensure Docker is installed and running +# * Start Egeria Platform stack from the 'coco-lab-docker-compose' folder using: +# 'docker compose -f ./egeria-platform-jupyter-uc-compose.yaml up --build' +# * Subsequent startups can be performed without the '--build' at the end +# * Uninstall the containers by issuing 'docker compose -f ./egeria-platform-jupyter-uc-compose.yaml down' +# +# Assumptions: +# * Ports 7443, 7444, 7445 and 9192 are available on the host system - these are the default ports for Kafka and Egeria. +# * by default, the jupyter notebooks in the 'coco-jupyter-labs' folder are mounted and available for use by the jupyter noteboos +# * by default, strict SSL validation is turned off +# +# + +services: + jupyter-hub: + depends_on: + egeria-main: + condition: service_healthy + + image: quay.io/jupyter/scipy-notebook + container_name: jupyter-work + ports: + - 8888:8888 + environment: + JUPYTER_ENABLE_LAB: "yes" + JUPYTER_TOKEN: "egeria" + build: + dockerfile: Dockerfile-jupyter + + volumes: + - ./before-notebook.d:/usr/local/bin/before-notebook.d + - ../work:/home/jovyan/work + - ../workspaces:/home/jovyan/workspaces + + + kafka: + image: 'bitnami/kafka:latest' + ports: + - '9092:9092' + + environment: + - KAFKA_CFG_NODE_ID=0 + - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true + - KAFKA_CFG_PROCESS_ROLES=controller,broker + - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 + - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT + - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 + - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER + + + + egeria-main: + depends_on: + - kafka + image: 'egeria-platform:uc1' +# image: 'docker.io/odpi/egeria-platform:stable' + ports: + - '9443:9443' + environment: + - XTDB_ENABLE_BYTEUTILS_SHA1=True + - XTDB_DISABLE_LIBCRYPTO=True + - startup.server.list=active-metadata-store,engine-host,integration-daemon,view-server,simple-metadata-store + - server.port=9443 + + healthcheck: + test: curl -k -X GET "https://localhost:9443/open-metadata/platform-services/users/garygeeke/server-platform/origin" || exit 1 + interval: 20s + timeout: 10s + retries: 3 + start_period: 10s + start_interval: 5s + + volumes: + - ../landing_area:/deployments/landing-area + - ../logs:/deployments/logs + # - "YOUR EXTRA LIBRARY DIRECTORY"/extra:/deployments/extra + # - "ANOTHER DIRECTOR TO MOUNT"/:/deployments/user_mount + + +# +# Change external to true and create volumes manually if you wish to persist between runs +# +volumes: + zookeeper-data: + external: false + kafka-data: + external: false + db_home: + external: false diff --git a/workspaces/UnityCatalog-demo-cataloguing-uc.http b/workspaces/UnityCatalog-demo-cataloguing-uc.http new file mode 100644 index 0000000..4a0f880 --- /dev/null +++ b/workspaces/UnityCatalog-demo-cataloguing-uc.http @@ -0,0 +1,379 @@ +# Unity catalog enablement demo + +@baseURL=https://localhost:9443 +@viewServer=view-server + +### +# ===================================================================================================================== +# Manage the authentication token. Run this request to create/refresh the token. + +# @name Token (RequestBody) +POST {{baseURL}}/api/token +Content-Type: application/json + +{ + "userId" : "peterprofile", + "password" : "secret" +} + +> {% client.global.set("token", response.body); %} + + + +### +# ===================================================================================================================== +# What do we know about the OSS Unity Catalog +# + + +### +# @name findTechnologyTypes +# Retrieve the list of deployed implementation type metadata elements that contain the search string. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/by-search-string?startFrom=0&pageSize=0&startsWith=false&endsWith=false&ignoreCase=true +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "Unity Catalog" +} + + +### +# @name getTechnologyTypeDetail +# Retrieve the requested deployed implementation type metadata element. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/by-name +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Server" +} + + +### +# @name getTechnologyTypeDetail +# Retrieve the requested deployed implementation type metadata element. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/by-name +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Catalog" +} + + +### +# @name getTechnologyTypeDetail +# Retrieve the requested deployed implementation type metadata element. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/by-name +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Volume" +} + +### +# ===================================================================================================================== +# Create a server asset for the OSS Unity Catalog +# + +### +# @name getTechnologyTypeTemplates (OSS Unity Catalog (UC) Server) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=true +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Server" +} + + +### +# @name createElementFromTemplate (OSS Unity Catalog (UC) Server) +# Create a new element from a template. +# Further Information: https://egeria-project.org/features/templated-cataloguing/overview/ +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/catalog-templates/new-element +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "templateGUID" : "1077a346-7a50-4cb0-a795-b219bafaabf6", + "isOwnAnchor" : true, + "placeholderPropertyValues" : { + "hostURL" : "http://localhost", + "portNumber" : "8080", + "serverName" : "Unity Catalog 1", + "versionIdentifier" : "V1.0", + "description" : "First instance of the OSS Unity Catalog (UC) Server.", + "serverUserId" : "uc1", + "versionIdentifier" : "V1.0" + } +} + + + +### + +@serverGUID=47132e90-108e-442b-8edb-c8c86f091692 + +### +# @name getTechnologyTypeElements (UC Server) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=false +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Server" +} + + +### +# @name=getAssetGraph +# Return all the elements that are anchored to an asset plus relationships between these elements and to other elements. +# +# Asset: https://egeria-project.org/concepts/asset/ +GET {{baseURL}}/servers/{{viewServer}}/api/open-metadata/asset-catalog/assets/{{serverGUID}}/as-graph?startFrom=0&pageSize=0 +Authorization: Bearer {{token}} +Content-Type: application/json + + +### +# ===================================================================================================================== +# Discover the templates +# + +@ucCatalogTemplateGUID=f7b05a3e-913c-497d-96f5-acdeb2ec897e +@ucSchemaTemplateGUID=d68f5aa3-152e-40fa-8c16-e73db8d925d6 +@ucVolumeTemplateGUID=dfc0c928-0db3-4eb4-a1f0-0760dab168c5 +@ucTableTemplateGUID=cb34184b-d6a9-4a27-9fd2-ea4c78978f9f +@ucFunctionTemplateGUID=5b72bd18-665d-4696-8ebb-f6d0885312e2 + +### +# @name getTechnologyTypeTemplates (UC Catalog) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=true +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "get" +} + +### +# @name getTechnologyTypeTemplates (UC Schema) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=true +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Schema" +} + +### +# @name getTechnologyTypeTemplates (UC Volume) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=true +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Volume" +} + +### +# @name getTechnologyTypeTemplates (UC Table) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=true +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Table" +} + +### +# @name getTechnologyTypeTemplates (UC Function) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=true +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Function" +} + + +### +# ===================================================================================================================== +# Create a catalog target relationship between the new UC server asset and the integration connector. +# Then refresh the UC Integration Connectors to force the cataloguing (or wait an hour :) +# + +@integrationConnectorGUID=06d068d9-9e08-4e67-8c59-073bbf1013af +@friendshipGUID=74dde22f-2249-4ea3-af2b-b39e73f79b81 + +### +# @name addCatalogTarget +# Add a catalog target to the Unity Catalog Server Sync integration connector. +# Notice that details of all of the templates for different types of UC elements are passed. These +# are not used directly by this connector, but passed to the friendship connector +# (Unity Catalog Inside Catalog Sync integration conenctor) to support its cataloguing. +# Further Information: https://egeria-project.org/concepts/integration-connector/ +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/integration-connectors/{{integrationConnectorGUID}}/catalog-targets/{{serverGUID}} +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "catalogTargetName" : "uc1", + "templateProperties" : { + "OSS Unity Catalog (UC) Catalog" : "{{ucCatalogTemplateGUID}}", + "OSS Unity Catalog (UC) Schema" : "{{ucSchemaTemplateGUID}}", + "OSS Unity Catalog (UC) Volume" : "{{ucVolumeTemplateGUID}}", + "OSS Unity Catalog (UC) Table" : "{{ucTableTemplateGUID}}", + "OSS Unity Catalog (UC) Function" : "{{ucFunctionTemplateGUID}}" + }, + "configurationProperties" : { + "OSSUnityCatalogFriendshipGUID" : "74dde22f-2249-4ea3-af2b-b39e73f79b81" + } +} + + +### +# @name getCatalogTargets (OSSUnityCatalogServerSynchronizer) +# Retrieve the details of the metadata elements identified as catalog targets with an integration connector. +# Further Information: https://egeria-project.org/concepts/integration-connector/ +GET {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/integration-connectors/{{integrationConnectorGUID}}/catalog-targets?startFrom=0&pageSize=0 +Authorization: Bearer {{token}} +Content-Type: application/json + + + +### +# @name Refresh Integration Connector (OSSUnityCatalogServerSynchronizer) +# Refreshes all Integration Connectors running in an integration daemon +POST {{baseURL}}/servers/integration-daemon/open-metadata/integration-daemon/users/garygeeke/integration-connectors/refresh +Content-Type: application/json + +{ + "class" : "NameRequestBody", + "name" : "OSSUnityCatalogServerSynchronizer" +} + + +### +# @name getCatalogTargets (OSSUnityCatalogInsideCatalogSynchronizer) +# Retrieve the details of the metadata elements identified as catalog targets with an integration connector. +# Further Information: https://egeria-project.org/concepts/integration-connector/ +GET {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/integration-connectors/{{friendshipGUID}}/catalog-targets?startFrom=0&pageSize=10 +Authorization: Bearer {{token}} +Content-Type: application/json + + +### +# @name Refresh Integration Connector (OSSUnityCatalogInsideCatalogSynchronizer) +# Refreshes all Integration Connectors running in an integration daemon +POST {{baseURL}}/servers/integration-daemon/open-metadata/integration-daemon/users/garygeeke/integration-connectors/refresh +Content-Type: application/json + +{ + "class" : "NameRequestBody", + "name" : "OSSUnityCatalogInsideCatalogSynchronizer" +} + +### +# ===================================================================================================================== +# Review the elements created by the integration connectors +# +### +# @name getTechnologyTypeElements (catalogs) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=false +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Catalog" +} + +### + +@ucCatalogGUID=9b8c275d-d1d7-4e42-9962-21656334b77b + +### +# @name getTechnologyTypeElements (schemas) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=false +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Schema" +} + +### + +@ucSchemaGUID=632ac7ff-6ca1-4d06-b160-0daad5486727 + +### +# @name=getAssetGraph (schemas) +# Return all the elements that are anchored to an asset plus relationships between these elements and to other elements. +# +# Asset: https://egeria-project.org/concepts/asset/ +GET {{baseURL}}/servers/{{viewServer}}/api/open-metadata/asset-catalog/assets/{{ucSchemaGUID}}/as-graph?startFrom=0&pageSize=0 +Authorization: Bearer {{token}} +Content-Type: application/json + + +### +# @name getTechnologyTypeElements (Volumes) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=false +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Volume" +} + +### + +@ucVolumeGUID=5e44ba90-9813-411d-aa62-36e5cc2cdf24 + +### +# @name=getAssetGraph (volumes) +# Return all the elements that are anchored to an asset plus relationships between these elements and to other elements. +# +# Asset: https://egeria-project.org/concepts/asset/ +GET {{baseURL}}/servers/{{viewServer}}/api/open-metadata/asset-catalog/assets/{{ucVolumeGUID}}/as-graph?startFrom=0&pageSize=0 +Authorization: Bearer {{token}} +Content-Type: application/json + + +### +# @name getTechnologyTypeElements (Tables) +# Retrieve the elements for the requested deployed implementation type. There are no wildcards allowed in the name. +POST {{baseURL}}/servers/{{viewServer}}/api/open-metadata/automated-curation/technology-types/elements?startFrom=0&pageSize=10&getTemplates=false +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "filter" : "OSS Unity Catalog (UC) Table" +} + +### + +@ucTableGUID=b20f88cb-8e5c-4ff2-bead-e193b910bc13 + +### +# @name=getAssetGraph (Tables) +# Return all the elements that are anchored to an asset plus relationships between these elements and to other elements. +# +# Asset: https://egeria-project.org/concepts/asset/ +GET {{baseURL}}/servers/{{viewServer}}/api/open-metadata/asset-catalog/assets/{{ucTableGUID}}/as-graph?startFrom=0&pageSize=0 +Authorization: Bearer {{token}} +Content-Type: application/json + diff --git a/workspaces/Untitled.ipynb b/workspaces/Untitled.ipynb index 5e9f891..aab4536 100644 --- a/workspaces/Untitled.ipynb +++ b/workspaces/Untitled.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "id": "1cb9b8e5-2672-4ae1-a8a3-7ef368ef368c", "metadata": {}, "outputs": [], @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 4, "id": "458d6da3-bfb8-4f4c-80eb-84f28505d910", "metadata": {}, "outputs": [], @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "id": "0b614b04-fe66-4f85-b027-57625a0c9127", "metadata": {}, "outputs": [ @@ -55,7 +55,7 @@ "'No elements'" ] }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } diff --git a/workspaces/Untitled1.ipynb b/workspaces/Untitled1.ipynb new file mode 100644 index 0000000..f48613f --- /dev/null +++ b/workspaces/Untitled1.ipynb @@ -0,0 +1,258 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "7f2f5e7b-ea0b-4be2-b6fa-653d02133e3f", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-19T16:29:46.214376Z", + "start_time": "2024-07-19T16:29:46.210863Z" + } + }, + "outputs": [], + "source": [ + "import asyncio\n", + "import nest_asyncio\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "19eefeb4-a81f-41b7-94ab-cadc07eaf6c2", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-19T16:29:52.325578Z", + "start_time": "2024-07-19T16:29:52.322074Z" + } + }, + "outputs": [], + "source": [ + "from pyegeria import AutomatedCuration\n", + "a_client = AutomatedCuration(\"view-server\", \"https://localhost:9443\", user_id='erinoverview',\n", + " user_pwd=\"secret\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "75c033ce-729e-4157-94a9-8cdc5dc74308", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-19T16:29:54.011550Z", + "start_time": "2024-07-19T16:29:53.770506Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All connection attempts failed\n", + "FAILED\n" + ] + } + ], + "source": [ + "token = a_client.create_egeria_bearer_token()\n", + "print(token)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bcd1929b-5bed-47b7-912a-2f23caf92e2a", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-19T16:30:27.783804Z", + "start_time": "2024-07-19T16:30:27.094126Z" + } + }, + "outputs": [], + "source": [ + "response = a_client.get_technology_type_detail(\"OSS Unity Catalog (UC) Server\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea6b05e6-fa22-40bc-8742-eb733098e723", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-19T16:30:30.613857Z", + "start_time": "2024-07-19T16:30:30.610394Z" + } + }, + "outputs": [], + "source": [ + "import json\n", + "print(f\"{json.dumps(response, indent=2)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6500e17-27dd-4623-9a9b-7aef30d4e2d1", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-19T16:31:00.262599Z", + "start_time": "2024-07-19T16:31:00.204995Z" + } + }, + "outputs": [], + "source": [ + "#!/usr/bin/env python3\n", + "\"\"\"\n", + "SPDX-License-Identifier: Apache-2.0\n", + "Copyright Contributors to the ODPi Egeria project.\n", + "\n", + "A simple viewer for collections - provide the root and we display the hierarchy\n", + "\n", + "\"\"\"\n", + "\n", + "import argparse\n", + "\n", + "from rich import print\n", + "from rich.panel import Panel\n", + "from rich.prompt import Prompt\n", + "from rich.text import Text\n", + "from rich.tree import Tree\n", + "from rich.console import Console\n", + "from pyegeria import (UserNotAuthorizedException, PropertyServerException,\n", + " InvalidParameterException, AutomatedCuration)\n", + "from pyegeria._exceptions import (\n", + " print_exception_response,\n", + ")\n", + "\n", + "console = Console()\n", + "disable_ssl_warnings = True\n", + "\n", + "platform = \"https://127.0.0.1:9443\"\n", + "user = \"erinoverview\"\n", + "view_server = \"view-server\"\n", + "\n", + "\n", + "def tech_viewer(tech: str, server_name:str, platform_url:str, user:str):\n", + "\n", + " def view_tech_details(a_client: AutomatedCuration, root_collection_name: str, tree: Tree) -> Tree:\n", + " l2: Tree = None\n", + " tech_details = a_client.get_technology_type_detail(tech)\n", + " if (type(tech_details) is dict) and (len(tech_details)>0):\n", + " name = tech_details.get('name','---')\n", + " qualified_name = tech_details.get('qualifiedName',\"---\")\n", + " category = tech_details.get('category','---')\n", + " description = tech_details.get('description','---')\n", + "\n", + " style = \"\"\n", + " l2 = tree.add(Text(f\"Name: {name}\", \"bold red\"))\n", + " l2 = tree.add(Text(f\"* QualifiedName: {qualified_name}\",\"bold white\"))\n", + " l2 = tree.add(Text(f\"* Category: {category}\", \"bold white\"))\n", + " l2 = tree.add(Text(f\"* Technology Description: {description}\", \"bold white\"))\n", + " ext_ref = tech_details.get('externalReferences', None)\n", + "\n", + " if ext_ref is not None:\n", + " uri = ext_ref[0][\"properties\"].get(\"uri\", \"---\")\n", + " # console.print(f\" {type(ext_ref)}, {len(ext_ref)}\")\n", + " l2 = tree.add(Text(f'* URI: {uri}', \"bold white\"))\n", + "\n", + " resource_list = tech_details.get('resourceList',None)\n", + " if resource_list:\n", + " t_r = tree.add(\"Resource List[bold red]\")\n", + " for resource in resource_list:\n", + " resource_use = Text(f\"[bold white]{resource.get('resourceUse','---')}\", \"\")\n", + " resource_use_description = Text(f\"[bold white]{resource.get('resourceUseDescription','---')}\", \"\")\n", + " type_name = Text(f\"[bold white]{resource['relatedElement']['type'].get('typeName','---')}\", \"\")\n", + " unique_name = Text(f\"[bold white]{resource['relatedElement'].get('uniqueName','---')}\", \"\")\n", + " related_guid = Text(f\"[bold white]{resource['relatedElement'].get('guid','---')}\", \"\")\n", + " resource_text = (f\"[bold red]Resource\\n\"\n", + " f\"[white]Resource use: {resource_use}[white]\\nDescription: \"\n", + " f\"{resource_use_description}\\nType Name: {type_name}\\n\"\n", + " f\"[white]Unique Name: {unique_name}\\n[white]Related GUID: {related_guid}\\n\")\n", + " p = Panel.fit(resource_text)\n", + " tt = t_r.add(p, style=style)\n", + "\n", + " else:\n", + " tt = tree.add(f\"Tech type {tech} was not found - please check the tech type name\")\n", + "\n", + " return tt\n", + "\n", + " try:\n", + " tree = Tree(f\"[bold bright green]{tech}\", guide_style=\"bold bright_blue\")\n", + " a_client = AutomatedCuration(view_server, platform,\n", + " user_id=user)\n", + "\n", + " token = a_client.create_egeria_bearer_token(user, \"secret\")\n", + " view_tech_details(a_client,tech,tree)\n", + " print(tree)\n", + "\n", + " except (\n", + " InvalidParameterException,\n", + " PropertyServerException,\n", + " UserNotAuthorizedException\n", + " ) as e:\n", + " print_exception_response(e)\n", + "\n", + "\n", + "def main():\n", + " parser = argparse.ArgumentParser()\n", + "\n", + " parser.add_argument(\"--server\", help=\"Name of the server to display status for\")\n", + " parser.add_argument(\"--url\", help=\"URL Platform to connect to\")\n", + " parser.add_argument(\"--userid\", help=\"User Id\")\n", + " args = parser.parse_args()\n", + "\n", + " server = args.server if args.server is not None else \"view-server\"\n", + " url = args.url if args.url is not None else \"https://localhost:9443\"\n", + " userid = args.userid if args.userid is not None else 'erinoverview'\n", + "\n", + " tech = Prompt.ask(\"Enter the Technology to start from:\", default=\"PostgreSQL Server\")\n", + " tech_viewer(tech,server, url, userid)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b51998b6-070a-4b28-b647-45f22917b255", + "metadata": { + "ExecuteTime": { + "end_time": "2024-07-19T16:31:02.693291Z", + "start_time": "2024-07-19T16:31:02.195416Z" + } + }, + "outputs": [], + "source": [ + "tech_viewer(\"PostgreSQL Server\", 'view-server', 'https://127.0.0.1:9443', 'erinoverview')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82bccd62-fb0f-4f94-a117-4b37f57cbf42", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python312", + "language": "python", + "name": "python312" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workspaces/Untitled2.ipynb b/workspaces/Untitled2.ipynb new file mode 100644 index 0000000..51621a7 --- /dev/null +++ b/workspaces/Untitled2.ipynb @@ -0,0 +1,107 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "03ae11e3-274a-4d3f-9195-475c64a0b88f", + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/home/jovyan/workspaces/-f'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 50\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 46\u001b[0m tree \u001b[38;5;241m=\u001b[39m Tree(\n\u001b[1;32m 47\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m:open_file_folder: [link file://\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdirectory\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m]\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdirectory\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 48\u001b[0m guide_style\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbold bright_blue\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 49\u001b[0m )\n\u001b[0;32m---> 50\u001b[0m \u001b[43mwalk_directory\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpathlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPath\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdirectory\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtree\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28mprint\u001b[39m(tree)\n", + "Cell \u001b[0;32mIn[1], line 15\u001b[0m, in \u001b[0;36mwalk_directory\u001b[0;34m(directory, tree)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Recursively build a Tree with directory contents.\"\"\"\u001b[39;00m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# Sort dirs first then by filename\u001b[39;00m\n\u001b[0;32m---> 15\u001b[0m paths \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msorted\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 16\u001b[0m \u001b[43m \u001b[49m\u001b[43mpathlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPath\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdirectory\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43miterdir\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 17\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_file\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlower\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 18\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m path \u001b[38;5;129;01min\u001b[39;00m paths:\n\u001b[1;32m 20\u001b[0m \u001b[38;5;66;03m# Remove hidden files\u001b[39;00m\n\u001b[1;32m 21\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m path\u001b[38;5;241m.\u001b[39mname\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n", + "File \u001b[0;32m/opt/conda/lib/python3.11/pathlib.py:931\u001b[0m, in \u001b[0;36mPath.iterdir\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 927\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21miterdir\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 928\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Iterate over the files in this directory. Does not yield any\u001b[39;00m\n\u001b[1;32m 929\u001b[0m \u001b[38;5;124;03m result for the special paths '.' and '..'.\u001b[39;00m\n\u001b[1;32m 930\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 931\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlistdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 932\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_child_relpath(name)\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/home/jovyan/workspaces/-f'" + ] + } + ], + "source": [ + "import os\n", + "import pathlib\n", + "import sys\n", + "\n", + "from rich import print\n", + "from rich.filesize import decimal\n", + "from rich.markup import escape\n", + "from rich.text import Text\n", + "from rich.tree import Tree\n", + "\n", + "\n", + "def walk_directory(directory: pathlib.Path, tree: Tree) -> None:\n", + " \"\"\"Recursively build a Tree with directory contents.\"\"\"\n", + " # Sort dirs first then by filename\n", + " paths = sorted(\n", + " pathlib.Path(directory).iterdir(),\n", + " key=lambda path: (path.is_file(), path.name.lower()),\n", + " )\n", + " for path in paths:\n", + " # Remove hidden files\n", + " if path.name.startswith(\".\"):\n", + " continue\n", + " if path.is_dir():\n", + " style = \"dim\" if path.name.startswith(\"__\") else \"\"\n", + " branch = tree.add(\n", + " f\"[bold magenta]:open_file_folder: [link file://{path}]{escape(path.name)}\",\n", + " style=style,\n", + " guide_style=style,\n", + " )\n", + " walk_directory(path, branch)\n", + " else:\n", + " text_filename = Text(path.name, \"green\")\n", + " text_filename.highlight_regex(r\"\\..*$\", \"bold red\")\n", + " text_filename.stylize(f\"link file://{path}\")\n", + " file_size = path.stat().st_size\n", + " text_filename.append(f\" ({decimal(file_size)})\", \"blue\")\n", + " icon = \"๐Ÿ \" if path.suffix == \".py\" else \"๐Ÿ“„ \"\n", + " tree.add(Text(icon) + text_filename)\n", + "\n", + "\n", + "try:\n", + " directory = os.path.abspath(sys.argv[1])\n", + "except IndexError:\n", + " print(\"[b]Usage:[/] python tree.py \")\n", + "else:\n", + " tree = Tree(\n", + " f\":open_file_folder: [link file://{directory}]{directory}\",\n", + " guide_style=\"bold bright_blue\",\n", + " )\n", + " walk_directory(pathlib.Path(directory), tree)\n", + " print(tree)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "422630f1-75a9-444e-b550-9478127912b7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workspaces/experiments.ipynb b/workspaces/experiments.ipynb index ce91dcc..7d523bd 100644 --- a/workspaces/experiments.ipynb +++ b/workspaces/experiments.ipynb @@ -2,51 +2,54 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, "id": "9968014f-4cd4-40fb-959a-13689f5ac01e", "metadata": { - "ExecuteTime": { - "end_time": "2024-07-18T00:23:20.558488Z", - "start_time": "2024-07-18T00:23:20.551811Z" - }, "editable": true, "slideshow": { "slide_type": "" }, - "tags": [] + "tags": [], + "ExecuteTime": { + "end_time": "2024-07-19T16:28:17.657152Z", + "start_time": "2024-07-19T16:28:17.651353Z" + } }, - "outputs": [], "source": [ "import asyncio\n", "import nest_asyncio\n", "nest_asyncio.apply()" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "code", - "execution_count": 2, "id": "a11585d4-48e0-43c8-aba9-0bbc1b1cbbc1", "metadata": { "ExecuteTime": { - "end_time": "2024-07-18T00:23:22.658459Z", - "start_time": "2024-07-18T00:23:22.484398Z" + "end_time": "2024-07-19T16:28:20.841507Z", + "start_time": "2024-07-19T16:28:20.739152Z" } }, - "outputs": [], "source": [ "from pyegeria import Platform\n" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "code", - "execution_count": 3, "id": "271affe2-3f66-46cf-b3ec-75fe4e3d2cfe", "metadata": { "ExecuteTime": { - "end_time": "2024-07-18T00:23:24.245215Z", - "start_time": "2024-07-18T00:23:24.202681Z" + "end_time": "2024-07-19T16:28:44.755463Z", + "start_time": "2024-07-19T16:28:44.725151Z" } }, + "source": [ + "p_client = Platform('active-metadata-store', \"https://localhost:9443\",\"garygeeke\")\n", + "p_client.get_platform_origin() " + ], "outputs": [ { "data": { @@ -54,652 +57,108 @@ "'Egeria OMAG Server Platform (version 5.1-SNAPSHOT)\\n'" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "p_client = Platform('active-metadata-store', \"https://host.docker.internal:9443\",\"garygeeke\")\n", - "p_client.get_platform_origin() " - ] + "execution_count": 4 }, { "cell_type": "code", - "execution_count": 5, "id": "802fe1f8-9bd5-4378-ae46-2a677a8466b7", "metadata": { - "ExecuteTime": { - "end_time": "2024-07-18T00:27:13.308981Z", - "start_time": "2024-07-18T00:27:10.147943Z" - }, "editable": true, "slideshow": { "slide_type": "" }, - "tags": [] + "tags": [], + "ExecuteTime": { + "end_time": "2024-07-19T16:28:51.957049Z", + "start_time": "2024-07-19T16:28:51.597143Z" + } }, + "source": [ + "%run uc_oss_catalog_viewer.py\n" + ], "outputs": [ - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "\n"
+      "                                                                               UC OSS Catalog @ Fri Jul 19 11:28:51 2024                                                                                \n",
+      "โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ\n",
+      "โ”‚ Catalog Name โ”‚ Catalog Comment โ”‚ Schema Name โ”‚ Schema Comment โ”‚ Vol/Tab                                                                        โ”‚ Details                                             โ”‚\n",
+      "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+      "โ”‚ unity        โ”‚ Main catalog    โ”‚ default     โ”‚ Default schema โ”‚ Functions                                                                      โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ * name: sum                                                                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * comment: Adds two numbers.                                           โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * function_id: 0188f6e0-006e-410c-9aa7-7ded9079469a                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * function_type: INT                                                   โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * sql_access: NO_SQL                                                   โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚                                                     โ”‚\n",
+      "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+      "โ”‚ unity        โ”‚ Main catalog    โ”‚ default     โ”‚ Default schema โ”‚ Functions                                                                      โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ * name: sum                                                                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * comment: Adds two numbers.                                           โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * function_id: 0188f6e0-006e-410c-9aa7-7ded9079469a                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * function_type: INT                                                   โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * sql_access: NO_SQL                                                   โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ * name: lowercase                                                              โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * comment: Converts a string to lowercase.                             โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * function_id: c6c8524e-51d5-42ad-a2c7-969849dd3b79                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * function_type: STRING                                                โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * sql_access: NO_SQL                                                   โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚                                                     โ”‚\n",
+      "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+      "โ”‚ unity        โ”‚ Main catalog    โ”‚ default     โ”‚ Default schema โ”‚ Volumes                                                                        โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ * name: txt_files                                                              โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * comment: None                                                        โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * created_at: 1720454731455                                            โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * updated_at: 1720454731455                                            โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * volume_id: f4ca0bb0-26eb-425a-b564-ff4113363837                      โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * volume_type: MANAGED                                                 โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * storage_location:                                                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ file:///Users/dwolfson/localGit/databricks/unitycatalog/etc/data/managed/unitโ€ฆ โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ * name: json_files                                                             โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * comment: None                                                        โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * created_at: 1720454731455                                            โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * updated_at: 1720454731455                                            โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * volume_id: 003b2b4c-5289-4437-a995-fd9cbd66efdb                      โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * volume_type: EXTERNAL                                                โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * storage_location:                                                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ file:///Users/dwolfson/localGit/databricks/unitycatalog/etc/data/external/uniโ€ฆ โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚                                                     โ”‚\n",
+      "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค\n",
+      "โ”‚ unity        โ”‚ Main catalog    โ”‚ default     โ”‚ Default schema โ”‚ Tables                                                                         โ”‚ โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚ โ”ƒ name  โ”ƒ type   โ”ƒ nullable โ”ƒ comment             โ”ƒ โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚ * name: marksheet                                                              โ”‚ โ”กโ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * comment: Managed table                                               โ”‚ โ”‚ id    โ”‚ int    โ”‚ false    โ”‚ ID primary key      โ”‚ โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * created_at: 1720454731426                                            โ”‚ โ”‚ name  โ”‚ string โ”‚ false    โ”‚ Name of the entity  โ”‚ โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * updated_at: 1720454731426                                            โ”‚ โ”‚ marks โ”‚ int    โ”‚ true     โ”‚ Marks of the entity โ”‚ โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * table_id: 25ca07aa-1350-4104-b485-13b9ad1f5d72                       โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * table_type: MANAGED                                                  โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚         * src_format: DELTA                                                    โ”‚                                                     โ”‚\n",
+      "โ”‚              โ”‚                 โ”‚             โ”‚                โ”‚                                                                                โ”‚                                                     โ”‚\n",
+      "โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\n",
+      "                                                                                    Running on http://localhost:8080                                                                                    \n"
      ]
     },
     {
      "data": {
+      "text/plain": [],
       "text/html": [
-       "
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_transports/default.py:69 in                       โ”‚\n",
-       "โ”‚ map_httpcore_exceptions                                                                          โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    66 @contextlib.contextmanager                                                                 โ”‚\n",
-       "โ”‚    67 def map_httpcore_exceptions() -> typing.Iterator[None]:                                    โ”‚\n",
-       "โ”‚    68 โ”‚   try:                                                                                   โ”‚\n",
-       "โ”‚ โฑ  69 โ”‚   โ”‚   yield                                                                              โ”‚\n",
-       "โ”‚    70 โ”‚   except Exception as exc:                                                               โ”‚\n",
-       "โ”‚    71 โ”‚   โ”‚   mapped_exc = None                                                                  โ”‚\n",
-       "โ”‚    72                                                                                            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_transports/default.py:233 in handle_request       โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   230 โ”‚   โ”‚   โ”‚   extensions=request.extensions,                                                 โ”‚\n",
-       "โ”‚   231 โ”‚   โ”‚   )                                                                                  โ”‚\n",
-       "โ”‚   232 โ”‚   โ”‚   with map_httpcore_exceptions():                                                    โ”‚\n",
-       "โ”‚ โฑ 233 โ”‚   โ”‚   โ”‚   resp = self._pool.handle_request(req)                                          โ”‚\n",
-       "โ”‚   234 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚   235 โ”‚   โ”‚   assert isinstance(resp.stream, typing.Iterable)                                    โ”‚\n",
-       "โ”‚   236                                                                                            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:216 in handle_request  โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   213 โ”‚   โ”‚   โ”‚   โ”‚   closing = self._assign_requests_to_connections()                           โ”‚\n",
-       "โ”‚   214 โ”‚   โ”‚   โ”‚                                                                                  โ”‚\n",
-       "โ”‚   215 โ”‚   โ”‚   โ”‚   self._close_connections(closing)                                               โ”‚\n",
-       "โ”‚ โฑ 216 โ”‚   โ”‚   โ”‚   raise exc from None                                                            โ”‚\n",
-       "โ”‚   217 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚   218 โ”‚   โ”‚   # Return the response. Note that in this case we still have to manage              โ”‚\n",
-       "โ”‚   219 โ”‚   โ”‚   # the point at which the response is closed.                                       โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:196 in handle_request  โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   193 โ”‚   โ”‚   โ”‚   โ”‚                                                                              โ”‚\n",
-       "โ”‚   194 โ”‚   โ”‚   โ”‚   โ”‚   try:                                                                       โ”‚\n",
-       "โ”‚   195 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   # Send the request on the assigned connection.                         โ”‚\n",
-       "โ”‚ โฑ 196 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   response = connection.handle_request(                                  โ”‚\n",
-       "โ”‚   197 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   pool_request.request                                               โ”‚\n",
-       "โ”‚   198 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   )                                                                      โ”‚\n",
-       "โ”‚   199 โ”‚   โ”‚   โ”‚   โ”‚   except ConnectionNotAvailable:                                             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpcore/_sync/connection.py:99 in handle_request        โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    96 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   )                                                                  โ”‚\n",
-       "โ”‚    97 โ”‚   โ”‚   except BaseException as exc:                                                       โ”‚\n",
-       "โ”‚    98 โ”‚   โ”‚   โ”‚   self._connect_failed = True                                                    โ”‚\n",
-       "โ”‚ โฑ  99 โ”‚   โ”‚   โ”‚   raise exc                                                                      โ”‚\n",
-       "โ”‚   100 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚   101 โ”‚   โ”‚   return self._connection.handle_request(request)                                    โ”‚\n",
-       "โ”‚   102                                                                                            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpcore/_sync/connection.py:76 in handle_request        โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    73 โ”‚   โ”‚   try:                                                                               โ”‚\n",
-       "โ”‚    74 โ”‚   โ”‚   โ”‚   with self._request_lock:                                                       โ”‚\n",
-       "โ”‚    75 โ”‚   โ”‚   โ”‚   โ”‚   if self._connection is None:                                               โ”‚\n",
-       "โ”‚ โฑ  76 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   stream = self._connect(request)                                        โ”‚\n",
-       "โ”‚    77 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚                                                                          โ”‚\n",
-       "โ”‚    78 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   ssl_object = stream.get_extra_info(\"ssl_object\")                       โ”‚\n",
-       "โ”‚    79 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   http2_negotiated = (                                                   โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpcore/_sync/connection.py:122 in _connect             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   119 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   \"socket_options\": self._socket_options,                            โ”‚\n",
-       "โ”‚   120 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   }                                                                      โ”‚\n",
-       "โ”‚   121 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   with Trace(\"connect_tcp\", logger, request, kwargs) as trace:           โ”‚\n",
-       "โ”‚ โฑ 122 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   stream = self._network_backend.connect_tcp(**kwargs)               โ”‚\n",
-       "โ”‚   123 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   trace.return_value = stream                                        โ”‚\n",
-       "โ”‚   124 โ”‚   โ”‚   โ”‚   โ”‚   else:                                                                      โ”‚\n",
-       "โ”‚   125 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   kwargs = {                                                             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpcore/_backends/sync.py:205 in connect_tcp            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   202 โ”‚   โ”‚   โ”‚   OSError: ConnectError,                                                         โ”‚\n",
-       "โ”‚   203 โ”‚   โ”‚   }                                                                                  โ”‚\n",
-       "โ”‚   204 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚ โฑ 205 โ”‚   โ”‚   with map_exceptions(exc_map):                                                      โ”‚\n",
-       "โ”‚   206 โ”‚   โ”‚   โ”‚   sock = socket.create_connection(                                               โ”‚\n",
-       "โ”‚   207 โ”‚   โ”‚   โ”‚   โ”‚   address,                                                                   โ”‚\n",
-       "โ”‚   208 โ”‚   โ”‚   โ”‚   โ”‚   timeout,                                                                   โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/contextlib.py:158 in __exit__                                          โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   155 โ”‚   โ”‚   โ”‚   โ”‚   # tell if we get the same exception back                                   โ”‚\n",
-       "โ”‚   156 โ”‚   โ”‚   โ”‚   โ”‚   value = typ()                                                              โ”‚\n",
-       "โ”‚   157 โ”‚   โ”‚   โ”‚   try:                                                                           โ”‚\n",
-       "โ”‚ โฑ 158 โ”‚   โ”‚   โ”‚   โ”‚   self.gen.throw(typ, value, traceback)                                      โ”‚\n",
-       "โ”‚   159 โ”‚   โ”‚   โ”‚   except StopIteration as exc:                                                   โ”‚\n",
-       "โ”‚   160 โ”‚   โ”‚   โ”‚   โ”‚   # Suppress StopIteration *unless* it's the same exception that             โ”‚\n",
-       "โ”‚   161 โ”‚   โ”‚   โ”‚   โ”‚   # was passed to throw().  This prevents a StopIteration                    โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpcore/_exceptions.py:14 in map_exceptions             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   11 โ”‚   except Exception as exc:  # noqa: PIE786                                                โ”‚\n",
-       "โ”‚   12 โ”‚   โ”‚   for from_exc, to_exc in map.items():                                                โ”‚\n",
-       "โ”‚   13 โ”‚   โ”‚   โ”‚   if isinstance(exc, from_exc):                                                   โ”‚\n",
-       "โ”‚ โฑ 14 โ”‚   โ”‚   โ”‚   โ”‚   raise to_exc(exc) from exc                                                  โ”‚\n",
-       "โ”‚   15 โ”‚   โ”‚   raise  # pragma: nocover                                                            โ”‚\n",
-       "โ”‚   16                                                                                             โ”‚\n",
-       "โ”‚   17                                                                                             โ”‚\n",
-       "โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\n",
-       "ConnectError: [Errno 111] Connection refused\n",
-       "\n",
-       "The above exception was the direct cause of the following exception:\n",
-       "\n",
-       "โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:951 in _request             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    948 โ”‚   โ”‚   log.debug(\"Sending HTTP Request: %s %s\", request.method, request.url)             โ”‚\n",
-       "โ”‚    949 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚    950 โ”‚   โ”‚   try:                                                                              โ”‚\n",
-       "โ”‚ โฑ  951 โ”‚   โ”‚   โ”‚   response = self._client.send(                                                 โ”‚\n",
-       "โ”‚    952 โ”‚   โ”‚   โ”‚   โ”‚   request,                                                                  โ”‚\n",
-       "โ”‚    953 โ”‚   โ”‚   โ”‚   โ”‚   stream=stream or self._should_stream_response_body(request=request),      โ”‚\n",
-       "โ”‚    954 โ”‚   โ”‚   โ”‚   โ”‚   **kwargs,                                                                 โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_client.py:914 in send                             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    911 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚    912 โ”‚   โ”‚   auth = self._build_request_auth(request, auth)                                    โ”‚\n",
-       "โ”‚    913 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚ โฑ  914 โ”‚   โ”‚   response = self._send_handling_auth(                                              โ”‚\n",
-       "โ”‚    915 โ”‚   โ”‚   โ”‚   request,                                                                      โ”‚\n",
-       "โ”‚    916 โ”‚   โ”‚   โ”‚   auth=auth,                                                                    โ”‚\n",
-       "โ”‚    917 โ”‚   โ”‚   โ”‚   follow_redirects=follow_redirects,                                            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_client.py:942 in _send_handling_auth              โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    939 โ”‚   โ”‚   โ”‚   request = next(auth_flow)                                                     โ”‚\n",
-       "โ”‚    940 โ”‚   โ”‚   โ”‚                                                                                 โ”‚\n",
-       "โ”‚    941 โ”‚   โ”‚   โ”‚   while True:                                                                   โ”‚\n",
-       "โ”‚ โฑ  942 โ”‚   โ”‚   โ”‚   โ”‚   response = self._send_handling_redirects(                                 โ”‚\n",
-       "โ”‚    943 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   request,                                                              โ”‚\n",
-       "โ”‚    944 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   follow_redirects=follow_redirects,                                    โ”‚\n",
-       "โ”‚    945 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   history=history,                                                      โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_client.py:979 in _send_handling_redirects         โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    976 โ”‚   โ”‚   โ”‚   for hook in self._event_hooks[\"request\"]:                                     โ”‚\n",
-       "โ”‚    977 โ”‚   โ”‚   โ”‚   โ”‚   hook(request)                                                             โ”‚\n",
-       "โ”‚    978 โ”‚   โ”‚   โ”‚                                                                                 โ”‚\n",
-       "โ”‚ โฑ  979 โ”‚   โ”‚   โ”‚   response = self._send_single_request(request)                                 โ”‚\n",
-       "โ”‚    980 โ”‚   โ”‚   โ”‚   try:                                                                          โ”‚\n",
-       "โ”‚    981 โ”‚   โ”‚   โ”‚   โ”‚   for hook in self._event_hooks[\"response\"]:                                โ”‚\n",
-       "โ”‚    982 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   hook(response)                                                        โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_client.py:1015 in _send_single_request            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   1012 โ”‚   โ”‚   โ”‚   )                                                                             โ”‚\n",
-       "โ”‚   1013 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚   1014 โ”‚   โ”‚   with request_context(request=request):                                            โ”‚\n",
-       "โ”‚ โฑ 1015 โ”‚   โ”‚   โ”‚   response = transport.handle_request(request)                                  โ”‚\n",
-       "โ”‚   1016 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚   1017 โ”‚   โ”‚   assert isinstance(response.stream, SyncByteStream)                                โ”‚\n",
-       "โ”‚   1018                                                                                           โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_transports/default.py:232 in handle_request       โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   229 โ”‚   โ”‚   โ”‚   content=request.stream,                                                        โ”‚\n",
-       "โ”‚   230 โ”‚   โ”‚   โ”‚   extensions=request.extensions,                                                 โ”‚\n",
-       "โ”‚   231 โ”‚   โ”‚   )                                                                                  โ”‚\n",
-       "โ”‚ โฑ 232 โ”‚   โ”‚   with map_httpcore_exceptions():                                                    โ”‚\n",
-       "โ”‚   233 โ”‚   โ”‚   โ”‚   resp = self._pool.handle_request(req)                                          โ”‚\n",
-       "โ”‚   234 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚   235 โ”‚   โ”‚   assert isinstance(resp.stream, typing.Iterable)                                    โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/contextlib.py:158 in __exit__                                          โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   155 โ”‚   โ”‚   โ”‚   โ”‚   # tell if we get the same exception back                                   โ”‚\n",
-       "โ”‚   156 โ”‚   โ”‚   โ”‚   โ”‚   value = typ()                                                              โ”‚\n",
-       "โ”‚   157 โ”‚   โ”‚   โ”‚   try:                                                                           โ”‚\n",
-       "โ”‚ โฑ 158 โ”‚   โ”‚   โ”‚   โ”‚   self.gen.throw(typ, value, traceback)                                      โ”‚\n",
-       "โ”‚   159 โ”‚   โ”‚   โ”‚   except StopIteration as exc:                                                   โ”‚\n",
-       "โ”‚   160 โ”‚   โ”‚   โ”‚   โ”‚   # Suppress StopIteration *unless* it's the same exception that             โ”‚\n",
-       "โ”‚   161 โ”‚   โ”‚   โ”‚   โ”‚   # was passed to throw().  This prevents a StopIteration                    โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/httpx/_transports/default.py:86 in                       โ”‚\n",
-       "โ”‚ map_httpcore_exceptions                                                                          โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    83 โ”‚   โ”‚   โ”‚   raise                                                                          โ”‚\n",
-       "โ”‚    84 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚    85 โ”‚   โ”‚   message = str(exc)                                                                 โ”‚\n",
-       "โ”‚ โฑ  86 โ”‚   โ”‚   raise mapped_exc(message) from exc                                                 โ”‚\n",
-       "โ”‚    87                                                                                            โ”‚\n",
-       "โ”‚    88                                                                                            โ”‚\n",
-       "โ”‚    89 HTTPCORE_EXC_MAP = {                                                                       โ”‚\n",
-       "โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\n",
-       "ConnectError: [Errno 111] Connection refused\n",
-       "\n",
-       "The above exception was the direct cause of the following exception:\n",
-       "\n",
-       "โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ\n",
-       "โ”‚ /home/jovyan/workspaces/uc_oss_catalog_viewer.py:147 in display_catalog                          โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   144 โ”‚   try:                                                                                   โ”‚\n",
-       "โ”‚   145 โ”‚   โ”‚   console = Console(width=200)                                                       โ”‚\n",
-       "โ”‚   146 โ”‚   โ”‚   with console.pager():                                                              โ”‚\n",
-       "โ”‚ โฑ 147 โ”‚   โ”‚   โ”‚   console.print(generate_table())                                                โ”‚\n",
-       "โ”‚   148 โ”‚                                                                                          โ”‚\n",
-       "โ”‚   149 โ”‚   except Exception as e:                                                                 โ”‚\n",
-       "โ”‚   150 โ”‚   โ”‚   print()                                                                            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /home/jovyan/workspaces/uc_oss_catalog_viewer.py:49 in generate_table                            โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    46 โ”‚   โ”‚   table.add_column(\"Vol/Tab\")                                                        โ”‚\n",
-       "โ”‚    47 โ”‚   โ”‚   table.add_column(\"Details\")                                                        โ”‚\n",
-       "โ”‚    48 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚ โฑ  49 โ”‚   โ”‚   c_list = uc_client.catalogs.list()                                                 โ”‚\n",
-       "โ”‚    50 โ”‚   โ”‚   catalogs= c_list.catalogs                                                          โ”‚\n",
-       "โ”‚    51 โ”‚   โ”‚   for catalog in catalogs:                                                           โ”‚\n",
-       "โ”‚    52 โ”‚   โ”‚   โ”‚   # cat_info = catalog.CatalogInfo                                               โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/resources/catalogs.py:211 in list           โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   208 โ”‚   โ”‚                                                                                      โ”‚\n",
-       "โ”‚   209 โ”‚   โ”‚     timeout: Override the client-level default timeout for this request, in second   โ”‚\n",
-       "โ”‚   210 โ”‚   โ”‚   \"\"\"                                                                                โ”‚\n",
-       "โ”‚ โฑ 211 โ”‚   โ”‚   return self._get(                                                                  โ”‚\n",
-       "โ”‚   212 โ”‚   โ”‚   โ”‚   \"/catalogs\",                                                                   โ”‚\n",
-       "โ”‚   213 โ”‚   โ”‚   โ”‚   options=make_request_options(                                                  โ”‚\n",
-       "โ”‚   214 โ”‚   โ”‚   โ”‚   โ”‚   extra_headers=extra_headers,                                               โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:1168 in get                 โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   1165 โ”‚   โ”‚   opts = FinalRequestOptions.construct(method=\"get\", url=path, **options)           โ”‚\n",
-       "โ”‚   1166 โ”‚   โ”‚   # cast is required because mypy complains about returning Any even though         โ”‚\n",
-       "โ”‚   1167 โ”‚   โ”‚   # it understands the type variables                                               โ”‚\n",
-       "โ”‚ โฑ 1168 โ”‚   โ”‚   return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=str  โ”‚\n",
-       "โ”‚   1169 โ”‚                                                                                         โ”‚\n",
-       "โ”‚   1170 โ”‚   @overload                                                                             โ”‚\n",
-       "โ”‚   1171 โ”‚   def post(                                                                             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:920 in request              โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    917 โ”‚   โ”‚   stream: bool = False,                                                             โ”‚\n",
-       "โ”‚    918 โ”‚   โ”‚   stream_cls: type[_StreamT] | None = None,                                         โ”‚\n",
-       "โ”‚    919 โ”‚   ) -> ResponseT | _StreamT:                                                            โ”‚\n",
-       "โ”‚ โฑ  920 โ”‚   โ”‚   return self._request(                                                             โ”‚\n",
-       "โ”‚    921 โ”‚   โ”‚   โ”‚   cast_to=cast_to,                                                              โ”‚\n",
-       "โ”‚    922 โ”‚   โ”‚   โ”‚   options=options,                                                              โ”‚\n",
-       "โ”‚    923 โ”‚   โ”‚   โ”‚   stream=stream,                                                                โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:975 in _request             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    972 โ”‚   โ”‚   โ”‚   log.debug(\"Encountered Exception\", exc_info=True)                             โ”‚\n",
-       "โ”‚    973 โ”‚   โ”‚   โ”‚                                                                                 โ”‚\n",
-       "โ”‚    974 โ”‚   โ”‚   โ”‚   if retries > 0:                                                               โ”‚\n",
-       "โ”‚ โฑ  975 โ”‚   โ”‚   โ”‚   โ”‚   return self._retry_request(                                               โ”‚\n",
-       "โ”‚    976 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   options,                                                              โ”‚\n",
-       "โ”‚    977 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   cast_to,                                                              โ”‚\n",
-       "โ”‚    978 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   retries,                                                              โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:1051 in _retry_request      โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   1048 โ”‚   โ”‚   # different thread if necessary.                                                  โ”‚\n",
-       "โ”‚   1049 โ”‚   โ”‚   time.sleep(timeout)                                                               โ”‚\n",
-       "โ”‚   1050 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚ โฑ 1051 โ”‚   โ”‚   return self._request(                                                             โ”‚\n",
-       "โ”‚   1052 โ”‚   โ”‚   โ”‚   options=options,                                                              โ”‚\n",
-       "โ”‚   1053 โ”‚   โ”‚   โ”‚   cast_to=cast_to,                                                              โ”‚\n",
-       "โ”‚   1054 โ”‚   โ”‚   โ”‚   remaining_retries=remaining,                                                  โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:975 in _request             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    972 โ”‚   โ”‚   โ”‚   log.debug(\"Encountered Exception\", exc_info=True)                             โ”‚\n",
-       "โ”‚    973 โ”‚   โ”‚   โ”‚                                                                                 โ”‚\n",
-       "โ”‚    974 โ”‚   โ”‚   โ”‚   if retries > 0:                                                               โ”‚\n",
-       "โ”‚ โฑ  975 โ”‚   โ”‚   โ”‚   โ”‚   return self._retry_request(                                               โ”‚\n",
-       "โ”‚    976 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   options,                                                              โ”‚\n",
-       "โ”‚    977 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   cast_to,                                                              โ”‚\n",
-       "โ”‚    978 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   retries,                                                              โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:1051 in _retry_request      โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚   1048 โ”‚   โ”‚   # different thread if necessary.                                                  โ”‚\n",
-       "โ”‚   1049 โ”‚   โ”‚   time.sleep(timeout)                                                               โ”‚\n",
-       "โ”‚   1050 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚ โฑ 1051 โ”‚   โ”‚   return self._request(                                                             โ”‚\n",
-       "โ”‚   1052 โ”‚   โ”‚   โ”‚   options=options,                                                              โ”‚\n",
-       "โ”‚   1053 โ”‚   โ”‚   โ”‚   cast_to=cast_to,                                                              โ”‚\n",
-       "โ”‚   1054 โ”‚   โ”‚   โ”‚   remaining_retries=remaining,                                                  โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚ /opt/conda/lib/python3.11/site-packages/unitycatalog/_base_client.py:985 in _request             โ”‚\n",
-       "โ”‚                                                                                                  โ”‚\n",
-       "โ”‚    982 โ”‚   โ”‚   โ”‚   โ”‚   )                                                                         โ”‚\n",
-       "โ”‚    983 โ”‚   โ”‚   โ”‚                                                                                 โ”‚\n",
-       "โ”‚    984 โ”‚   โ”‚   โ”‚   log.debug(\"Raising connection error\")                                         โ”‚\n",
-       "โ”‚ โฑ  985 โ”‚   โ”‚   โ”‚   raise APIConnectionError(request=request) from err                            โ”‚\n",
-       "โ”‚    986 โ”‚   โ”‚                                                                                     โ”‚\n",
-       "โ”‚    987 โ”‚   โ”‚   log.debug(                                                                        โ”‚\n",
-       "โ”‚    988 โ”‚   โ”‚   โ”‚   'HTTP Response: %s %s \"%i %s\" %s',                                            โ”‚\n",
-       "โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\n",
-       "APIConnectionError: Connection error.\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[31mโ•ญโ”€\u001b[0m\u001b[31mโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31mโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\u001b[0m\u001b[31mโ”€โ•ฎ\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/_transports/\u001b[0m\u001b[1;33mdefault.py\u001b[0m:\u001b[94m69\u001b[0m in \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[92mmap_httpcore_exceptions\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 66 \u001b[0m\u001b[1;95m@contextlib\u001b[0m.contextmanager \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 67 \u001b[0m\u001b[94mdef\u001b[0m \u001b[92mmap_httpcore_exceptions\u001b[0m() -> typing.Iterator[\u001b[94mNone\u001b[0m]: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 68 \u001b[0m\u001b[2mโ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 69 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94myield\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 70 \u001b[0m\u001b[2mโ”‚ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mException\u001b[0m \u001b[94mas\u001b[0m exc: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 71 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mmapped_exc = \u001b[94mNone\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 72 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/_transports/\u001b[0m\u001b[1;33mdefault.py\u001b[0m:\u001b[94m233\u001b[0m in \u001b[92mhandle_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m230 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mextensions=request.extensions, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m231 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m232 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mwith\u001b[0m map_httpcore_exceptions(): \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m233 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mresp = \u001b[96mself\u001b[0m._pool.handle_request(req) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m234 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m235 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94massert\u001b[0m \u001b[96misinstance\u001b[0m(resp.stream, typing.Iterable) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m236 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpcore/_sync/\u001b[0m\u001b[1;33mconnection_pool.py\u001b[0m:\u001b[94m216\u001b[0m in \u001b[92mhandle_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m213 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mclosing = \u001b[96mself\u001b[0m._assign_requests_to_connections() \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m214 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m215 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[96mself\u001b[0m._close_connections(closing) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m216 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mraise\u001b[0m exc \u001b[94mfrom\u001b[0m \u001b[94mNone\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m217 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m218 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[2m# Return the response. Note that in this case we still have to manage\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m219 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[2m# the point at which the response is closed.\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpcore/_sync/\u001b[0m\u001b[1;33mconnection_pool.py\u001b[0m:\u001b[94m196\u001b[0m in \u001b[92mhandle_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m193 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m194 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m195 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# Send the request on the assigned connection.\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m196 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mresponse = connection.handle_request( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m197 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mpool_request.request \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m198 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m199 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mexcept\u001b[0m ConnectionNotAvailable: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpcore/_sync/\u001b[0m\u001b[1;33mconnection.py\u001b[0m:\u001b[94m99\u001b[0m in \u001b[92mhandle_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 96 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 97 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mBaseException\u001b[0m \u001b[94mas\u001b[0m exc: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 98 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[96mself\u001b[0m._connect_failed = \u001b[94mTrue\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 99 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mraise\u001b[0m exc \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m100 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m101 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._connection.handle_request(request) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m102 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpcore/_sync/\u001b[0m\u001b[1;33mconnection.py\u001b[0m:\u001b[94m76\u001b[0m in \u001b[92mhandle_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 73 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 74 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mwith\u001b[0m \u001b[96mself\u001b[0m._request_lock: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 75 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mif\u001b[0m \u001b[96mself\u001b[0m._connection \u001b[95mis\u001b[0m \u001b[94mNone\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 76 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mstream = \u001b[96mself\u001b[0m._connect(request) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 77 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 78 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mssl_object = stream.get_extra_info(\u001b[33m\"\u001b[0m\u001b[33mssl_object\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 79 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mhttp2_negotiated = ( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpcore/_sync/\u001b[0m\u001b[1;33mconnection.py\u001b[0m:\u001b[94m122\u001b[0m in \u001b[92m_connect\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m119 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[33m\"\u001b[0m\u001b[33msocket_options\u001b[0m\u001b[33m\"\u001b[0m: \u001b[96mself\u001b[0m._socket_options, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m120 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m} \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m121 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mwith\u001b[0m Trace(\u001b[33m\"\u001b[0m\u001b[33mconnect_tcp\u001b[0m\u001b[33m\"\u001b[0m, logger, request, kwargs) \u001b[94mas\u001b[0m trace: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m122 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mstream = \u001b[96mself\u001b[0m._network_backend.connect_tcp(**kwargs) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m123 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mtrace.return_value = stream \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m124 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94melse\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m125 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mkwargs = { \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpcore/_backends/\u001b[0m\u001b[1;33msync.py\u001b[0m:\u001b[94m205\u001b[0m in \u001b[92mconnect_tcp\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m202 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[96mOSError\u001b[0m: ConnectError, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m203 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m} \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m204 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m205 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mwith\u001b[0m map_exceptions(exc_map): \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m206 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0msock = socket.create_connection( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m207 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0maddress, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m208 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mtimeout, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/\u001b[0m\u001b[1;33mcontextlib.py\u001b[0m:\u001b[94m158\u001b[0m in \u001b[92m__exit__\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m155 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# tell if we get the same exception back\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m156 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mvalue = typ() \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m157 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m158 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[96mself\u001b[0m.gen.throw(typ, value, traceback) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m159 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mStopIteration\u001b[0m \u001b[94mas\u001b[0m exc: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m160 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# Suppress StopIteration *unless* it's the same exception that\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m161 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# was passed to throw(). This prevents a StopIteration\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpcore/\u001b[0m\u001b[1;33m_exceptions.py\u001b[0m:\u001b[94m14\u001b[0m in \u001b[92mmap_exceptions\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m11 \u001b[0m\u001b[2mโ”‚ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mException\u001b[0m \u001b[94mas\u001b[0m exc: \u001b[2m# noqa: PIE786\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m12 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mfor\u001b[0m from_exc, to_exc \u001b[95min\u001b[0m \u001b[96mmap\u001b[0m.items(): \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m13 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mif\u001b[0m \u001b[96misinstance\u001b[0m(exc, from_exc): \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m14 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mraise\u001b[0m to_exc(exc) \u001b[94mfrom\u001b[0m \u001b[4;96mexc\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m15 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mraise\u001b[0m \u001b[2m# pragma: nocover\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m16 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m17 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\u001b[0m\n", - "\u001b[1;91mConnectError: \u001b[0m\u001b[1m[\u001b[0mErrno \u001b[1;36m111\u001b[0m\u001b[1m]\u001b[0m Connection refused\n", - "\n", - "\u001b[3mThe above exception was the direct cause of the following exception:\u001b[0m\n", - "\n", - "\u001b[31mโ•ญโ”€\u001b[0m\u001b[31mโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31mโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\u001b[0m\u001b[31mโ”€โ•ฎ\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m951\u001b[0m in \u001b[92m_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 948 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mlog.debug(\u001b[33m\"\u001b[0m\u001b[33mSending HTTP Request: \u001b[0m\u001b[33m%s\u001b[0m\u001b[33m \u001b[0m\u001b[33m%s\u001b[0m\u001b[33m\"\u001b[0m, request.method, request.url) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 949 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 950 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 951 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mresponse = \u001b[96mself\u001b[0m._client.send( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 952 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mrequest, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 953 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mstream=stream \u001b[95mor\u001b[0m \u001b[96mself\u001b[0m._should_stream_response_body(request=request), \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 954 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m**kwargs, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/\u001b[0m\u001b[1;33m_client.py\u001b[0m:\u001b[94m914\u001b[0m in \u001b[92msend\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 911 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 912 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mauth = \u001b[96mself\u001b[0m._build_request_auth(request, auth) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 913 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 914 \u001b[2mโ”‚ โ”‚ \u001b[0mresponse = \u001b[96mself\u001b[0m._send_handling_auth( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 915 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mrequest, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 916 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mauth=auth, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 917 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mfollow_redirects=follow_redirects, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/\u001b[0m\u001b[1;33m_client.py\u001b[0m:\u001b[94m942\u001b[0m in \u001b[92m_send_handling_auth\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 939 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mrequest = \u001b[96mnext\u001b[0m(auth_flow) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 940 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 941 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mwhile\u001b[0m \u001b[94mTrue\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 942 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mresponse = \u001b[96mself\u001b[0m._send_handling_redirects( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 943 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mrequest, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 944 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mfollow_redirects=follow_redirects, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 945 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mhistory=history, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/\u001b[0m\u001b[1;33m_client.py\u001b[0m:\u001b[94m979\u001b[0m in \u001b[92m_send_handling_redirects\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 976 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mfor\u001b[0m hook \u001b[95min\u001b[0m \u001b[96mself\u001b[0m._event_hooks[\u001b[33m\"\u001b[0m\u001b[33mrequest\u001b[0m\u001b[33m\"\u001b[0m]: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 977 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mhook(request) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 978 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 979 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mresponse = \u001b[96mself\u001b[0m._send_single_request(request) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 980 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 981 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mfor\u001b[0m hook \u001b[95min\u001b[0m \u001b[96mself\u001b[0m._event_hooks[\u001b[33m\"\u001b[0m\u001b[33mresponse\u001b[0m\u001b[33m\"\u001b[0m]: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 982 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mhook(response) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/\u001b[0m\u001b[1;33m_client.py\u001b[0m:\u001b[94m1015\u001b[0m in \u001b[92m_send_single_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1012 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1013 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1014 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mwith\u001b[0m request_context(request=request): \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m1015 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mresponse = transport.handle_request(request) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1016 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1017 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94massert\u001b[0m \u001b[96misinstance\u001b[0m(response.stream, SyncByteStream) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1018 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/_transports/\u001b[0m\u001b[1;33mdefault.py\u001b[0m:\u001b[94m232\u001b[0m in \u001b[92mhandle_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m229 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mcontent=request.stream, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m230 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mextensions=request.extensions, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m231 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m232 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mwith\u001b[0m map_httpcore_exceptions(): \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m233 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mresp = \u001b[96mself\u001b[0m._pool.handle_request(req) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m234 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m235 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94massert\u001b[0m \u001b[96misinstance\u001b[0m(resp.stream, typing.Iterable) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/\u001b[0m\u001b[1;33mcontextlib.py\u001b[0m:\u001b[94m158\u001b[0m in \u001b[92m__exit__\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m155 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# tell if we get the same exception back\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m156 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mvalue = typ() \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m157 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m158 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[96mself\u001b[0m.gen.throw(typ, value, traceback) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m159 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mStopIteration\u001b[0m \u001b[94mas\u001b[0m exc: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m160 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# Suppress StopIteration *unless* it's the same exception that\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m161 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# was passed to throw(). This prevents a StopIteration\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/httpx/_transports/\u001b[0m\u001b[1;33mdefault.py\u001b[0m:\u001b[94m86\u001b[0m in \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[92mmap_httpcore_exceptions\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 83 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mraise\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 84 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 85 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mmessage = \u001b[96mstr\u001b[0m(exc) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 86 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mraise\u001b[0m mapped_exc(message) \u001b[94mfrom\u001b[0m \u001b[4;96mexc\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 87 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 88 \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 89 \u001b[0mHTTPCORE_EXC_MAP = { \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\u001b[0m\n", - "\u001b[1;91mConnectError: \u001b[0m\u001b[1m[\u001b[0mErrno \u001b[1;36m111\u001b[0m\u001b[1m]\u001b[0m Connection refused\n", - "\n", - "\u001b[3mThe above exception was the direct cause of the following exception:\u001b[0m\n", - "\n", - "\u001b[31mโ•ญโ”€\u001b[0m\u001b[31mโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31mโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\u001b[0m\u001b[31mโ”€โ•ฎ\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/home/jovyan/workspaces/\u001b[0m\u001b[1;33muc_oss_catalog_viewer.py\u001b[0m:\u001b[94m147\u001b[0m in \u001b[92mdisplay_catalog\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m144 \u001b[0m\u001b[2mโ”‚ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m145 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mconsole = Console(width=\u001b[94m200\u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m146 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mwith\u001b[0m console.pager(): \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m147 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mconsole.print(generate_table()) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m148 \u001b[0m\u001b[2mโ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m149 \u001b[0m\u001b[2mโ”‚ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mException\u001b[0m \u001b[94mas\u001b[0m e: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m150 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[96mprint\u001b[0m() \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/home/jovyan/workspaces/\u001b[0m\u001b[1;33muc_oss_catalog_viewer.py\u001b[0m:\u001b[94m49\u001b[0m in \u001b[92mgenerate_table\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 46 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mtable.add_column(\u001b[33m\"\u001b[0m\u001b[33mVol/Tab\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 47 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mtable.add_column(\u001b[33m\"\u001b[0m\u001b[33mDetails\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 48 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 49 \u001b[2mโ”‚ โ”‚ \u001b[0mc_list = uc_client.catalogs.list() \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 50 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mcatalogs= c_list.catalogs \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 51 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mfor\u001b[0m catalog \u001b[95min\u001b[0m catalogs: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 52 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[2m# cat_info = catalog.CatalogInfo\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/resources/\u001b[0m\u001b[1;33mcatalogs.py\u001b[0m:\u001b[94m211\u001b[0m in \u001b[92mlist\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m208 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m209 \u001b[0m\u001b[2;33mโ”‚ โ”‚ \u001b[0m\u001b[33mtimeout: Override the client-level default timeout for this request, in second\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m210 \u001b[0m\u001b[2;33mโ”‚ โ”‚ \u001b[0m\u001b[33m\"\"\"\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m211 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._get( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m212 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[33m\"\u001b[0m\u001b[33m/catalogs\u001b[0m\u001b[33m\"\u001b[0m, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m213 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0moptions=make_request_options( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m214 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mextra_headers=extra_headers, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m1168\u001b[0m in \u001b[92mget\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1165 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mopts = FinalRequestOptions.construct(method=\u001b[33m\"\u001b[0m\u001b[33mget\u001b[0m\u001b[33m\"\u001b[0m, url=path, **options) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1166 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[2m# cast is required because mypy complains about returning Any even though\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1167 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[2m# it understands the type variables\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m1168 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m cast(ResponseT, \u001b[96mself\u001b[0m.request(cast_to, opts, stream=stream, stream_cls=str \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1169 \u001b[0m\u001b[2mโ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1170 \u001b[0m\u001b[2mโ”‚ \u001b[0m\u001b[1;95m@overload\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1171 \u001b[0m\u001b[2mโ”‚ \u001b[0m\u001b[94mdef\u001b[0m \u001b[92mpost\u001b[0m( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m920\u001b[0m in \u001b[92mrequest\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 917 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mstream: \u001b[96mbool\u001b[0m = \u001b[94mFalse\u001b[0m, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 918 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mstream_cls: \u001b[96mtype\u001b[0m[_StreamT] | \u001b[94mNone\u001b[0m = \u001b[94mNone\u001b[0m, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 919 \u001b[0m\u001b[2mโ”‚ \u001b[0m) -> ResponseT | _StreamT: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 920 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._request( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 921 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mcast_to=cast_to, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 922 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0moptions=options, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 923 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mstream=stream, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m975\u001b[0m in \u001b[92m_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 972 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mlog.debug(\u001b[33m\"\u001b[0m\u001b[33mEncountered Exception\u001b[0m\u001b[33m\"\u001b[0m, exc_info=\u001b[94mTrue\u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 973 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 974 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mif\u001b[0m retries > \u001b[94m0\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 975 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._retry_request( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 976 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0moptions, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 977 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mcast_to, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 978 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mretries, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m1051\u001b[0m in \u001b[92m_retry_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1048 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[2m# different thread if necessary.\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1049 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mtime.sleep(timeout) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1050 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m1051 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._request( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1052 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0moptions=options, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1053 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mcast_to=cast_to, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1054 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mremaining_retries=remaining, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m975\u001b[0m in \u001b[92m_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 972 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mlog.debug(\u001b[33m\"\u001b[0m\u001b[33mEncountered Exception\u001b[0m\u001b[33m\"\u001b[0m, exc_info=\u001b[94mTrue\u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 973 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 974 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mif\u001b[0m retries > \u001b[94m0\u001b[0m: \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 975 \u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._retry_request( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 976 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0moptions, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 977 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mcast_to, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 978 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ โ”‚ \u001b[0mretries, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m1051\u001b[0m in \u001b[92m_retry_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1048 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[2m# different thread if necessary.\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1049 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mtime.sleep(timeout) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1050 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m1051 \u001b[2mโ”‚ โ”‚ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._request( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1052 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0moptions=options, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1053 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mcast_to=cast_to, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m1054 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mremaining_retries=remaining, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2;33m/opt/conda/lib/python3.11/site-packages/unitycatalog/\u001b[0m\u001b[1;33m_base_client.py\u001b[0m:\u001b[94m985\u001b[0m in \u001b[92m_request\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 982 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ โ”‚ \u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 983 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 984 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0mlog.debug(\u001b[33m\"\u001b[0m\u001b[33mRaising connection error\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[31mโฑ \u001b[0m 985 \u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[94mraise\u001b[0m APIConnectionError(request=request) \u001b[94mfrom\u001b[0m \u001b[4;96merr\u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 986 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0m \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 987 \u001b[0m\u001b[2mโ”‚ โ”‚ \u001b[0mlog.debug( \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ”‚\u001b[0m \u001b[2m 988 \u001b[0m\u001b[2mโ”‚ โ”‚ โ”‚ \u001b[0m\u001b[33m'\u001b[0m\u001b[33mHTTP Response: \u001b[0m\u001b[33m%s\u001b[0m\u001b[33m \u001b[0m\u001b[33m%s\u001b[0m\u001b[33m \u001b[0m\u001b[33m\"\u001b[0m\u001b[33m%i\u001b[0m\u001b[33m \u001b[0m\u001b[33m%s\u001b[0m\u001b[33m\"\u001b[0m\u001b[33m \u001b[0m\u001b[33m%s\u001b[0m\u001b[33m'\u001b[0m, \u001b[31mโ”‚\u001b[0m\n", - "\u001b[31mโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ\u001b[0m\n", - "\u001b[1;91mAPIConnectionError: \u001b[0mConnection error.\n" + "
\n"
       ]
      },
      "metadata": {},
      "output_type": "display_data"
     }
    ],
-   "source": [
-    "%run uc_oss_catalog_viewer.py\n"
-   ]
+   "execution_count": 5
   },
   {
    "cell_type": "code",
diff --git a/workspaces/uc-demo.jupyterlab-workspace b/workspaces/uc-demo.jupyterlab-workspace
new file mode 100644
index 0000000..1f2554b
--- /dev/null
+++ b/workspaces/uc-demo.jupyterlab-workspace
@@ -0,0 +1 @@
+{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":4,"widgets":["notebook:workspaces/Untitled.ipynb","terminal:1","terminal:2","terminal:3","terminal:4","terminal:5","terminal:6","terminal:7"]},"current":"terminal:4"},"down":{"size":0,"widgets":[]},"left":{"collapsed":false,"visible":true,"current":"filebrowser","widgets":["filebrowser","running-sessions","git-sessions","@jupyterlab/toc:plugin","extensionmanager.main-view"],"widgetStates":{"jp-running-sessions":{"sizes":[0.16666666666666666,0.16666666666666666,0.16666666666666666,0.16666666666666666,0.16666666666666666,0.16666666666666666],"expansionStates":[false,false,false,false,false,false]},"extensionmanager.main-view":{"sizes":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"expansionStates":[false,false,false]}}},"right":{"collapsed":true,"visible":true,"widgets":["jp-property-inspector","debugger-sidebar"],"widgetStates":{"jp-debugger-sidebar":{"sizes":[0.2,0.2,0.2,0.2,0.2],"expansionStates":[false,false,false,false,false]}}},"relativeSizes":[0.18893072289156626,0.8110692771084337,0],"top":{"simpleVisibility":true}},"docmanager:recents":{"opened":[{"path":"workspaces","contentType":"directory","root":"/home/jovyan"},{"path":"workspaces/Untitled.ipynb","contentType":"notebook","factory":"Notebook","root":"/home/jovyan"},{"path":"workspaces/uc_oss_catalog_viewer.py","contentType":"file","factory":"Editor","root":"/home/jovyan"}],"closed":[{"path":"workspaces/uc_oss_catalog_viewer.py","contentType":"file","factory":"Editor","root":"/home/jovyan"}]},"file-browser-filebrowser:cwd":{"path":"workspaces"},"notebook:workspaces/Untitled.ipynb":{"data":{"path":"workspaces/Untitled.ipynb","factory":"Notebook"}},"workspace-ui:lastSave":"workspaces/uc-demo.jupyterlab-workspace","terminal:1":{"data":{"name":"1"}},"terminal:2":{"data":{"name":"2"}},"terminal:3":{"data":{"name":"3"}},"terminal:4":{"data":{"name":"4"}},"terminal:5":{"data":{"name":"5"}},"terminal:6":{"data":{"name":"6"}},"terminal:7":{"data":{"name":"7"}}},"metadata":{"id":"uc-demo","last_modified":"2024-07-19T13:20:03.410779+00:00","created":"2024-07-19T13:20:03.410779+00:00"}}
\ No newline at end of file