# Podman Service Interface and API description.  The master version of this document can be found
# in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in the upstream libpod repository.
interface io.podman

type Volume (
  name: string,
  labels: [string]string,
  mountPoint: string,
  driver: string,
  options: [string]string
)

type NotImplemented (
    comment: string
)

type StringResponse (
    message: string
)

type LogLine (
    device: string,
    parseLogType : string,
    time: string,
    msg: string,
    cid: string
)

# ContainerChanges describes the return struct for ListContainerChanges
type ContainerChanges (
   changed: []string,
   added: []string,
   deleted: []string
)

type ImageSaveOptions (
    name: string,
    format: string,
    output: string,
    outputType: string,
    moreTags: []string,
    quiet: bool,
    compress: bool
)

type VolumeCreateOpts (
   volumeName: string,
   driver: string,
   labels: [string]string,
   options: [string]string
)

type VolumeRemoveOpts (
   volumes: []string,
   all: bool,
   force: bool
)

type Image (
  id: string,
  digest:   string,
  parentId: string,
  repoTags: []string,
  repoDigests: []string,
  created: string, # as RFC3339
  size: int,
  virtualSize: int,
  containers: int,
  labels: [string]string,
  isParent: bool,
  topLayer: string,
  readOnly: bool
)

# ImageHistory describes the returned structure from ImageHistory.
type ImageHistory (
    id: string,
    created: string, # as RFC3339
    createdBy: string,
    tags: []string,
    size: int,
    comment: string
)

# Represents a single search result from SearchImages
type ImageSearchResult (
    description: string,
    is_official: bool,
    is_automated: bool,
    registry: string,
    name: string,
    star_count: int
)

type ImageSearchFilter (
    is_official: ?bool,
    is_automated: ?bool,
    star_count: int
)

type KubePodService (
    pod: string,
    service: string
)

type Container (
    id: string,
    image: string,
    imageid: string,
    command: []string,
    createdat: string, # as RFC3339
    runningfor: string,
    status: string,
    ports: []ContainerPortMappings,
    rootfssize: int,
    rwsize: int,
    names: string,
    labels: [string]string,
    mounts: []ContainerMount,
    containerrunning: bool,
    namespaces: ContainerNameSpace
)

# ContainerStats is the return struct for the stats of a container
type ContainerStats (
    id: string,
    name: string,
    cpu: float,
    cpu_nano: int,
    system_nano: int,
    mem_usage: int,
    mem_limit: int,
    mem_perc: float,
    net_input: int,
    net_output: int,
    block_output: int,
    block_input: int,
    pids: int
)

type PsOpts (
    all: bool,
    filters: ?[]string,
    last: ?int,
    latest: ?bool,
    noTrunc: ?bool,
    pod: ?bool,
    quiet: ?bool,
    size: ?bool,
    sort: ?string,
    sync: ?bool
)

type PsContainer (
    id: string,
    image: string,
    command: string,
    created: string,
    ports: string,
    names: string,
    isInfra: bool,
    status: string,
    state: string,
    pidNum: int,
    rootFsSize: int,
    rwSize: int,
    pod: string,
    createdAt: string,
    exitedAt: string,
    startedAt: string,
    labels: [string]string,
    nsPid: string,
    cgroup: string,
    ipc: string,
    mnt: string,
    net: string,
    pidNs: string,
    user: string,
    uts: string,
    mounts: string
)

# ContainerMount describes the struct for mounts in a container
type ContainerMount (
    destination: string,
    type: string,
    source: string,
    options: []string
)

# ContainerPortMappings describes the struct for portmappings in an existing container
type ContainerPortMappings (
    host_port: string,
    host_ip: string,
    protocol: string,
    container_port: string
)

# ContainerNamespace describes the namespace structure for an existing container
type ContainerNameSpace (
    user: string,
    uts: string,
    pidns: string,
    pid: string,
    cgroup: string,
    net: string,
    mnt: string,
    ipc: string
)

# InfoDistribution describes the host's distribution
type InfoDistribution (
    distribution: string,
    version: string
)

# InfoHost describes the host stats portion of PodmanInfo
type InfoHost (
    buildah_version: string,
    distribution: InfoDistribution,
    mem_free: int,
    mem_total: int,
    swap_free: int,
    swap_total: int,
    arch: string,
    cpus: int,
    hostname: string,
    kernel: string,
    os: string,
    uptime: string,
    eventlogger: string
)

# InfoGraphStatus describes the detailed status of the storage driver
type InfoGraphStatus (
    backing_filesystem: string,
    native_overlay_diff: string,
    supports_d_type: string
)

# InfoStore describes the host's storage informatoin
type InfoStore (
    containers: int,
    images: int,
    graph_driver_name: string,
    graph_driver_options: string,
    graph_root: string,
    graph_status: InfoGraphStatus,
    run_root: string
)

# InfoPodman provides details on the Podman binary
type InfoPodmanBinary (
    compiler: string,
    go_version: string,
    podman_version: string,
    git_commit: string
)

# PodmanInfo describes the Podman host and build
type PodmanInfo (
    host: InfoHost,
    registries: []string,
    insecure_registries: []string,
    store: InfoStore,
    podman: InfoPodmanBinary
)

# Sockets describes sockets location for a container
type Sockets(
    container_id: string,
    io_socket: string,
    control_socket: string
)

