podman/libpod
W. Trevor King 68eb128fb0 pkg/hooks: Version the hook structure and add 1.0.0 hooks
This shifts the matching logic out of libpod/container_internal and
into the hook package, where we can reuse it after vendoring into
CRI-O.  It also adds unit tests with almost-complete coverage.  Now
libpod is even more isolated from the hook internals, which makes it
fairly straightforward to bump the hook config file to 1.0.0.  I've
dubbed the old format 0.1.0, although it doesn't specify an explicit
version.  Motivation for some of my changes with 1.0.0:

* Add an explicit version field.  This will make any future JSON
  structure migrations more straightforward by avoiding the need for
  version-guessing heuristics.

* Collect the matching properties in a new When sub-structure.  This
  makes the root Hook structure easier to understand, because you
  don't have to read over all the matching properties when wrapping
  your head around Hook.

* Replace the old 'hook' and 'arguments' with a direct embedding of
  the runtime-spec's hook structure.  This provides access to
  additional upstream properties (args[0], env, and timeout) and
  avoids the complication of a CRI-O-specific analog structure.

* Add a 'when.always' property.  You can usually accomplish this
  effect in another way (e.g. when.commands = [".*"]), but having a
  boolean explicitly for this use-case makes for easier reading and
  writing.

* Replace the previous annotations array with an annotations map.  The
  0.1.0 approach matched only the values regardless of key, and that
  seems unreliable.

* Replace 'cmds' with 'when.commands', because while there are a few
  ways to abbreviate "commands", there's only one way to write it out
  in full ;).  This gives folks one less thing to remember when
  writing hook JSON.

* Replace the old "inject if any specified condition matches" with
  "inject if all specified conditions match".  This allows for more
  precise targeting.  Users that need more generous targeting can
  recover the previous behavior by creating a separate 1.0.0 hook file
  for each specified 0.1.0 condition.

I've added doc-compat support for the various pluralizations of the
0.1.0 properties.  Previously, the docs and code were not in
agreement.  More on this particular facet in [1].

I've updated the docs to point out that the annotations being matched
are the OCI config annotations.  This differs from CRI-O, where the
annotations used are the Kubernetes-supplied annotations [2,3].  For
example, io.kubernetes.cri-o.Volumes [4] is part of CRI-O's runtime
config annotations [5], but not part of the Kubernetes-supplied
annotations CRI-O uses for matching hooks.

The Monitor method supports the CRI-O use-case [6].  podman doesn't
need it directly, but CRI-O will need it when we vendor this package
there.

I've used nvidia-container-runtime-hook for the annotation examples
because Dan mentioned the Nvidia folks as the motivation behind
annotation matching.  The environment variables are documented in [7].
The 0.1.0 hook config, which does not allow for environment variables,
only works because runc currently leaks the host environment into the
hooks [8].  I haven't been able to find documentation for their usual
annotation trigger or hook-install path, so I'm just guessing there.

[1]: https://github.com/kubernetes-incubator/cri-o/pull/1235
[2]: https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L760
[3]: https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L772
[4]: https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/pkg/annotations/annotations.go#L97-L98
[5]: https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L830-L834
[6]: https://github.com/kubernetes-incubator/cri-o/pull/1345/
[7]: https://github.com/NVIDIA/nvidia-container-runtime/tree/v1.3.0-1#environment-variables-oci-spec
[8]: https://github.com/opencontainers/runc/pull/1738

Signed-off-by: W. Trevor King <wking@tremily.us>

Closes: #686
Approved by: mheon
2018-05-11 16:26:35 +00:00
..
common Change un/pwd handling to match Buildah's 2018-02-06 09:29:23 -05:00
driver Migrate Create|Commit to ginkgo 2018-02-02 22:44:40 +00:00
image podman push should honor registries.conf 2018-05-10 14:56:56 +00:00
layers Initial checkin from CRI-O repo 2017-11-01 11:24:59 -04:00
testdata Add hooks support to podman 2018-04-05 14:13:49 +00:00
boltdb_state.go Check for duplicate names when generating new container and pod names. 2018-03-29 01:55:20 +00:00
boltdb_state_internal.go Ensure container dependencies are part of the same pod 2018-03-29 01:27:40 +00:00
common_test.go Add tests for container graphs 2018-03-29 02:18:45 +00:00
container.go Place Conmon and Container in separate CGroups 2018-05-11 14:43:57 +00:00
container_api.go Optionally init() during container restart 2018-05-04 10:57:50 +00:00
container_attach.go Fix another comparison of a Go interface against nil 2018-04-13 18:43:44 +00:00
container_commit.go Make podman commit to localhost rather then docker.io 2018-05-03 13:12:46 +00:00
container_graph.go Remove a loop in container graph 2018-03-29 02:18:45 +00:00
container_graph_test.go Fix tests 2018-03-29 02:18:45 +00:00
container_inspect.go Retrieve IP addresses for container from DB 2018-04-26 17:26:13 +00:00
container_internal.go pkg/hooks: Version the hook structure and add 1.0.0 hooks 2018-05-11 16:26:35 +00:00
container_top.go Major fixes to systemd cgroup handling 2018-05-11 14:43:57 +00:00
diff.go Stage 4 Image cleanup 2018-03-23 15:35:37 +00:00
errors.go Add schema validation to DB 2017-11-30 18:05:56 +00:00
finished_32.go Make libpod build on 32-bit systems 2018-02-13 15:39:07 +00:00
finished_64.go Make libpod build on 32-bit systems 2018-02-13 15:39:07 +00:00
in_memory_state.go Prevent ctrs not in pods from depending on pod ctrs 2018-03-29 01:27:40 +00:00
info.go Tweak info time format 2018-02-28 18:06:50 +00:00
networking.go networking, userNS: configure the network namespace after create 2018-05-04 17:15:55 +00:00
oci.go Place Conmon and Container in separate CGroups 2018-05-11 14:43:57 +00:00
options.go Add --cgroup-manager flag to Podman binary 2018-05-11 14:43:57 +00:00
pod.go Vendor in latest containers/image and contaners/storage 2018-04-19 14:08:47 +00:00
runtime.go pkg/hooks: Version the hook structure and add 1.0.0 hooks 2018-05-11 16:26:35 +00:00
runtime_ctr.go Remove parent cgroup we create with cgroupfs 2018-05-11 14:43:57 +00:00
runtime_img.go Use buildah commit and bud in podman 2018-04-27 20:51:07 +00:00
runtime_img_test.go regression: tls verify should be set on registries.conf if insecure 2018-04-18 14:07:59 +00:00
runtime_pod.go Check for duplicate names when generating new container and pod names. 2018-03-29 01:55:20 +00:00
state.go Containers in a pod can only join namespaces in that pod 2018-02-12 14:28:07 +00:00
state_test.go Add backend code for generic dependencies 2018-04-03 14:57:16 +00:00
stats.go Major fixes to systemd cgroup handling 2018-05-11 14:43:57 +00:00
storage.go Begin wiring in USERNS Support into podman 2018-05-04 17:15:55 +00:00
util.go Stage 4 Image cleanup 2018-03-23 15:35:37 +00:00
util_test.go Stage3 Image Library 2018-03-14 20:21:31 +00:00
version.go varlink images 2018-04-26 19:14:44 +00:00