我的 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
-
添加事件日志端点 事件日志可帮助用户获取在 UI 上执行的操作信息
-
为连接添加 CRUD 端点 此 PR 在
Connection上实现 DELETE、PATCH 和 POST 操作 -
添加日志端点 此 PR 使用户能够获取任务实例的日志条目
-
将 limit & offset 移到视图的 kwargs 并实现可配置的最大限制 这有助于让视图代码更整洁,并为查询结果添加可配置的最大限制。
-
更新 FlaskAppBuilder 至 v3 这使 Airflow 开始使用 Flask App Builder 的第3版,并让 API 能使用现代的数据库序列化/反序列化器
-
添加从实验性 REST API 到稳定 REST API 的迁移指南 这将帮助用户更快开始使用稳定的 REST API。
后续工作
REST API 仍有大量工作要完成,包括撰写有帮助的文档。我仍在跟进这些工作,并期望在实习结束前完成 REST API。
我非常感谢我的导师 Jarek 和 Kaxil 对我的耐心以及他们对我源源不断的问题的包容。Kamil 和 Tomek 也非常支持,我感激他们的帮助和出色的代码审查。
感谢 Leah E. Cole 与 Karolina Rosół 的精彩审阅。我深表感激。
感谢阅读!
分享