# Create is an input structure for creating containers.
# args[0] is the image name or id
# args[1-] are the new commands if changed
type Create (
    args: []string,
    addHost: ?[]string,
    annotation: ?[]string,
    attach: ?[]string,
    blkioWeight: ?string,
    blkioWeightDevice: ?[]string,
    capAdd: ?[]string,
    capDrop: ?[]string,
    cgroupParent: ?string,
    cidFile: ?string,
    conmonPidfile: ?string,
    command: ?[]string,
    cpuPeriod: ?int,
    cpuQuota: ?int,
    cpuRtPeriod: ?int,
    cpuRtRuntime: ?int,
    cpuShares: ?int,
    cpus: ?float,
    cpuSetCpus: ?string,
    cpuSetMems: ?string,
    detach: ?bool,
    detachKeys: ?string,
    device: ?[]string,
    deviceReadBps: ?[]string,
    deviceReadIops: ?[]string,
    deviceWriteBps: ?[]string,
    deviceWriteIops: ?[]string,
    dns: ?[]string,
    dnsOpt: ?[]string,
    dnsSearch: ?[]string,
    dnsServers: ?[]string,
    entrypoint: ?string,
    env:  ?[]string,
    envFile: ?[]string,
    expose: ?[]string,
    gidmap: ?[]string,
    groupadd: ?[]string,
    healthcheckCommand: ?string,
    healthcheckInterval: ?string,
    healthcheckRetries: ?int,
    healthcheckStartPeriod: ?string,
    healthcheckTimeout:?string,
    hostname: ?string,
    imageVolume: ?string,
    init: ?bool,
    initPath: ?string,
    interactive: ?bool,
    ip: ?string,
    ipc: ?string,
    kernelMemory: ?string,
    label: ?[]string,
    labelFile: ?[]string,
    logDriver: ?string,
    logOpt: ?[]string,
    macAddress: ?string,
    memory: ?string,
    memoryReservation: ?string,
    memorySwap: ?string,
    memorySwappiness: ?int,
    name: ?string,
    net: ?string,
    network: ?string,
    noHosts: ?bool,
    oomKillDisable: ?bool,
    oomScoreAdj: ?int,
    pid: ?string,
    pidsLimit: ?int,
    pod: ?string,
    privileged: ?bool,
    publish: ?[]string,
    publishAll: ?bool,
    pull: ?string,
    quiet: ?bool,
    readonly: ?bool,
    readonlytmpfs: ?bool,
    restart: ?string,
    rm: ?bool,
    rootfs: ?bool,
    securityOpt: ?[]string,
    shmSize: ?string,
    stopSignal: ?string,
    stopTimeout: ?int,
    storageOpt: ?[]string,
    subuidname: ?string,
    subgidname: ?string,
    sysctl: ?[]string,
    systemd: ?string,
    tmpfs: ?[]string,
    tty: ?bool,
    uidmap: ?[]string,
    ulimit: ?[]string,
    user: ?string,
    userns: ?string,
    uts: ?string,
    mount: ?[]string,
    volume: ?[]string,
    volumesFrom: ?[]string,
    workDir: ?string
)

# BuildOptions are are used to describe describe physical attributes of the build
type BuildOptions (
    addHosts: []string,
    cgroupParent: string,
    cpuPeriod: int,
    cpuQuota: int,
    cpuShares: int,
    cpusetCpus: string,
    cpusetMems: string,
    memory: int,
    memorySwap: int,
    shmSize: string,
    ulimit: []string,
    volume: []string
)

# BuildInfo is used to describe user input for building images
type BuildInfo (
    additionalTags: []string,
    annotations: []string,
    buildArgs: [string]string,
    buildOptions: BuildOptions,
    cniConfigDir: string,
    cniPluginDir: string,
    compression: string,
    contextDir: string,
    defaultsMountFilePath: string,
    dockerfiles: []string,
    err: string,
    forceRmIntermediateCtrs: bool,
    iidfile: string,
    label: []string,
    layers: bool,
    nocache: bool,
    out: string,
    output: string,
    outputFormat: string,
    pullPolicy: string,
    quiet: bool,
    remoteIntermediateCtrs: bool,
    reportWriter: string,
    runtimeArgs: []string,
    squash: bool
)

# MoreResponse is a struct for when responses from varlink requires longer output
type MoreResponse (
    logs: []string,
    id: string
)

# ListPodContainerInfo is a returned struct for describing containers
# in a pod.
type ListPodContainerInfo (
    name: string,
    id: string,
    status: string
)

# PodCreate is an input structure for creating pods.
# It emulates options to podman pod create. The infraCommand and
# infraImage options are currently NotSupported.
type PodCreate (
    name: string,
    cgroupParent: string,
    labels: [string]string,
    share: []string,
    infra: bool,
    infraCommand: string,
    infraImage: string,
    publish: []string
)

# ListPodData is the returned struct for an individual pod
type ListPodData (
    id: string,
    name: string,
    createdat: string,
    cgroup: string,
    status: string,
    labels: [string]string,
    numberofcontainers: string,
    containersinfo: []ListPodContainerInfo
)

type PodContainerErrorData (
    containerid: string,
    reason: string
)

# Runlabel describes the required input for container runlabel
type Runlabel(
    image: string,
    authfile: string,
    display: bool,
    name: string,
    pull: bool,
    label: string,
    extraArgs: []string,
    opts: [string]string
)

# Event describes a libpod struct
type Event(
    # TODO: make status and type a enum at some point?
    # id is the container, volume, pod, image ID
    id: string,
    # image is the image name where applicable
    image: string,
    # name is the name of the pod, container, image
    name: string,
    # status describes the event that happened (i.e. create, remove, ...)
    status: string,
    # time the event happened
    time: string,
    # type describes object the event happened with (image, container...)
    type: string
)

type DiffInfo(
    # path that is different
    path: string,
    # Add, Delete, Modify
    changeType: string
)

type ExecOpts(
    # container name or id
    name: string,
    # Create pseudo tty
    tty: bool,
    # privileged access in container
    privileged: bool,
    # command to execute in container
    cmd: []string,
    # user to use in container
    user: ?string,
    # workdir to run command in container
    workdir: ?string,
    # slice of keyword=value environment variables
    env: ?[]string,
    # string of detach keys
    detachKeys: ?string
)

# GetVersion returns version and build information of the podman service
method GetVersion() -> (
    version: string,
    go_version: string,
    git_commit: string,
    built: string, # as RFC3339
    os_arch: string,
    remote_api_version: int
)

