dotflow 0.15.0.dev3__tar.gz → 0.15.0.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/PKG-INFO +77 -22
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/README.md +73 -21
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/__init__.py +1 -1
- dotflow-0.15.0.dev4/dotflow/abc/server.py +30 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/cloud.py +1 -0
- dotflow-0.15.0.dev4/dotflow/cli/commands/deploy.py +171 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/log.py +2 -1
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/setup.py +5 -2
- dotflow-0.15.0.dev4/dotflow/cloud/alibaba/__init__.py +11 -0
- dotflow-0.15.0.dev4/dotflow/cloud/alibaba/constants.py +22 -0
- dotflow-0.15.0.dev4/dotflow/cloud/alibaba/deployers/__init__.py +13 -0
- dotflow-0.15.0.dev4/dotflow/cloud/alibaba/deployers/fc.py +134 -0
- dotflow-0.15.0.dev4/dotflow/cloud/alibaba/deployers/fc_scheduled.py +78 -0
- dotflow-0.15.0.dev4/dotflow/cloud/alibaba/services/__init__.py +1 -0
- dotflow-0.15.0.dev4/dotflow/cloud/alibaba/services/cr.py +99 -0
- dotflow-0.15.0.dev4/dotflow/cloud/aws/__init__.py +19 -0
- dotflow-0.15.0.dev4/dotflow/cloud/aws/constants.py +23 -0
- dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/__init__.py +19 -0
- dotflow-0.15.0.dev3/dotflow/cloud/aws/base_lambda_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/base_lambda.py +6 -9
- dotflow-0.15.0.dev3/dotflow/cloud/aws/ecs_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/ecs.py +11 -3
- dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/ecs_scheduled.py +154 -0
- dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_.py +9 -3
- dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_api_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_api.py +6 -3
- dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_s3_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_s3.py +10 -4
- dotflow-0.15.0.dev3/dotflow/cloud/aws/lambda_sqs_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/aws/deployers/lambda_sqs.py +19 -4
- dotflow-0.15.0.dev4/dotflow/cloud/aws/schedule.py +66 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/cloudwatch.py +4 -1
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/ecr.py +8 -5
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/iam.py +4 -1
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/core.py +8 -2
- dotflow-0.15.0.dev4/dotflow/cloud/gcp/__init__.py +5 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/constants.py +9 -0
- dotflow-0.15.0.dev4/dotflow/cloud/gcp/deployers/__init__.py +5 -0
- dotflow-0.15.0.dev3/dotflow/cloud/gcp/cloudrun_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/gcp/deployers/cloudrun.py +12 -10
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/apis.py +8 -2
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/artifact_registry.py +16 -5
- dotflow-0.15.0.dev4/dotflow/cloud/github/__init__.py +5 -0
- dotflow-0.15.0.dev4/dotflow/cloud/github/deployers/__init__.py +5 -0
- dotflow-0.15.0.dev3/dotflow/cloud/github/actions_deployer.py → dotflow-0.15.0.dev4/dotflow/cloud/github/deployers/actions.py +10 -15
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/config.py +5 -5
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/dotflow.py +1 -1
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/engine.py +5 -2
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/serializers/task.py +52 -34
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/serializers/transport.py +2 -2
- dotflow-0.15.0.dev4/dotflow/core/serializers/workflow.py +14 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/task.py +10 -2
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/workflow.py +1 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/workflow.py +23 -5
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/__init__.py +2 -0
- dotflow-0.15.0.dev4/dotflow/providers/server_default.py +112 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/settings.py +2 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/pyproject.toml +3 -2
- dotflow-0.15.0.dev3/dotflow/abc/api.py +0 -24
- dotflow-0.15.0.dev3/dotflow/cli/commands/deploy.py +0 -110
- dotflow-0.15.0.dev3/dotflow/cloud/aws/__init__.py +0 -15
- dotflow-0.15.0.dev3/dotflow/cloud/aws/constants.py +0 -9
- dotflow-0.15.0.dev3/dotflow/cloud/gcp/__init__.py +0 -5
- dotflow-0.15.0.dev3/dotflow/cloud/github/__init__.py +0 -5
- dotflow-0.15.0.dev3/dotflow/core/serializers/workflow.py +0 -23
- dotflow-0.15.0.dev3/dotflow/providers/api_default.py +0 -158
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/LICENSE +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/file.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/flow.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/http.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/log.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/metrics.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/notify.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/scheduler.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/storage.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/tcp.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/abc/tracer.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/command.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/init.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/schedule.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/start.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/commands/storage.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/validators/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cli/validators/start.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/aws/services/s3.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/gcp/services/gcs.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/cloud/github/constants.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/action.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/context.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/decorators/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/decorators/time.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/exception.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/module.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/serializers/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/execution.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/overlap.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/status.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/core/types/storage.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/logging.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/main.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/log_default.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/log_opentelemetry.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/log_sentry.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/metrics_default.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/metrics_opentelemetry.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/notify_default.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/notify_discord.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/notify_telegram.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/scheduler_cron.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/scheduler_default.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_default.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_file.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_gcs.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/storage_s3.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/tracer_default.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/tracer_opentelemetry.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/providers/tracer_sentry.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/types.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/__init__.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/basic_functions.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/error_handler.py +0 -0
- {dotflow-0.15.0.dev3 → dotflow-0.15.0.dev4}/dotflow/utils/tools.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dotflow
|
|
3
|
-
Version: 0.15.0.
|
|
3
|
+
Version: 0.15.0.dev4
|
|
4
4
|
Summary: 🎲 Dotflow turns an idea into flow! Lightweight Python library for execution pipelines with retry, parallel, cron and async support.
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -42,6 +42,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
42
42
|
Classifier: Programming Language :: Python :: 3.12
|
|
43
43
|
Classifier: Programming Language :: Python :: 3.13
|
|
44
44
|
Provides-Extra: aws
|
|
45
|
+
Provides-Extra: deploy-alibaba
|
|
45
46
|
Provides-Extra: deploy-aws
|
|
46
47
|
Provides-Extra: deploy-gcp
|
|
47
48
|
Provides-Extra: deploy-github
|
|
@@ -51,6 +52,8 @@ Provides-Extra: scheduler
|
|
|
51
52
|
Provides-Extra: sentry
|
|
52
53
|
Requires-Dist: GitPython ; extra == "deploy-github"
|
|
53
54
|
Requires-Dist: PyGithub ; extra == "deploy-github"
|
|
55
|
+
Requires-Dist: alibabacloud-fc-open20210406 ; extra == "deploy-alibaba"
|
|
56
|
+
Requires-Dist: alibabacloud-tea-openapi ; extra == "deploy-alibaba"
|
|
54
57
|
Requires-Dist: boto3 ; extra == "aws"
|
|
55
58
|
Requires-Dist: boto3 ; extra == "deploy-aws"
|
|
56
59
|
Requires-Dist: cookiecutter (>=2.0)
|
|
@@ -78,9 +81,9 @@ Description-Content-Type: text/markdown
|
|
|
78
81
|
|
|
79
82
|
<div align="center">
|
|
80
83
|
|
|
81
|
-

