diff --git a/CHANGELOG.md b/CHANGELOG.md index 30dbbfad3..87a6bacdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## 0.2.8 +Released on March 29, 2023. + +### Key Features + +### Enhancements +* Extends Aqueduct's parameter support to allow parameters to be `None` *if* + there is a default value for the parameter in the function definition. +* Tweaks the design of the workflow details page to reduce the number of shades + of blue. +* Updates SQL query parametrization scheme to use `$1`, `$2`, etc. as parameter + placeholders rather than the previous `{ param }` syntax. This allows a + paramter to be reused multiple times within the same query and is similar + to how traditional RDBMS interfaces work. +* Adds context about the execution configuration of an operator to the workflow + details page. Now, each operator will show the logo of the engine on which + its running. + +### Bugfixes +* Fixes bug where the metric history graph's X-axis would not reflect + timescales; all data points would be evenly spaced out rather than + reflecting the amount of time between each point. +* Fixes bug where cross-environment Python requirements gathering would lead to + erroneous installation. Currently, Aqueduct only supports explicit + requirements specification. +* Fixes bug where certain workflow failures would leave unfinished operators in + an infinitely-pending state; now, nodes are correctly marked as canceled. +* Fixes bug where retrieving a non-existent filepath from S3 would return + succesfully but with empty data; now, a detailed error message is shown + instead. +* Fixes bug where attempting to capture a system metric would thrown an error. + ## 0.2.7 Released on March 22, 2023. diff --git a/manual_qa_tests/README.md b/manual_qa_tests/README.md index d22565698..05e31713c 100644 --- a/manual_qa_tests/README.md +++ b/manual_qa_tests/README.md @@ -19,21 +19,21 @@ To run with more flexibility, configure the following commandline flags: ## Checklist * **Workflows** Page: - * There should be **5** workflows. **4** Succeeded and **1** Failed if using `--example-notebooks` - * There should be **6** workflows. **3** Succeeded, **2** Failed, and **1** Registered if **not** using `--example-notebooks` + * There should be **15** workflows. **10** Succeeded, **2** Warning, **2** Failed, and **1** Registered if using `-example-notebooks` + * There should be **9** workflows. **4** Succeeded, **2** Warning, **2** Failed, and **1** Registered if **not** using `-example-notebooks` * **Notifications**: There should be **2** notifications for failed workflow. * **Workflow Details** Page: Each page should reflect the **workflow description**. Pay attention to any noted **sidesheets** behaviors in the description. * **Integration** Page: - * There should be **11** *Data* integrations, **5** *Compute* integrations, and **2** *Notifications* integrations. - * If you are not using additional integration, `aqueduct_demo` should be the only available one. + * There should be **1** *Cloud* integration, **11** *Data* integrations, **6** *Compute* integrations, and **2** *Notifications* integrations. + * If you are not using additional integration, `aqueduct_demo` should be the only available one. If you have passed in slack arguments to `initialize.py`, there should be two. * **Integration Details** Page: * In the **Workflows** section of the `aqueduct_demo` page: - * There should be **10** workflows if using `--example-notebooks` - * Ther should be **4** workflows if **not** using `--example-notebooks` + * There should be **13** workflows if using `--example-notebooks` + * There should be **7** workflows if **not** using `--example-notebooks` * If you are using `aqueduct_demo`, there should be **8** tables in **Data** section. -* **Data** Page: There should be **5** data rows available. +* **Data** Page: There should be **7** data rows available. * **Slack channel**: - * There should be **16** new notifications. + * If Slack flags are set, there should be **15** new notifications. * Each notification should have the following aspects: * A title including the workflow's name and status * Workflow name diff --git a/sdk/setup.py b/sdk/setup.py index 4830fc099..c1cea8e75 100644 --- a/sdk/setup.py +++ b/sdk/setup.py @@ -18,7 +18,7 @@ setuptools.setup( name="aqueduct-sdk", - version="0.2.7", + version="0.2.8", author="Aqueduct, Inc.", author_email="hello@aqueducthq.com", description="Python SDK for the Aqueduct prediction infrastructure", diff --git a/src/dockerfiles/Makefile b/src/dockerfiles/Makefile index 7ae63eed9..d0d157d86 100644 --- a/src/dockerfiles/Makefile +++ b/src/dockerfiles/Makefile @@ -1,5 +1,5 @@ .DEFAULT_GOAL = all -VERSION = 0.2.7 +VERSION = 0.2.8 # By default, turn off the Makefile practice of printing each command before # you run it. diff --git a/src/dockerfiles/connectors/athena.dockerfile b/src/dockerfiles/connectors/athena.dockerfile index 07648fb6f..f65e32cf1 100644 --- a/src/dockerfiles/connectors/athena.dockerfile +++ b/src/dockerfiles/connectors/athena.dockerfile @@ -1,4 +1,4 @@ -FROM aqueducthq/base_connector:0.2.7 +FROM aqueducthq/base_connector:0.2.8 MAINTAINER Aqueduct version: 0.1 diff --git a/src/dockerfiles/connectors/bigquery.dockerfile b/src/dockerfiles/connectors/bigquery.dockerfile index 2cf23d653..fb494be8e 100644 --- a/src/dockerfiles/connectors/bigquery.dockerfile +++ b/src/dockerfiles/connectors/bigquery.dockerfile @@ -1,4 +1,4 @@ -FROM aqueducthq/base_connector:0.2.7 +FROM aqueducthq/base_connector:0.2.8 MAINTAINER Aqueduct version: 0.1 diff --git a/src/dockerfiles/connectors/mysql.dockerfile b/src/dockerfiles/connectors/mysql.dockerfile index 5d8160a58..4c366cb15 100644 --- a/src/dockerfiles/connectors/mysql.dockerfile +++ b/src/dockerfiles/connectors/mysql.dockerfile @@ -1,4 +1,4 @@ -FROM aqueducthq/base_connector:0.2.7 +FROM aqueducthq/base_connector:0.2.8 MAINTAINER Aqueduct version: 0.1 diff --git a/src/dockerfiles/connectors/postgres.dockerfile b/src/dockerfiles/connectors/postgres.dockerfile index f5b1b818e..a4eab8b86 100644 --- a/src/dockerfiles/connectors/postgres.dockerfile +++ b/src/dockerfiles/connectors/postgres.dockerfile @@ -1,4 +1,4 @@ -FROM aqueducthq/base_connector:0.2.7 +FROM aqueducthq/base_connector:0.2.8 MAINTAINER Aqueduct version: 0.1 diff --git a/src/dockerfiles/connectors/s3.dockerfile b/src/dockerfiles/connectors/s3.dockerfile index bc319e30f..89f16b613 100644 --- a/src/dockerfiles/connectors/s3.dockerfile +++ b/src/dockerfiles/connectors/s3.dockerfile @@ -1,4 +1,4 @@ -FROM aqueducthq/base_connector:0.2.7 +FROM aqueducthq/base_connector:0.2.8 MAINTAINER Aqueduct version: 0.1 diff --git a/src/dockerfiles/connectors/snowflake.dockerfile b/src/dockerfiles/connectors/snowflake.dockerfile index c7c00fb53..bd6a1a3dc 100644 --- a/src/dockerfiles/connectors/snowflake.dockerfile +++ b/src/dockerfiles/connectors/snowflake.dockerfile @@ -1,4 +1,4 @@ -FROM aqueducthq/base_connector:0.2.7 +FROM aqueducthq/base_connector:0.2.8 MAINTAINER Aqueduct version: 0.1 diff --git a/src/dockerfiles/connectors/sqlserver.dockerfile b/src/dockerfiles/connectors/sqlserver.dockerfile index 5e02358fa..5b62a76d1 100644 --- a/src/dockerfiles/connectors/sqlserver.dockerfile +++ b/src/dockerfiles/connectors/sqlserver.dockerfile @@ -1,4 +1,4 @@ -FROM aqueducthq/base_connector:0.2.7 +FROM aqueducthq/base_connector:0.2.8 MAINTAINER Aqueduct version: 0.1 diff --git a/src/dockerfiles/function/function310.dockerfile b/src/dockerfiles/function/function310.dockerfile index d479a7c9a..9e84269db 100644 --- a/src/dockerfiles/function/function310.dockerfile +++ b/src/dockerfiles/function/function310.dockerfile @@ -16,7 +16,7 @@ pyarrow==7.0.0 \ boto3==1.18.0 \ pydantic==1.9.0 \ scikit_learn==1.0.2 \ -aqueduct-ml==0.2.7 +aqueduct-ml==0.2.8 ENV PYTHONUNBUFFERED 1 diff --git a/src/dockerfiles/function/function37.dockerfile b/src/dockerfiles/function/function37.dockerfile index dc477f634..36ec54b30 100644 --- a/src/dockerfiles/function/function37.dockerfile +++ b/src/dockerfiles/function/function37.dockerfile @@ -16,7 +16,7 @@ boto3==1.18.0 \ pydantic==1.9.0 \ scikit_learn==1.0.2 \ typing_extensions==4.3.0 \ -aqueduct-ml==0.2.7 +aqueduct-ml==0.2.8 ENV PYTHONUNBUFFERED 1 diff --git a/src/dockerfiles/function/function38.dockerfile b/src/dockerfiles/function/function38.dockerfile index 3f960ef49..2fba2bdeb 100644 --- a/src/dockerfiles/function/function38.dockerfile +++ b/src/dockerfiles/function/function38.dockerfile @@ -16,7 +16,7 @@ pyarrow==7.0.0 \ boto3==1.18.0 \ pydantic==1.9.0 \ scikit_learn==1.0.2 \ -aqueduct-ml==0.2.7 +aqueduct-ml==0.2.8 ENV PYTHONUNBUFFERED 1 diff --git a/src/dockerfiles/function/function39.dockerfile b/src/dockerfiles/function/function39.dockerfile index 888555784..5af8efc85 100644 --- a/src/dockerfiles/function/function39.dockerfile +++ b/src/dockerfiles/function/function39.dockerfile @@ -16,7 +16,7 @@ pyarrow==7.0.0 \ boto3==1.18.0 \ pydantic==1.9.0 \ scikit_learn==1.0.2 \ -aqueduct-ml==0.2.7 +aqueduct-ml==0.2.8 ENV PYTHONUNBUFFERED 1 diff --git a/src/dockerfiles/gpu/py310_env.yml b/src/dockerfiles/gpu/py310_env.yml index c16ec011d..7897fe5c2 100644 --- a/src/dockerfiles/gpu/py310_env.yml +++ b/src/dockerfiles/gpu/py310_env.yml @@ -14,4 +14,4 @@ dependencies: - pip: - scikit_learn==1.0.2 - typing_extensions==4.3.0 - - aqueduct-ml==0.2.7 + - aqueduct-ml==0.2.8 diff --git a/src/dockerfiles/gpu/py37_env.yml b/src/dockerfiles/gpu/py37_env.yml index de5176041..c344c0bdc 100644 --- a/src/dockerfiles/gpu/py37_env.yml +++ b/src/dockerfiles/gpu/py37_env.yml @@ -14,4 +14,4 @@ dependencies: - pip: - scikit_learn==1.0.2 - typing_extensions==4.3.0 - - aqueduct-ml==0.2.7 + - aqueduct-ml==0.2.8 diff --git a/src/dockerfiles/gpu/py38_env.yml b/src/dockerfiles/gpu/py38_env.yml index ff12b8816..bf7ce8ce9 100644 --- a/src/dockerfiles/gpu/py38_env.yml +++ b/src/dockerfiles/gpu/py38_env.yml @@ -14,4 +14,4 @@ dependencies: - pip: - scikit_learn==1.0.2 - typing_extensions==4.3.0 - - aqueduct-ml==0.2.7 \ No newline at end of file + - aqueduct-ml==0.2.8 \ No newline at end of file diff --git a/src/dockerfiles/gpu/py39_env.yml b/src/dockerfiles/gpu/py39_env.yml index 917d6a6cf..ca787c625 100644 --- a/src/dockerfiles/gpu/py39_env.yml +++ b/src/dockerfiles/gpu/py39_env.yml @@ -14,4 +14,4 @@ dependencies: - pip: - scikit_learn==1.0.2 - typing_extensions==4.3.0 - - aqueduct-ml==0.2.7 \ No newline at end of file + - aqueduct-ml==0.2.8 \ No newline at end of file diff --git a/src/dockerfiles/lambda/function/requirements-37.txt b/src/dockerfiles/lambda/function/requirements-37.txt index 17a7edd16..5987125f6 100644 --- a/src/dockerfiles/lambda/function/requirements-37.txt +++ b/src/dockerfiles/lambda/function/requirements-37.txt @@ -7,4 +7,4 @@ boto3==1.18.0 pydantic==1.9.0 scikit_learn==1.0.2 typing_extensions==4.3.0 -aqueduct-ml==0.2.7 \ No newline at end of file +aqueduct-ml==0.2.8 \ No newline at end of file diff --git a/src/dockerfiles/lambda/function/requirements.txt b/src/dockerfiles/lambda/function/requirements.txt index a81ed2221..3cfff70be 100644 --- a/src/dockerfiles/lambda/function/requirements.txt +++ b/src/dockerfiles/lambda/function/requirements.txt @@ -6,4 +6,4 @@ pyarrow==7.0.0 boto3==1.18.0 pydantic==1.9.0 scikit_learn==1.0.2 -aqueduct-ml==0.2.7 \ No newline at end of file +aqueduct-ml==0.2.8 \ No newline at end of file diff --git a/src/dockerfiles/lambda/requirements.txt b/src/dockerfiles/lambda/requirements.txt index 198555a43..456758be1 100644 --- a/src/dockerfiles/lambda/requirements.txt +++ b/src/dockerfiles/lambda/requirements.txt @@ -6,4 +6,4 @@ pydantic==1.9.0 pyyaml SQLAlchemy==1.4.30 typing_extensions==4.3.0 -aqueduct-ml==0.2.7 \ No newline at end of file +aqueduct-ml==0.2.8 \ No newline at end of file diff --git a/src/golang/lib/constants.go b/src/golang/lib/constants.go index 48226faec..858bf720f 100644 --- a/src/golang/lib/constants.go +++ b/src/golang/lib/constants.go @@ -1,3 +1,3 @@ package lib -const ServerVersionNumber = "0.2.7" +const ServerVersionNumber = "0.2.8" diff --git a/src/python/bin/aqueduct b/src/python/bin/aqueduct index 1823370da..69fa9651c 100755 --- a/src/python/bin/aqueduct +++ b/src/python/bin/aqueduct @@ -37,7 +37,7 @@ base_directory = os.path.join(os.environ["HOME"], ".aqueduct") server_directory = os.path.join(os.environ["HOME"], ".aqueduct", "server") ui_directory = os.path.join(os.environ["HOME"], ".aqueduct", "ui") -package_version = "0.2.7" +package_version = "0.2.8" aws_credentials_path = os.path.join(os.environ["HOME"], ".aws", "credentials") default_server_port = 8080 diff --git a/src/python/requirements.txt b/src/python/requirements.txt index df70e4535..057a772d4 100644 --- a/src/python/requirements.txt +++ b/src/python/requirements.txt @@ -11,4 +11,4 @@ typing_extensions>=4.3.0,<=4.4.0 Pillow<=9.4.0 packaging<=23.0 pymongo<=4.3.3 -aqueduct-sdk==0.2.7 +aqueduct-sdk==0.2.8 diff --git a/src/python/setup.py b/src/python/setup.py index 75be4f8b6..87851c6b4 100644 --- a/src/python/setup.py +++ b/src/python/setup.py @@ -10,7 +10,7 @@ setup( name="aqueduct-ml", - version="0.2.7", + version="0.2.8", install_requires=install_requires, scripts=["bin/aqueduct"], packages=find_packages(), diff --git a/src/ui/app/package.json b/src/ui/app/package.json index a87a838b4..3b22a3116 100644 --- a/src/ui/app/package.json +++ b/src/ui/app/package.json @@ -1,7 +1,7 @@ { "name": "@aqueducthq/ui", "author": "Aqueduct, Inc. ", - "version": "0.2.7", + "version": "0.2.8", "scripts": { "start": "parcel --no-cache index.html", "build": "parcel build --public-url /dist --dist-dir dist/default index.html", @@ -9,7 +9,7 @@ "lint:fix": "eslint '*/**/*.{js,ts,tsx}' --format table --fix" }, "dependencies": { - "@aqueducthq/common": "0.2.7", + "@aqueducthq/common": "0.2.8", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@fortawesome/fontawesome-svg-core": "^6.2.1", diff --git a/src/ui/common/package-lock.json b/src/ui/common/package-lock.json index 991ef6f70..f52b98337 100644 --- a/src/ui/common/package-lock.json +++ b/src/ui/common/package-lock.json @@ -1,12 +1,12 @@ { "name": "@aqueducthq/common", - "version": "0.2.7", + "version": "0.2.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@aqueducthq/common", - "version": "0.2.7", + "version": "0.2.8", "hasInstallScript": true, "devDependencies": { "@babel/core": "^7.20.12", diff --git a/src/ui/common/package.json b/src/ui/common/package.json index 3bdb6acfb..1e69e1116 100644 --- a/src/ui/common/package.json +++ b/src/ui/common/package.json @@ -1,7 +1,7 @@ { "name": "@aqueducthq/common", "author": "Aqueduct ", - "version": "0.2.7", + "version": "0.2.8", "main": "dist/index.js", "types": "dist/index.d.ts", "alias": { diff --git a/src/ui/common/src/components/workflows/ReactFlowCanvas.tsx b/src/ui/common/src/components/workflows/ReactFlowCanvas.tsx index 04824f6ce..424667890 100644 --- a/src/ui/common/src/components/workflows/ReactFlowCanvas.tsx +++ b/src/ui/common/src/components/workflows/ReactFlowCanvas.tsx @@ -33,6 +33,26 @@ const ReactFlowCanvas: React.FC = ({ ); const { edges, nodes } = dagPositionState.result ?? { edges: [], nodes: [] }; + if (edges.length === 0 || nodes.length === 0) { + // The DAG position state is still loading. + return null; + } + + // This is a bit of a tricky check; when we switch between workflow versions, the selected DAG + // does not load in sync with the DAG positioning. As a result, we need to ensure + // that we only render the graph once the two sets of Redux state are in sync before + // proceeding; otherwise, our node IDs will be mismatched. Here, we simply check to see + // if the UUIDs for one of the nodes exists in the selected DAG. If it doesn't, that + // means the state has not synced yet, so we return null and wait for it to sync. + const testNode = nodes[0]; + if ( + (testNode.data.nodeType === ReactflowNodeType.Operator && + !selectedDag.operators[testNode.id]) || + (testNode.data.nodeType === ReactflowNodeType.Artifact && + !selectedDag.artifacts[testNode.id]) + ) { + return null; + } const defaultViewport = { x: 0, y: 0, zoom: 1 }; diff --git a/src/ui/common/src/components/workflows/workflowHeader.tsx b/src/ui/common/src/components/workflows/workflowHeader.tsx index ae1b0eda8..4f2b94043 100644 --- a/src/ui/common/src/components/workflows/workflowHeader.tsx +++ b/src/ui/common/src/components/workflows/workflowHeader.tsx @@ -175,7 +175,7 @@ const WorkflowHeader: React.FC = ({ workflowDag }) => { {engines.map((engine) => ( - + ))}