# GetInfo returns a [PodmanInfo](#PodmanInfo) struct that describes podman and its host such as storage stats,
# build information of Podman, and system-wide registries.
method GetInfo() -> (info: PodmanInfo)

# ListContainers returns information about all containers.
# See also [GetContainer](#GetContainer).
method ListContainers() -> (containers: []Container)

method Ps(opts: PsOpts) -> (containers: []PsContainer)

method GetContainersByStatus(status: []string) -> (containerS: []Container)

method Top (nameOrID: string, descriptors: []string) -> (top: []string)

# HealthCheckRun executes defined container's healthcheck command
# and returns the container's health status.
method HealthCheckRun (nameOrID: string) -> (healthCheckStatus: string)

# GetContainer returns information about a single container.  If a container
# with the given id doesn't exist, a [ContainerNotFound](#ContainerNotFound)
# error will be returned.  See also [ListContainers](ListContainers) and
# [InspectContainer](#InspectContainer).
method GetContainer(id: string) -> (container: Container)

# GetContainersByContext allows you to get a list of container ids depending on all, latest, or a list of
# container names.  The definition of latest container means the latest by creation date.  In a multi-
# user environment, results might differ from what you expect.
method GetContainersByContext(all: bool, latest: bool, args: []string) -> (containers: []string)

# CreateContainer creates a new container from an image.  It uses a [Create](#Create) type for input.
method CreateContainer(create: Create) -> (container: string)

# InspectContainer data takes a name or ID of a container returns the inspection
# data in string format.  You can then serialize the string into JSON.  A [ContainerNotFound](#ContainerNotFound)
# error will be returned if the container cannot be found. See also [InspectImage](#InspectImage).
method InspectContainer(name: string) -> (container: string)

# ListContainerProcesses takes a name or ID of a container and returns the processes
# running inside the container as array of strings.  It will accept an array of string
# arguments that represent ps options.  If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
# error will be returned.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.ListContainerProcesses '{"name": "135d71b9495f", "opts": []}'
# {
#   "container": [
#     "  UID   PID  PPID  C STIME TTY          TIME CMD",
#     "    0 21220 21210  0 09:05 pts/0    00:00:00 /bin/sh",
#     "    0 21232 21220  0 09:05 pts/0    00:00:00 top",
#     "    0 21284 21220  0 09:05 pts/0    00:00:00 vi /etc/hosts"
#   ]
# }
# ~~~
method ListContainerProcesses(name: string, opts: []string) -> (container: []string)

# GetContainerLogs takes a name or ID of a container and returns the logs of that container.
# If the container cannot be found, a [ContainerNotFound](#ContainerNotFound) error will be returned.
# The container logs are returned as an array of strings.  GetContainerLogs will honor the streaming
# capability of varlink if the client invokes it.
method GetContainerLogs(name: string) -> (container: []string)

method GetContainersLogs(names: []string, follow: bool, latest: bool, since: string, tail: int, timestamps: bool) -> (log: LogLine)

# ListContainerChanges takes a name or ID of a container and returns changes between the container and
# its base image. It returns a struct of changed, deleted, and added path names.
method ListContainerChanges(name: string) -> (container: ContainerChanges)

# ExportContainer creates an image from a container.  It takes the name or ID of a container and a
# path representing the target tarfile.  If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
# error will be returned.
# The return value is the written tarfile.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.ExportContainer '{"name": "flamboyant_payne", "path": "/tmp/payne.tar" }'
# {
#   "tarfile": "/tmp/payne.tar"
# }
# ~~~
method ExportContainer(name: string, path: string) -> (tarfile: string)

# GetContainerStats takes the name or ID of a container and returns a single ContainerStats structure which
# contains attributes like memory and cpu usage.  If the container cannot be found, a
# [ContainerNotFound](#ContainerNotFound) error will be returned. If the container is not running, a [NoContainerRunning](#NoContainerRunning)
# error will be returned
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.GetContainerStats '{"name": "c33e4164f384"}'
# {
#   "container": {
#     "block_input": 0,
#     "block_output": 0,
#     "cpu": 2.571123918839990154678e-08,
#     "cpu_nano": 49037378,
#     "id": "c33e4164f384aa9d979072a63319d66b74fd7a128be71fa68ede24f33ec6cfee",
#     "mem_limit": 33080606720,
#     "mem_perc": 2.166828456524753747370e-03,
#     "mem_usage": 716800,
#     "name": "competent_wozniak",
#     "net_input": 768,
#     "net_output": 5910,
#     "pids": 1,
#     "system_nano": 10000000
#   }
# }
# ~~~
method GetContainerStats(name: string) -> (container: ContainerStats)

# GetContainerStatsWithHistory takes a previous set of container statistics and uses libpod functions
# to calculate the containers statistics based on current and previous measurements.
method GetContainerStatsWithHistory(previousStats: ContainerStats) -> (container: ContainerStats)

# This method has not be implemented yet.
# method ResizeContainerTty() -> (notimplemented: NotImplemented)

# StartContainer starts a created or stopped container. It takes the name or ID of container.  It returns
# the container ID once started.  If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
# error will be returned.  See also [CreateContainer](#CreateContainer).
method StartContainer(name: string) -> (container: string)

# StopContainer stops a container given a timeout.  It takes the name or ID of a container as well as a
# timeout value.  The timeout value the time before a forcible stop to the container is applied.  It
# returns the container ID once stopped. If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
# error will be returned instead. See also [KillContainer](KillContainer).
# #### Error
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.StopContainer '{"name": "135d71b9495f", "timeout": 5}'
# {
#   "container": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6"
# }
# ~~~
method StopContainer(name: string, timeout: int) -> (container: string)