|
|
84
|
+

|
|
82
85
|
|
|
83
|
-
**
|
|
86
|
+
**import dotflow. @action. deploy. Done.**
|
|
84
87
|
|
|
85
88
|
[](https://pypi.org/project/dotflow/)
|
|
86
89
|
[](https://pypi.org/project/dotflow/)
|
|
@@ -103,7 +106,7 @@ Dotflow is a lightweight Python library for execution pipelines. Define tasks wi
|
|
|
103
106
|
- **Resilient** — Retry, backoff, timeout, checkpoints, and error handling out of the box.
|
|
104
107
|
- **Observable** — OpenTelemetry traces, metrics, and logs. Sentry error tracking.
|
|
105
108
|
- **Deployable** — `dotflow deploy --platform lambda` ships your pipeline to AWS in one command.
|
|
106
|
-
- **Portable** — Same code runs on Lambda, ECS, Cloud Run, Kubernetes, Docker, or GitHub Actions.
|
|
109
|
+
- **Portable** — Same code runs on Lambda, ECS, Cloud Run, Alibaba FC, Kubernetes, Docker, or GitHub Actions.
|
|
107
110
|
|
|
108
111
|
## Install
|
|
109
112
|
|
|
@@ -150,16 +153,20 @@ dotflow deploy --platform lambda --project my_pipeline
|
|
|
150
153
|
|
|
151
154
|
| Platform | Deploy method |
|
|
152
155
|
|----------|---------------|
|
|
153
|
-
| <img src="https://
|
|
154
|
-
| <img src="https://
|
|
155
|
-
| <img src="https://
|
|
156
|
-
| <img src="https://
|
|
157
|
-
| <img src="https://
|
|
158
|
-
| <img src="https://
|
|
159
|
-
| <img src="https://
|
|
160
|
-
| <img src="https://
|
|
161
|
-
| <img src="https://
|
|
162
|
-
| <img src="https://
|
|
156
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-docker.svg" width="16" /> **Docker** | `docker compose up` |
|
|
157
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> **AWS Lambda** | `dotflow deploy` |
|
|
158
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS Lambda + EventBridge** | `dotflow deploy --schedule` |
|
|
159
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-s3.svg" width="16" /> **AWS Lambda + S3 Trigger** | `dotflow deploy` |
|
|
160
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-sqs.svg" width="16" /> **AWS Lambda + SQS Trigger** | `dotflow deploy` |
|
|
161
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-api-gateway.svg" width="16" /> **AWS Lambda + API Gateway** | `dotflow deploy` |
|
|
162
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> **AWS ECS Fargate** | `dotflow deploy` |
|
|
163
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS ECS + EventBridge** | `dotflow deploy --schedule` |
|
|
164
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> **Google Cloud Run** | `dotflow deploy` |
|
|
165
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud-scheduler.svg" width="16" /> **Cloud Run + Scheduler** | `dotflow deploy --schedule` |
|
|
166
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-kubernetes.svg" width="16" /> **Kubernetes** | `kubectl apply` |
|
|
167
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC** | `dotflow deploy` |
|
|
168
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC + Timer** | `dotflow deploy --schedule` |
|
|
169
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-github-actions.svg" width="16" /> **GitHub Actions** | `dotflow deploy` |
|
|
163
170
|
|
|
164
171
|
> [See all 34+ platforms →](https://dotflow-io.github.io/dotflow/nav/cloud/)
|
|
165
172
|
|
|
@@ -171,9 +178,10 @@ pip install dotflow[gcp] # Google Cloud Storage
|
|
|
171
178
|
pip install dotflow[scheduler] # Cron scheduler
|
|
172
179
|
pip install dotflow[otel] # OpenTelemetry
|
|
173
180
|
pip install dotflow[sentry] # Sentry error tracking
|
|
174
|
-
pip install dotflow[deploy-aws]
|
|
175
|
-
pip install dotflow[deploy-gcp]
|
|
176
|
-
pip install dotflow[deploy-
|
|
181
|
+
pip install dotflow[deploy-aws] # AWS deploy (Lambda, ECS)
|
|
182
|
+
pip install dotflow[deploy-gcp] # GCP deploy (Cloud Run)
|
|
183
|
+
pip install dotflow[deploy-alibaba] # Alibaba Cloud deploy (FC)
|
|
184
|
+
pip install dotflow[deploy-github] # GitHub Actions deploy
|
|
177
185
|
```
|
|
178
186
|
|
|
179
187
|
> **[Read the full documentation →](https://dotflow-io.github.io/dotflow/)**
|
|
@@ -184,8 +192,8 @@ pip install dotflow[deploy-github] # GitHub Actions deploy
|
|
|
184
192
|
|---------|-------------|
|
|
185
193
|
| [Concepts](https://dotflow-io.github.io/dotflow/nav/concepts/concept-workflow-and-tasks/) | Workflows, tasks, context, providers, process modes |
|
|
186
194
|
| [How-to Guides](https://dotflow-io.github.io/dotflow/nav/how-to/) | Step-by-step tutorials for workflows, tasks, and CLI |
|
|
187
|
-
| [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Kubernetes, Docker, GitHub Actions |
|
|
188
|
-
| [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS |
|
|
195
|
+
| [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Alibaba, Kubernetes, Docker, GitHub Actions |
|
|
196
|
+
| [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS, Server |
|
|
189
197
|
| [Examples](https://dotflow-io.github.io/dotflow/nav/examples/) | Real-world pipelines: ETL, health checks, async, scheduler |
|
|
190
198
|
| [Reference](https://dotflow-io.github.io/dotflow/nav/reference/dotflow/) | API reference for all classes and providers |
|
|
191
199
|
| [Custom Providers](https://dotflow-io.github.io/dotflow/nav/development/custom-providers/) | Build your own storage, notify, log, tracer, or metrics provider |
|
|
@@ -723,20 +731,64 @@ Available CLI commands:
|
|
|
723
731
|
|
|
724
732
|
</details>
|
|
725
733
|
|
|
734
|
+
<details>
|
|
735
|
+
<summary><strong>Server Provider</strong></summary>
|
|
736
|
+
|
|
737
|
+
> [Server docs](https://dotflow-io.github.io/dotflow/nav/tutorial/server-default/)
|
|
738
|
+
|
|
739
|
+
Send workflow and task execution data to a remote API (e.g. dotflow-api) in real time.
|
|
740
|
+
|
|
741
|
+
```python
|
|
742
|
+
from dotflow import DotFlow, Config, action
|
|
743
|
+
from dotflow.providers import ServerDefault
|
|
744
|
+
|
|
745
|
+
@action
|
|
746
|
+
def my_task():
|
|
747
|
+
return {"result": "ok"}
|
|
748
|
+
|
|
749
|
+
config = Config(
|
|
750
|
+
server=ServerDefault(
|
|
751
|
+
base_url="http://localhost:8000/api/v1",
|
|
752
|
+
user_token="your-api-token",
|
|
753
|
+
)
|
|
754
|
+
)
|
|
755
|
+
|
|
756
|
+
workflow = DotFlow(config=config)
|
|
757
|
+
workflow.task.add(step=my_task)
|
|
758
|
+
workflow.start()
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
| Parameter | Type | Default | Description |
|
|
762
|
+
|-----------|------|---------|-------------|
|
|
763
|
+
| `base_url` | `str` | `""` | API base URL |
|
|
764
|
+
| `user_token` | `str` | `""` | API token (`X-User-Token` header) |
|
|
765
|
+
| `timeout` | `float` | `5.0` | HTTP request timeout in seconds |
|
|
766
|
+
|
|
767
|
+
The server provider automatically:
|
|
768
|
+
- Creates the workflow on `DotFlow()` init
|
|
769
|
+
- Creates each task on `task.add()`
|
|
770
|
+
- Updates task status on each transition (In progress, Completed, Failed, Retry)
|
|
771
|
+
- Updates workflow status on completion (In progress → Completed)
|
|
772
|
+
|
|
773
|
+
---
|
|
774
|
+
|
|
775
|
+
</details>
|
|
776
|
+
|
|
726
777
|
<details>
|
|
727
778
|
<summary><strong>Dependency Injection via Config</strong></summary>
|
|
728
779
|
|
|
729
|
-
The `Config` class lets you swap providers for storage, notifications, logging, and
|
|
780
|
+
The `Config` class lets you swap providers for storage, notifications, logging, scheduling, and server:
|
|
730
781
|
|
|
731
782
|
```python
|
|
732
783
|
from dotflow import DotFlow, Config
|
|
733
|
-
from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron
|
|
784
|
+
from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron, ServerDefault
|
|
734
785
|
|
|
735
786
|
config = Config(
|
|
736
787
|
storage=StorageFile(path=".output"),
|
|
737
788
|
notify=NotifyTelegram(token="...", chat_id=123),
|
|
738
789
|
log=LogDefault(),
|
|
739
790
|
scheduler=SchedulerCron(cron="0 * * * *"),
|
|
791
|
+
server=ServerDefault(base_url="...", user_token="..."),
|
|
740
792
|
)
|
|
741
793
|
|
|
742
794
|
workflow = DotFlow(config=config)
|
|
@@ -748,8 +800,11 @@ Extend Dotflow by implementing the abstract base classes:
|
|
|
748
800
|
|-----|---------|---------|
|
|
749
801
|
| `Storage` | `post`, `get`, `key` | Custom storage backends |
|
|
750
802
|
| `Notify` | `hook_status_task` | Custom notification channels |
|
|
751
|
-
| `Log` | `info`, `error` | Custom logging |
|
|
803
|
+
| `Log` | `info`, `error`, `warning`, `debug` | Custom logging |
|
|
752
804
|
| `Scheduler` | `start`, `stop` | Custom scheduling strategies |
|
|
805
|
+
| `Tracer` | `start_workflow`, `end_workflow`, `start_task`, `end_task` | Distributed tracing |
|
|
806
|
+
| `Metrics` | `workflow_started`, `workflow_completed`, `workflow_failed`, `task_completed`, `task_failed`, `task_retried` | Counters and histograms |
|
|
807
|
+
| `Server` | `create_workflow`, `update_workflow`, `create_task`, `update_task` | Remote API communication |
|
|
753
808
|
|
|
754
809
|
---
|
|
755
810
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-

|
|
3
|
+

|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**import dotflow. @action. deploy. Done.**
|
|
6
6
|
|
|
7
7
|
[](https://pypi.org/project/dotflow/)
|
|
8
8
|
[](https://pypi.org/project/dotflow/)
|
|
@@ -25,7 +25,7 @@ Dotflow is a lightweight Python library for execution pipelines. Define tasks wi
|
|
|
25
25
|
- **Resilient** — Retry, backoff, timeout, checkpoints, and error handling out of the box.
|
|
26
26
|
- **Observable** — OpenTelemetry traces, metrics, and logs. Sentry error tracking.
|
|
27
27
|
- **Deployable** — `dotflow deploy --platform lambda` ships your pipeline to AWS in one command.
|
|
28
|
-
- **Portable** — Same code runs on Lambda, ECS, Cloud Run, Kubernetes, Docker, or GitHub Actions.
|
|
28
|
+
- **Portable** — Same code runs on Lambda, ECS, Cloud Run, Alibaba FC, Kubernetes, Docker, or GitHub Actions.
|
|
29
29
|
|
|
30
30
|
## Install
|
|
31
31
|
|
|
@@ -72,16 +72,20 @@ dotflow deploy --platform lambda --project my_pipeline
|
|
|
72
72
|
|
|
73
73
|
| Platform | Deploy method |
|
|
74
74
|
|----------|---------------|
|
|
75
|
-
| <img src="https://
|
|
76
|
-
| <img src="https://
|
|
77
|
-
| <img src="https://
|
|
78
|
-
| <img src="https://
|
|
79
|
-
| <img src="https://
|
|
80
|
-
| <img src="https://
|
|
81
|
-
| <img src="https://
|
|
82
|
-
| <img src="https://
|
|
83
|
-
| <img src="https://
|
|
84
|
-
| <img src="https://
|
|
75
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-docker.svg" width="16" /> **Docker** | `docker compose up` |
|
|
76
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> **AWS Lambda** | `dotflow deploy` |
|
|
77
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS Lambda + EventBridge** | `dotflow deploy --schedule` |
|
|
78
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-s3.svg" width="16" /> **AWS Lambda + S3 Trigger** | `dotflow deploy` |
|
|
79
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-sqs.svg" width="16" /> **AWS Lambda + SQS Trigger** | `dotflow deploy` |
|
|
80
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-lambda.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-api-gateway.svg" width="16" /> **AWS Lambda + API Gateway** | `dotflow deploy` |
|
|
81
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> **AWS ECS Fargate** | `dotflow deploy` |
|
|
82
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-ecs.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-aws-eventbridge.svg" width="16" /> **AWS ECS + EventBridge** | `dotflow deploy --schedule` |
|
|
83
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> **Google Cloud Run** | `dotflow deploy` |
|
|
84
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud.svg" width="16" /> <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-google-cloud-scheduler.svg" width="16" /> **Cloud Run + Scheduler** | `dotflow deploy --schedule` |
|
|
85
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-kubernetes.svg" width="16" /> **Kubernetes** | `kubectl apply` |
|
|
86
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC** | `dotflow deploy` |
|
|
87
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-alibaba-cloud.svg" width="16" /> **Alibaba Cloud FC + Timer** | `dotflow deploy --schedule` |
|
|
88
|
+
| <img src="https://raw.githubusercontent.com/dotflow-io/dotflow/develop/docs/assets/icon-github-actions.svg" width="16" /> **GitHub Actions** | `dotflow deploy` |
|
|
85
89
|
|
|
86
90
|
> [See all 34+ platforms →](https://dotflow-io.github.io/dotflow/nav/cloud/)
|
|
87
91
|
|
|
@@ -93,9 +97,10 @@ pip install dotflow[gcp] # Google Cloud Storage
|
|
|
93
97
|
pip install dotflow[scheduler] # Cron scheduler
|
|
94
98
|
pip install dotflow[otel] # OpenTelemetry
|
|
95
99
|
pip install dotflow[sentry] # Sentry error tracking
|
|
96
|
-
pip install dotflow[deploy-aws]
|
|
97
|
-
pip install dotflow[deploy-gcp]
|
|
98
|
-
pip install dotflow[deploy-
|
|
100
|
+
pip install dotflow[deploy-aws] # AWS deploy (Lambda, ECS)
|
|
101
|
+
pip install dotflow[deploy-gcp] # GCP deploy (Cloud Run)
|
|
102
|
+
pip install dotflow[deploy-alibaba] # Alibaba Cloud deploy (FC)
|
|
103
|
+
pip install dotflow[deploy-github] # GitHub Actions deploy
|
|
99
104
|
```
|
|
100
105
|
|
|
101
106
|
> **[Read the full documentation →](https://dotflow-io.github.io/dotflow/)**
|
|
@@ -106,8 +111,8 @@ pip install dotflow[deploy-github] # GitHub Actions deploy
|
|
|
106
111
|
|---------|-------------|
|
|
107
112
|
| [Concepts](https://dotflow-io.github.io/dotflow/nav/concepts/concept-workflow-and-tasks/) | Workflows, tasks, context, providers, process modes |
|
|
108
113
|
| [How-to Guides](https://dotflow-io.github.io/dotflow/nav/how-to/) | Step-by-step tutorials for workflows, tasks, and CLI |
|
|
109
|
-
| [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Kubernetes, Docker, GitHub Actions |
|
|
110
|
-
| [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS |
|
|
114
|
+
| [Cloud Deployment](https://dotflow-io.github.io/dotflow/nav/cloud/) | Deploy to AWS, GCP, Alibaba, Kubernetes, Docker, GitHub Actions |
|
|
115
|
+
| [Integrations](https://dotflow-io.github.io/dotflow/nav/integrations/) | OpenTelemetry, Sentry, Telegram, Discord, S3, GCS, Server |
|
|
111
116
|
| [Examples](https://dotflow-io.github.io/dotflow/nav/examples/) | Real-world pipelines: ETL, health checks, async, scheduler |
|
|
112
117
|
| [Reference](https://dotflow-io.github.io/dotflow/nav/reference/dotflow/) | API reference for all classes and providers |
|
|
113
118
|
| [Custom Providers](https://dotflow-io.github.io/dotflow/nav/development/custom-providers/) | Build your own storage, notify, log, tracer, or metrics provider |
|
|
@@ -645,20 +650,64 @@ Available CLI commands:
|
|
|
645
650
|
|
|
646
651
|
</details>
|
|
647
652
|
|
|
653
|
+
<details>
|
|
654
|
+
<summary><strong>Server Provider</strong></summary>
|
|
655
|
+
|
|
656
|
+
> [Server docs](https://dotflow-io.github.io/dotflow/nav/tutorial/server-default/)
|
|
657
|
+
|
|
658
|
+
Send workflow and task execution data to a remote API (e.g. dotflow-api) in real time.
|
|
659
|
+
|
|
660
|
+
```python
|
|
661
|
+
from dotflow import DotFlow, Config, action
|
|
662
|
+
from dotflow.providers import ServerDefault
|
|
663
|
+
|
|
664
|
+
@action
|
|
665
|
+
def my_task():
|
|
666
|
+
return {"result": "ok"}
|
|
667
|
+
|
|
668
|
+
config = Config(
|
|
669
|
+
server=ServerDefault(
|
|
670
|
+
base_url="http://localhost:8000/api/v1",
|
|
671
|
+
user_token="your-api-token",
|
|
672
|
+
)
|
|
673
|
+
)
|
|
674
|
+
|
|
675
|
+
workflow = DotFlow(config=config)
|
|
676
|
+
workflow.task.add(step=my_task)
|
|
677
|
+
workflow.start()
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
| Parameter | Type | Default | Description |
|
|
681
|
+
|-----------|------|---------|-------------|
|
|
682
|
+
| `base_url` | `str` | `""` | API base URL |
|
|
683
|
+
| `user_token` | `str` | `""` | API token (`X-User-Token` header) |
|
|
684
|
+
| `timeout` | `float` | `5.0` | HTTP request timeout in seconds |
|
|
685
|
+
|
|
686
|
+
The server provider automatically:
|
|
687
|
+
- Creates the workflow on `DotFlow()` init
|
|
688
|
+
- Creates each task on `task.add()`
|
|
689
|
+
- Updates task status on each transition (In progress, Completed, Failed, Retry)
|
|
690
|
+
- Updates workflow status on completion (In progress → Completed)
|
|
691
|
+
|
|
692
|
+
---
|
|
693
|
+
|
|
694
|
+
</details>
|
|
695
|
+
|
|
648
696
|
<details>
|
|
649
697
|
<summary><strong>Dependency Injection via Config</strong></summary>
|
|
650
698
|
|
|
651
|
-
The `Config` class lets you swap providers for storage, notifications, logging, and
|
|
699
|
+
The `Config` class lets you swap providers for storage, notifications, logging, scheduling, and server:
|
|
652
700
|
|
|
653
701
|
```python
|
|
654
702
|
from dotflow import DotFlow, Config
|
|
655
|
-
from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron
|
|
703
|
+
from dotflow.providers import StorageFile, NotifyTelegram, LogDefault, SchedulerCron, ServerDefault
|
|
656
704
|
|
|
657
705
|
config = Config(
|
|
658
706
|
storage=StorageFile(path=".output"),
|
|
659
707
|
notify=NotifyTelegram(token="...", chat_id=123),
|
|
660
708
|
log=LogDefault(),
|
|
661
709
|
scheduler=SchedulerCron(cron="0 * * * *"),
|
|
710
|
+
server=ServerDefault(base_url="...", user_token="..."),
|
|
662
711
|
)
|
|
663
712
|
|
|
664
713
|
workflow = DotFlow(config=config)
|
|
@@ -670,8 +719,11 @@ Extend Dotflow by implementing the abstract base classes:
|
|
|
670
719
|
|-----|---------|---------|
|
|
671
720
|
| `Storage` | `post`, `get`, `key` | Custom storage backends |
|
|
672
721
|
| `Notify` | `hook_status_task` | Custom notification channels |
|
|
673
|
-
| `Log` | `info`, `error` | Custom logging |
|
|
722
|
+
| `Log` | `info`, `error`, `warning`, `debug` | Custom logging |
|
|
674
723
|
| `Scheduler` | `start`, `stop` | Custom scheduling strategies |
|
|
724
|
+
| `Tracer` | `start_workflow`, `end_workflow`, `start_task`, `end_task` | Distributed tracing |
|
|
725
|
+
| `Metrics` | `workflow_started`, `workflow_completed`, `workflow_failed`, `task_completed`, `task_failed`, `task_retried` | Counters and histograms |
|
|
726
|
+
| `Server` | `create_workflow`, `update_workflow`, `create_task`, `update_task` | Remote API communication |
|
|
675
727
|
|
|
676
728
|
---
|
|
677
729
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Abstract base for remote server communication."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Server(ABC):
|
|
8
|
+
"""Server ABC provider for sending workflow and task
|
|
9
|
+
data to a remote API.
|
|
10
|
+
|
|
11
|
+
Implementations should handle HTTP communication with
|
|
12
|
+
a server like dotflow-api, sending execution data
|
|
13
|
+
(status, duration, errors, context) in real time.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def create_workflow(self, workflow: Any) -> None:
|
|
18
|
+
"""Register a new workflow on the remote server."""
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def update_workflow(self, workflow: Any, status: str = "") -> None:
|
|
22
|
+
"""Update workflow status on the remote server."""
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def create_task(self, task: Any) -> None:
|
|
26
|
+
"""Register a new task on the remote server."""
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def update_task(self, task: Any) -> None:
|
|
30
|
+
"""Update task data on the remote server."""
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"""Command deploy module."""
|
|
2
|
+
|
|
3
|
+
from rich import print # type: ignore
|
|
4
|
+
from rich.prompt import Prompt
|
|
5
|
+
|
|
6
|
+
from dotflow.cli.command import Command
|
|
7
|
+
from dotflow.cloud.alibaba.constants import (
|
|
8
|
+
DEFAULT_REGION as ALI_DEFAULT_REGION,
|
|
9
|
+
)
|
|
10
|
+
from dotflow.cloud.alibaba.constants import PLATFORMS as ALI_PLATFORMS
|
|
11
|
+
from dotflow.cloud.alibaba.constants import (
|
|
12
|
+
SCHEDULED_PLATFORMS as ALI_SCHEDULED,
|
|
13
|
+
)
|
|
14
|
+
from dotflow.cloud.aws.constants import DEFAULT_REGION as AWS_DEFAULT_REGION
|
|
15
|
+
from dotflow.cloud.aws.constants import PLATFORMS as AWS_PLATFORMS
|
|
16
|
+
from dotflow.cloud.aws.constants import SCHEDULED_PLATFORMS as AWS_SCHEDULED
|
|
17
|
+
from dotflow.cloud.gcp.constants import DEFAULT_REGION as GCP_DEFAULT_REGION
|
|
18
|
+
from dotflow.cloud.gcp.constants import PLATFORMS as GCP_PLATFORMS
|
|
19
|
+
from dotflow.cloud.gcp.constants import SCHEDULED_PLATFORMS as GCP_SCHEDULED
|
|
20
|
+
from dotflow.settings import Settings as settings
|
|
21
|
+
|
|
22
|
+
DEFAULT_REGIONS = {
|
|
23
|
+
**dict.fromkeys(AWS_PLATFORMS, AWS_DEFAULT_REGION),
|
|
24
|
+
**dict.fromkeys(GCP_PLATFORMS, GCP_DEFAULT_REGION),
|
|
25
|
+
**dict.fromkeys(ALI_PLATFORMS, ALI_DEFAULT_REGION),
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
SCHEDULED_PLATFORMS = AWS_SCHEDULED | GCP_SCHEDULED | ALI_SCHEDULED
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ScheduleResolver:
|
|
32
|
+
"""Resolves a schedule expression.
|
|
33
|
+
|
|
34
|
+
From CLI args, template, or user input.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
def _get_provider(cls, platform: str) -> type | None:
|
|
39
|
+
if platform in AWS_PLATFORMS:
|
|
40
|
+
from dotflow.cloud.aws.schedule import AWSSchedule
|
|
41
|
+
|
|
42
|
+
return AWSSchedule
|
|
43
|
+
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def resolve(cls, schedule: str | None, platform: str) -> str | None:
|
|
48
|
+
if platform not in SCHEDULED_PLATFORMS:
|
|
49
|
+
return schedule
|
|
50
|
+
|
|
51
|
+
provider = cls._get_provider(platform)
|
|
52
|
+
|
|
53
|
+
if schedule:
|
|
54
|
+
return provider.convert(schedule) if provider else schedule
|
|
55
|
+
|
|
56
|
+
raw = cls._ask_schedule(provider)
|
|
57
|
+
|
|
58
|
+
if not raw:
|
|
59
|
+
raise SystemExit(
|
|
60
|
+
f"{settings.ERROR_ALERT} --schedule (cron) is required for {platform}"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
return provider.convert(raw) if provider else raw
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def _ask_schedule(cls, provider: type | None) -> str | None:
|
|
67
|
+
template_schedule = None
|
|
68
|
+
if provider:
|
|
69
|
+
template_schedule = provider.read_from_template()
|
|
70
|
+
|
|
71
|
+
choices = {}
|
|
72
|
+
if template_schedule:
|
|
73
|
+
choices["1"] = f"Use from template.yaml: {template_schedule}"
|
|
74
|
+
choices["2"] = "Enter cron expression"
|
|
75
|
+
|
|
76
|
+
print(settings.QUESTION_ALERT, "Cron schedule is required:")
|
|
77
|
+
for key, label in choices.items():
|
|
78
|
+
print(f" [bold cyan]{key}[/bold cyan] - {label}")
|
|
79
|
+
|
|
80
|
+
choice = Prompt.ask(" Select", choices=list(choices.keys()))
|
|
81
|
+
|
|
82
|
+
if choice == "1" and template_schedule:
|
|
83
|
+
print(settings.INFO_ALERT, f"Using cron: {template_schedule}")
|
|
84
|
+
return template_schedule
|
|
85
|
+
|
|
86
|
+
print(" Format: [bold]min hour day month weekday[/bold]")
|
|
87
|
+
return Prompt.ask(" Cron (e.g. */5 * * * *)") or None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class DeployCommand(Command):
|
|
91
|
+
def setup(self):
|
|
92
|
+
platform = self.params.platform
|
|
93
|
+
name = self.params.project
|
|
94
|
+
region = self.params.region or DEFAULT_REGIONS.get(platform)
|
|
95
|
+
schedule = ScheduleResolver.resolve(
|
|
96
|
+
getattr(self.params, "schedule", None), platform
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
method_name = f"_deploy_{platform.replace('-', '_')}"
|
|
100
|
+
handler = getattr(self, method_name, None)
|
|
101
|
+
if not handler:
|
|
102
|
+
print(
|
|
103
|
+
settings.ERROR_ALERT, f"Deploy not supported for '{platform}'."
|
|
104
|
+
)
|
|
105
|
+
return
|
|
106
|
+
|
|
107
|
+
handler(name=name, region=region, schedule=schedule)
|
|
108
|
+
|
|
109
|
+
def _deploy_lambda(self, name, region, schedule=None):
|
|
110
|
+
from dotflow.cloud.aws import LambdaDeployer
|
|
111
|
+
|
|
112
|
+
LambdaDeployer(region=region).deploy(name, schedule=schedule)
|
|
113
|
+
|
|
114
|
+
def _deploy_lambda_scheduled(self, name, region, schedule=None):
|
|
115
|
+
from dotflow.cloud.aws import LambdaDeployer
|
|
116
|
+
|
|
117
|
+
LambdaDeployer(region=region).deploy(name, schedule=schedule)
|
|
118
|
+
|
|
119
|
+
def _deploy_lambda_s3_trigger(self, name, region, **kwargs):
|
|
120
|
+
from dotflow.cloud.aws import LambdaS3Deployer
|
|
121
|
+
|
|
122
|
+
LambdaS3Deployer(region=region).deploy(name)
|
|
123
|
+
|
|
124
|
+
def _deploy_lambda_sqs_trigger(self, name, region, **kwargs):
|
|
125
|
+
from dotflow.cloud.aws import LambdaSQSDeployer
|
|
126
|
+
|
|
127
|
+
LambdaSQSDeployer(region=region).deploy(name)
|
|
128
|
+
|
|
129
|
+
def _deploy_lambda_api_trigger(self, name, region, **kwargs):
|
|
130
|
+
from dotflow.cloud.aws import LambdaApiDeployer
|
|
131
|
+
|
|
132
|
+
LambdaApiDeployer(region=region).deploy(name)
|
|
133
|
+
|
|
134
|
+
def _deploy_ecs(self, name, region, **kwargs):
|
|
135
|
+
from dotflow.cloud.aws import ECSDeployer
|
|
136
|
+
|
|
137
|
+
ECSDeployer(region=region).deploy(name)
|
|
138
|
+
|
|
139
|
+
def _deploy_ecs_scheduled(self, name, region, schedule=None):
|
|
140
|
+
from dotflow.cloud.aws import ECSScheduledDeployer
|
|
141
|
+
|
|
142
|
+
ECSScheduledDeployer(region=region).deploy(name, schedule=schedule)
|
|
143
|
+
|
|
144
|
+
def _deploy_cloud_run(self, name, region, **kwargs):
|
|
145
|
+
from dotflow.cloud.gcp import CloudRunDeployer
|
|
146
|
+
|
|
147
|
+
CloudRunDeployer(region=region).deploy(name)
|
|
148
|
+
|
|
149
|
+
def _deploy_cloud_run_scheduled(self, name, region, **kwargs):
|
|
150
|
+
from dotflow.cloud.gcp import CloudRunDeployer
|
|
151
|
+
|
|
152
|
+
CloudRunDeployer(region=region).deploy(name)
|
|
153
|
+
|
|
154
|
+
def _deploy_github_actions(self, name, **kwargs):
|
|
155
|
+
from dotflow.cloud.github import ActionsDeployer
|
|
156
|
+
|
|
157
|
+
ActionsDeployer().deploy(name)
|
|
158
|
+
|
|
159
|
+
def _deploy_alibaba_fc(self, name, region, **kwargs):
|
|
160
|
+
from dotflow.cloud.alibaba import AliyunFCDeployer
|
|
161
|
+
|
|
162
|
+
AliyunFCDeployer(region=region).deploy(name)
|
|
163
|
+
|
|
164
|
+
def _deploy_alibaba_fc_scheduled(self, name, region, schedule=None):
|
|
165
|
+
from dotflow.cloud.alibaba import (
|
|
166
|
+
AliyunFCScheduledDeployer,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
AliyunFCScheduledDeployer(region=region).deploy(
|
|
170
|
+
name, schedule=schedule
|
|
171
|
+
)
|
|
@@ -14,7 +14,8 @@ class LogCommand(Command):
|
|
|
14
14
|
|
|
15
15
|
print(
|
|
16
16
|
settings.INFO_ALERT,
|
|
17
|
-
|
|
17
|
+
"To access all logs, open the file"
|
|
18
|
+
f" ({settings.LOG_PATH.resolve()}).",
|
|
18
19
|
)
|
|
19
20
|
else:
|
|
20
21
|
print(settings.WARNING_ALERT, "Log file not found.")
|
|
@@ -163,7 +163,7 @@ class Command:
|
|
|
163
163
|
cmd_generate.add_argument(
|
|
164
164
|
"--platform",
|
|
165
165
|
required=True,
|
|
166
|
-
help="Target platform (e.g. docker, lambda, cloud-run
|
|
166
|
+
help=("Target platform (e.g. docker, lambda, cloud-run)"),
|
|
167
167
|
)
|
|
168
168
|
cmd_generate.add_argument(
|
|
169
169
|
"--project",
|
|
@@ -206,7 +206,7 @@ class Command:
|
|
|
206
206
|
self.cmd_deploy.add_argument(
|
|
207
207
|
"--schedule",
|
|
208
208
|
default=None,
|
|
209
|
-
help="
|
|
209
|
+
help="Cron expression (e.g. '*/5 * * * *')",
|
|
210
210
|
)
|
|
211
211
|
self.cmd_deploy.set_defaults(exec=DeployCommand)
|
|
212
212
|
|
|
@@ -233,6 +233,9 @@ class Command:
|
|
|
233
233
|
except ImportModuleError as err:
|
|
234
234
|
print(settings.WARNING_ALERT, err)
|
|
235
235
|
|
|
236
|
+
except KeyboardInterrupt:
|
|
237
|
+
print("\n", settings.INFO_ALERT, "Aborted.")
|
|
238
|
+
|
|
236
239
|
except Exception as err:
|
|
237
240
|
logger.error(f"Internal problem: {str(err)}")
|
|
238
241
|
print(settings.ERROR_ALERT, MESSAGE_UNKNOWN_ERROR)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Alibaba Cloud constants."""
|
|
2
|
+
|
|
3
|
+
SDK_NOT_FOUND = (
|
|
4
|
+
"alibabacloud-fc-open20210406 is required: "
|
|
5
|
+
"pip install dotflow[deploy-alibaba]"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
CREDENTIALS_NOT_FOUND = (
|
|
9
|
+
"Alibaba Cloud credentials not found. "
|
|
10
|
+
"Run 'aliyun configure' or set "
|
|
11
|
+
"ALIBABA_CLOUD_ACCESS_KEY_ID and "
|
|
12
|
+
"ALIBABA_CLOUD_ACCESS_KEY_SECRET."
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
PLATFORMS = {
|
|
16
|
+
"alibaba-fc",
|
|
17
|
+
"alibaba-fc-scheduled",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
SCHEDULED_PLATFORMS = {"alibaba-fc-scheduled"}
|
|
21
|
+
|
|
22
|
+
DEFAULT_REGION = "cn-hangzhou"
|