我的 Outreachy 实习即将结束,也是回顾并反思迄今为止进展的最佳时机。

我的项目目标是扩展并改进 Apache Airflow 的 REST API。本篇文章将分享我目前的进展。

我们开始实现 REST API 有点晚,因为我们要使用的 OpenAPI 3.0 规范合并花了时间。感谢 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 utils 模块中实现了一个名为 conn_parse_datetime 的函数来绕过这个问题。随后它被重构,幸好 Kamil 实现了一个装饰器,使我们在视图中使用该函数时代码更简洁。

随后我们尝试使用许可证与 Apache 2.0 兼容的 rfc3339-validator,但后来放弃了,因为使用我们的自定义日期解析器我们还能处理持续时间(duration),而不仅仅是日期时间。

其他端点

我实现了一些其他不同的端点。一个特殊的问题是 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 使用户能够获取任务实例的日志条目

  4. 将 limit & offset 移到视图的 kwargs 并实现可配置的最大限制 这有助于让视图代码更整洁,并为查询结果添加可配置的最大限制。

  5. 更新 FlaskAppBuilder 至 v3 这使 Airflow 开始使用 Flask App Builder 的第3版,并让 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 已正式发布。