# InitContainer initializes the given container. It accepts a container name or
# ID, and will initialize the container matching that ID if possible, and error
# if not. Containers can only be initialized when they are in the Created or
# Exited states. Initialization prepares a container to be started, but does not
# start the container. It is intended to be used to debug a container's state
# prior to starting it.
method InitContainer(name: string) -> (container: string)

# RestartContainer will restart a running container given a container name or ID and timeout value. The timeout
# value is the time before a forcible stop is used to stop the container.  If the container cannot be found by
# name or ID, a [ContainerNotFound](#ContainerNotFound)  error will be returned; otherwise, the ID of the
# container will be returned.
method RestartContainer(name: string, timeout: int) -> (container: string)

# KillContainer takes the name or ID of a container as well as a signal to be applied to the container.  Once the
# container has been killed, the container's ID is returned.  If the container cannot be found, a
# [ContainerNotFound](#ContainerNotFound) error is returned. See also [StopContainer](StopContainer).
method KillContainer(name: string, signal: int) -> (container: string)

# This method has not be implemented yet.
# method UpdateContainer() -> (notimplemented: NotImplemented)

# This method has not be implemented yet.
# method RenameContainer() -> (notimplemented: NotImplemented)

# PauseContainer takes the name or ID of container and pauses it.  If the container cannot be found,
# a [ContainerNotFound](#ContainerNotFound) error will be returned; otherwise the ID of the container is returned.
# See also [UnpauseContainer](#UnpauseContainer).
method PauseContainer(name: string) -> (container: string)

# UnpauseContainer takes the name or ID of container and unpauses a paused container.  If the container cannot be
# found, a [ContainerNotFound](#ContainerNotFound) error will be returned; otherwise the ID of the container is returned.
# See also [PauseContainer](#PauseContainer).
method UnpauseContainer(name: string) -> (container: string)

# Attach takes the name or ID of a container and sets up the ability to remotely attach to its console. The start
# bool is whether you wish to start the container in question first.
method Attach(name: string, detachKeys: string, start: bool) -> ()

method AttachControl(name: string) -> ()

# GetAttachSockets takes the name or ID of an existing container.  It returns file paths for two sockets needed
# to properly communicate with a container.  The first is the actual I/O socket that the container uses.  The
# second is a "control" socket where things like resizing the TTY events are sent. If the container cannot be
# found, a [ContainerNotFound](#ContainerNotFound) error will be returned.
# #### Example
# ~~~
# $ varlink call -m unix:/run/io.podman/io.podman.GetAttachSockets '{"name": "b7624e775431219161"}'
# {
#   "sockets": {
#     "container_id": "b7624e7754312191613245ce1a46844abee60025818fe3c3f3203435623a1eca",
#     "control_socket": "/var/lib/containers/storage/overlay-containers/b7624e7754312191613245ce1a46844abee60025818fe3c3f3203435623a1eca/userdata/ctl",
#     "io_socket": "/var/run/libpod/socket/b7624e7754312191613245ce1a46844abee60025818fe3c3f3203435623a1eca/attach"
#   }
# }
# ~~~
method GetAttachSockets(name: string) -> (sockets: Sockets)

# WaitContainer takes the name or ID of a container and waits the given interval in milliseconds until the container
# stops.  Upon stopping, the return code of the container is returned. If the container container cannot be found by ID
# or name, a [ContainerNotFound](#ContainerNotFound) error is returned.
method WaitContainer(name: string, interval: int) -> (exitcode: int)

# RemoveContainer requires the name or ID of a container as well as a boolean that
# indicates whether a container should be forcefully removed (e.g., by stopping it), and a boolean
# indicating whether to remove builtin volumes. Upon successful removal of the
# container, its ID is returned.  If the
# container cannot be found by name or ID, a [ContainerNotFound](#ContainerNotFound) error will be returned.
# See also [EvictContainer](EvictContainer).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.RemoveContainer '{"name": "62f4fd98cb57"}'
# {
#   "container": "62f4fd98cb57f529831e8f90610e54bba74bd6f02920ffb485e15376ed365c20"
# }
# ~~~
method RemoveContainer(name: string, force: bool, removeVolumes: bool) -> (container: string)

# EvictContainer requires the name or ID of a container as well as a boolean that
# indicates to remove builtin volumes. Upon successful eviction of the container,
# its ID is returned.  If the container cannot be found by name or ID,
# a [ContainerNotFound](#ContainerNotFound) error will be returned.
# See also [RemoveContainer](RemoveContainer).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.EvictContainer '{"name": "62f4fd98cb57"}'
# {
#   "container": "62f4fd98cb57f529831e8f90610e54bba74bd6f02920ffb485e15376ed365c20"
# }
# ~~~
method EvictContainer(name: string, removeVolumes: bool) -> (container: string)

# DeleteStoppedContainers will delete all containers that are not running. It will return a list the deleted
# container IDs.  See also [RemoveContainer](RemoveContainer).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.DeleteStoppedContainers
# {
#   "containers": [
#     "451410b931d00def8aa9b4f8084e4d4a39e5e04ea61f358cf53a5cf95afcdcee",
#     "8b60f754a3e01389494a9581ade97d35c2765b6e2f19acd2d3040c82a32d1bc0",
#     "cf2e99d4d3cad6073df199ed32bbe64b124f3e1aba6d78821aa8460e70d30084",
#     "db901a329587312366e5ecff583d08f0875b4b79294322df67d90fc6eed08fc1"
#   ]
# }
# ~~~
method DeleteStoppedContainers() -> (containers: []string)

# ListImages returns information about the images that are currently in storage.
# See also [InspectImage](#InspectImage).
method ListImages() -> (images: []Image)

# GetImage returns information about a single image in storage.
# If the image caGetImage returns be found, [ImageNotFound](#ImageNotFound) will be returned.
method GetImage(id: string) -> (image: Image)

