-
Notifications
You must be signed in to change notification settings - Fork 605
E2E Tests #1678
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
E2E Tests #1678
Changes from all commits
Commits
Show all changes
35 commits
Select commit
Hold shift + click to select a range
879f526
Move test apis to an api/ folder
f493047
Add E2E test package
e699b5b
Add e2e test for local realtime apis
5b35b54
Add -y flag to cluster management function
4782de5
Refactor test file in order to share test with different envs
6e2c1e8
Add pytest.ini configuration
b5b4f6b
Rename test function
0c47cd1
Add aws e2e tests for realtime api's
0dc928e
Add e2e tests for GCP realtime api's
f400310
Fix pytest custom options
b610669
Add more test cases and move client fixtures to conftest.py
2b4f321
WIP: test batch api's
2a964d9
Fix cortex client dir in e2e setup.py
c7f3dd6
Skip tests instead of failing if flags are not passed in
eb4c0b5
Fixed batch tests
0d999ad
Add sample.json to onnx and tf batch examples
1ac903a
Add env vars to set tests behaviour and improved batch tests flakiness
1d78346
Fix linting issues
59b08c3
Update e2e setup.py with dependencies
b85fbaa
Update e2e setup.py
c66dac9
Restructure tests README.md, add E2E tests README.md
df45223
Add sleep before request retry
52b710f
Refactor tests configuration
59ce55d
Fix linting errors
61c1657
Merge branch 'master' into e2e-tests
20d4588
Merge branch 'master' into e2e-tests
0bcb781
Merge branch 'master' into e2e-tests
ac67ea6
Address PR comments
c644abb
Remove local tests
1f88f3a
Merge branch 'master' into e2e-tests
9bffb5f
Update pytest version
deliahu 9993471
Update README.md
deliahu 91e38db
Update CONTRIBUTING.md
deliahu 724e25a
Update .gitignore
deliahu 6288069
Fix e2e test README.md
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -9,6 +9,7 @@ __pycache__/ | |
| .python-version | ||
| .env | ||
| .venv | ||
| *.egg-info | ||
|
|
||
| # OSX | ||
| .DS_Store | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,67 +1,5 @@ | ||
| # Examples | ||
| # Cortex Tests | ||
|
|
||
| ## TensorFlow | ||
|
|
||
| - [Iris classification](tensorflow/iris-classifier): deploy a model to classify iris flowers. | ||
|
|
||
| - [Text generation](tensorflow/text-generator): deploy OpenAI's GPT-2 to generate text. | ||
|
|
||
| - [Sentiment analysis](tensorflow/sentiment-analyzer): deploy a BERT model for sentiment analysis. | ||
|
|
||
| - [Image classification](tensorflow/image-classifier-inception): deploy an Inception model to classify images. | ||
|
|
||
| - [Image classification](tensorflow/image-classifier-resnet50): deploy a ResNet50 model to classify images. | ||
|
|
||
| - [License plate reader](tensorflow/license-plate-reader): deploy a YOLOv3 model (and others) to identify license plates in real time. | ||
|
|
||
| - [Multi-model classification](tensorflow/multi-model-classifier): deploy 3 models (ResNet50, Iris, Inception) in a single API. | ||
|
|
||
| ## Keras | ||
|
|
||
| - [Denoisify text documents](keras/document-denoiser): deploy an Autoencoder model to clean text document images of noise. | ||
|
|
||
| ## PyTorch | ||
|
|
||
| - [Iris classification](pytorch/iris-classifier): deploy a model to classify iris flowers. | ||
|
|
||
| - [Text generation](pytorch/text-generator): deploy Hugging Face's GPT-2 model to generate text. | ||
|
|
||
| - [Sentiment analysis](pytorch/sentiment-analyzer): deploy a Hugging Face transformers model for sentiment analysis. | ||
|
|
||
| - [Search completion](pytorch/search-completer): deploy a Facebook's RoBERTa model to complete search terms. | ||
|
|
||
| - [Answer generation](pytorch/answer-generator): deploy Microsoft's DialoGPT model to answer questions. | ||
|
|
||
| - [Text summarization](pytorch/text-summarizer): deploy a BART model (from Hugging Face's transformers library) to summarize text. | ||
|
|
||
| - [Reading comprehension](pytorch/reading-comprehender): deploy an AllenNLP model for reading comprehension. | ||
|
|
||
| - [Language identification](pytorch/language-identifier): deploy a fastText model to identify languages. | ||
|
|
||
| - [Multi-model text analysis](pytorch/multi-model-text-analyzer): deploy 2 models (Sentiment and Summarization analyzers) in a single API. | ||
|
|
||
| - [Image classification](pytorch/image-classifier-alexnet): deploy an AlexNet model from TorchVision to classify images. | ||
|
|
||
| - [Image classification](pytorch/image-classifier-resnet50): deploy a ResNet50 model from TorchVision to classify images. | ||
|
|
||
| - [Object detection](pytorch/object-detector): deploy a Faster R-CNN model from TorchVision to detect objects in images. | ||
|
|
||
| - [Question generator](pytorch/question-generator): deploy a transformers model to generate questions given text and the correct answer. | ||
|
|
||
| ## ONNX | ||
|
|
||
| - [Iris classification](onnx/iris-classifier): deploy an XGBoost model (exported in ONNX) to classify iris flowers. | ||
|
|
||
| - [YOLOv5 YouTube detection](onnx/yolov5-youtube): deploy a YOLOv5 model trained on COCO val2017 dataset. | ||
|
|
||
| - [Multi-model classification](onnx/multi-model-classifier): deploy 3 models (ResNet50, MobileNet, ShuffleNet) in a single API. | ||
|
|
||
| ## scikit-learn | ||
|
|
||
| - [Iris classification](sklearn/iris-classifier): deploy a model to classify iris flowers. | ||
|
|
||
| - [MPG estimation](sklearn/mpg-estimator): deploy a linear regression model to estimate MPG. | ||
|
|
||
| ## spacy | ||
|
|
||
| - [Entity recognizer](spacy/entity-recognizer): deploy a spacy model for named entity recognition. | ||
| - [Example APIs](apis) | ||
| - [End-to-end Tests](e2e) | ||
| - [Testing Utilities](utils) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| # Examples | ||
|
|
||
| ## TensorFlow | ||
|
|
||
| - [Iris classification](tensorflow/iris-classifier): deploy a model to classify iris flowers. | ||
|
|
||
| - [Text generation](tensorflow/text-generator): deploy OpenAI's GPT-2 to generate text. | ||
|
|
||
| - [Sentiment analysis](tensorflow/sentiment-analyzer): deploy a BERT model for sentiment analysis. | ||
|
|
||
| - [Image classification](tensorflow/image-classifier-inception): deploy an Inception model to classify images. | ||
|
|
||
| - [Image classification](tensorflow/image-classifier-resnet50): deploy a ResNet50 model to classify images. | ||
|
|
||
| - [License plate reader](tensorflow/license-plate-reader): deploy a YOLOv3 model (and others) to identify license plates in real time. | ||
|
|
||
| - [Multi-model classification](tensorflow/multi-model-classifier): deploy 3 models (ResNet50, Iris, Inception) in a single API. | ||
|
|
||
| ## Keras | ||
|
|
||
| - [Denoisify text documents](keras/document-denoiser): deploy an Autoencoder model to clean text document images of noise. | ||
|
|
||
| ## PyTorch | ||
|
|
||
| - [Iris classification](pytorch/iris-classifier): deploy a model to classify iris flowers. | ||
|
|
||
| - [Text generation](pytorch/text-generator): deploy Hugging Face's GPT-2 model to generate text. | ||
|
|
||
| - [Sentiment analysis](pytorch/sentiment-analyzer): deploy a Hugging Face transformers model for sentiment analysis. | ||
|
|
||
| - [Search completion](pytorch/search-completer): deploy a Facebook's RoBERTa model to complete search terms. | ||
|
|
||
| - [Answer generation](pytorch/answer-generator): deploy Microsoft's DialoGPT model to answer questions. | ||
|
|
||
| - [Text summarization](pytorch/text-summarizer): deploy a BART model (from Hugging Face's transformers library) to summarize text. | ||
|
|
||
| - [Reading comprehension](pytorch/reading-comprehender): deploy an AllenNLP model for reading comprehension. | ||
|
|
||
| - [Language identification](pytorch/language-identifier): deploy a fastText model to identify languages. | ||
|
|
||
| - [Multi-model text analysis](pytorch/multi-model-text-analyzer): deploy 2 models (Sentiment and Summarization analyzers) in a single API. | ||
|
|
||
| - [Image classification](pytorch/image-classifier-alexnet): deploy an AlexNet model from TorchVision to classify images. | ||
|
|
||
| - [Image classification](pytorch/image-classifier-resnet50): deploy a ResNet50 model from TorchVision to classify images. | ||
|
|
||
| - [Object detection](pytorch/object-detector): deploy a Faster R-CNN model from TorchVision to detect objects in images. | ||
|
|
||
| - [Question generator](pytorch/question-generator): deploy a transformers model to generate questions given text and the correct answer. | ||
|
|
||
| ## ONNX | ||
|
|
||
| - [Iris classification](onnx/iris-classifier): deploy an XGBoost model (exported in ONNX) to classify iris flowers. | ||
|
|
||
| - [YOLOv5 YouTube detection](onnx/yolov5-youtube): deploy a YOLOv5 model trained on COCO val2017 dataset. | ||
|
|
||
| - [Multi-model classification](onnx/multi-model-classifier): deploy 3 models (ResNet50, MobileNet, ShuffleNet) in a single API. | ||
|
|
||
| ## scikit-learn | ||
|
|
||
| - [Iris classification](sklearn/iris-classifier): deploy a model to classify iris flowers. | ||
|
|
||
| - [MPG estimation](sklearn/mpg-estimator): deploy a linear regression model to estimate MPG. | ||
|
|
||
| ## spacy | ||
|
|
||
| - [Entity recognizer](spacy/entity-recognizer): deploy a spacy model for named entity recognition. |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| [ | ||
| "https://i.imgur.com/PzXprwl.jpg" | ||
| ] |
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| [ | ||
| "https://i.imgur.com/PzXprwl.jpg" | ||
| ] |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
1 change: 0 additions & 1 deletion
1
...loading/python/mpg-estimator/predictor.py → ...loading/python/mpg-estimator/predictor.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,4 @@ | ||
| import mlflow.sklearn | ||
| import numpy as np | ||
|
|
||
|
|
||
| class PythonPredictor: | ||
|
|
||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
1 change: 0 additions & 1 deletion
1
...caching/python/mpg-estimator/predictor.py → ...caching/python/mpg-estimator/predictor.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,4 @@ | ||
| import mlflow.sklearn | ||
| import numpy as np | ||
|
|
||
|
|
||
| class PythonPredictor: | ||
|
|
||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| # this file is used for testing purposes only | ||
|
|
||
| response: | ||
| content_type: "text" | ||
| expected: "versicolor" |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,75 @@ | ||
| # End-to-end Tests | ||
|
|
||
| ## Dependencies | ||
|
|
||
| Install the `e2e` package, from the project directory: | ||
|
|
||
| ```shell | ||
| pip install -e test/e2e | ||
| ``` | ||
|
|
||
| This only needs to be installed once (not on every code change). | ||
|
|
||
| ## Running the tests | ||
|
|
||
| Before running tests, instruct the Python client to use your development CLI binary: | ||
|
|
||
| ```shell | ||
| export CORTEX_CLI_PATH=<cortex_repo_path>/bin/cortex | ||
| ``` | ||
|
|
||
| ### AWS | ||
|
|
||
| From an existing cluster: | ||
|
|
||
| ```shell | ||
| pytest test/e2e/tests -k aws --aws-env <cortex_aws_env> | ||
deliahu marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ``` | ||
|
|
||
| Using a new cluster, created for testing only and deleted afterwards: | ||
|
|
||
| ```shell | ||
| pytest test/e2e/tests -k aws --aws-config <cortex_aws_cluster_config.yaml> | ||
| ``` | ||
|
|
||
| **Note:** For the BatchAPI tests, the `--s3-bucket` option should be provided with an | ||
| AWS S3 bucket for testing purposes. It is more convinient however to define | ||
| this bucket through an environment variable, see [configuration](#configuration). | ||
|
|
||
| ### GCP | ||
|
|
||
| From an existing cluster: | ||
|
|
||
| ```shell | ||
| pytest test/e2e/tests -k gcp --gcp-env <cortex_gcp_env> | ||
| ``` | ||
|
|
||
| Using a new cluster, created for testing only and deleted afterwards: | ||
|
|
||
| ```shell | ||
| pytest test/e2e/tests -k gcp --gcp-config <cortex_gcp_cluster_config.yaml> | ||
| ``` | ||
|
|
||
| ### All Tests | ||
|
|
||
| You can run all tests at once, however the provider specific options should be passed | ||
| accordingly, or the test cases will be skipped. | ||
|
|
||
| e.g. | ||
|
|
||
| ```shell | ||
| pytest test/e2e/tests --aws-env <cortex_aws_env> --gcp-env <cortex_gcp_env> | ||
| ``` | ||
|
|
||
| ## Configuration | ||
|
|
||
| It is possible to configure the behaviour of the tests by defining | ||
| environment variables or a `.env` file at the project directory. | ||
|
|
||
| ```dotenv | ||
| # .env file | ||
| CORTEX_TEST_REALTIME_DEPLOY_TIMEOUT=60 | ||
| CORTEX_TEST_BATCH_DEPLOY_TIMEOUT=30 | ||
| CORTEX_TEST_BATCH_JOB_TIMEOUT=120 | ||
| CORTEX_TEST_BATCH_S3_BUCKET_DIR=s3://<s3_bucket>/test/jobs | ||
| ``` | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| # Copyright 2020 Cortex Labs, Inc. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| from .cluster import create_cluster, delete_cluster | ||
|
|
||
| __all__ = ["create_cluster", "delete_cluster"] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| # Copyright 2020 Cortex Labs, Inc. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| import subprocess | ||
| import sys | ||
|
|
||
| import yaml | ||
|
|
||
| from e2e.exceptions import ClusterCreationException, ClusterDeletionException | ||
|
|
||
|
|
||
| def create_cluster(cluster_config: str): | ||
| """Create a cortex cluster from a cluster config""" | ||
| with open(cluster_config) as f: | ||
| config = yaml.safe_load(f) | ||
|
|
||
| cluster_name = config["cluster_name"] | ||
| provider = config["provider"] | ||
|
|
||
| p = subprocess.run( | ||
| [ | ||
| "cortex", | ||
| "cluster", | ||
| "up", | ||
| "-y", | ||
| "--config", | ||
| cluster_config, | ||
| "--configure-env", | ||
| f"{cluster_name}-{provider}", | ||
| ], | ||
| stdout=sys.stdout, | ||
| stderr=sys.stderr, | ||
| ) | ||
|
|
||
| if p.returncode != 0: | ||
| raise ClusterCreationException(f"failed to create cluster with config: {cluster_config}") | ||
|
|
||
|
|
||
| def delete_cluster(cluster_config: str): | ||
| """Delete a cortex cluster from a cluster config""" | ||
| p = subprocess.run( | ||
| ["cortex", "cluster", "down", "-y", "--config", cluster_config], | ||
| stdout=sys.stdout, | ||
| stderr=sys.stderr, | ||
| ) | ||
|
|
||
| if p.returncode != 0: | ||
| raise ClusterDeletionException(f"failed to delete cluster with config: {cluster_config}") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| class ClusterCreationException(Exception): | ||
| pass | ||
|
|
||
|
|
||
| class ClusterDeletionException(Exception): | ||
| pass | ||
|
|
||
|
|
||
| class ExpectationsValidationException(Exception): | ||
| pass |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.