我的 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 实现了一个装饰器,允许我们在视图中使用此函数时获得更简洁的代码。

然后我们尝试使用 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 使 用户能够获取任务实例日志条目

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

  5. 将 FlaskAppBuilder 更新到 v3 这使 Airflow 能够开始使用 Flask App Builder 的 v3,并使 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 已发布。