# BuildImage takes a [BuildInfo](#BuildInfo) structure and builds an image.  At a minimum, you must provide the
# contextDir tarball path, the 'dockerfiles' path, and 'output' option in the BuildInfo structure.  The 'output'
# options is the name of the of the resulting build. It will return a [MoreResponse](#MoreResponse) structure
# that contains the build logs and resulting image ID.
# #### Example
# ~~~
# $ sudo varlink call -m unix:///run/podman/io.podman/io.podman.BuildImage '{"build":{"contextDir":"/tmp/t/context.tar","dockerfiles":["Dockerfile"], "output":"foobar"}}'
# {
#  "image": {
#    "id": "",
#    "logs": [
#      "STEP 1: FROM alpine\n"
#    ]
#  }
# }
# {
#  "image": {
#    "id": "",
#    "logs": [
#      "STEP 2: COMMIT foobar\n"
#    ]
#  }
# }
# {
#  "image": {
#    "id": "",
#    "logs": [
#      "b7b28af77ffec6054d13378df4fdf02725830086c7444d9c278af25312aa39b9\n"
#    ]
#  }
# }
# {
#  "image": {
#    "id": "b7b28af77ffec6054d13378df4fdf02725830086c7444d9c278af25312aa39b9",
#    "logs": []
#  }
# }
# ~~~
method BuildImage(build: BuildInfo) -> (image: MoreResponse)

# This function is not implemented yet.
# method CreateImage() -> (notimplemented: NotImplemented)

# InspectImage takes the name or ID of an image and returns a string representation of data associated with the
#image.  You must serialize the string into JSON to use it further.  An [ImageNotFound](#ImageNotFound) error will
# be returned if the image cannot be found.
method InspectImage(name: string) -> (image: string)

# HistoryImage takes the name or ID of an image and returns information about its history and layers.  The returned
# history is in the form of an array of ImageHistory structures.  If the image cannot be found, an
# [ImageNotFound](#ImageNotFound) error is returned.
method HistoryImage(name: string) -> (history: []ImageHistory)

# PushImage takes two input arguments: the name or ID of an image, the fully-qualified destination name of the image,
# It will return an [ImageNotFound](#ImageNotFound) error if
# the image cannot be found in local storage; otherwise it will return a [MoreResponse](#MoreResponse)
method PushImage(name: string, tag: string, compress: bool, format: string, removeSignatures: bool, signBy: string) -> (reply: MoreResponse)

# TagImage takes the name or ID of an image in local storage as well as the desired tag name.  If the image cannot
# be found, an [ImageNotFound](#ImageNotFound) error will be returned; otherwise, the ID of the image is returned on success.
method TagImage(name: string, tagged: string) -> (image: string)

# RemoveImage takes the name or ID of an image as well as a boolean that determines if containers using that image
# should be deleted.  If the image cannot be found, an [ImageNotFound](#ImageNotFound) error will be returned.  The
# ID of the removed image is returned when complete.  See also [DeleteUnusedImages](DeleteUnusedImages).
# #### Example
# ~~~
# varlink call -m unix:/run/podman/io.podman/io.podman.RemoveImage '{"name": "registry.fedoraproject.org/fedora", "force": true}'
# {
#   "image": "426866d6fa419873f97e5cbd320eeb22778244c1dfffa01c944db3114f55772e"
# }
# ~~~
method RemoveImage(name: string, force: bool) -> (image: string)

# SearchImages searches available registries for images that contain the
# contents of "query" in their name. If "limit" is given, limits the amount of
# search results per registry.
method SearchImages(query: string, limit: ?int, filter: ImageSearchFilter) -> (results: []ImageSearchResult)

# DeleteUnusedImages deletes any images not associated with a container.  The IDs of the deleted images are returned
# in a string array.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.DeleteUnusedImages
# {
#   "images": [
#     "166ea6588079559c724c15223f52927f514f73dd5c5cf2ae2d143e3b2e6e9b52",
#     "da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e",
#     "3ef70f7291f47dfe2b82931a993e16f5a44a0e7a68034c3e0e086d77f5829adc",
#     "59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690"
#   ]
# }
# ~~~
method DeleteUnusedImages() -> (images: []string)

# Commit, creates an image from an existing container. It requires the name or
# ID of the container as well as the resulting image name.  Optionally, you can define an author and message
# to be added to the resulting image.  You can also define changes to the resulting image for the following
# attributes: _CMD, ENTRYPOINT, ENV, EXPOSE, LABEL, ONBUILD, STOPSIGNAL, USER, VOLUME, and WORKDIR_.  To pause the
# container while it is being committed, pass a _true_ bool for the pause argument.  If the container cannot
# be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise,
# the resulting image's ID will be returned as a string inside a MoreResponse.
method Commit(name: string, image_name: string, changes: []string, author: string, message: string, pause: bool, manifestType: string) -> (reply: MoreResponse)

# ImportImage imports an image from a source (like tarball) into local storage.  The image can have additional
# descriptions added to it using the message and changes options. See also [ExportImage](ExportImage).
method ImportImage(source: string, reference: string, message: string, changes: []string, delete: bool) -> (image: string)

# ExportImage takes the name or ID of an image and exports it to a destination like a tarball.  There is also
# a boolean option to force compression.  It also takes in a string array of tags to be able to save multiple
# tags of the same image to a tarball (each tag should be of the form <image>:<tag>).  Upon completion, the ID
# of the image is returned. If the image cannot be found in local storage, an [ImageNotFound](#ImageNotFound)
# error will be returned. See also [ImportImage](ImportImage).
method ExportImage(name: string, destination: string, compress: bool, tags: []string) -> (image: string)

# PullImage pulls an image from a repository to local storage.  After a successful pull, the image id and logs
# are returned as a [MoreResponse](#MoreResponse).  This connection also will handle a WantsMores request to send
# status as it occurs.
method PullImage(name: string) -> (reply: MoreResponse)

