我的 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:

  1. 添加事件日志端点 事件日志将帮助用户获取在 UI 上执行的操作信息

  2. 添加连接的 CRUD 端点 此 PR 对 Connection 执行 DELETE、PATCH 和 POST 操作

  3. 添加日志端点 此 PR 允许用户获取 Task Instances 的日志条目

  4. 将 limit 和 offset 移动到视图中的 kwargs 并实现可配置的最大限制 这有助于我们在视图中编写整洁的代码,并为查询结果添加了可配置的最大限制。

  5. 更新 FlaskAppBuilder 到 v3 这使得 Airflow 可以开始使用 v3 版本的 Flask App Builder,也使 API 能够使用现代的数据库序列化/反序列化器

  6. 添加从实验性 REST API 到稳定 REST API 的迁移指南 这将使用户能够更快地开始使用稳定的 REST API。

后续工作

REST API 仍有很多工作要做,包括编写有用的文档。我仍在跟进这些工作,希望能在实习结束前完成 REST API。

我非常感谢我的导师 JarekKaxil,感谢他们对我的耐心以及忍受我没完没了的问题。KamilTomek 一直非常支持我,我感谢他们的支持和出色的代码评审。

感谢 Leah E. ColeKarolina Rosół 提供的精彩评审。我心存感激。

感谢您的阅读!

分享

另请阅读

Apache Airflow 2.8.0 发布啦

Ephraim Anierobi

介绍 Apache Airflow 2.8.0:新增功能和重大改进增强版

Apache Airflow 2.3.0 发布啦

Ephraim Anierobi

我们自豪地宣布 Apache Airflow 2.3.0 已发布。