Plug/slot rules: plug-names/slot-names constraints

We have discussed the idea of being able to constraint auto-connection (or connection or installation) on actual plug names or slot names.

Use cases

Plugs of superprivileged interfaces that don’t need parameters/attributes should have names that match the interface name. This is good style and makes it clearer what they are about. The feature would allow to enforce this when granting them.

When we grant something like system-files/personal-files we want to enforce again a good plug name that describes within reason what is being given access to.

In case of gadget snaps or snaps designed for one or a given set of models (so from a brand store) and assuming well chosen names for slots, this feature might help disambiguate auto-connection situations where other means would not be enough.

Syntax

Parallel to similar constraints like plug-attributes/slot-attributes we would introduce plug-names and slot-names constraints.

Their value to check would be a list of strings, interpreted as regular expressions (implicitly wrapped in ^$). The constraint would succeed if any of the expression matches. It should be noted that any valid plug or slot name is a valid regular expression matching itself.

Further we would also allow for the strings the special value $INTERFACE which matches the interface name of the rule.

(There’s a less clear case for $PLUG_NAME, $SLOT_NAME special values).

Examples

snapd-control:
  allow-installation:
    plug-names:
      - $INTERFACE
  allow-auto-connection: true
personal-files:
  allow-auto-connection :  true
  allow-installation:
    plug-names:
      - home-dot-bar
    plug-attributes:
      read: \\$HOME/\\.bar
gpio:
  allow-auto-connection:
     slot-names:
       - alert-led
personal-files:
  allow-auto-connection :  true
  allow-installation:
    -  plug-names:
        - home-dot-bar
      plug-attributes:
        read: \\$HOME/\\.bar
    - plug-names:
        - home-dot-foo
      plug-attributes:
        read: \\$HOME/\\.foo

Proposed:

https://github.com/snapcore/snapd/pull/7812
https://github.com/snapcore/snapd/pull/7813

This will be supported by snapd starting with 2.44.