# CreatePod creates a new empty pod.  It uses a [PodCreate](#PodCreate) type for input.
# On success, the ID of the newly created pod will be returned.
# #### Example
# ~~~
# $ varlink call unix:/run/podman/io.podman/io.podman.CreatePod '{"create": {"name": "test"}}'
# {
#   "pod": "b05dee7bd4ccfee688099fe1588a7a898d6ddd6897de9251d4671c9b0feacb2a"
# }
#
# $ varlink call unix:/run/podman/io.podman/io.podman.CreatePod '{"create": {"infra": true, "share": ["ipc", "net", "uts"]}}'
# {
#   "pod": "d7697449a8035f613c1a8891286502aca68fff7d5d49a85279b3bda229af3b28"
# }
# ~~~
method CreatePod(create: PodCreate) -> (pod: string)

# ListPods returns a list of pods in no particular order.  They are
# returned as an array of ListPodData structs.  See also [GetPod](#GetPod).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.ListPods
# {
#   "pods": [
#     {
#       "cgroup": "machine.slice",
#       "containersinfo": [
#         {
#           "id": "00c130a45de0411f109f1a0cfea2e298df71db20fa939de5cab8b2160a36be45",
#           "name": "1840835294cf-infra",
#           "status": "running"
#         },
#         {
#           "id": "49a5cce72093a5ca47c6de86f10ad7bb36391e2d89cef765f807e460865a0ec6",
#           "name": "upbeat_murdock",
#           "status": "running"
#         }
#       ],
#       "createdat": "2018-12-07 13:10:15.014139258 -0600 CST",
#       "id": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f",
#       "name": "foobar",
#       "numberofcontainers": "2",
#       "status": "Running"
#     },
#     {
#       "cgroup": "machine.slice",
#       "containersinfo": [
#         {
#           "id": "1ca4b7bbba14a75ba00072d4b705c77f3df87db0109afaa44d50cb37c04a477e",
#           "name": "784306f655c6-infra",
#           "status": "running"
#         }
#       ],
#       "createdat": "2018-12-07 13:09:57.105112457 -0600 CST",
#       "id": "784306f655c6200aea321dd430ba685e9b2cc1f7d7528a72f3ff74ffb29485a2",
#       "name": "nostalgic_pike",
#       "numberofcontainers": "1",
#       "status": "Running"
#     }
#   ]
# }
# ~~~
method ListPods() -> (pods: []ListPodData)

# GetPod takes a name or ID of a pod and returns single [ListPodData](#ListPodData)
# structure.  A [PodNotFound](#PodNotFound) error will be returned if the pod cannot be found.
# See also [ListPods](ListPods).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.GetPod '{"name": "foobar"}'
# {
#   "pod": {
#     "cgroup": "machine.slice",
#     "containersinfo": [
#       {
#         "id": "00c130a45de0411f109f1a0cfea2e298df71db20fa939de5cab8b2160a36be45",
#         "name": "1840835294cf-infra",
#         "status": "running"
#       },
#       {
#         "id": "49a5cce72093a5ca47c6de86f10ad7bb36391e2d89cef765f807e460865a0ec6",
#         "name": "upbeat_murdock",
#         "status": "running"
#       }
#     ],
#     "createdat": "2018-12-07 13:10:15.014139258 -0600 CST",
#     "id": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f",
#     "name": "foobar",
#     "numberofcontainers": "2",
#     "status": "Running"
#   }
# }
# ~~~
method GetPod(name: string) -> (pod: ListPodData)

# InspectPod takes the name or ID of an image and returns a string representation of data associated with the
# pod.  You must serialize the string into JSON to use it further.  A [PodNotFound](#PodNotFound) error will
# be returned if the pod cannot be found.
method InspectPod(name: string) -> (pod: string)

# StartPod starts containers in a pod.  It takes the name or ID of pod.  If the pod cannot be found, a [PodNotFound](#PodNotFound)
# error will be returned.  Containers in a pod are started independently. If there is an error starting one container, the ID of those containers
# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
# If the pod was started with no errors, the pod ID is returned.
# See also [CreatePod](#CreatePod).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.StartPod '{"name": "135d71b9495f"}'
# {
#   "pod": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6",
# }
# ~~~
method StartPod(name: string) -> (pod: string)

# StopPod stops containers in a pod.  It takes the name or ID of a pod and a timeout.
# If the pod cannot be found, a [PodNotFound](#PodNotFound) error will be returned instead.
# Containers in a pod are stopped independently. If there is an error stopping one container, the ID of those containers
# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
# If the pod was stopped with no errors, the pod ID is returned.
# See also [KillPod](KillPod).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.StopPod '{"name": "135d71b9495f"}'
# {
#   "pod": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6"
# }
# ~~~
method StopPod(name: string, timeout: int) -> (pod: string)

# RestartPod will restart containers in a pod given a pod name or ID. Containers in
# the pod that are running will be stopped, then all stopped containers will be run.
# If the pod cannot be found by name or ID, a [PodNotFound](#PodNotFound) error will be returned.
# Containers in a pod are restarted independently. If there is an error restarting one container, the ID of those containers
# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
# If the pod was restarted with no errors, the pod ID is returned.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.RestartPod '{"name": "135d71b9495f"}'
# {
#   "pod": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6"
# }
# ~~~
method RestartPod(name: string) -> (pod: string)

# KillPod takes the name or ID of a pod as well as a signal to be applied to the pod.  If the pod cannot be found, a
# [PodNotFound](#PodNotFound) error is returned.
# Containers in a pod are killed independently. If there is an error killing one container, the ID of those containers
# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
# If the pod was killed with no errors, the pod ID is returned.
# See also [StopPod](StopPod).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.KillPod '{"name": "foobar", "signal": 15}'
# {
#   "pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
# }
# ~~~
method KillPod(name: string, signal: int) -> (pod: string)

