5 个版本 (有破坏性更新)

0.5.0 2023年4月17日
0.4.0 2023年1月13日
0.3.0 2022年9月5日
0.2.0 2022年5月8日
0.1.0 2022年3月18日

#895开发工具

MIT/Apache

225KB
5.5K SLoC

podtender logo

Podtender

Podman REST API 的异步 Rust 客户端库。

Crates.io Documentation

使用方法

示例

use tokio;
use podtender::podman_service::PodmanService;

#[tokio::main]
async fn main() {
  let podman_service = PodmanService::new("path/to/podman/socket");
  let podtender_result = podman_service.system().get_info().await.unwrap();
  println!("{podtender_result:?}");
}

集成测试(integration tests)也作为如何使用该库的示例。

Podman 设置

在可以使用该库之前,需要设置 Podman 服务

# Set up podman service
podman system service unix:///home/`whoami`/podman.sock --log-level=debug --time=50
# Test if the socket is up and running
curl --unix-socket /home/`whoami`/podman.sock http://d/v4.0.0/libpod/info

支持的 Podman 版本

我们旨在仅支持最新版本的 Podman。目前这是 4.5.x。

库功能

通过 derive builder 实现构建器模式

builder 功能为请求类型启用构建器模式。这是通过 builder derive 宏 实现的。由宏创建的代码在 IDE 中的支持可能有限。

// with builder feature
let create_volume_parameter = CreateVolumeParameterBuilder::default()
    .driver("local".to_owned())
    .volume_name("some_volume_name".to_owned())
    .options(some_previously_created_hashmap)
    .build()
    .expect("Error building CreateVolumeParameter");
// without builder feature
let create_volume_parameter = CreateVolumeParameter {
    driver: Some("local".to_owned()),
    labels: None,
    volume_name: Some("some_volume_name".to_owned())
    options: Some(some_previously_created_hashmap),
}

测试中使用的示例参数

examples 功能通过 ExampleValues 特性启用初始化参数。这主要用于测试和展示每个 API 操作的可使用示例参数。

跟踪

tracing 启用由 Tokio 的 tracing crate 提供的日志/跟踪。

要求

Podtender 使用 hypertokio。需要活动的 Podman 套接字才能与 Podman 通信。

测试

要运行集成测试,需要tracingexamples功能。为了便于测试,测试被定义为Cargo.toml文件中的目标,可以使用以下命令运行:cargo test --test {target-name} --features="examples tracing"其中{target-name}是指定的目标之一(例如:containers-test)。

项目结构

Podman套接字和网络操作由PodmanService结构体内部管理。

Podman API将端点分为多个部分。本库基于该结构。pods模块包含实现的所有pods API端点的API调用函数、参数类型和响应类型。

每个端点类别模块包含以下内容:

  • 用于配置请求的参数类型
  • 用于发起请求的API调用函数
  • 将响应反序列化的响应类型

要启动一个pod,您需要配置podtender::pods::parameter_types::PodStatsParameter,使用它通过podman_service.pods().start(parameter).await并期待podtender::pods::response_types::StartPodResponse

注意

  • 目前仅支持Unix套接字
  • 由于tokio仅在Linux上构建对Unix套接字的支持,Podtender目前仅在Linux上构建
  • 将Podman(API)视为可信的,并在测试中将它作为真实来源
  • 要创建桥接网络模式的容器,以此作为起点
    CreateContainerParameter {
          netns: Some(Namespace {
              nsmode: Some("bridge".to_owned()),
              value: None,
          }),
          ..Default::default()
      };
    
  • 以下错误表明Podman套接字不可用。如果测试中出现这种情况,重新运行将重新创建套接字,对于定义的TTL应该可以消除错误。
     HyperError(
         hyper::Error(
             Connect,
             Os {
                 code: 2,
                 kind: NotFound,
                 message: "No such file or directory",
             },
         ),
     )
    
  • connect_container_to_network_from_example测试需要机器上执行测试的192.168.123.0/24子网未被使用。
  • Podman支持2021-05-26T10:42:00+02:00时间戳,但本库目前仅支持作为字符串的日期。
  • Podman仅支持以下格式的查询数组:containers=container1&containers=container2
  • 测试将在unix:///home/{user}/{socket_name}.sock创建Podman服务套接字,socket_name可以在tests/utils中进行更改。
  • 测试从test_container中的Dockerfile构建镜像。

