我的 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
-
添加事件日志端点 事件日志将帮助用户获取有关在 UI 上执行的操作的信息
-
添加连接的 CRUD 端点 此 PR 对
Connection
执行 DELETE、PATCH 和 POST 操作 -
添加日志端点 此 PR 使 用户能够获取任务实例日志条目
-
将 limit 和 offset 移动到视图中的 kwargs,并处理可配置的最大限制 这有助于我们在视图中获得简洁的代码,并为查询结果添加了可配置的最大限制。
-
将 FlaskAppBuilder 更新到 v3 这使 Airflow 能够开始使用 Flask App Builder 的 v3,并使 API 可以使用现代数据库序列化器/反序列化器
-
添加从实验性 REST API 到稳定 REST API 的迁移指南 这将使用户能够在更短的时间内开始使用稳定的 REST API。
后续工作
REST API 仍有许多工作要做,包括编写有用的文档。我仍然在跟进这些工作,希望我们能在实习结束前完成 REST API。
我非常感谢我的导师 Jarek 和 Kaxil 对我的耐心,以及他们能够承受我永无止境的问题。Kamil 和 Tomek 一直非常支持我,我感谢他们的支持和出色的代码审查。
感谢 Leah E. Cole 和 Karolina Rosół 的精彩评论。我非常感激。
感谢阅读!
分享