# PausePod takes the name or ID of a pod and pauses the running containers associated with it.  If the pod cannot be found,
# a [PodNotFound](#PodNotFound) error will be returned.
# Containers in a pod are paused independently. If there is an error pausing one container, the ID of those containers
# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
# If the pod was paused with no errors, the pod ID is returned.
# See also [UnpausePod](#UnpausePod).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.PausePod '{"name": "foobar"}'
# {
#   "pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
# }
# ~~~
method PausePod(name: string) -> (pod: string)

# UnpausePod takes the name or ID of a pod and unpauses the paused containers associated with it.  If the pod cannot be
# found, a [PodNotFound](#PodNotFound) error will be returned.
# Containers in a pod are unpaused independently. If there is an error unpausing one container, the ID of those containers
# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
# If the pod was unpaused with no errors, the pod ID is returned.
# See also [PausePod](#PausePod).
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.UnpausePod '{"name": "foobar"}'
# {
#   "pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
# }
# ~~~
method UnpausePod(name: string) -> (pod: string)

# RemovePod takes the name or ID of a pod as well a boolean representing whether a running
# container in the pod can be stopped and removed.  If a pod has containers associated with it, and force is not true,
# an error will occur.
# If the pod cannot be found by name or ID, a [PodNotFound](#PodNotFound) error will be returned.
# Containers in a pod are removed independently. If there is an error removing any container, the ID of those containers
# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
# If the pod was removed with no errors, the pod ID is returned.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.RemovePod '{"name": "62f4fd98cb57", "force": "true"}'
# {
#   "pod": "62f4fd98cb57f529831e8f90610e54bba74bd6f02920ffb485e15376ed365c20"
# }
# ~~~
method RemovePod(name: string, force: bool) -> (pod: string)

# This method has not be implemented yet.
# method WaitPod() -> (notimplemented: NotImplemented)

method TopPod(pod: string, latest: bool, descriptors: []string) -> (stats: []string)

# GetPodStats takes the name or ID of a pod and returns a pod name and slice of ContainerStats structure which
# contains attributes like memory and cpu usage.  If the pod cannot be found, a [PodNotFound](#PodNotFound)
# error will be returned.  If the pod has no running containers associated with it, a [NoContainerRunning](#NoContainerRunning)
# error will be returned.
# #### Example
# ~~~
# $ varlink call unix:/run/podman/io.podman/io.podman.GetPodStats '{"name": "7f62b508b6f12b11d8fe02e"}'
# {
#   "containers": [
#     {
#       "block_input": 0,
#       "block_output": 0,
#       "cpu": 2.833470544016107524276e-08,
#       "cpu_nano": 54363072,
#       "id": "a64b51f805121fe2c5a3dc5112eb61d6ed139e3d1c99110360d08b58d48e4a93",
#       "mem_limit": 12276146176,
#       "mem_perc": 7.974359265237864966003e-03,
#       "mem_usage": 978944,
#       "name": "quirky_heisenberg",
#       "net_input": 866,
#       "net_output": 7388,
#       "pids": 1,
#       "system_nano": 20000000
#     }
#   ],
#   "pod": "7f62b508b6f12b11d8fe02e0db4de6b9e43a7d7699b33a4fc0d574f6e82b4ebd"
# }
# ~~~
method GetPodStats(name: string) -> (pod: string, containers: []ContainerStats)

# GetPodsByStatus searches for pods whose status is included in statuses
method GetPodsByStatus(statuses: []string) -> (pods: []string)

# ImageExists talks a full or partial image ID or name and returns an int as to whether
# the image exists in local storage. An int result of 0 means the image does exist in
# local storage; whereas 1 indicates the image does not exists in local storage.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.ImageExists '{"name": "imageddoesntexist"}'
# {
#   "exists": 1
# }
# ~~~
method ImageExists(name: string) -> (exists: int)

# ContainerExists takes a full or partial container ID or name and returns an int as to
# whether the container exists in local storage.  A result of 0 means the container does
# exists; whereas a result of 1 means it could not be found.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.ContainerExists '{"name": "flamboyant_payne"}'{
#   "exists": 0
# }
# ~~~
method ContainerExists(name: string) -> (exists: int)

# ContainerCheckPoint performs a checkpopint on a container by its name or full/partial container
# ID.  On successful checkpoint, the id of the checkpointed container is returned.
method ContainerCheckpoint(name: string, keep: bool, leaveRunning: bool, tcpEstablished: bool) -> (id: string)

# ContainerRestore restores a container that has been checkpointed.  The container to be restored can
# be identified by its name or full/partial container ID.  A successful restore will result in the return
# of the container's ID.
method ContainerRestore(name: string, keep: bool, tcpEstablished: bool) -> (id: string)

# ContainerRunlabel runs executes a command as described by a given container image label.
method ContainerRunlabel(runlabel: Runlabel) -> ()

# ExecContainer executes a command in the given container.
method ExecContainer(opts: ExecOpts) -> ()

# ListContainerMounts gathers all the mounted container mount points and returns them as an array
# of strings
# #### Example
# ~~~
# $ varlink call unix:/run/podman/io.podman/io.podman.ListContainerMounts
# {
#   "mounts": {
#     "04e4c255269ed2545e7f8bd1395a75f7949c50c223415c00c1d54bfa20f3b3d9": "/var/lib/containers/storage/overlay/a078925828f57e20467ca31cfca8a849210d21ec7e5757332b72b6924f441c17/merged",
#     "1d58c319f9e881a644a5122ff84419dccf6d138f744469281446ab243ef38924": "/var/lib/containers/storage/overlay/948fcf93f8cb932f0f03fd52e3180a58627d547192ffe3b88e0013b98ddcd0d2/merged"
#   }
# }
# ~~~
method ListContainerMounts() -> (mounts: [string]string)