致谢

  • 本工作是在达姆施塔特工业大学和平与安全技术(PEASEC)创建的,并由德国政府特别目的基金资助,该基金存放在农业信用银行,项目为Geobox-II和AgriRegio。
    • 该基金下的贡献者
      • Julian Schindel
      • Franz Kuntke
  • 本crate的整体结构受到了shiplift的启发,该结构由softprops (Doug Tangren)创建。

许可

您可以选择根据Apache License, Version 2.0MIT license进行许可。

除非您明确说明,否则您提交给podtender的任何有意贡献,如Apache-2.0许可中定义,将如上双许可,不附加任何额外的条款或条件。

当前状态

目前支持的API端点

  • 容器
    • 提交
    • 删除容器
    • 将文件复制到容器中
    • 连接到容器
    • 报告容器文件系统的更改;添加、删除或修改
    • 检查点容器(目前未测试,CRIU需要root权限)
    • 检查容器是否存在
    • 导出容器
    • 运行容器的健康检查
    • 初始化容器
    • 检查容器
    • 杀死容器
    • 获取容器日志
    • 挂载容器
    • 暂停容器
    • 重命名现有容器
    • 调整容器的TTY大小
    • 重启容器
    • 恢复容器
    • 启动容器
    • 获取容器的统计信息(已弃用,使用“获取一个或多个容器的统计信息”)
    • 停止容器
    • 列出进程
      • 流式传输
      • 非流式传输
    • 卸载容器
    • 取消暂停容器
    • 等待容器
    • 创建容器
    • 列出容器
    • 删除已停止的容器
    • 显示挂载的容器
    • 获取一个或多个容器的统计信息
      • 流式传输
      • 非流式传输
    • 生成Kubernetes YAML文件
    • 从play kube中移除Pod
    • 播放Kubernetes YAML文件
  • 执行
    • 创建执行实例
    • 检查执行实例
    • 调整执行实例的大小
    • 启动执行实例
  • 镜像
    • 创建镜像
    • 从本地存储中删除镜像
    • 报告镜像文件系统的更改;添加、删除或修改
    • 镜像存在
    • 导出镜像
    • 镜像的历史
    • 检查镜像
    • 推送镜像
    • 标记镜像
    • 镜像树
    • 取消标记镜像
    • 导出多个镜像
    • 导入镜像
    • 列出镜像
    • 加载镜像
    • 修剪未使用的镜像
    • 拉取镜像
    • 从存储中删除一个或多个镜像
    • 搜索镜像
  • 清单
    • 删除
    • 添加镜像
    • 存在
    • 检查
    • 推送
    • 创建
  • 网络
    • 删除网络
    • 将容器连接到网络
    • 将容器从网络断开连接
    • 网络存在
    • 检查网络
    • 创建网络
    • 列出网络
    • 删除未使用的网络
  • Pods
    • 生成Systemd单元
    • 生成Kubernetes YAML文件
    • 删除Pod
    • Pod存在
    • 检查Pod
    • 杀死Pod
    • 暂停Pod
    • 重启Pod
    • 启动Pod
    • 停止Pod
    • 列出进程
      • 流式传输
      • 非流式传输
    • 恢复Pod
    • 创建Pod
    • 列出Pods
    • 清理未使用的Pods
    • 获取一个或多个Pod的状态
    • 删除卷
    • 卷存在
    • 检查卷
    • 创建卷
    • 列出卷
    • 清理未使用的卷
  • 机密
    • 删除机密
    • 检查机密
    • 创建机密
    • 列出机密
  • 系统
    • ping服务
    • 获取事件
      • 流式传输
      • 非流式传输
    • 获取信息
    • 显示磁盘使用情况
    • 清理未使用的数据
    • 组件版本信息

计划中的功能

  • 支持DateTime Json字段(目前表示为String)
  • 完全支持Podman API(Docker兼容性不在范围内)

依赖项

~6–19MB
~207K SLoC