我的 Outreachy 实习期即将结束,这也是回顾和反思至今进展的最佳时机。
我项目的目标是扩展和改进 Apache Airflow REST API。在这篇文章中,我将分享我目前的进展。
由于项目计划使用的 OpenAPI 3.0 规范合并花费了一些时间,我们开始实现 REST API 的时间稍晚。感谢 Kamil 为我们开始实现 REST API 端点铺平了道路。以下是我实现的端点以及遇到的挑战,包括我是如何克服它们的。
实现只读连接端点
这些 只读连接端点 是我实现的第一个端点。回过头看,我看到了自己取得了多大的进步。
我首先使用 Marshmallow 2 为 Connection 表实现了数据库模式。我们必须使用 Marshmallow 2,因为 Flask-AppBuilder 仍然在使用它,并且 Flask-AppBuilder 与 Apache Airflow 深度集成。这意味着我不得不忘记在此之前我一直在学习的 Marshmallow 3,但幸运的是,Marshmallow 3 与之差异不大,所以我很快就学会了使用 Marshmallow 2。
如果没有可以参考的端点,第一个 PR 会比实际更困难。Kamil 实现了一个 草稿 PR,我从中获得了启发。多亏了这一点,我编写单元测试变得容易了。也是在实现这个端点时,我学会了在单元测试中使用 parameterized :D。
实现只读 DagRuns 端点
这个 端点 带来了许多挑战,尤其是在使用 datetimes
进行过滤时。这是因为我们用来构建 REST API 的 connexion
库没有验证 OpenAPI 3.0 规范中的日期时间格式,我后来发现这是故意的。Connexion 放弃了 strict-rfc3339
,因为它后来的许可证与 Apache 2.0 许可证不兼容。
我对此实现了一个变通方法,在 API 工具模块中定义了一个名为 conn_parse_datetime
的函数。这个函数后来被重构,幸运的是,Kamil 实现了一个装饰器,使我们在视图中使用此函数时代码更加整洁。
然后我们尝试使用 rfc3339-validator
,它的许可证与 Apache 2.0 许可证兼容,但后来放弃了,因为通过我们的自定义日期解析器,我们可以使用时长而不仅仅是日期时间。
其他端点
我实现了一些其他不同的端点。我遇到的一个特殊问题是 Marshmallow 2 在请求体中存在额外字段时不会报错。我在模式上实现了一个 validate_unknown
方法来处理这个问题。幸运的是,Flask-AppBuilder 更新到使用 Marshmallow 3,我们迅速在 Apache Airflow 中更新了 Flask-AppBuilder,也开始使用 Marshmallow 3 了。
以下是我贡献的一些与 REST API 相关的 PR:
-
添加事件日志端点 事件日志将帮助用户获取在 UI 上执行的操作信息
-
添加连接的 CRUD 端点 此 PR 对
Connection
执行 DELETE、PATCH 和 POST 操作 -
添加日志端点 此 PR 允许用户获取 Task Instances 的日志条目
-
将 limit 和 offset 移动到视图中的 kwargs 并实现可配置的最大限制 这有助于我们在视图中编写整洁的代码,并为查询结果添加了可配置的最大限制。
-
更新 FlaskAppBuilder 到 v3 这使得 Airflow 可以开始使用 v3 版本的 Flask App Builder,也使 API 能够使用现代的数据库序列化/反序列化器
-
添加从实验性 REST API 到稳定 REST API 的迁移指南 这将使用户能够更快地开始使用稳定的 REST API。
后续工作
REST API 仍有很多工作要做,包括编写有用的文档。我仍在跟进这些工作,希望能在实习结束前完成 REST API。
我非常感谢我的导师 Jarek 和 Kaxil,感谢他们对我的耐心以及忍受我没完没了的问题。Kamil 和 Tomek 一直非常支持我,我感谢他们的支持和出色的代码评审。
感谢 Leah E. Cole 和 Karolina Rosół 提供的精彩评审。我心存感激。
感谢您的阅读!
分享