• Mahmood Ali's avatar
    Use init to handle plugin invocation · eeaa95dd
    Mahmood Ali authored
    Currently, nomad "plugin" processes (e.g. executor, logmon, docker_logger) are started as CLI
    commands to be handled by command CLI framework.  Plugin launchers use
    `discover.NomadBinary()` to identify the binary and start it.
    
    This has few downsides: The trivial one is that when running tests, one
    must re-compile the nomad binary as the tests need to invoke the nomad
    executable to start plugin.  This is frequently overlooked, resulting in
    puzzlement.
    
    The more significant issue with `executor` in particular is in relation
    to external driver:
    
    * Plugin must identify the path of invoking nomad binary, which is not
    trivial; `discvoer.NomadBinary()` now returns the path to the plugin
    rather than to nomad, preventing external drivers from launching
    executors.
    
    * The external driver may get a different version of executor than it
    expects (specially if we make a binary incompatible change in future).
    
    This commit addresses both downside by having the plugin invocation
    handling through an `init()` call, similar to how libcontainer init
    handler is done in [1] and recommened by libcontainer [2].  `init()`
    will be invoked and handled properly in tests and external drivers.
    
    For external drivers, this change will cause external drivers to launch
    the executor that's compiled against.
    
    There a are a couple of downsides to this approach:
    * These specific packages (i.e executor, logmon, and dockerlog) need to
    be careful in use of `init()`, package initializers.  Must avoid having
    command execution rely on any other init in the package.  I prefixed
    files with `z_` (golang processes files in lexical order), but ensured
    we don't depend on order.
    * The command handling is spread in multiple packages making it a bit
    less obvious how plugin starts are handled.
    
    [1] drivers/shared/executor/libcontainer_nsenter_linux.go
    [2] https://github.com/opencontainers/runc/tree/eb4aeed24ffbf8e2d740fafea39d91faa0ee84d0/libcontainer#using-libcontainer
    eeaa95dd