# MountContainer mounts a container by name or full/partial ID.  Upon a successful mount, the destination
# mount is returned as a string.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.MountContainer '{"name": "jolly_shannon"}'{
#   "path": "/var/lib/containers/storage/overlay/419eeb04e783ea159149ced67d9fcfc15211084d65e894792a96bedfae0470ca/merged"
# }
# ~~~
method MountContainer(name: string) -> (path: string)

# UnmountContainer umounts a container by its name or full/partial container ID.
# #### Example
# ~~~
# $ varlink call -m unix:/run/podman/io.podman/io.podman.UnmountContainer '{"name": "jolly_shannon", "force": false}'
# {}
# ~~~
method  UnmountContainer(name: string, force: bool) -> ()

# ImagesPrune removes all unused images from the local store.  Upon successful pruning,
# the IDs of the removed images are returned.
method ImagesPrune(all: bool) -> (pruned: []string)

# This function is not implemented yet.
# method ListContainerPorts(name: string) -> (notimplemented: NotImplemented)

# GenerateKube generates a Kubernetes v1 Pod description of a Podman container or pod
# and its containers. The description is in YAML.  See also [ReplayKube](ReplayKube).
method GenerateKube(name: string, service: bool) -> (pod: KubePodService)

# ReplayKube recreates a pod and its containers based on a Kubernetes v1 Pod description (in YAML)
# like that created by GenerateKube. See also [GenerateKube](GenerateKube).
# method ReplayKube() -> (notimplemented: NotImplemented)

# ContainerConfig returns a container's config in string form. This call is for
# development of Podman only and generally should not be used.
method ContainerConfig(name: string) -> (config: string)

# ContainerArtifacts returns a container's artifacts in string form.  This call is for
# development of Podman only and generally should not be used.
method ContainerArtifacts(name: string, artifactName: string) -> (config: string)

# ContainerInspectData returns a container's inspect data in string form.  This call is for
# development of Podman only and generally should not be used.
method ContainerInspectData(name: string, size: bool) -> (config: string)

# ContainerStateData returns a container's state config in string form.  This call is for
# development of Podman only and generally should not be used.
method ContainerStateData(name: string) -> (config: string)

# PodStateData returns inspectr level information of a given pod in string form.  This call is for
# development of Podman only and generally should not be used.
method PodStateData(name: string) -> (config: string)

# This call is for the development of Podman only and should not be used.
method CreateFromCC(in: []string) -> (id: string)

# Spec returns the oci spec for a container.  This call is for development of Podman only and generally should not be used.
method Spec(name: string) -> (config: string)

# Sendfile allows a remote client to send a file to the host
method SendFile(type: string, length: int) -> (file_handle: string)

# ReceiveFile allows the host to send a remote client a file
method ReceiveFile(path: string, delete: bool) -> (len: int)

# VolumeCreate creates a volume on a remote host
method VolumeCreate(options: VolumeCreateOpts) -> (volumeName: string)

# VolumeRemove removes a volume on a remote host
method VolumeRemove(options: VolumeRemoveOpts) -> (successes: []string, failures: [string]string)

# GetVolumes gets slice of the volumes on a remote host
method GetVolumes(args: []string, all: bool) -> (volumes: []Volume)

# VolumesPrune removes unused volumes on the host
method VolumesPrune() -> (prunedNames: []string, prunedErrors: []string)

# ImageSave allows you to save an image from the local image storage to a tarball
method ImageSave(options: ImageSaveOptions) -> (reply: MoreResponse)

# GetPodsByContext allows you to get a list pod ids depending on all, latest, or a list of
# pod names.  The definition of latest pod means the latest by creation date.  In a multi-
# user environment, results might differ from what you expect.
method GetPodsByContext(all: bool, latest: bool, args: []string) -> (pods: []string)

# LoadImage allows you to load an image into local storage from a tarball.
method LoadImage(name: string, inputFile: string, quiet: bool, deleteFile: bool) -> (reply: MoreResponse)

# GetEvents returns known libpod events filtered by the options provided.
method GetEvents(filter: []string, since: string, until: string) -> (events: Event)

# Diff returns a diff between libpod objects
method Diff(name: string) -> (diffs: []DiffInfo)

# GetLayersMapWithImageInfo is for the development of Podman and should not be used.
method GetLayersMapWithImageInfo() -> (layerMap: string)

# BuildImageHierarchyMap is for the development of Podman and should not be used.
method BuildImageHierarchyMap(name: string) -> (imageInfo: string)

# ImageNotFound means the image could not be found by the provided name or ID in local storage.
error ImageNotFound (id: string, reason: string)

# ContainerNotFound means the container could not be found by the provided name or ID in local storage.
error ContainerNotFound (id: string, reason: string)

# NoContainerRunning means none of the containers requested are running in a command that requires a running container.
error NoContainerRunning ()

# PodNotFound means the pod could not be found by the provided name or ID in local storage.
error PodNotFound (name: string, reason: string)

# VolumeNotFound means the volume could not be found by the name or ID in local storage.
error VolumeNotFound (id: string, reason: string)

# PodContainerError means a container associated with a pod failed to perform an operation. It contains
# a container ID of the container that failed.
error PodContainerError (podname: string, errors: []PodContainerErrorData)

# NoContainersInPod means a pod has no containers on which to perform the operation. It contains
# the pod ID.
error NoContainersInPod (name: string)

# InvalidState indicates that a container or pod was in an improper state for the requested operation
error InvalidState (id: string, reason: string)

# ErrorOccurred is a generic error for an error that occurs during the execution.  The actual error message
# is includes as part of the error's text.
error ErrorOccurred (reason: string)

# RuntimeErrors generally means a runtime could not be found or gotten.
error RuntimeError (reason: string)

# The Podman endpoint requires that you use a streaming connection.
error WantsMoreRequired (reason: string)

# Container is already stopped
error ErrCtrStopped (id: string)

# This function requires CGroupsV2 to run in rootless mode.
error ErrRequiresCgroupsV2ForRootless(reason: string)
